diff options
910 files changed, 3291 insertions, 56480 deletions
diff --git a/Android.bp b/Android.bp index 14a2bff8ad13..3ca1e37cb082 100644 --- a/Android.bp +++ b/Android.bp @@ -500,7 +500,7 @@ java_library { // TODO(b/147128803) remove the below lines "//frameworks/base/apex/blobstore/framework", "//frameworks/base/apex/jobscheduler/framework", - "//frameworks/base/packages/Tethering/tests/unit", + "//packages/modules/Connectivity/Tethering/tests/unit", ], } @@ -607,6 +607,7 @@ gensrcs { srcs: [ ":ipconnectivity-proto-src", + ":libstats_atom_enum_protos", "core/proto/**/*.proto", "libs/incident/**/*.proto", ], @@ -633,6 +634,7 @@ gensrcs { srcs: [ ":ipconnectivity-proto-src", + ":libstats_atom_enum_protos", "core/proto/**/*.proto", "libs/incident/**/*.proto", ], @@ -655,6 +657,7 @@ filegroup { "core/java/android/annotation/RequiresPermission.java", "core/java/android/annotation/SdkConstant.java", "core/java/android/annotation/StringDef.java", + "core/java/android/annotation/SuppressLint.java", "core/java/android/annotation/SystemApi.java", "core/java/android/annotation/SystemService.java", "core/java/android/annotation/TestApi.java", @@ -748,13 +751,18 @@ java_library_host { name: "platformprotos", srcs: [ ":ipconnectivity-proto-src", + ":libstats_atom_enum_protos", + ":libstats_internal_protos", "cmds/am/proto/instrumentation_data.proto", "cmds/statsd/src/**/*.proto", "core/proto/**/*.proto", "libs/incident/proto/**/*.proto", ], proto: { - include_dirs: ["external/protobuf/src"], + include_dirs: [ + "external/protobuf/src", + "frameworks/proto_logging/stats", + ], type: "full", }, errorprone: { @@ -777,6 +785,7 @@ java_library { sdk_version: "9", srcs: [ ":ipconnectivity-proto-src", + ":libstats_atom_enum_protos", "core/proto/**/*.proto", "libs/incident/proto/android/os/**/*.proto", ], @@ -792,6 +801,7 @@ java_library { srcs: [ ":ipconnectivity-proto-src", + ":libstats_atom_enum_protos", "core/proto/**/*.proto", "libs/incident/proto/android/os/**/*.proto", ], @@ -812,7 +822,9 @@ cc_defaults { proto: { export_proto_headers: true, - include_dirs: ["external/protobuf/src"], + include_dirs: [ + "external/protobuf/src", + ], }, cflags: [ @@ -823,6 +835,7 @@ cc_defaults { srcs: [ ":ipconnectivity-proto-src", + ":libstats_atom_enum_protos", "core/proto/**/*.proto", ], } diff --git a/StubLibraries.bp b/StubLibraries.bp index 3eb482dc5dc5..d98a665a872a 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -154,6 +154,9 @@ priv_apps = " " + module_libs = " " + " --show-annotation android.annotation.SystemApi\\(" + "client=android.annotation.SystemApi.Client.MODULE_LIBRARIES" + + "\\)" + + " --show-for-stub-purposes-annotation android.annotation.SystemApi\\(" + + "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" + "\\) " droidstubs { @@ -212,7 +215,11 @@ droidstubs { arg_files: [ "core/res/AndroidManifest.xml", ], - args: metalava_framework_docs_args + " --show-annotation android.annotation.TestApi", + args: metalava_framework_docs_args + + " --show-annotation android.annotation.TestApi" + + " --show-for-stub-purposes-annotation android.annotation.SystemApi\\(" + + "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" + + "\\)", check_api: { current: { api_file: "api/test-current.txt", @@ -231,16 +238,10 @@ droidstubs { } ///////////////////////////////////////////////////////////////////// -// Following droidstubs modules are for extra APIs for modules. -// The framework currently have two more API surfaces for modules: -// @SystemApi(client=MODULE_APPS) and @SystemApi(client=MODULE_LIBRARIES) +// Following droidstubs modules are for extra APIs for modules, +// namely @SystemApi(client=MODULE_LIBRARIES) APIs. ///////////////////////////////////////////////////////////////////// -// TODO(b/146727827) remove the *-api module when we can teach metalava -// about the relationship among the API surfaces. Currently, these modules are only to generate -// the API signature files and ensure that the APIs evolve in a backwards compatible manner. -// They however are NOT used for building the API stub. - droidstubs { name: "module-lib-api", defaults: ["metalava-full-api-stubs-default"], @@ -273,7 +274,7 @@ droidstubs { name: "module-lib-api-stubs-docs-non-updatable", defaults: ["metalava-non-updatable-api-stubs-default"], arg_files: ["core/res/AndroidManifest.xml"], - args: metalava_framework_docs_args + module_libs, + args: metalava_framework_docs_args + priv_apps + module_libs, check_api: { current: { api_file: "non-updatable-api/module-lib-current.txt", @@ -286,17 +287,6 @@ droidstubs { }, } -// The following droidstub module generates source files for the API stub library for -// modules. Note that it not only includes its own APIs but also other APIs that have -// narrower scope (all @SystemApis, not just the ones with 'client=MODULE_LIBRARIES'). - -droidstubs { - name: "module-lib-api-stubs-docs", - defaults: ["metalava-non-updatable-api-stubs-default"], - arg_files: ["core/res/AndroidManifest.xml"], - args: metalava_framework_docs_args + priv_apps + module_libs, -} - ///////////////////////////////////////////////////////////////////// // android_*_stubs_current modules are the stubs libraries compiled // from *-api-stubs-docs @@ -389,7 +379,7 @@ java_library_static { java_library_static { name: "android_module_lib_stubs_current", - srcs: [ ":module-lib-api-stubs-docs" ], + srcs: [ ":module-lib-api-stubs-docs-non-updatable" ], defaults: ["android_defaults_stubs_current"], libs: ["sdk_system_29_android"], } diff --git a/apex/Android.bp b/apex/Android.bp index 992648b04ef0..784e3a859851 100644 --- a/apex/Android.bp +++ b/apex/Android.bp @@ -53,6 +53,9 @@ priv_apps = " " + module_libs = " " + " --show-annotation android.annotation.SystemApi\\(" + "client=android.annotation.SystemApi.Client.MODULE_LIBRARIES" + + "\\)" + + " --show-for-stub-purposes-annotation android.annotation.SystemApi\\(" + + "client=android.annotation.SystemApi.Client.PRIVILEGED_APPS" + "\\) " mainline_service_stubs_args = @@ -94,20 +97,15 @@ java_defaults { annotations_enabled: true, - stubs_library_visibility: [ - "//visibility:public", - ], + // Allow access to the stubs from anywhere + visibility: ["//visibility:public"], + stubs_library_visibility: ["//visibility:public"], - // Set the visibility of the modules creating the stubs source. - stubs_source_visibility: [ - // Ignore any visibility rules specified on the java_sdk_library when - // setting the visibility of the stubs source modules. - "//visibility:override", + // Hide impl library and stub sources + impl_library_visibility: [":__package__"], + stubs_source_visibility: ["//visibility:private"], - // Currently, the stub source is not required for anything other than building - // the stubs library so is private to avoid misuse. - "//visibility:private", - ], + defaults_visibility: ["//visibility:private"], // Collates API usages from each module for further analysis. plugins: ["java_api_finder"], diff --git a/apex/OWNERS b/apex/OWNERS new file mode 100644 index 000000000000..97600135a103 --- /dev/null +++ b/apex/OWNERS @@ -0,0 +1,7 @@ +# Shared module build rule owners +per-file *.bp=hansson@google.com +per-file *.bp=jiyong@google.com + +# This file, and all other OWNERS files +per-file OWNERS=dariofreni@google.com +per-file OWNERS=hansson@google.com diff --git a/apex/extservices/Android.bp b/apex/extservices/Android.bp deleted file mode 100644 index 0c6c4c23dce1..000000000000 --- a/apex/extservices/Android.bp +++ /dev/null @@ -1,39 +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. - -apex { - name: "com.android.extservices", - defaults: ["com.android.extservices-defaults"], - manifest: "apex_manifest.json", -} - -apex_defaults { - name: "com.android.extservices-defaults", - updatable: true, - min_sdk_version: "current", - key: "com.android.extservices.key", - certificate: ":com.android.extservices.certificate", - apps: ["ExtServices"], -} - -apex_key { - name: "com.android.extservices.key", - public_key: "com.android.extservices.avbpubkey", - private_key: "com.android.extservices.pem", -} - -android_app_certificate { - name: "com.android.extservices.certificate", - certificate: "com.android.extservices", -} diff --git a/apex/extservices/apex_manifest.json b/apex/extservices/apex_manifest.json deleted file mode 100644 index b4acf1283d3e..000000000000 --- a/apex/extservices/apex_manifest.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "com.android.extservices", - "version": 300000000 -} diff --git a/apex/extservices/com.android.extservices.avbpubkey b/apex/extservices/com.android.extservices.avbpubkey Binary files differdeleted file mode 100644 index f37d3e4a14d4..000000000000 --- a/apex/extservices/com.android.extservices.avbpubkey +++ /dev/null diff --git a/apex/extservices/com.android.extservices.pem b/apex/extservices/com.android.extservices.pem deleted file mode 100644 index 7bfbd34ff9b9..000000000000 --- a/apex/extservices/com.android.extservices.pem +++ /dev/null @@ -1,51 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIJKAIBAAKCAgEAuYshVDiRkt3tmBhqcWkKOm5GcviKpLbHSPpYQDHGDwS0dqqL -SqAd1/BgT/bVVtUkAciFApPnXn96WhNYCypptyC5FHCxM21uBCGmow+3WermD++w -5dQk4QP2ONPIpG+KzOWBl9SiBud4SpOHDyr0JycBsrXS89Tln9kAsTDuDEFfXL/J -8cX/S3IUwhPV0pAlgUIHdDp0DGFjZaJlEZBZ+HmImriC/AUNUMVb5lfbczXOEZPF -0A9+JzYschfXUxn8nu1N7RN5GDbq+chszx1FMVhuFUheukkd4dLNSDl0O0RlUnD+ -C/xz1ilDzEVZhnMtMnxS9oJ8bA/HUVMfsFnaQbgGmQ0CcxFxnfbYyGXGG1H+b8vA -MTVQi5rZXG2p+VgHIAKVrYmpETVnRPgoMqp18KuGtp5SDngi13G3YEzS7iFbqfYh -6iW2G974nD/Dq0cSire8Oljd9PEaMCMZiP5PTFJp0G/mtw7ROoyZqsSM6rX3XVTo -Y5dBmBMctSJ8rgDMi0ZNvRH+rq/E5+RT6yMAJ7DDbOJzBnQ3IIoGn8NzUT3P1FCB -HYEp1U2N7QNirIQMAuVz3IlHae9N1kl3eGAO6f2CjV7vZmFpDeWw+KSYs71mRkOb -WBgl6D9FFq4u1azrU3AwV0dj3x1eU6yVnKUy1J7ppF/mcR+VzH7ThzTdV7cCAwEA -AQKCAgEApWFU2Mv/PYhg0bPZlLLKsiA+3RWaBo0AfpTd+oIjBpnr/OWweFjVoPcZ -8cyShe4/RPOlUxHgJcO8m/MoA/PO/LLHJWf5GlzMthQEgs1sYVJVtBiydXitUn+E -hUyIR8FAV7et1lZqAXtqJhbvSF7B9u/2vIMCv+GgtuTmkAmL9RKD3Jj6eG1CS84o -oICrkx52v4rKOBgt/icEQMAKFCi1eRti3n3eCqK6JqdzbZIcAcoQnmw34mccy/im -jx+fBuxf1oywa8NyqVmyAehazBVL6lrm7ENwY9zuLK4H2fuUFYu2QFCEsMxZt6da -TgX2cTfSLnDQRfcyzeMWhu9vjHHabjpLNjiCKhIhGyO0rO1rtea8ajZHgM/2sxXq -6gLynW0dlatlxmjANlN9WQPGNdzvcIFJ0TLnI4mlJnWpqCsN9iW1d4ey13WiZUVR -DgtnR60zao+LRCCM4D3cuVLq0DjL2BlHGXnOPK/LpQG1LbI1TroZpgSEHSZlQRzT -ql9txgNqTHxijXuPL2VhhwhW7cqDoO8sLwV3BqDMIH56U0cbUBiSA/G9fKeI/DEG -i7LcrMgrBk+xnuAWoFHuzfBMAdD9i3kYyk+41tOmcza2TNJgxadVYp5woHFvYvS/ -GKaNiRz0XmcijO5Ir0yxgCq21BdkWzo5zVrTFABiKeR7YXiee8kCggEBAOeULWgR -spolJJrACWJspRvKb9FGnbGiYOnCGJoAc751kuXmNxoyWnEwgcjrSEoayNPUfOtz -IgA+twqjgl0Zec2XFPfUcgWUBrrvvUEV4NIH5ibaR7ezHGeovCWs9XoDyzHHvhDr -c6T5kXFZ60rS5h6LGUnE1hkHFJoHuTIBbn9j7eIbri8S71i7HWQ04s4KuQ+Bwbxm -UnkEhbc+zMWHXfXy7rx4/eEZcZwtEybIORcHXYNPGeqMfOlcEMHpKEOi+NvDA6cp -vTaTSwJ6ZBgYh7Tw3bNgRxSknaIhcGwMD0ojStjC5xzXT1Zr2Z3GXwYvOGcq3MeZ -z+V2cx5xuwyp7R0CggEBAM0cKKNZEZwi/1zBPUDMFB4iJoX12BxQX6e5wdlHGXgF -XeZwCnaIxOxMDxH79M5Svmpdu/jkUijI/pRvcE1iohFyIBvTUSDmlAoy4keXqMEQ -M2hA+TwVA3JLmMcV8HKy/MFlwwKJB1JDcoxGjnXsM5UjVTD2jilO7vlJZs3+0ws0 -R7qzRT3ED25QTpZyDYcKE2otc5bzIZG3yAaJtWd3NugWsKpxDgr2RFUGJiHBq72n -48FkSjfgaDTn83zYcPvS0Uykb2ho8G/N+EurstL41n3nQo0I7FLbyptOopDDwsSp -Ndejn08NVAQ+xFAafOyqHkA3Ytpl0QCZDpMBuLdvw+MCggEAOVMt1kgjPRMat4/4 -ArxANtvqyBRB7vnyIYthiaW5ARmbrntJgpuaVdCbIABWGbn9oqpD7gjHDuZ3axPE -roUi6KiQkTSusQDOlbHI2Haw+2znJRD9ldSpoGNdh7oD3htYTk9Sll+ideEthrCq -lRAV1NO8A83M7c8Z43Mr/dvq3XAAL+uIN7DpPL687NRGnJh87QDC039ExR5Ad3b9 -O5xhvwNO46rTtcgVnoJt7ji8IR46oMmQ8cWrGh0nLMkppWyPS98/ZT7ozryxYcCo -TGquFTVWvBOGJO8G8l5ytNxbYI/R9Exy52nJAuyZpvu3BBHmVWt/0Y0asIOcxZmD -owPhZQKCAQAfWAFBzReq05JQe1s/7q/YVwGqEQKgeQvVFsbvzDSxKajK0S5YJNhq -/8iByA4GBZEBsidKhqGjh+uXhVwVB1Ca9+S+O9G3BGV1FYeMxzlLn40rjlpH+zIW -okTLj6e5724+o61kUspioNn9Y77beGf9j3OyUsswttZAFB54tktL+AZKGqEnKjHt -eqo3xWAZ1clXvXBfjfIAUaRok1y8XfRvDSCcO0CZHj8c+x6SpAT5q5FbeVb6KPnj -s9p6ppzFbtb7Llm0C+1KOKCL98YRBWPJw7Bg2w86LkpM53xiQPgfk3gd5uwuaWwA -ZhMb5qBWjjynNY+OrmZ8/+bBQk8XASZfAoIBAFkHOnZOD1JJQ0QvaJ9tuCgHi216 -I8QPMMTdm3ZEDHSYMNwl7ayeseBcmB2zaqBKYz75qcU0SK4lnZkR2wIpbsHZNSVM -J0WpN6r9G4JdnVi11J04RsfSMjCUr/PTVMmPvw8xPHrCxkJmB+d56olSE80I1Jrx -djCv1LtSsT10W7FIcY82/cOi4xxGLOA70lDCf+szofQgVP8WvuOA1YaFw98ca8zc -A401CyNexk24/c3d6C19YW/MppdE0uGMxL/oHsPgwkZAf6LmvF/UF71PsBUEniLc -YFaJl3wn1cPfBBo9L4sZzyP2qokL8YHdg+wW7b4IOsYwbeqceBvqPtcUUPs= ------END RSA PRIVATE KEY----- diff --git a/apex/extservices/com.android.extservices.pk8 b/apex/extservices/com.android.extservices.pk8 Binary files differdeleted file mode 100644 index 59585a212592..000000000000 --- a/apex/extservices/com.android.extservices.pk8 +++ /dev/null diff --git a/apex/extservices/com.android.extservices.x509.pem b/apex/extservices/com.android.extservices.x509.pem deleted file mode 100644 index e0343b81d279..000000000000 --- a/apex/extservices/com.android.extservices.x509.pem +++ /dev/null @@ -1,36 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIGLTCCBBWgAwIBAgIUdqdMmx/5OsCP3Ew3/hcr7+1ACHEwDQYJKoZIhvcNAQEL -BQAwgaQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH -DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy -b2lkMSAwHgYDVQQDDBdjb20uYW5kcm9pZC5leHRzZXJ2aWNlczEiMCAGCSqGSIb3 -DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAgFw0yMDAxMTcxMDIxMzZaGA80NzU3 -MTIxMzEwMjEzNlowgaQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlh -MRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYD -VQQLDAdBbmRyb2lkMSAwHgYDVQQDDBdjb20uYW5kcm9pZC5leHRzZXJ2aWNlczEi -MCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANKaSeLGaFRRt779vAtTfG3t2aQZrWOByUYc7yUN -RdmJqWxU47OL5urYmanWPbz2f972Q9oi8x+8y4ny9SEY3wg0pUbzvKNTXpkxWyG1 -HE2C2zTfzuDDLpDIf2usWynt1wLVhpYC3k+7Yv2vOIK5dKkezh6PfdKmsbDae5DE -d22tTSYZ5KwNpIWrgQle26cRG5sqhAFdkpgGMF00Huz06cjUoTjs2sNSlXTRBOTP -CCy8UoRjBivQZkwHbddfsn+Z22ARPG8JDg/n4mEi8C0T6bJeQeirSPkBCkD6Djgq -7RddJ2eLYZII8l8r6A6x+6cnTkXHaV5g3LUwPvi8XEn9IUuT9WJNRje/vfYLycTQ -kP415CZMxDvsi1Ul4YsbL3enE89ryGMTpVZPogch/36DG5Sye28yISItNUy3urJa -OXbg7mh+MwPd4bQaW4CJk+AUweKaF4aV0SZFT+nCewL4xLdGdy889KazlW98NqtK -hOSxIg1jHkZq48ajuq2A+ns1yDKt1l0f9IYCz3mz/IXInokbkjPvHahJTJ+OMHXO -THD8e5gBzcK841jJk+H3EsIYOHsp66uy2IgEHN+9pAS6vI0xfrXOYuKzuSL3oxcV -FlVTimt4xokMMerdcW4KD+MC5NFEip4DUS4JKCyG0wRI3ffEs9Zcpxi3QSibrjLW -rz+hAgMBAAGjUzBRMB0GA1UdDgQWBBTP2AhZzEUUgtAFlkaMaq+RvY06fDAfBgNV -HSMEGDAWgBTP2AhZzEUUgtAFlkaMaq+RvY06fDAPBgNVHRMBAf8EBTADAQH/MA0G -CSqGSIb3DQEBCwUAA4ICAQCbwtfo37j62Sudmt32PCfRN/r5ZNDNNA2JhR8uDUmX -xXfF5YfDvSKsNLiQKcDagu6a+0C+QnzXHXCBlXZFrTJ8NAVMlmqdHGwoFoYMfJZH -R1lCTidyFMoMLJ8GRGPJjzDkKnOeAqKMCtKvXoH2r12+JB2/ov4ooLREu/wPkEXT -OymkyWNP5XLQTKWqfEQyXXFpuwZ+m35Wkr0Fm92mZeJpVeIZPK7M7aK3zyoj7XJP -YLMsR/AQs8OULdpfNMddAuN3ndlYu03LZlsF6LG5bduaDDcESJ5hdJrgBa/NBKRU -IbS+q/6WAjYKMNRT/fPGew4wUzlWKi1Ihdk79oaqKKijE1b2JSJD1/SEYiBf+JPE -bXobUrMbBwFpdhT+YLMF9FsuPQKsUIONaWiO4QcQoY/rQwGxPP6fV8ZbBrUWJewj -MpSdU9foZNa/TmOAgfS/JxH+nXnG4+H1m8mdNBsxvsYmF2ZuGb/jdEeA2cuHIJDZ -FJeWwCFxzlCGZJaUsxsnZByADBuufUVaO/9gGs0YQC/JP1i9hK4DyZdKwZpXdLi2 -Nw27Qma4WEIZnMb6Rgk1nTV+7ALcOSIhGgFOOeDTuCGfnEcz2coai5fbD/K6Q7Xu -IRNyxHQjheZPdei2x912Ex/KqKGfaFaZJxrvCSKdhzxcTFIsO4JuZs+SDpRTKcI7 -Cw== ------END CERTIFICATE----- diff --git a/apex/extservices/testing/Android.bp b/apex/extservices/testing/Android.bp deleted file mode 100644 index 88a47246c824..000000000000 --- a/apex/extservices/testing/Android.bp +++ /dev/null @@ -1,25 +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. - -apex_test { - name: "test_com.android.extservices", - visibility: [ - "//system/apex/tests", - ], - defaults: ["com.android.extservices-defaults"], - manifest: "test_manifest.json", - file_contexts: ":com.android.extservices-file_contexts", - // Test APEX, should never be installed - installable: false, -} diff --git a/apex/extservices/testing/test_manifest.json b/apex/extservices/testing/test_manifest.json deleted file mode 100644 index 23a50e37bdd3..000000000000 --- a/apex/extservices/testing/test_manifest.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "com.android.extservices", - "version": 2147483647 -} diff --git a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java index d54d857ffcd6..ed818f6ad9b5 100644 --- a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java +++ b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import java.lang.annotation.Retention; @@ -35,7 +34,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi @SystemService(Context.POWER_WHITELIST_MANAGER) public class PowerWhitelistManager { private final Context mContext; diff --git a/apex/media/framework/Android.bp b/apex/media/framework/Android.bp index 4417b681efc3..228e9baeba4c 100644 --- a/apex/media/framework/Android.bp +++ b/apex/media/framework/Android.bp @@ -35,7 +35,6 @@ java_library { libs: [ "framework_media_annotation", ], - static_libs: [ "exoplayer2-extractor" ], @@ -44,7 +43,6 @@ java_library { plugins: ["java_api_finder"], hostdex: true, // for hiddenapi check - visibility: ["//frameworks/av/apex:__subpackages__"], apex_available: [ "com.android.media", "test_com.android.media", @@ -83,7 +81,7 @@ filegroup { "java/android/media/MediaParser.java" ], path: "java", -} +} java_sdk_library { name: "framework-media", @@ -99,21 +97,35 @@ java_sdk_library { libs: [ "framework_media_annotation", ], - - // Allow access to the stubs from anywhere. - visibility: ["//visibility:public"], - - // Restrict access to implementation library. - impl_library_visibility: [ - "//visibility:override", // Ignore the visibility property. - "//frameworks/av/apex:__subpackages__", - ], + impl_library_visibility: ["//frameworks/av/apex:__subpackages__"], } - java_library { name: "framework_media_annotation", srcs: [":framework-media-annotation-srcs"], installable: false, sdk_version: "core_current", } + +cc_library_shared { + name: "libmediaparser-jni", + srcs: [ + "jni/android_media_MediaParserJNI.cpp", + ], + 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/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index e4b5d19e67c9..8bdca766e0dd 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -75,6 +75,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; 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. @@ -882,6 +884,7 @@ public final class MediaParser { // 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"; @@ -889,6 +892,14 @@ public final class MediaParser { 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 = { @@ -920,7 +931,7 @@ public final class MediaParser { @NonNull @ParserName String name, @NonNull OutputConsumer outputConsumer) { String[] nameAsArray = new String[] {name}; assertValidNames(nameAsArray); - return new MediaParser(outputConsumer, /* sniff= */ false, name); + return new MediaParser(outputConsumer, /* createdByName= */ true, name); } /** @@ -940,7 +951,7 @@ public final class MediaParser { if (parserNames.length == 0) { parserNames = EXTRACTOR_FACTORIES_BY_NAME.keySet().toArray(new String[0]); } - return new MediaParser(outputConsumer, /* sniff= */ true, parserNames); + return new MediaParser(outputConsumer, /* createdByName= */ false, parserNames); } // Misc static methods. @@ -1052,6 +1063,14 @@ public final class MediaParser { private long mPendingSeekPosition; private long mPendingSeekTimeMicros; private boolean mLoggedSchemeInitDataCreationException; + private boolean mReleased; + + // MediaMetrics fields. + private final boolean mCreatedByName; + private final SparseArray<Format> mTrackFormats; + private String mLastObservedExceptionName; + private long mDurationMillis; + private long mResourceByteCount; // Public methods. @@ -1166,11 +1185,15 @@ public final class MediaParser { 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(), - seekableInputReader.getLength()); + mExoDataReader, seekableInputReader.getPosition(), resourceLength); } mExoDataReader.mInputReader = seekableInputReader; @@ -1195,7 +1218,10 @@ public final class MediaParser { } } if (mExtractor == null) { - throw UnrecognizedInputFormatException.createForExtractors(mParserNamesPool); + UnrecognizedInputFormatException exception = + UnrecognizedInputFormatException.createForExtractors(mParserNamesPool); + mLastObservedExceptionName = exception.getClass().getName(); + throw exception; } return true; } @@ -1223,8 +1249,13 @@ public final class MediaParser { int result; try { result = mExtractor.read(mExtractorInput, mPositionHolder); - } catch (ParserException e) { - throw new ParsingException(e); + } 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; @@ -1264,21 +1295,64 @@ public final class MediaParser { * invoked. */ public void release() { - // TODO: Dump media metrics here. 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( + mParserName, + mCreatedByName, + String.join(MEDIAMETRICS_ELEMENT_SEPARATOR, mParserNamesPool), + mLastObservedExceptionName, + addDither(mResourceByteCount), + addDither(mDurationMillis), + trackMimeTypes, + trackCodecs, + alteredParameters, + videoWidth, + videoHeight); } // Private methods. - private MediaParser(OutputConsumer outputConsumer, boolean sniff, String... parserNamesPool) { + 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; - mParserName = sniff ? PARSER_NAME_UNKNOWN : parserNamesPool[0]; + mCreatedByName = createdByName; + mParserName = createdByName ? parserNamesPool[0] : PARSER_NAME_UNKNOWN; mPositionHolder = new PositionHolder(); mExoDataReader = new InputReadingDataReader(); removePendingSeek(); @@ -1286,6 +1360,24 @@ public final class MediaParser { 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) { @@ -1528,6 +1620,10 @@ public final class MediaParser { @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(); @@ -1575,6 +1671,7 @@ public final class MediaParser { @Override public void format(Format format) { + mTrackFormats.put(mTrackIndex, format); mOutputConsumer.onTrackDataFound( mTrackIndex, new TrackData( @@ -2031,6 +2128,20 @@ public final class MediaParser { 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)) { @@ -2070,9 +2181,26 @@ public final class MediaParser { } } + // Native methods. + + private native void nativeSubmitMetrics( + 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, @@ -2125,6 +2253,15 @@ public final class MediaParser { // 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/jni/android_media_MediaParserJNI.cpp b/apex/media/framework/jni/android_media_MediaParserJNI.cpp new file mode 100644 index 000000000000..7fc4628984f5 --- /dev/null +++ b/apex/media/framework/jni/android_media_MediaParserJNI.cpp @@ -0,0 +1,92 @@ +/* + * 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 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 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, 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/permission/Android.bp b/apex/permission/Android.bp index 71a52bb216ea..e30df05b2340 100644 --- a/apex/permission/Android.bp +++ b/apex/permission/Android.bp @@ -21,7 +21,7 @@ apex { apex_defaults { name: "com.android.permission-defaults", updatable: true, - min_sdk_version: "R", + min_sdk_version: "30", key: "com.android.permission.key", certificate: ":com.android.permission.certificate", java_libs: [ diff --git a/apex/permission/apex_manifest.json b/apex/permission/apex_manifest.json index 7960598affa3..eb2767f268a6 100644 --- a/apex/permission/apex_manifest.json +++ b/apex/permission/apex_manifest.json @@ -1,4 +1,4 @@ { "name": "com.android.permission", - "version": 300000000 + "version": 309999900 } diff --git a/apex/permission/framework/Android.bp b/apex/permission/framework/Android.bp index be553feb1d34..c0560f61460f 100644 --- a/apex/permission/framework/Android.bp +++ b/apex/permission/framework/Android.bp @@ -25,14 +25,8 @@ java_sdk_library { name: "framework-permission", defaults: ["framework-module-defaults"], - // Allow access to the stubs from anywhere. - visibility: ["//visibility:public"], - // Restrict access to implementation library. - impl_library_visibility: [ - "//visibility:override", // Ignore the visibility property. - "//frameworks/base/apex/permission:__subpackages__", - ], + impl_library_visibility: ["//frameworks/base/apex/permission:__subpackages__"], srcs: [ ":framework-permission-sources", diff --git a/apex/permission/service/Android.bp b/apex/permission/service/Android.bp index 7f3187949712..b7d843352d8e 100644 --- a/apex/permission/service/Android.bp +++ b/apex/permission/service/Android.bp @@ -23,15 +23,7 @@ filegroup { java_sdk_library { name: "service-permission", defaults: ["framework-system-server-module-defaults"], - visibility: [ - "//frameworks/base/services/core", - "//frameworks/base/apex/permission", - "//frameworks/base/apex/permission/testing", - "//frameworks/base/apex/permission/tests", - "//frameworks/base/services/tests/mockingservicestests", - ], impl_library_visibility: [ - "//visibility:override", "//frameworks/base/apex/permission/tests", "//frameworks/base/services/tests/mockingservicestests", "//frameworks/base/services/tests/servicestests", diff --git a/apex/statsd/Android.bp b/apex/statsd/Android.bp index e75fa88c54fe..d1148f8107c0 100644 --- a/apex/statsd/Android.bp +++ b/apex/statsd/Android.bp @@ -33,7 +33,7 @@ apex_defaults { prebuilts: ["com.android.os.statsd.init.rc"], name: "com.android.os.statsd-defaults", updatable: true, - min_sdk_version: "R", + min_sdk_version: "30", key: "com.android.os.statsd.key", certificate: ":com.android.os.statsd.certificate", } diff --git a/apex/statsd/aidl/android/os/IStatsCompanionService.aidl b/apex/statsd/aidl/android/os/IStatsCompanionService.aidl index 5cdb3249501b..d56a4bd0a8e5 100644 --- a/apex/statsd/aidl/android/os/IStatsCompanionService.aidl +++ b/apex/statsd/aidl/android/os/IStatsCompanionService.aidl @@ -27,17 +27,6 @@ interface IStatsCompanionService { oneway void statsdReady(); /** - * Register an alarm for anomaly detection to fire at the given timestamp (ms since epoch). - * If anomaly alarm had already been registered, it will be replaced with the new timestamp. - * Uses AlarmManager.set API, so if the timestamp is in the past, alarm fires immediately, and - * alarm is inexact. - */ - oneway void setAnomalyAlarm(long timestampMs); - - /** Cancel any anomaly detection alarm. */ - oneway void cancelAnomalyAlarm(); - - /** * Register a repeating alarm for pulling to fire at the given timestamp and every * intervalMs thereafter (in ms since epoch). * If polling alarm had already been registered, it will be replaced by new one. diff --git a/apex/statsd/aidl/android/os/IStatsd.aidl b/apex/statsd/aidl/android/os/IStatsd.aidl index 0d3f4208a2ab..066412a9f157 100644 --- a/apex/statsd/aidl/android/os/IStatsd.aidl +++ b/apex/statsd/aidl/android/os/IStatsd.aidl @@ -42,13 +42,6 @@ interface IStatsd { void statsCompanionReady(); /** - * Tells statsd that an anomaly may have occurred, so statsd can check whether this is so and - * act accordingly. - * Two-way binder call so that caller's method (and corresponding wakelocks) will linger. - */ - void informAnomalyAlarmFired(); - - /** * Tells statsd that it is time to poll some stats. Statsd will be responsible for determing * what stats to poll and initiating the polling. * Two-way binder call so that caller's method (and corresponding wakelocks) will linger. diff --git a/apex/statsd/apex_manifest.json b/apex/statsd/apex_manifest.json index e2972e700880..1d029c61b4bf 100644 --- a/apex/statsd/apex_manifest.json +++ b/apex/statsd/apex_manifest.json @@ -1,5 +1,5 @@ { "name": "com.android.os.statsd", - "version": 300000000 + "version": 309999900 } diff --git a/apex/statsd/framework/Android.bp b/apex/statsd/framework/Android.bp index d19faa97e223..09ab56384761 100644 --- a/apex/statsd/framework/Android.bp +++ b/apex/statsd/framework/Android.bp @@ -71,19 +71,7 @@ java_sdk_library { hostdex: true, // for hiddenapi check - visibility: [ - "//frameworks/base", // Framework - "//frameworks/base/apex/statsd:__subpackages__", // statsd apex - "//frameworks/base/packages/Tethering", // Tethering - "//frameworks/opt/net/wifi/service", // wifi service - "//packages/providers/MediaProvider", // MediaProvider apk - ], - - // Restrict access to implementation library. - impl_library_visibility: [ - "//visibility:override", // Ignore the visibility property. - "//frameworks/base/apex/statsd:__subpackages__", // statsd apex - ], + impl_library_visibility: ["//frameworks/base/apex/statsd/framework/test:__subpackages__"], apex_available: [ "com.android.os.statsd", diff --git a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java index cbc8ed636ff2..b5e72247a4a3 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsCompanionService.java @@ -100,7 +100,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private static IStatsd sStatsd; private static final Object sStatsdLock = new Object(); - private final OnAlarmListener mAnomalyAlarmListener; private final OnAlarmListener mPullingAlarmListener; private final OnAlarmListener mPeriodicAlarmListener; @@ -124,7 +123,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { handlerThread.start(); mHandler = new CompanionHandler(handlerThread.getLooper()); - mAnomalyAlarmListener = new AnomalyAlarmListener(context); mPullingAlarmListener = new PullingAlarmListener(context); mPeriodicAlarmListener = new PeriodicAlarmListener(context); } @@ -336,41 +334,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } } - public static final class AnomalyAlarmListener implements OnAlarmListener { - private final Context mContext; - - AnomalyAlarmListener(Context context) { - mContext = context; - } - - @Override - public void onAlarm() { - if (DEBUG) { - Log.i(TAG, "StatsCompanionService believes an anomaly has occurred at time " - + System.currentTimeMillis() + "ms."); - } - IStatsd statsd = getStatsdNonblocking(); - if (statsd == null) { - Log.w(TAG, "Could not access statsd to inform it of anomaly alarm firing"); - return; - } - - // Wakelock needs to be retained while calling statsd. - Thread thread = new WakelockThread(mContext, - AnomalyAlarmListener.class.getCanonicalName(), new Runnable() { - @Override - public void run() { - try { - statsd.informAnomalyAlarmFired(); - } catch (RemoteException e) { - Log.w(TAG, "Failed to inform statsd of anomaly alarm firing", e); - } - } - }); - thread.start(); - } - } - public final static class PullingAlarmListener implements OnAlarmListener { private final Context mContext; @@ -469,34 +432,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } @Override // Binder call - public void setAnomalyAlarm(long timestampMs) { - StatsCompanion.enforceStatsdCallingUid(); - if (DEBUG) Log.d(TAG, "Setting anomaly alarm for " + timestampMs); - final long callingToken = Binder.clearCallingIdentity(); - try { - // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will - // only fire when it awakens. - // AlarmManager will automatically cancel any previous mAnomalyAlarmListener alarm. - mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, TAG + ".anomaly", - mAnomalyAlarmListener, mHandler); - } finally { - Binder.restoreCallingIdentity(callingToken); - } - } - - @Override // Binder call - public void cancelAnomalyAlarm() { - StatsCompanion.enforceStatsdCallingUid(); - if (DEBUG) Log.d(TAG, "Cancelling anomaly alarm"); - final long callingToken = Binder.clearCallingIdentity(); - try { - mAlarmManager.cancel(mAnomalyAlarmListener); - } finally { - Binder.restoreCallingIdentity(callingToken); - } - } - - @Override // Binder call public void setAlarmForSubscriberTriggering(long timestampMs) { StatsCompanion.enforceStatsdCallingUid(); if (DEBUG) { @@ -666,7 +601,6 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { // instead of in binder death because statsd can come back and set different alarms, or not // want to set an alarm when it had been set. This guarantees that when we get a new statsd, // we cancel any alarms before it is able to set them. - cancelAnomalyAlarm(); cancelPullingAlarm(); cancelAlarmForSubscriberTriggering(); diff --git a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java index 97846f2397a5..1e3846bc4a0b 100644 --- a/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java +++ b/apex/statsd/service/java/com/android/server/stats/StatsManagerService.java @@ -27,6 +27,7 @@ import android.os.Binder; import android.os.IPullAtomCallback; import android.os.IStatsManagerService; import android.os.IStatsd; +import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; import android.util.ArrayMap; @@ -412,8 +413,13 @@ public class StatsManagerService extends IStatsManagerService.Stub { @Override public byte[] getData(long key, String packageName) throws IllegalStateException { enforceDumpAndUsageStatsPermission(packageName); + PowerManager powerManager = (PowerManager) + mContext.getSystemService(Context.POWER_SERVICE); + PowerManager.WakeLock wl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + /*tag=*/ StatsManagerService.class.getCanonicalName()); int callingUid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); + wl.acquire(); try { IStatsd statsd = waitForStatsd(); if (statsd != null) { @@ -423,6 +429,7 @@ public class StatsManagerService extends IStatsManagerService.Stub { Log.e(TAG, "Failed to getData with statsd"); throw new IllegalStateException(e.getMessage(), e); } finally { + wl.release(); Binder.restoreCallingIdentity(token); } throw new IllegalStateException("Failed to connect to statsd to getData"); diff --git a/api/current.txt b/api/current.txt index 952ccdad992c..a586dd2f4601 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3712,7 +3712,7 @@ package android.app { ctor public ActionBar.LayoutParams(int); ctor public ActionBar.LayoutParams(android.app.ActionBar.LayoutParams); ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams); - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=0xffffffff, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.NO_GRAVITY, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.TOP, to="TOP"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.BOTTOM, to="BOTTOM"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.LEFT, to="LEFT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.RIGHT, to="RIGHT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.START, to="START"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.END, to="END"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_VERTICAL, to="CENTER_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_VERTICAL, to="FILL_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_HORIZONTAL, to="CENTER_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_HORIZONTAL, to="FILL_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL, to="FILL")}) public int gravity; + field public int gravity; } public static interface ActionBar.OnMenuVisibilityListener { @@ -10092,7 +10092,7 @@ package android.content { method public final <T> T getSystemService(@NonNull Class<T>); method @Nullable public abstract String getSystemServiceName(@NonNull Class<?>); method @NonNull public final CharSequence getText(@StringRes int); - method @android.view.ViewDebug.ExportedProperty(deepExport=true) public abstract android.content.res.Resources.Theme getTheme(); + method public abstract android.content.res.Resources.Theme getTheme(); method @Deprecated public abstract android.graphics.drawable.Drawable getWallpaper(); method @Deprecated public abstract int getWallpaperDesiredMinimumHeight(); method @Deprecated public abstract int getWallpaperDesiredMinimumWidth(); @@ -53838,13 +53838,13 @@ package android.view { method @Nullable public CharSequence getAccessibilityPaneTitle(); method @IdRes public int getAccessibilityTraversalAfter(); method @IdRes public int getAccessibilityTraversalBefore(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getAlpha(); + method public float getAlpha(); method public android.view.animation.Animation getAnimation(); method @Nullable public android.graphics.Matrix getAnimationMatrix(); method public android.os.IBinder getApplicationWindowToken(); method @NonNull public int[] getAttributeResolutionStack(@AttrRes int); method @NonNull public java.util.Map<java.lang.Integer,java.lang.Integer> getAttributeSourceResourceMap(); - method @android.view.ViewDebug.ExportedProperty @Nullable public String[] getAutofillHints(); + method @Nullable public String[] getAutofillHints(); method public final android.view.autofill.AutofillId getAutofillId(); method public int getAutofillType(); method @Nullable public android.view.autofill.AutofillValue getAutofillValue(); @@ -53852,8 +53852,8 @@ package android.view { method @Nullable public android.graphics.BlendMode getBackgroundTintBlendMode(); method @Nullable public android.content.res.ColorStateList getBackgroundTintList(); method @Nullable public android.graphics.PorterDuff.Mode getBackgroundTintMode(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public int getBaseline(); - method @android.view.ViewDebug.CapturedViewProperty public final int getBottom(); + method public int getBaseline(); + method public final int getBottom(); method protected float getBottomFadingEdgeStrength(); method protected int getBottomPaddingOffset(); method public float getCameraDistance(); @@ -53861,10 +53861,10 @@ package android.view { method public boolean getClipBounds(android.graphics.Rect); method public final boolean getClipToOutline(); method @Nullable public final android.view.contentcapture.ContentCaptureSession getContentCaptureSession(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility") public CharSequence getContentDescription(); - method @android.view.ViewDebug.CapturedViewProperty public final android.content.Context getContext(); + method public CharSequence getContentDescription(); + method public final android.content.Context getContext(); method protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean getDefaultFocusHighlightEnabled(); + method public final boolean getDefaultFocusHighlightEnabled(); method public static int getDefaultSize(int, int); method public android.view.Display getDisplay(); method public final int[] getDrawableState(); @@ -53874,11 +53874,11 @@ package android.view { method @Deprecated public int getDrawingCacheQuality(); method public void getDrawingRect(android.graphics.Rect); method public long getDrawingTime(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getElevation(); + method public float getElevation(); method @StyleRes public int getExplicitStyle(); - method @android.view.ViewDebug.ExportedProperty public boolean getFilterTouchesWhenObscured(); - method @android.view.ViewDebug.ExportedProperty public boolean getFitsSystemWindows(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.NOT_FOCUSABLE, to="NOT_FOCUSABLE"), @android.view.ViewDebug.IntToString(from=android.view.View.FOCUSABLE, to="FOCUSABLE"), @android.view.ViewDebug.IntToString(from=android.view.View.FOCUSABLE_AUTO, to="FOCUSABLE_AUTO")}, category="focus") public int getFocusable(); + method public boolean getFilterTouchesWhenObscured(); + method public boolean getFitsSystemWindows(); + method public int getFocusable(); method public java.util.ArrayList<android.view.View> getFocusables(int); method public void getFocusedRect(android.graphics.Rect); method public android.graphics.drawable.Drawable getForeground(); @@ -53890,23 +53890,23 @@ package android.view { method public final boolean getGlobalVisibleRect(android.graphics.Rect); method public android.os.Handler getHandler(); method public final boolean getHasOverlappingRendering(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public final int getHeight(); + method public final int getHeight(); method public void getHitRect(android.graphics.Rect); method public int getHorizontalFadingEdgeLength(); method protected int getHorizontalScrollbarHeight(); method @Nullable public android.graphics.drawable.Drawable getHorizontalScrollbarThumbDrawable(); method @Nullable public android.graphics.drawable.Drawable getHorizontalScrollbarTrackDrawable(); - method @android.view.ViewDebug.CapturedViewProperty @IdRes public int getId(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS, to="noHideDescendants")}) public int getImportantForAccessibility(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForAutofill(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture(); + method @IdRes public int getId(); + method public int getImportantForAccessibility(); + method public int getImportantForAutofill(); + method public int getImportantForContentCapture(); method public boolean getKeepScreenOn(); method public android.view.KeyEvent.DispatcherState getKeyDispatcherState(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility") @IdRes public int getLabelFor(); + method @IdRes public int getLabelFor(); method public int getLayerType(); - method @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_LTR, to="RESOLVED_DIRECTION_LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_RTL, to="RESOLVED_DIRECTION_RTL")}) public int getLayoutDirection(); - method @android.view.ViewDebug.ExportedProperty(deepExport=true, prefix="layout_") public android.view.ViewGroup.LayoutParams getLayoutParams(); - method @android.view.ViewDebug.CapturedViewProperty public final int getLeft(); + method public int getLayoutDirection(); + method public android.view.ViewGroup.LayoutParams getLayoutParams(); + method public final int getLeft(); method protected float getLeftFadingEdgeStrength(); method protected int getLeftPaddingOffset(); method public final boolean getLocalVisibleRect(android.graphics.Rect); @@ -53915,10 +53915,10 @@ package android.view { method public void getLocationOnScreen(@Size(2) int[]); method public android.graphics.Matrix getMatrix(); method public final int getMeasuredHeight(); - method @android.view.ViewDebug.ExportedProperty(category="measurement", flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.View.MEASURED_STATE_MASK, equals=android.view.View.MEASURED_STATE_TOO_SMALL, name="MEASURED_STATE_TOO_SMALL")}) public final int getMeasuredHeightAndState(); + method public final int getMeasuredHeightAndState(); method public final int getMeasuredState(); method public final int getMeasuredWidth(); - method @android.view.ViewDebug.ExportedProperty(category="measurement", flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.View.MEASURED_STATE_MASK, equals=android.view.View.MEASURED_STATE_TOO_SMALL, name="MEASURED_STATE_TOO_SMALL")}) public final int getMeasuredWidthAndState(); + method public final int getMeasuredWidthAndState(); method public int getMinimumHeight(); method public int getMinimumWidth(); method @IdRes public int getNextClusterForwardId(); @@ -53941,51 +53941,51 @@ package android.view { method public int getPaddingTop(); method public final android.view.ViewParent getParent(); method public android.view.ViewParent getParentForAccessibility(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getPivotX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getPivotY(); + method public float getPivotX(); + method public float getPivotY(); method public android.view.PointerIcon getPointerIcon(); method public android.content.res.Resources getResources(); method public final boolean getRevealOnFocusHint(); - method @android.view.ViewDebug.CapturedViewProperty public final int getRight(); + method public final int getRight(); method protected float getRightFadingEdgeStrength(); method protected int getRightPaddingOffset(); method public android.view.View getRootView(); method public android.view.WindowInsets getRootWindowInsets(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotation(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotationX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotationY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getScaleX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getScaleY(); + method public float getRotation(); + method public float getRotationX(); + method public float getRotationY(); + method public float getScaleX(); + method public float getScaleY(); method public int getScrollBarDefaultDelayBeforeFade(); method public int getScrollBarFadeDuration(); method public int getScrollBarSize(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_INSIDE_OVERLAY, to="INSIDE_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_INSIDE_INSET, to="INSIDE_INSET"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_OUTSIDE_OVERLAY, to="OUTSIDE_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_OUTSIDE_INSET, to="OUTSIDE_INSET")}) public int getScrollBarStyle(); + method public int getScrollBarStyle(); method public int getScrollIndicators(); method public final int getScrollX(); method public final int getScrollY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") @ColorInt public int getSolidColor(); + method @ColorInt public int getSolidColor(); method @LayoutRes public int getSourceLayoutResId(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility") @Nullable public final CharSequence getStateDescription(); + method @Nullable public final CharSequence getStateDescription(); method public android.animation.StateListAnimator getStateListAnimator(); method protected int getSuggestedMinimumHeight(); method protected int getSuggestedMinimumWidth(); method @NonNull public java.util.List<android.graphics.Rect> getSystemGestureExclusionRects(); method @Deprecated public int getSystemUiVisibility(); - method @android.view.ViewDebug.ExportedProperty public Object getTag(); + method public Object getTag(); method public Object getTag(int); - method @android.view.ViewDebug.ExportedProperty(category="text", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_INHERIT, to="INHERIT"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_GRAVITY, to="GRAVITY"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_TEXT_START, to="TEXT_START"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_TEXT_END, to="TEXT_END"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_VIEW_START, to="VIEW_START"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_VIEW_END, to="VIEW_END")}) public int getTextAlignment(); - method @android.view.ViewDebug.ExportedProperty(category="text", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_INHERIT, to="INHERIT"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG, to="FIRST_STRONG"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_ANY_RTL, to="ANY_RTL"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_LTR, to="LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_RTL, to="RTL"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_LOCALE, to="LOCALE"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG_LTR, to="FIRST_STRONG_LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG_RTL, to="FIRST_STRONG_RTL")}) public int getTextDirection(); + method public int getTextAlignment(); + method public int getTextDirection(); method @Nullable public CharSequence getTooltipText(); - method @android.view.ViewDebug.CapturedViewProperty public final int getTop(); + method public final int getTop(); method protected float getTopFadingEdgeStrength(); method protected int getTopPaddingOffset(); method public android.view.TouchDelegate getTouchDelegate(); method public java.util.ArrayList<android.view.View> getTouchables(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTransitionAlpha(); - method @android.view.ViewDebug.ExportedProperty public String getTransitionName(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationZ(); + method public float getTransitionAlpha(); + method public String getTransitionName(); + method public float getTranslationX(); + method public float getTranslationY(); + method public float getTranslationZ(); method public long getUniqueDrawingId(); method public int getVerticalFadingEdgeLength(); method public int getVerticalScrollbarPosition(); @@ -53993,8 +53993,8 @@ package android.view { method @Nullable public android.graphics.drawable.Drawable getVerticalScrollbarTrackDrawable(); method public int getVerticalScrollbarWidth(); method public android.view.ViewTreeObserver getViewTreeObserver(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.VISIBLE, to="VISIBLE"), @android.view.ViewDebug.IntToString(from=android.view.View.INVISIBLE, to="INVISIBLE"), @android.view.ViewDebug.IntToString(from=android.view.View.GONE, to="GONE")}) public int getVisibility(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public final int getWidth(); + method public int getVisibility(); + method public final int getWidth(); method protected int getWindowAttachCount(); method public android.view.WindowId getWindowId(); method @Nullable public android.view.WindowInsetsController getWindowInsetsController(); @@ -54002,18 +54002,18 @@ package android.view { method public android.os.IBinder getWindowToken(); method public int getWindowVisibility(); method public void getWindowVisibleDisplayFrame(android.graphics.Rect); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getZ(); + method public float getX(); + method public float getY(); + method public float getZ(); method public boolean hasExplicitFocusable(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean hasFocus(); + method public boolean hasFocus(); method public boolean hasFocusable(); method public boolean hasNestedScrollingParent(); method public boolean hasOnClickListeners(); method public boolean hasOnLongClickListeners(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean hasOverlappingRendering(); + method public boolean hasOverlappingRendering(); method public boolean hasPointerCapture(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public boolean hasTransientState(); + method public boolean hasTransientState(); method public boolean hasWindowFocus(); method public static android.view.View inflate(android.content.Context, @LayoutRes int, android.view.ViewGroup); method @Deprecated public void invalidate(android.graphics.Rect); @@ -54023,50 +54023,50 @@ package android.view { method public void invalidateOutline(); method public boolean isAccessibilityFocused(); method public boolean isAccessibilityHeading(); - method @android.view.ViewDebug.ExportedProperty public boolean isActivated(); + method public boolean isActivated(); method public boolean isAttachedToWindow(); - method @android.view.ViewDebug.ExportedProperty public boolean isClickable(); + method public boolean isClickable(); method public boolean isContextClickable(); method public boolean isDirty(); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isDrawingCacheEnabled(); + method @Deprecated public boolean isDrawingCacheEnabled(); method public boolean isDuplicateParentStateEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusable(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusableInTouchMode(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean isFocused(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusedByDefault(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isForceDarkAllowed(); - method @android.view.ViewDebug.ExportedProperty public boolean isHapticFeedbackEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isHardwareAccelerated(); + method public boolean isEnabled(); + method public final boolean isFocusable(); + method public final boolean isFocusableInTouchMode(); + method public boolean isFocused(); + method public final boolean isFocusedByDefault(); + method public boolean isForceDarkAllowed(); + method public boolean isHapticFeedbackEnabled(); + method public boolean isHardwareAccelerated(); method public boolean isHorizontalFadingEdgeEnabled(); method public boolean isHorizontalScrollBarEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isHovered(); + method public boolean isHovered(); method public boolean isImportantForAccessibility(); method public final boolean isImportantForAutofill(); method public final boolean isImportantForContentCapture(); method public boolean isInEditMode(); method public boolean isInLayout(); - method @android.view.ViewDebug.ExportedProperty public boolean isInTouchMode(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isKeyboardNavigationCluster(); + method public boolean isInTouchMode(); + method public final boolean isKeyboardNavigationCluster(); method public boolean isLaidOut(); method public boolean isLayoutDirectionResolved(); method public boolean isLayoutRequested(); method public boolean isLongClickable(); method public boolean isNestedScrollingEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isOpaque(); + method public boolean isOpaque(); method protected boolean isPaddingOffsetRequired(); method public boolean isPaddingRelative(); method public boolean isPivotSet(); - method @android.view.ViewDebug.ExportedProperty public boolean isPressed(); + method public boolean isPressed(); method public boolean isSaveEnabled(); method public boolean isSaveFromParentEnabled(); method public boolean isScreenReaderFocusable(); method public boolean isScrollContainer(); method public boolean isScrollbarFadingEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isSelected(); + method public boolean isSelected(); method public final boolean isShowingLayoutBounds(); method public boolean isShown(); - method @android.view.ViewDebug.ExportedProperty public boolean isSoundEffectsEnabled(); + method public boolean isSoundEffectsEnabled(); method public final boolean isTemporarilyDetached(); method public boolean isTextAlignmentResolved(); method public boolean isTextDirectionResolved(); @@ -54357,8 +54357,8 @@ package android.view { method public void unscheduleDrawable(android.graphics.drawable.Drawable); method public final void updateDragShadow(android.view.View.DragShadowBuilder); method @CallSuper protected boolean verifyDrawable(@NonNull android.graphics.drawable.Drawable); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean willNotCacheDrawing(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean willNotDraw(); + method @Deprecated public boolean willNotCacheDrawing(); + method public boolean willNotDraw(); field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2 field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0 field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1 @@ -54799,9 +54799,9 @@ package android.view { method public static int getChildMeasureSpec(int, int, int); method protected boolean getChildStaticTransformation(android.view.View, android.view.animation.Transformation); method public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean getClipChildren(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean getClipToPadding(); - method @android.view.ViewDebug.ExportedProperty(category="focus", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_BEFORE_DESCENDANTS, to="FOCUS_BEFORE_DESCENDANTS"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_AFTER_DESCENDANTS, to="FOCUS_AFTER_DESCENDANTS"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_BLOCK_DESCENDANTS, to="FOCUS_BLOCK_DESCENDANTS")}) public int getDescendantFocusability(); + method public boolean getClipChildren(); + method public boolean getClipToPadding(); + method public int getDescendantFocusability(); method public android.view.View getFocusedChild(); method public android.view.animation.LayoutAnimationController getLayoutAnimation(); method public android.view.animation.Animation.AnimationListener getLayoutAnimationListener(); @@ -54809,14 +54809,14 @@ package android.view { method public android.animation.LayoutTransition getLayoutTransition(); method public int getNestedScrollAxes(); method public android.view.ViewGroupOverlay getOverlay(); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_NO_CACHE, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_ANIMATION_CACHE, to="ANIMATION"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_SCROLLING_CACHE, to="SCROLLING"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_ALL_CACHES, to="ALL")}) public int getPersistentDrawingCache(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean getTouchscreenBlocksFocus(); + method @Deprecated public int getPersistentDrawingCache(); + method public boolean getTouchscreenBlocksFocus(); method public int indexOfChild(android.view.View); method @Deprecated public final void invalidateChild(android.view.View, android.graphics.Rect); method @Deprecated public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect); method @Deprecated public boolean isAlwaysDrawnWithCacheEnabled(); method @Deprecated public boolean isAnimationCacheEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") protected boolean isChildrenDrawingOrderEnabled(); + method protected boolean isChildrenDrawingOrderEnabled(); method @Deprecated protected boolean isChildrenDrawnWithCacheEnabled(); method public boolean isLayoutSuppressed(); method public boolean isMotionEventSplittingEnabled(); @@ -54907,9 +54907,9 @@ package android.view { field @Deprecated public static final int FILL_PARENT = -1; // 0xffffffff field public static final int MATCH_PARENT = -1; // 0xffffffff field public static final int WRAP_CONTENT = -2; // 0xfffffffe - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.MATCH_PARENT, to="MATCH_PARENT"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.WRAP_CONTENT, to="WRAP_CONTENT")}) public int height; + field public int height; field public android.view.animation.LayoutAnimationController.AnimationParameters layoutAnimationParameters; - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.MATCH_PARENT, to="MATCH_PARENT"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.WRAP_CONTENT, to="WRAP_CONTENT")}) public int width; + field public int width; } public static class ViewGroup.MarginLayoutParams extends android.view.ViewGroup.LayoutParams { @@ -54925,10 +54925,10 @@ package android.view { method public void setMarginEnd(int); method public void setMarginStart(int); method public void setMargins(int, int, int, int); - field @android.view.ViewDebug.ExportedProperty(category="layout") public int bottomMargin; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int leftMargin; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int rightMargin; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int topMargin; + field public int bottomMargin; + field public int leftMargin; + field public int rightMargin; + field public int topMargin; } public static interface ViewGroup.OnHierarchyChangeListener { @@ -55725,11 +55725,11 @@ package android.view { field public float alpha; field public float buttonBrightness; field public float dimAmount; - field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, name="ALLOW_LOCK_WHILE_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND, equals=android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND, name="DIM_BEHIND"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND, equals=android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND, name="BLUR_BEHIND"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, name="NOT_FOCUSABLE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, name="NOT_TOUCHABLE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, name="NOT_TOUCH_MODAL"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, equals=android.view.WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, name="TOUCHABLE_WHEN_WAKING"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, name="KEEP_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, name="LAYOUT_IN_SCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, name="LAYOUT_NO_LIMITS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN, name="FULLSCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, name="FORCE_NOT_FULLSCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DITHER, equals=android.view.WindowManager.LayoutParams.FLAG_DITHER, name="DITHER"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SECURE, equals=android.view.WindowManager.LayoutParams.FLAG_SECURE, name="SECURE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SCALED, equals=android.view.WindowManager.LayoutParams.FLAG_SCALED, name="SCALED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES, equals=android.view.WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES, name="IGNORE_CHEEK_PRESSES"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR, name="LAYOUT_INSET_DECOR"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, equals=android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, name="ALT_FOCUSABLE_IM"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, equals=android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, name="WATCH_OUTSIDE_TOUCH"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, equals=android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, name="SHOW_WHEN_LOCKED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, equals=android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, name="SHOW_WALLPAPER"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, name="TURN_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, equals=android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, name="DISMISS_KEYGUARD"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, equals=android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, name="SPLIT_TOUCH"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, equals=android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, name="HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN, name="LOCAL_FOCUS_MODE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, equals=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, name="TRANSLUCENT_STATUS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, equals=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, name="TRANSLUCENT_NAVIGATION"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE, equals=android.view.WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE, name="LOCAL_FOCUS_MODE"), @android.view.ViewDebug.FlagToString(mask=0x20000000, equals=0x20000000, name="FLAG_SLIPPERY"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR, name="FLAG_LAYOUT_ATTACHED_IN_DECOR"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, equals=android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, name="DRAWS_SYSTEM_BAR_BACKGROUNDS")}, formatToHexString=true) public int flags; + field public int flags; field public int format; field public int gravity; field public float horizontalMargin; - field @android.view.ViewDebug.ExportedProperty public float horizontalWeight; + field public float horizontalWeight; field public int layoutInDisplayCutoutMode; field @Deprecated public int memoryType; field public String packageName; @@ -55742,12 +55742,12 @@ package android.view { field public int softInputMode; field @Deprecated public int systemUiVisibility; field public android.os.IBinder token; - field @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION, to="BASE_APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION, to="APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING, to="APPLICATION_STARTING"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION, to="DRAWN_APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL, to="APPLICATION_PANEL"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA, to="APPLICATION_MEDIA"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, to="APPLICATION_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=0x3ed, to="APPLICATION_ABOVE_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG, to="APPLICATION_ATTACHED_DIALOG"), @android.view.ViewDebug.IntToString(from=0x3ec, to="APPLICATION_MEDIA_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR, to="STATUS_BAR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SEARCH_BAR, to="SEARCH_BAR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PHONE, to="PHONE"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, to="SYSTEM_ALERT"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_TOAST, to="TOAST"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, to="SYSTEM_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE, to="PRIORITY_PHONE"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG, to="SYSTEM_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, to="KEYGUARD_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, to="SYSTEM_ERROR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD, to="INPUT_METHOD"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG, to="INPUT_METHOD_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_WALLPAPER, to="WALLPAPER"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, to="STATUS_BAR_PANEL"), @android.view.ViewDebug.IntToString(from=0x7df, to="SECURE_SYSTEM_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7e0, to="DRAG"), @android.view.ViewDebug.IntToString(from=0x7e1, to="STATUS_BAR_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=0x7e2, to="POINTER"), @android.view.ViewDebug.IntToString(from=0x7e3, to="NAVIGATION_BAR"), @android.view.ViewDebug.IntToString(from=0x7e4, to="VOLUME_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7e5, to="BOOT_PROGRESS"), @android.view.ViewDebug.IntToString(from=0x7e6, to="INPUT_CONSUMER"), @android.view.ViewDebug.IntToString(from=0x7e8, to="NAVIGATION_BAR_PANEL"), @android.view.ViewDebug.IntToString(from=0x7ea, to="DISPLAY_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7eb, to="MAGNIFICATION_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7f5, to="PRESENTATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION, to="PRIVATE_PRESENTATION"), @android.view.ViewDebug.IntToString(from=0x7ef, to="VOICE_INTERACTION"), @android.view.ViewDebug.IntToString(from=0x7f1, to="VOICE_INTERACTION_STARTING"), @android.view.ViewDebug.IntToString(from=0x7f2, to="DOCK_DIVIDER"), @android.view.ViewDebug.IntToString(from=0x7f3, to="QS_DIALOG"), @android.view.ViewDebug.IntToString(from=0x7f4, to="SCREENSHOT"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, to="APPLICATION_OVERLAY")}) public int type; + field public int type; field public float verticalMargin; - field @android.view.ViewDebug.ExportedProperty public float verticalWeight; + field public float verticalWeight; field public int windowAnimations; - field @android.view.ViewDebug.ExportedProperty public int x; - field @android.view.ViewDebug.ExportedProperty public int y; + field public int x; + field public int y; } public final class WindowMetrics { @@ -58484,21 +58484,21 @@ package android.webkit { method public void flingScroll(int, int); method @Deprecated public void freeMemory(); method @Nullable public android.net.http.SslCertificate getCertificate(); - method @android.view.ViewDebug.ExportedProperty(category="webview") public int getContentHeight(); + method public int getContentHeight(); method @Nullable public static android.content.pm.PackageInfo getCurrentWebViewPackage(); method @Nullable public android.graphics.Bitmap getFavicon(); method @NonNull public android.webkit.WebView.HitTestResult getHitTestResult(); method @Deprecated @Nullable public String[] getHttpAuthUsernamePassword(String, String); - method @android.view.ViewDebug.ExportedProperty(category="webview") @Nullable public String getOriginalUrl(); + method @Nullable public String getOriginalUrl(); method public int getProgress(); method public boolean getRendererPriorityWaivedWhenNotVisible(); method public int getRendererRequestedPriority(); method @NonNull public static android.net.Uri getSafeBrowsingPrivacyPolicyUrl(); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="webview") public float getScale(); + method @Deprecated public float getScale(); method @NonNull public android.webkit.WebSettings getSettings(); method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier(); - method @android.view.ViewDebug.ExportedProperty(category="webview") @Nullable public String getTitle(); - method @android.view.ViewDebug.ExportedProperty(category="webview") @Nullable public String getUrl(); + method @Nullable public String getTitle(); + method @Nullable public String getUrl(); method @Nullable public android.webkit.WebChromeClient getWebChromeClient(); method @NonNull public static ClassLoader getWebViewClassLoader(); method @NonNull public android.webkit.WebViewClient getWebViewClient(); @@ -58700,7 +58700,7 @@ package android.widget { method public void fling(int); method public android.widget.AbsListView.LayoutParams generateLayoutParams(android.util.AttributeSet); method @ColorInt public int getBottomEdgeEffectColor(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") @ColorInt public int getCacheColorHint(); + method @ColorInt public int getCacheColorHint(); method public int getCheckedItemCount(); method public long[] getCheckedItemIds(); method public int getCheckedItemPosition(); @@ -58710,7 +58710,7 @@ package android.widget { method public int getListPaddingLeft(); method public int getListPaddingRight(); method public int getListPaddingTop(); - method @android.view.ViewDebug.ExportedProperty public android.view.View getSelectedView(); + method public android.view.View getSelectedView(); method public android.graphics.drawable.Drawable getSelector(); method public CharSequence getTextFilter(); method @ColorInt public int getTopEdgeEffectColor(); @@ -58720,13 +58720,13 @@ package android.widget { method public void invalidateViews(); method public boolean isDrawSelectorOnTop(); method public boolean isFastScrollAlwaysVisible(); - method @android.view.ViewDebug.ExportedProperty public boolean isFastScrollEnabled(); + method public boolean isFastScrollEnabled(); method protected boolean isInFilterMode(); method public boolean isItemChecked(int); - method @android.view.ViewDebug.ExportedProperty public boolean isScrollingCacheEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isSmoothScrollbarEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isStackFromBottom(); - method @android.view.ViewDebug.ExportedProperty public boolean isTextFilterEnabled(); + method public boolean isScrollingCacheEnabled(); + method public boolean isSmoothScrollbarEnabled(); + method public boolean isStackFromBottom(); + method public boolean isTextFilterEnabled(); method protected void layoutChildren(); method public void onFilterComplete(int); method public void onGlobalLayout(); @@ -58923,7 +58923,7 @@ package android.widget { ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int, int); method public abstract T getAdapter(); - method @android.view.ViewDebug.CapturedViewProperty public int getCount(); + method public int getCount(); method public android.view.View getEmptyView(); method public int getFirstVisiblePosition(); method public Object getItemAtPosition(int); @@ -58934,8 +58934,8 @@ package android.widget { method @Nullable public final android.widget.AdapterView.OnItemSelectedListener getOnItemSelectedListener(); method public int getPositionForView(android.view.View); method public Object getSelectedItem(); - method @android.view.ViewDebug.CapturedViewProperty public long getSelectedItemId(); - method @android.view.ViewDebug.CapturedViewProperty public int getSelectedItemPosition(); + method public long getSelectedItemId(); + method public int getSelectedItemPosition(); method public abstract android.view.View getSelectedView(); method public boolean performItemClick(android.view.View, int, long); method public abstract void setAdapter(T); @@ -59236,7 +59236,7 @@ package android.widget { method @Nullable public android.graphics.BlendMode getCheckMarkTintBlendMode(); method @Nullable public android.content.res.ColorStateList getCheckMarkTintList(); method @Nullable public android.graphics.PorterDuff.Mode getCheckMarkTintMode(); - method @android.view.ViewDebug.ExportedProperty public boolean isChecked(); + method public boolean isChecked(); method public void setCheckMarkDrawable(@DrawableRes int); method public void setCheckMarkDrawable(@Nullable android.graphics.drawable.Drawable); method public void setCheckMarkTintBlendMode(@Nullable android.graphics.BlendMode); @@ -59277,7 +59277,7 @@ package android.widget { method @Nullable public android.graphics.BlendMode getButtonTintBlendMode(); method @Nullable public android.content.res.ColorStateList getButtonTintList(); method @Nullable public android.graphics.PorterDuff.Mode getButtonTintMode(); - method @android.view.ViewDebug.ExportedProperty public boolean isChecked(); + method public boolean isChecked(); method public void setButtonDrawable(@DrawableRes int); method public void setButtonDrawable(@Nullable android.graphics.drawable.Drawable); method public void setButtonTintBlendMode(@Nullable android.graphics.BlendMode); @@ -59666,7 +59666,7 @@ package android.widget { method public int getColumnWidth(); method public int getGravity(); method public int getHorizontalSpacing(); - method @android.view.ViewDebug.ExportedProperty public int getNumColumns(); + method public int getNumColumns(); method public int getRequestedColumnWidth(); method public int getRequestedHorizontalSpacing(); method public int getStretchMode(); @@ -59857,8 +59857,8 @@ package android.widget { ctor public LinearLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams); ctor public LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams); method public String debug(String); - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=0xffffffff, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.NO_GRAVITY, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.TOP, to="TOP"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.BOTTOM, to="BOTTOM"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.LEFT, to="LEFT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.RIGHT, to="RIGHT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.START, to="START"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.END, to="END"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_VERTICAL, to="CENTER_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_VERTICAL, to="FILL_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_HORIZONTAL, to="CENTER_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_HORIZONTAL, to="FILL_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL, to="FILL")}) public int gravity; - field @android.view.ViewDebug.ExportedProperty(category="layout") public float weight; + field public int gravity; + field public float weight; } public interface ListAdapter extends android.widget.Adapter { @@ -60247,13 +60247,13 @@ package android.widget { method @Nullable public android.content.res.ColorStateList getIndeterminateTintList(); method @Nullable public android.graphics.PorterDuff.Mode getIndeterminateTintMode(); method public android.view.animation.Interpolator getInterpolator(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getMax(); + method public int getMax(); method @Px public int getMaxHeight(); method @Px public int getMaxWidth(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getMin(); + method public int getMin(); method @Px public int getMinHeight(); method @Px public int getMinWidth(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getProgress(); + method public int getProgress(); method @Nullable public android.graphics.BlendMode getProgressBackgroundTintBlendMode(); method @Nullable public android.content.res.ColorStateList getProgressBackgroundTintList(); method @Nullable public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode(); @@ -60261,14 +60261,14 @@ package android.widget { method @Nullable public android.graphics.BlendMode getProgressTintBlendMode(); method @Nullable public android.content.res.ColorStateList getProgressTintList(); method @Nullable public android.graphics.PorterDuff.Mode getProgressTintMode(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getSecondaryProgress(); + method public int getSecondaryProgress(); method @Nullable public android.graphics.BlendMode getSecondaryProgressTintBlendMode(); method @Nullable public android.content.res.ColorStateList getSecondaryProgressTintList(); method @Nullable public android.graphics.PorterDuff.Mode getSecondaryProgressTintMode(); method public final void incrementProgressBy(int); method public final void incrementSecondaryProgressBy(int); method public boolean isAnimating(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public boolean isIndeterminate(); + method public boolean isIndeterminate(); method public void onRestoreInstanceState(android.os.Parcelable); method public android.os.Parcelable onSaveInstanceState(); method public void setIndeterminate(boolean); @@ -60419,7 +60419,7 @@ package android.widget { method public int getRule(int); method public int[] getRules(); method public void removeRule(int); - field @android.view.ViewDebug.ExportedProperty(category="layout") public boolean alignWithParent; + field public boolean alignWithParent; } public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable { @@ -60978,8 +60978,8 @@ package android.widget { ctor public TableRow.LayoutParams(int); ctor public TableRow.LayoutParams(android.view.ViewGroup.LayoutParams); ctor public TableRow.LayoutParams(android.view.ViewGroup.MarginLayoutParams); - field @android.view.ViewDebug.ExportedProperty(category="layout") public int column; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int span; + field public int column; + field public int span; } @android.widget.RemoteViews.RemoteView public class TextClock extends android.widget.TextView { @@ -60987,8 +60987,8 @@ package android.widget { ctor public TextClock(android.content.Context, android.util.AttributeSet); ctor public TextClock(android.content.Context, android.util.AttributeSet, int); ctor public TextClock(android.content.Context, android.util.AttributeSet, int, int); - method @android.view.ViewDebug.ExportedProperty public CharSequence getFormat12Hour(); - method @android.view.ViewDebug.ExportedProperty public CharSequence getFormat24Hour(); + method public CharSequence getFormat12Hour(); + method public CharSequence getFormat24Hour(); method public String getTimeZone(); method public boolean is24HourModeEnabled(); method public void refreshTime(); @@ -61047,7 +61047,7 @@ package android.widget { method protected boolean getDefaultEditable(); method protected android.text.method.MovementMethod getDefaultMovementMethod(); method public android.text.Editable getEditableText(); - method @android.view.ViewDebug.ExportedProperty public android.text.TextUtils.TruncateAt getEllipsize(); + method public android.text.TextUtils.TruncateAt getEllipsize(); method public CharSequence getError(); method public int getExtendedPaddingBottom(); method public int getExtendedPaddingTop(); @@ -61058,7 +61058,7 @@ package android.widget { method public boolean getFreezesText(); method public int getGravity(); method @ColorInt public int getHighlightColor(); - method @android.view.ViewDebug.CapturedViewProperty public CharSequence getHint(); + method public CharSequence getHint(); method public final android.content.res.ColorStateList getHintTextColors(); method public int getHyphenationFrequency(); method public int getImeActionId(); @@ -61094,14 +61094,14 @@ package android.widget { method public android.text.TextPaint getPaint(); method public int getPaintFlags(); method public String getPrivateImeOptions(); - method @android.view.ViewDebug.ExportedProperty(category="text") public int getSelectionEnd(); - method @android.view.ViewDebug.ExportedProperty(category="text") public int getSelectionStart(); + method public int getSelectionEnd(); + method public int getSelectionStart(); method @ColorInt public int getShadowColor(); method public float getShadowDx(); method public float getShadowDy(); method public float getShadowRadius(); method public final boolean getShowSoftInputOnFocus(); - method @android.view.ViewDebug.CapturedViewProperty public CharSequence getText(); + method public CharSequence getText(); method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier(); method public final android.content.res.ColorStateList getTextColors(); method @Nullable public android.graphics.drawable.Drawable getTextCursorDrawable(); @@ -61113,7 +61113,7 @@ package android.widget { method @Nullable public android.graphics.drawable.Drawable getTextSelectHandle(); method @Nullable public android.graphics.drawable.Drawable getTextSelectHandleLeft(); method @Nullable public android.graphics.drawable.Drawable getTextSelectHandleRight(); - method @android.view.ViewDebug.ExportedProperty(category="text") public float getTextSize(); + method public float getTextSize(); method public int getTextSizeUnit(); method public int getTotalPaddingBottom(); method public int getTotalPaddingEnd(); diff --git a/api/module-lib-current.txt b/api/module-lib-current.txt index 67afc3225f7b..6f5ac7cb0c5a 100644 --- a/api/module-lib-current.txt +++ b/api/module-lib-current.txt @@ -1,24 +1,6 @@ // Signature format: 2.0 package android.net { - public final class TetheredClient implements android.os.Parcelable { - ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int); - method public int describeContents(); - method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses(); - method @NonNull public android.net.MacAddress getMacAddress(); - method public int getTetheringType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR; - } - - public static final class TetheredClient.AddressInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.net.LinkAddress getAddress(); - method @Nullable public String getHostname(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR; - } - public final class TetheringConstants { field public static final String EXTRA_ADD_TETHER_TYPE = "extraAddTetherType"; field public static final String EXTRA_PROVISION_CALLBACK = "extraProvisionCallback"; @@ -38,69 +20,15 @@ package android.net { method @NonNull public String[] getTetheringErroredIfaces(); method public boolean isTetheringSupported(); method public boolean isTetheringSupported(@NonNull String); - method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener); method public void requestLatestTetheringEntitlementResult(int, @NonNull android.os.ResultReceiver, boolean); method @Deprecated public int setUsbTethering(boolean); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(int, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering(); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int); + method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(int, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); method @Deprecated public int tether(@NonNull String); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback); method @Deprecated public int untether(@NonNull String); - field public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; - field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY"; - field public static final String EXTRA_ACTIVE_TETHER = "tetherArray"; - field public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; - field public static final String EXTRA_ERRORED_TETHER = "erroredArray"; - field public static final int TETHERING_BLUETOOTH = 2; // 0x2 - field public static final int TETHERING_ETHERNET = 5; // 0x5 - field public static final int TETHERING_INVALID = -1; // 0xffffffff - field public static final int TETHERING_NCM = 4; // 0x4 - field public static final int TETHERING_USB = 1; // 0x1 - field public static final int TETHERING_WIFI = 0; // 0x0 - field public static final int TETHERING_WIFI_P2P = 3; // 0x3 - field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc - field public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; // 0x9 - field public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; // 0x8 - field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd - field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa - field public static final int TETHER_ERROR_INTERNAL_ERROR = 5; // 0x5 - field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf - field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe - field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0 - field public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; // 0xb - field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2 - field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6 - field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4 - field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1 - field public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; // 0x10 - field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3 - field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7 - field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2 - field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1 - field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0 - } - - public static interface TetheringManager.OnTetheringEntitlementResultListener { - method public void onTetheringEntitlementResult(int); - } - - public static interface TetheringManager.StartTetheringCallback { - method public default void onTetheringFailed(int); - method public default void onTetheringStarted(); } public static interface TetheringManager.TetheringEventCallback { - method public default void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>); - method public default void onError(@NonNull String, int); - method public default void onOffloadStatusChanged(int); method public default void onTetherableInterfaceRegexpsChanged(@NonNull android.net.TetheringManager.TetheringInterfaceRegexps); - method public default void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheringSupported(boolean); - method public default void onUpstreamChanged(@Nullable android.net.Network); } public static class TetheringManager.TetheringInterfaceRegexps { @@ -109,22 +37,6 @@ package android.net { method @NonNull public java.util.List<java.lang.String> getTetherableWifiRegexs(); } - public static class TetheringManager.TetheringRequest { - method @Nullable public android.net.LinkAddress getClientStaticIpv4Address(); - method @Nullable public android.net.LinkAddress getLocalIpv4Address(); - method public boolean getShouldShowEntitlementUi(); - method public int getTetheringType(); - method public boolean isExemptFromEntitlementCheck(); - } - - public static class TetheringManager.TetheringRequest.Builder { - ctor public TetheringManager.TetheringRequest.Builder(int); - method @NonNull public android.net.TetheringManager.TetheringRequest build(); - method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean); - method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean); - method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress); - } - } package android.os { diff --git a/api/test-current.txt b/api/test-current.txt index 3838bad57aa7..818a33314f63 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -72,18 +72,11 @@ package android.app { } public class ActivityManager { - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener, int); method public void alwaysShowUnsupportedCompileSdkWarning(android.content.ComponentName); - method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String); - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getPackageImportance(String); method public long getTotalRam(); - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getUidImportance(int); method public static boolean isHighEndGfx(); - method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String); - method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener); method public static void resumeAppSwitches() throws android.os.RemoteException; method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int); - method @RequiresPermission("android.permission.MANAGE_USERS") public boolean switchUser(@NonNull android.os.UserHandle); field public static final int PROCESS_CAPABILITY_ALL = 7; // 0x7 field public static final int PROCESS_CAPABILITY_ALL_EXPLICIT = 1; // 0x1 field public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = 6; // 0x6 @@ -93,10 +86,6 @@ package android.app { field public static final int PROCESS_CAPABILITY_NONE = 0; // 0x0 } - public static interface ActivityManager.OnUidImportanceListener { - method public void onUidImportance(int, int); - } - public static class ActivityManager.RunningAppProcessInfo implements android.os.Parcelable { field public static final int IMPORTANCE_CANT_SAVE_STATE_PRE_26 = 170; // 0xaa } @@ -183,15 +172,10 @@ package android.app { public class AppOpsManager { method @RequiresPermission("android.permission.MANAGE_APPOPS") public void addHistoricalOps(@NonNull android.app.AppOpsManager.HistoricalOps); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void clearHistory(); - method @Nullable @RequiresPermission("android.permission.GET_APP_OPS_STATS") public android.app.RuntimeAppOpAccessMessage collectRuntimeAppOpAccessMessage(); - method @RequiresPermission("android.permission.GET_APP_OPS_STATS") public void getHistoricalOps(@NonNull android.app.AppOpsManager.HistoricalOpsRequest, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void getHistoricalOpsFromDiskRaw(@NonNull android.app.AppOpsManager.HistoricalOpsRequest, @Nullable java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.app.AppOpsManager.HistoricalOps>); method public static int getNumOps(); - method public static String[] getOpStrs(); - method @NonNull @RequiresPermission("android.permission.GET_APP_OPS_STATS") public java.util.List<android.app.AppOpsManager.PackageOps> getOpsForPackage(int, @NonNull String, @Nullable java.lang.String...); method public boolean isOperationActive(int, int, String); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void offsetHistory(long); - method public static int opToDefaultMode(@NonNull String); method public static String opToPermission(int); method public static int permissionToOpCode(String); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void rebootHistory(long); @@ -199,8 +183,6 @@ package android.app { method @RequiresPermission("android.permission.MANAGE_APPOPS") public void resetHistoryParameters(); method @RequiresPermission("android.permission.MANAGE_APPOPS") public void setHistoryParameters(int, long, int); method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(int, int, String, int); - method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setMode(@NonNull String, int, @Nullable String, int); - method @RequiresPermission("android.permission.MANAGE_APP_OPS_MODES") public void setUidMode(@NonNull String, int, int); method public static int strOpToOp(@NonNull String); field public static final int HISTORICAL_MODE_DISABLED = 0; // 0x0 field public static final int HISTORICAL_MODE_ENABLED_ACTIVE = 1; // 0x1 @@ -208,224 +190,18 @@ package android.app { field public static final String KEY_BG_STATE_SETTLE_TIME = "bg_state_settle_time"; field public static final String KEY_FG_SERVICE_STATE_SETTLE_TIME = "fg_service_state_settle_time"; field public static final String KEY_TOP_STATE_SETTLE_TIME = "top_state_settle_time"; - field public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover"; - field public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications"; - field public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn"; - field public static final String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot"; - field public static final String OPSTR_ASSIST_STRUCTURE = "android:assist_structure"; - field public static final String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume"; - field public static final String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume"; - field public static final String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume"; - field public static final String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume"; - field public static final String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume"; - field public static final String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume"; - field public static final String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume"; - field public static final String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume"; - field public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service"; - field public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state"; - field public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts"; - field public static final String OPSTR_GPS = "android:gps"; - field public static final String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground"; - field public static final String OPSTR_LEGACY_STORAGE = "android:legacy_storage"; - field public static final String OPSTR_MANAGE_EXTERNAL_STORAGE = "android:manage_external_storage"; - field public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels"; - field public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone"; - field public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells"; - field public static final String OPSTR_PLAY_AUDIO = "android:play_audio"; - field public static final String OPSTR_POST_NOTIFICATION = "android:post_notification"; - field public static final String OPSTR_PROJECT_MEDIA = "android:project_media"; - field public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard"; - field public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms"; - field public static final String OPSTR_READ_MEDIA_AUDIO = "android:read_media_audio"; - field public static final String OPSTR_READ_MEDIA_IMAGES = "android:read_media_images"; - field public static final String OPSTR_READ_MEDIA_VIDEO = "android:read_media_video"; - field public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast"; - field public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages"; - field public static final String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages"; - field public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background"; - field public static final String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background"; - field public static final String OPSTR_START_FOREGROUND = "android:start_foreground"; - field public static final String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus"; - field public static final String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons"; - field public static final String OPSTR_TOAST_WINDOW = "android:toast_window"; - field public static final String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on"; - field public static final String OPSTR_VIBRATE = "android:vibrate"; - field public static final String OPSTR_WAKE_LOCK = "android:wake_lock"; - field public static final String OPSTR_WIFI_SCAN = "android:wifi_scan"; - field public static final String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard"; - field public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms"; - field public static final String OPSTR_WRITE_MEDIA_AUDIO = "android:write_media_audio"; - field public static final String OPSTR_WRITE_MEDIA_IMAGES = "android:write_media_images"; - field public static final String OPSTR_WRITE_MEDIA_VIDEO = "android:write_media_video"; - field public static final String OPSTR_WRITE_SMS = "android:write_sms"; - field public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper"; field public static final int OP_COARSE_LOCATION = 0; // 0x0 - field public static final int OP_FLAGS_ALL = 31; // 0x1f - field public static final int OP_FLAG_SELF = 1; // 0x1 - field public static final int OP_FLAG_TRUSTED_PROXIED = 8; // 0x8 - field public static final int OP_FLAG_TRUSTED_PROXY = 2; // 0x2 - field public static final int OP_FLAG_UNTRUSTED_PROXIED = 16; // 0x10 - field public static final int OP_FLAG_UNTRUSTED_PROXY = 4; // 0x4 field public static final int OP_RECORD_AUDIO = 27; // 0x1b field public static final int OP_START_FOREGROUND = 76; // 0x4c field public static final int OP_SYSTEM_ALERT_WINDOW = 24; // 0x18 - field public static final int UID_STATE_BACKGROUND = 600; // 0x258 - field public static final int UID_STATE_CACHED = 700; // 0x2bc - field public static final int UID_STATE_FOREGROUND = 500; // 0x1f4 - field public static final int UID_STATE_FOREGROUND_SERVICE = 400; // 0x190 - field @Deprecated public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; // 0x12c - field public static final int UID_STATE_PERSISTENT = 100; // 0x64 - field public static final int UID_STATE_TOP = 200; // 0xc8 - } - - public static final class AppOpsManager.AttributedHistoricalOps implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String); - method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(@IntRange(from=0) int); - method @IntRange(from=0) public int getOpCount(); - method @Nullable public String getTag(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.AttributedHistoricalOps> CREATOR; - } - - public static final class AppOpsManager.AttributedOpEntry implements android.os.Parcelable { - method public int describeContents(); - method public long getLastAccessBackgroundTime(int); - method public long getLastAccessForegroundTime(int); - method public long getLastAccessTime(int); - method public long getLastAccessTime(int, int, int); - method public long getLastBackgroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastBackgroundProxyInfo(int); - method public long getLastDuration(int); - method public long getLastDuration(int, int, int); - method public long getLastForegroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastForegroundProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int, int, int); - method public long getLastRejectBackgroundTime(int); - method public long getLastRejectForegroundTime(int); - method public long getLastRejectTime(int); - method public long getLastRejectTime(int, int, int); - method public boolean isRunning(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.AttributedOpEntry> CREATOR; - } - - public static final class AppOpsManager.HistoricalOp implements android.os.Parcelable { - method public int describeContents(); - method public long getAccessCount(int, int, int); - method public long getAccessDuration(int, int, int); - method public long getBackgroundAccessCount(int); - method public long getBackgroundAccessDuration(int); - method public long getBackgroundRejectCount(int); - method public long getForegroundAccessCount(int); - method public long getForegroundAccessDuration(int); - method public long getForegroundRejectCount(int); - method @NonNull public String getOpName(); - method public long getRejectCount(int, int, int); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOp> CREATOR; } public static final class AppOpsManager.HistoricalOps implements android.os.Parcelable { ctor public AppOpsManager.HistoricalOps(long, long); - method public int describeContents(); - method public long getBeginTimeMillis(); - method public long getEndTimeMillis(); - method @IntRange(from=0) public int getUidCount(); - method @Nullable public android.app.AppOpsManager.HistoricalUidOps getUidOps(int); - method @NonNull public android.app.AppOpsManager.HistoricalUidOps getUidOpsAt(@IntRange(from=0) int); method public void increaseAccessCount(int, int, @NonNull String, @Nullable String, int, int, long); method public void increaseAccessDuration(int, int, @NonNull String, @Nullable String, int, int, long); method public void increaseRejectCount(int, int, @NonNull String, @Nullable String, int, int, long); method public void offsetBeginAndEndTime(long); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalOps> CREATOR; - } - - public static final class AppOpsManager.HistoricalOpsRequest { - } - - public static final class AppOpsManager.HistoricalOpsRequest.Builder { - ctor public AppOpsManager.HistoricalOpsRequest.Builder(long, long); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest build(); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setAttributionTag(@Nullable String); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setFlags(int); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setOpNames(@Nullable java.util.List<java.lang.String>); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setPackageName(@Nullable String); - method @NonNull public android.app.AppOpsManager.HistoricalOpsRequest.Builder setUid(int); - } - - public static final class AppOpsManager.HistoricalPackageOps implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.app.AppOpsManager.AttributedHistoricalOps getAttributedOps(@NonNull String); - method @NonNull public android.app.AppOpsManager.AttributedHistoricalOps getAttributedOpsAt(@IntRange(from=0) int); - method @IntRange(from=0) public int getAttributedOpsCount(); - method @Nullable public android.app.AppOpsManager.HistoricalOp getOp(@NonNull String); - method @NonNull public android.app.AppOpsManager.HistoricalOp getOpAt(@IntRange(from=0) int); - method @IntRange(from=0) public int getOpCount(); - method @NonNull public String getPackageName(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalPackageOps> CREATOR; - } - - public static final class AppOpsManager.HistoricalUidOps implements android.os.Parcelable { - method public int describeContents(); - method @IntRange(from=0) public int getPackageCount(); - method @Nullable public android.app.AppOpsManager.HistoricalPackageOps getPackageOps(@NonNull String); - method @NonNull public android.app.AppOpsManager.HistoricalPackageOps getPackageOpsAt(@IntRange(from=0) int); - method public int getUid(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.HistoricalUidOps> CREATOR; - } - - public static final class AppOpsManager.OpEntry implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public java.util.Map<java.lang.String,android.app.AppOpsManager.AttributedOpEntry> getAttributedOpEntries(); - method @Deprecated public long getDuration(); - method public long getLastAccessBackgroundTime(int); - method public long getLastAccessForegroundTime(int); - method public long getLastAccessTime(int); - method public long getLastAccessTime(int, int, int); - method public long getLastBackgroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastBackgroundProxyInfo(int); - method public long getLastDuration(int); - method public long getLastDuration(int, int, int); - method public long getLastForegroundDuration(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastForegroundProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int); - method @Nullable public android.app.AppOpsManager.OpEventProxyInfo getLastProxyInfo(int, int, int); - method public long getLastRejectBackgroundTime(int); - method public long getLastRejectForegroundTime(int); - method public long getLastRejectTime(int); - method public long getLastRejectTime(int, int, int); - method public int getMode(); - method @NonNull public String getOpStr(); - method @Deprecated @Nullable public String getProxyPackageName(); - method @Deprecated @Nullable public String getProxyPackageName(int, int); - method @Deprecated public int getProxyUid(); - method @Deprecated public int getProxyUid(int, int); - method public boolean isRunning(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEntry> CREATOR; - } - - public static final class AppOpsManager.OpEventProxyInfo implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public String getAttributionTag(); - method @Nullable public String getPackageName(); - method @IntRange(from=0) public int getUid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.OpEventProxyInfo> CREATOR; - } - - public static final class AppOpsManager.PackageOps implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public java.util.List<android.app.AppOpsManager.OpEntry> getOps(); - method @NonNull public String getPackageName(); - method public int getUid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.AppOpsManager.PackageOps> CREATOR; } public class DownloadManager { @@ -433,10 +209,10 @@ package android.app { } public class DreamManager { - method @RequiresPermission("android.permission.READ_DREAM_STATE") public boolean isDreaming(); - method @RequiresPermission("android.permission.WRITE_DREAM_STATE") public void setActiveDream(@NonNull android.content.ComponentName); - method @RequiresPermission("android.permission.WRITE_DREAM_STATE") public void startDream(@NonNull android.content.ComponentName); - method @RequiresPermission("android.permission.WRITE_DREAM_STATE") public void stopDream(); + method @RequiresPermission(android.Manifest.permission.READ_DREAM_STATE) public boolean isDreaming(); + method @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE) public void setActiveDream(@NonNull android.content.ComponentName); + 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(); } public final class NotificationChannel implements android.os.Parcelable { @@ -445,14 +221,12 @@ package android.app { method public boolean isImportanceLockedByCriticalDeviceFunction(); method public boolean isImportanceLockedByOEM(); method public void lockFields(int); - method public void setBlockable(boolean); method public void setDeleted(boolean); method public void setFgServiceShown(boolean); method public void setImportanceLockedByCriticalDeviceFunction(boolean); method public void setImportanceLockedByOEM(boolean); method public void setImportantConversation(boolean); method public void setOriginalImportance(int); - field public static final int USER_LOCKED_SOUND = 32; // 0x20 } public final class NotificationChannelGroup implements android.os.Parcelable { @@ -464,12 +238,8 @@ package android.app { public class NotificationManager { method public void allowAssistantAdjustment(String); method public void disallowAssistantAdjustment(String); - method @NonNull public java.util.List<java.lang.String> getAllowedAssistantAdjustments(); - method @Nullable public android.content.ComponentName getAllowedNotificationAssistant(); method public android.content.ComponentName getEffectsSuppressor(); - method public boolean isNotificationAssistantAccessGranted(@NonNull android.content.ComponentName); method public boolean matchesCallFilter(android.os.Bundle); - method public void setNotificationAssistantAccessGranted(@Nullable android.content.ComponentName, boolean); } public final class PictureInPictureParams implements android.os.Parcelable { @@ -478,36 +248,12 @@ package android.app { method public android.graphics.Rect getSourceRectHint(); } - public final class RuntimeAppOpAccessMessage implements android.os.Parcelable { - ctor public RuntimeAppOpAccessMessage(@IntRange(from=0L) int, @IntRange(from=0L) int, @NonNull String, @Nullable String, @NonNull String, int); - method public int describeContents(); - method @Nullable public String getAttributionTag(); - method @NonNull public String getMessage(); - method @NonNull public String getOp(); - method @NonNull public String getPackageName(); - method public int getSamplingStrategy(); - method @IntRange(from=0L) public int getUid(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.RuntimeAppOpAccessMessage> CREATOR; - } - public class StatusBarManager { method public void collapsePanels(); method public void expandNotificationsPanel(); - method @NonNull @RequiresPermission(android.Manifest.permission.STATUS_BAR) public android.app.StatusBarManager.DisableInfo getDisableInfo(); - method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean); method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSimNetworkLock(boolean); } - public static final class StatusBarManager.DisableInfo { - method public boolean areAllComponentsEnabled(); - method public boolean isNavigateToHomeDisabled(); - method public boolean isNotificationPeekingDisabled(); - method public boolean isRecentsDisabled(); - method public boolean isSearchDisabled(); - method public boolean isStatusBarExpansionDisabled(); - } - public class TaskInfo { method @NonNull public android.content.res.Configuration getConfiguration(); method @NonNull public android.window.WindowContainerToken getToken(); @@ -526,14 +272,12 @@ package android.app { } public class UiModeManager { - method @RequiresPermission("android.permission.ENTER_CAR_MODE_PRIORITIZED") public void enableCarMode(@IntRange(from=0) int, int); method public boolean isNightModeLocked(); method public boolean isUiModeLocked(); } public class WallpaperManager { method @Nullable public android.graphics.Bitmap getBitmap(); - method @RequiresPermission("android.permission.SET_WALLPAPER_COMPONENT") public boolean setWallpaperComponent(android.content.ComponentName); method public boolean shouldEnableWideColorGamut(); method @RequiresPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) public boolean wallpaperSupportsWcg(int); } @@ -576,18 +320,13 @@ package android.app { package android.app.admin { public class DevicePolicyManager { - method @Nullable public CharSequence getDeviceOwnerOrganizationName(); method public long getLastBugReportRequestTime(); method public long getLastNetworkLogRetrievalTime(); method public long getLastSecurityLogRetrievalTime(); method public java.util.List<java.lang.String> getOwnerInstalledCaCerts(@NonNull android.os.UserHandle); method public boolean isCurrentInputMethodSetByOwner(); - method public boolean isDeviceManaged(); method public boolean isFactoryResetProtectionPolicySupported(); - field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED"; - field public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED"; field public static final String ACTION_DATA_SHARING_RESTRICTION_APPLIED = "android.app.action.DATA_SHARING_RESTRICTION_APPLIED"; - field public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION"; } public static final class SecurityLog.SecurityEvent implements android.os.Parcelable { @@ -596,26 +335,6 @@ package android.app.admin { } -package android.app.assist { - - public static class AssistStructure.ViewNode { - ctor public AssistStructure.ViewNode(); - } - -} - -package android.app.backup { - - public class BackupManager { - method @RequiresPermission("android.permission.BACKUP") public android.content.Intent getConfigurationIntent(String); - method @RequiresPermission("android.permission.BACKUP") public android.content.Intent getDataManagementIntent(String); - method @Nullable @RequiresPermission("android.permission.BACKUP") public CharSequence getDataManagementIntentLabel(@NonNull String); - method @Deprecated @Nullable @RequiresPermission("android.permission.BACKUP") public String getDataManagementLabel(@NonNull String); - method @RequiresPermission("android.permission.BACKUP") public String getDestinationString(String); - } - -} - package android.app.blob { public class BlobStoreManager { @@ -638,121 +357,17 @@ package android.app.blob { package android.app.prediction { - public final class AppPredictionContext implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.os.Bundle getExtras(); - method @NonNull public String getPackageName(); - method @IntRange(from=0) public int getPredictedTargetCount(); - method @NonNull public String getUiSurface(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionContext> CREATOR; - } - - public static final class AppPredictionContext.Builder { - ctor public AppPredictionContext.Builder(@NonNull android.content.Context); - method @NonNull public android.app.prediction.AppPredictionContext build(); - method @NonNull public android.app.prediction.AppPredictionContext.Builder setExtras(@Nullable android.os.Bundle); - method @NonNull public android.app.prediction.AppPredictionContext.Builder setPredictedTargetCount(@IntRange(from=0) int); - method @NonNull public android.app.prediction.AppPredictionContext.Builder setUiSurface(@NonNull String); - } - - public final class AppPredictionManager { - method @NonNull public android.app.prediction.AppPredictor createAppPredictionSession(@NonNull android.app.prediction.AppPredictionContext); - } - - public final class AppPredictionSessionId implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppPredictionSessionId> CREATOR; - } - public final class AppPredictor { - method public void destroy(); method public android.app.prediction.AppPredictionSessionId getSessionId(); - method public void notifyAppTargetEvent(@NonNull android.app.prediction.AppTargetEvent); - method public void notifyLaunchLocationShown(@NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>); - method public void registerPredictionUpdates(@NonNull java.util.concurrent.Executor, @NonNull android.app.prediction.AppPredictor.Callback); - method public void requestPredictionUpdate(); - method @Nullable public void sortTargets(@NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>); - method public void unregisterPredictionUpdates(@NonNull android.app.prediction.AppPredictor.Callback); - } - - public static interface AppPredictor.Callback { - method public void onTargetsAvailable(@NonNull java.util.List<android.app.prediction.AppTarget>); - } - - public final class AppTarget implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public String getClassName(); - method @NonNull public android.app.prediction.AppTargetId getId(); - method @NonNull public String getPackageName(); - method @IntRange(from=0) public int getRank(); - method @Nullable public android.content.pm.ShortcutInfo getShortcutInfo(); - method @NonNull public android.os.UserHandle getUser(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTarget> CREATOR; - } - - public static final class AppTarget.Builder { - ctor public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId, @NonNull String, @NonNull android.os.UserHandle); - ctor public AppTarget.Builder(@NonNull android.app.prediction.AppTargetId, @NonNull android.content.pm.ShortcutInfo); - method @NonNull public android.app.prediction.AppTarget build(); - method @NonNull public android.app.prediction.AppTarget.Builder setClassName(@NonNull String); - method @NonNull public android.app.prediction.AppTarget.Builder setRank(@IntRange(from=0) int); - } - - public final class AppTargetEvent implements android.os.Parcelable { - method public int describeContents(); - method public int getAction(); - method @Nullable public String getLaunchLocation(); - method @Nullable public android.app.prediction.AppTarget getTarget(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int ACTION_DISMISS = 2; // 0x2 - field public static final int ACTION_LAUNCH = 1; // 0x1 - field public static final int ACTION_PIN = 3; // 0x3 - field public static final int ACTION_UNPIN = 4; // 0x4 - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetEvent> CREATOR; - } - - public static final class AppTargetEvent.Builder { - ctor public AppTargetEvent.Builder(@Nullable android.app.prediction.AppTarget, int); - method @NonNull public android.app.prediction.AppTargetEvent build(); - method @NonNull public android.app.prediction.AppTargetEvent.Builder setLaunchLocation(@Nullable String); - } - - public final class AppTargetId implements android.os.Parcelable { - ctor public AppTargetId(@NonNull String); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.app.prediction.AppTargetId> CREATOR; } } package android.app.role { - public interface OnRoleHoldersChangedListener { - method public void onRoleHoldersChanged(@NonNull String, @NonNull android.os.UserHandle); - } - public class RoleControllerManager { - method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void isApplicationVisibleForRole(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void isRoleVisible(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - } - - public final class RoleManager { - method @RequiresPermission("android.permission.OBSERVE_ROLE_HOLDERS") public void addOnRoleHoldersChangedListenerAsUser(@NonNull java.util.concurrent.Executor, @NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle); - method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void addRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean addRoleHolderFromController(@NonNull String, @NonNull String); - method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void clearRoleHoldersAsUser(@NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @NonNull @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public java.util.List<java.lang.String> getHeldRolesFromController(@NonNull String); - method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHolders(@NonNull String); - method @NonNull @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public java.util.List<java.lang.String> getRoleHoldersAsUser(@NonNull String, @NonNull android.os.UserHandle); - method @RequiresPermission("android.permission.OBSERVE_ROLE_HOLDERS") public void removeOnRoleHoldersChangedListenerAsUser(@NonNull android.app.role.OnRoleHoldersChangedListener, @NonNull android.os.UserHandle); - method @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public void removeRoleHolderAsUser(@NonNull String, @NonNull String, int, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public boolean removeRoleHolderFromController(@NonNull String, @NonNull String); - method @RequiresPermission("com.android.permissioncontroller.permission.MANAGE_ROLES_FROM_CONTROLLER") public void setRoleNamesFromController(@NonNull java.util.List<java.lang.String>); - field public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; // 0x1 + method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void isApplicationVisibleForRole(@NonNull String, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); + method @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) public void isRoleVisible(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); } } @@ -785,23 +400,8 @@ package android.bluetooth { } -package android.companion { - - public final class CompanionDeviceManager { - method @RequiresPermission("android.permission.MANAGE_COMPANION_DEVICES") public boolean isDeviceAssociatedForWifiConnection(@NonNull String, @NonNull android.net.MacAddress, @NonNull android.os.UserHandle); - } - -} - package android.content { - public class ApexEnvironment { - method @NonNull public static android.content.ApexEnvironment getApexEnvironment(@NonNull String); - method @NonNull public java.io.File getCredentialProtectedDataDirForUser(@NonNull android.os.UserHandle); - method @NonNull public java.io.File getDeviceProtectedDataDir(); - method @NonNull public java.io.File getDeviceProtectedDataDirForUser(@NonNull android.os.UserHandle); - } - public final class AutofillOptions implements android.os.Parcelable { ctor public AutofillOptions(int, boolean); method public int describeContents(); @@ -837,36 +437,21 @@ package android.content { method @NonNull public static android.os.UserHandle getUserHandleFromUri(@NonNull android.net.Uri); } - public class ContentProviderClient implements java.lang.AutoCloseable { - method @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(long); - } - public abstract class ContentResolver { - method @NonNull public static android.net.Uri decodeFromFile(@NonNull java.io.File); - method @NonNull public static java.io.File encodeToFile(@NonNull android.net.Uri); method public static String[] getSyncAdapterPackagesForAuthorityAsUser(String, int); } public abstract class Context { - method @NonNull public android.content.Context createContextAsUser(@NonNull android.os.UserHandle, int); - method @NonNull public android.content.Context createPackageContextAsUser(@NonNull String, int, @NonNull android.os.UserHandle) throws android.content.pm.PackageManager.NameNotFoundException; method @NonNull public java.io.File getCrateDir(@NonNull String); method public abstract int getDisplayId(); method public android.os.UserHandle getUser(); method public int getUserId(); method public void setAutofillOptions(@Nullable android.content.AutofillOptions); method public void setContentCaptureOptions(@Nullable android.content.ContentCaptureOptions); - method @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public void startActivityAsUser(@NonNull @RequiresPermission android.content.Intent, @NonNull android.os.UserHandle); - field public static final String APP_INTEGRITY_SERVICE = "app_integrity"; - field public static final String BUGREPORT_SERVICE = "bugreport"; field public static final String CONTENT_CAPTURE_MANAGER_SERVICE = "content_capture"; field public static final String DEVICE_IDLE_CONTROLLER = "deviceidle"; field public static final String DREAM_SERVICE = "dream"; - field public static final String ETHERNET_SERVICE = "ethernet"; - field public static final String PERMISSION_SERVICE = "permission"; field public static final String POWER_WHITELIST_MANAGER = "power_whitelist"; - field public static final String ROLLBACK_SERVICE = "rollback"; - field public static final String STATUS_BAR_SERVICE = "statusbar"; field public static final String TEST_NETWORK_SERVICE = "test_network"; } @@ -874,75 +459,13 @@ package android.content { method public int getDisplayId(); } - public class Intent implements java.lang.Cloneable android.os.Parcelable { - field @RequiresPermission("android.permission.MANAGE_ROLE_HOLDERS") public static final String ACTION_MANAGE_DEFAULT_APP = "android.intent.action.MANAGE_DEFAULT_APP"; - field public static final String ACTION_ROLLBACK_COMMITTED = "android.intent.action.ROLLBACK_COMMITTED"; - field public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID"; - field public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME"; - } - } package android.content.integrity { public class AppIntegrityManager { method @NonNull public android.content.integrity.RuleSet getCurrentRuleSet(); - method @NonNull public String getCurrentRuleSetProvider(); - method @NonNull public String getCurrentRuleSetVersion(); method @NonNull public java.util.List<java.lang.String> getWhitelistedRuleProviders(); - method public void updateRuleSet(@NonNull android.content.integrity.RuleSet, @NonNull android.content.IntentSender); - field public static final String EXTRA_STATUS = "android.content.integrity.extra.STATUS"; - field public static final int STATUS_FAILURE = 1; // 0x1 - field public static final int STATUS_SUCCESS = 0; // 0x0 - } - - public abstract class IntegrityFormula { - method @NonNull public static android.content.integrity.IntegrityFormula all(@NonNull android.content.integrity.IntegrityFormula...); - method @NonNull public static android.content.integrity.IntegrityFormula any(@NonNull android.content.integrity.IntegrityFormula...); - method @NonNull public static android.content.integrity.IntegrityFormula not(@NonNull android.content.integrity.IntegrityFormula); - } - - public static final class IntegrityFormula.Application { - method @NonNull public static android.content.integrity.IntegrityFormula certificatesContain(@NonNull String); - method @NonNull public static android.content.integrity.IntegrityFormula isPreInstalled(); - method @NonNull public static android.content.integrity.IntegrityFormula packageNameEquals(@NonNull String); - method @NonNull public static android.content.integrity.IntegrityFormula versionCodeEquals(@NonNull long); - method @NonNull public static android.content.integrity.IntegrityFormula versionCodeGreaterThan(@NonNull long); - method @NonNull public static android.content.integrity.IntegrityFormula versionCodeGreaterThanOrEqualTo(@NonNull long); - } - - public static final class IntegrityFormula.Installer { - method @NonNull public static android.content.integrity.IntegrityFormula certificatesContain(@NonNull String); - method @NonNull public static android.content.integrity.IntegrityFormula notAllowedByManifest(); - method @NonNull public static android.content.integrity.IntegrityFormula packageNameEquals(@NonNull String); - } - - public static final class IntegrityFormula.SourceStamp { - method @NonNull public static android.content.integrity.IntegrityFormula notTrusted(); - method @NonNull public static android.content.integrity.IntegrityFormula stampCertificateHashEquals(@NonNull String); - } - - public final class Rule implements android.os.Parcelable { - ctor public Rule(@NonNull android.content.integrity.IntegrityFormula, int); - method public int describeContents(); - method public int getEffect(); - method @NonNull public android.content.integrity.IntegrityFormula getFormula(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.content.integrity.Rule> CREATOR; - field public static final int DENY = 0; // 0x0 - field public static final int FORCE_ALLOW = 1; // 0x1 - } - - public class RuleSet { - method @NonNull public java.util.List<android.content.integrity.Rule> getRules(); - method @NonNull public String getVersion(); - } - - public static class RuleSet.Builder { - ctor public RuleSet.Builder(); - method @NonNull public android.content.integrity.RuleSet.Builder addRules(@NonNull java.util.List<android.content.integrity.Rule>); - method @NonNull public android.content.integrity.RuleSet build(); - method @NonNull public android.content.integrity.RuleSet.Builder setVersion(@NonNull String); } } @@ -965,84 +488,31 @@ package android.content.pm { ctor public LauncherApps(android.content.Context); } - public static class PackageInstaller.SessionInfo implements android.os.Parcelable { - method public int getAutoRevokePermissionsMode(); - method public int getRollbackDataPolicy(); - method @NonNull public java.util.Set<java.lang.String> getWhitelistedRestrictedPermissions(); - } - public static class PackageInstaller.SessionParams implements android.os.Parcelable { - method public void setEnableRollback(boolean); - method public void setEnableRollback(boolean, int); - method @RequiresPermission("android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS") public void setGrantedRuntimePermissions(String[]); - method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex(); method public void setInstallerPackageName(@Nullable String); - method public void setRequestDowngrade(boolean); - method @RequiresPermission(android.Manifest.permission.INSTALL_PACKAGES) public void setStaged(); } public abstract class PackageManager { - method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void addOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener); - method public abstract boolean arePermissionsIndividuallyControlled(); method @Nullable public String getContentCaptureServicePackageName(); - method @Nullable @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract String getDefaultBrowserPackageNameAsUser(int); method @Nullable public String getDefaultTextClassifierPackageName(); - method @Nullable public String getIncidentReportApproverPackageName(); method public abstract int getInstallReason(@NonNull String, @NonNull android.os.UserHandle); method @NonNull public abstract java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int); - method @NonNull @RequiresPermission("android.permission.INTERACT_ACROSS_USERS_FULL") public abstract java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int); method @Nullable public abstract String[] getNamesForUids(int[]); method @NonNull public abstract String getPermissionControllerPackageName(); - method @RequiresPermission(anyOf={"android.permission.GRANT_RUNTIME_PERMISSIONS", "android.permission.REVOKE_RUNTIME_PERMISSIONS", "android.permission.GET_RUNTIME_PERMISSIONS"}) public abstract int getPermissionFlags(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); method @NonNull public abstract String getServicesSystemSharedLibraryPackageName(); method @NonNull public abstract String getSharedSystemSharedLibraryPackageName(); method @Nullable public String getSystemTextClassifierPackageName(); method @Nullable public String getWellbeingPackageName(); - method @RequiresPermission("android.permission.GRANT_RUNTIME_PERMISSIONS") public abstract void grantRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); - method @RequiresPermission("android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS") public abstract void removeOnPermissionsChangeListener(@NonNull android.content.pm.PackageManager.OnPermissionsChangedListener); - method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public abstract void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle); - method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public void revokeRuntimePermission(@NonNull String, @NonNull String, @NonNull android.os.UserHandle, @NonNull String); - method @RequiresPermission(anyOf={"android.permission.GRANT_RUNTIME_PERMISSIONS", "android.permission.REVOKE_RUNTIME_PERMISSIONS"}) public abstract void updatePermissionFlags(@NonNull String, @NonNull String, int, int, @NonNull android.os.UserHandle); field public static final String FEATURE_ADOPTABLE_STORAGE = "android.software.adoptable_storage"; field public static final String FEATURE_FILE_BASED_ENCRYPTION = "android.software.file_based_encryption"; - field public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 16384; // 0x4000 - field public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 32768; // 0x8000 - field public static final int FLAG_PERMISSION_ONE_TIME = 65536; // 0x10000 - field public static final int FLAG_PERMISSION_POLICY_FIXED = 4; // 0x4 - field public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 2048; // 0x800 - field public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 4096; // 0x1000 - field public static final int FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT = 8192; // 0x2000 - field public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 64; // 0x40 - field public static final int FLAG_PERMISSION_REVOKED_COMPAT = 8; // 0x8 - field @Deprecated public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 8; // 0x8 field public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 128; // 0x80 - field public static final int FLAG_PERMISSION_SYSTEM_FIXED = 16; // 0x10 - field public static final int FLAG_PERMISSION_USER_FIXED = 2; // 0x2 - field public static final int FLAG_PERMISSION_USER_SET = 1; // 0x1 - field public static final int MATCH_FACTORY_ONLY = 2097152; // 0x200000 field public static final int MATCH_KNOWN_PACKAGES = 4202496; // 0x402000 - field public static final int MODULE_APEX_NAME = 1; // 0x1 field public static final String SYSTEM_SHARED_LIBRARY_SERVICES = "android.ext.services"; field public static final String SYSTEM_SHARED_LIBRARY_SHARED = "android.ext.shared"; } - public static interface PackageManager.OnPermissionsChangedListener { - method public void onPermissionsChanged(int); - } - public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable { - field public static final int FLAG_REMOVED = 2; // 0x2 - field public static final int PROTECTION_FLAG_APP_PREDICTOR = 2097152; // 0x200000 - field public static final int PROTECTION_FLAG_COMPANION = 8388608; // 0x800000 - field public static final int PROTECTION_FLAG_CONFIGURATOR = 524288; // 0x80000 - field public static final int PROTECTION_FLAG_DOCUMENTER = 262144; // 0x40000 - field public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 1048576; // 0x100000 - field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000 - field public static final int PROTECTION_FLAG_RETAIL_DEMO = 16777216; // 0x1000000 - field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000 field public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 32768; // 0x8000 - field public static final int PROTECTION_FLAG_WELLBEING = 131072; // 0x20000 - field @Nullable public final String backgroundPermission; } public final class ProviderInfoList implements android.os.Parcelable { @@ -1081,40 +551,11 @@ package android.content.res { package android.content.rollback { - public final class PackageRollbackInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public String getPackageName(); - method @NonNull public android.content.pm.VersionedPackage getVersionRolledBackFrom(); - method @NonNull public android.content.pm.VersionedPackage getVersionRolledBackTo(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.content.rollback.PackageRollbackInfo> CREATOR; - } - - public final class RollbackInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public java.util.List<android.content.pm.VersionedPackage> getCausePackages(); - method public int getCommittedSessionId(); - method @NonNull public java.util.List<android.content.rollback.PackageRollbackInfo> getPackages(); - method public int getRollbackId(); - method public boolean isStaged(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.content.rollback.RollbackInfo> CREATOR; - } - public final class RollbackManager { method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void blockRollbackManager(long); - method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender); method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String); - method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks(); - method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public java.util.List<android.content.rollback.RollbackInfo> getRecentlyCommittedRollbacks(); method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void reloadPersistedData(); - field public static final String EXTRA_STATUS = "android.content.rollback.extra.STATUS"; - field public static final String EXTRA_STATUS_MESSAGE = "android.content.rollback.extra.STATUS_MESSAGE"; field public static final String PROPERTY_ROLLBACK_LIFETIME_MILLIS = "rollback_lifetime_in_millis"; - field public static final int STATUS_FAILURE = 1; // 0x1 - field public static final int STATUS_FAILURE_INSTALL = 3; // 0x3 - field public static final int STATUS_FAILURE_ROLLBACK_UNAVAILABLE = 2; // 0x2 - field public static final int STATUS_SUCCESS = 0; // 0x0 } } @@ -1201,13 +642,6 @@ package android.graphics.drawable { package android.hardware.camera2 { - public abstract class CameraDevice implements java.lang.AutoCloseable { - method @Deprecated public abstract void createCustomCaptureSession(android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, int, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException; - field public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED = 1; // 0x1 - field public static final int SESSION_OPERATION_MODE_NORMAL = 0; // 0x0 - field public static final int SESSION_OPERATION_MODE_VENDOR_START = 32768; // 0x8000 - } - public final class CameraManager { method public String[] getCameraIdListNoLazy() throws android.hardware.camera2.CameraAccessException; } @@ -1216,15 +650,6 @@ package android.hardware.camera2 { package android.hardware.display { - public final class AmbientBrightnessDayStats implements android.os.Parcelable { - method public int describeContents(); - method public float[] getBucketBoundaries(); - method public java.time.LocalDate getLocalDate(); - method public float[] getStats(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.AmbientBrightnessDayStats> CREATOR; - } - public class AmbientDisplayConfiguration { ctor public AmbientDisplayConfiguration(android.content.Context); method public boolean alwaysOnAvailable(); @@ -1232,167 +657,14 @@ package android.hardware.display { method public boolean alwaysOnEnabled(int); } - public final class BrightnessChangeEvent implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessChangeEvent> CREATOR; - field public final float batteryLevel; - field public final float brightness; - field public final long colorSampleDuration; - field public final int colorTemperature; - field @Nullable public final long[] colorValueBuckets; - field public final boolean isDefaultBrightnessConfig; - field public final boolean isUserSetBrightness; - field public final float lastBrightness; - field public final long[] luxTimestamps; - field public final float[] luxValues; - field public final boolean nightMode; - field public final String packageName; - field public final float powerBrightnessFactor; - field public final long timeStamp; - } - - public final class BrightnessConfiguration implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByCategory(int); - method @Nullable public android.hardware.display.BrightnessCorrection getCorrectionByPackageName(@NonNull String); - method public android.util.Pair<float[],float[]> getCurve(); - method public float getShortTermModelLowerLuxMultiplier(); - method public long getShortTermModelTimeoutMillis(); - method public float getShortTermModelUpperLuxMultiplier(); - method public boolean shouldCollectColorSamples(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessConfiguration> CREATOR; - field public static final long SHORT_TERM_TIMEOUT_UNSET = -1L; // 0xffffffffffffffffL - } - - public static class BrightnessConfiguration.Builder { - ctor public BrightnessConfiguration.Builder(float[], float[]); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByCategory(int, @NonNull android.hardware.display.BrightnessCorrection); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder addCorrectionByPackageName(@NonNull String, @NonNull android.hardware.display.BrightnessCorrection); - method @NonNull public android.hardware.display.BrightnessConfiguration build(); - method public int getMaxCorrectionsByCategory(); - method public int getMaxCorrectionsByPackageName(); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setDescription(@Nullable String); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelLowerLuxMultiplier(@FloatRange(from=0.0f) float); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelTimeoutMillis(long); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShortTermModelUpperLuxMultiplier(@FloatRange(from=0.0f) float); - method @NonNull public android.hardware.display.BrightnessConfiguration.Builder setShouldCollectColorSamples(boolean); - } - - public final class BrightnessCorrection implements android.os.Parcelable { - method @FloatRange(from=0.0) public float apply(@FloatRange(from=0.0) float); - method @NonNull public static android.hardware.display.BrightnessCorrection createScaleAndTranslateLog(float, float); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.display.BrightnessCorrection> CREATOR; - } - public final class DisplayManager { - method @RequiresPermission("android.permission.ACCESS_AMBIENT_LIGHT_STATS") public java.util.List<android.hardware.display.AmbientBrightnessDayStats> getAmbientBrightnessStats(); - method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getBrightnessConfiguration(); - method @RequiresPermission(android.Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public java.util.List<android.hardware.display.BrightnessChangeEvent> getBrightnessEvents(); - method @Nullable @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public android.hardware.display.BrightnessConfiguration getDefaultBrightnessConfiguration(); - method public android.graphics.Point getStableDisplaySize(); method public boolean isMinimalPostProcessingRequested(int); - method @RequiresPermission(android.Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(android.hardware.display.BrightnessConfiguration); } } package android.hardware.hdmi { - public final class HdmiControlManager { - method @Nullable public android.hardware.hdmi.HdmiSwitchClient getSwitchClient(); - method @RequiresPermission("android.permission.HDMI_CEC") public void setStandbyMode(boolean); - field public static final String ACTION_OSD_MESSAGE = "android.hardware.hdmi.action.OSD_MESSAGE"; - field public static final int AVR_VOLUME_MUTED = 101; // 0x65 - field public static final int CLEAR_TIMER_STATUS_CEC_DISABLE = 162; // 0xa2 - field public static final int CLEAR_TIMER_STATUS_CHECK_RECORDER_CONNECTION = 160; // 0xa0 - field public static final int CLEAR_TIMER_STATUS_FAIL_TO_CLEAR_SELECTED_SOURCE = 161; // 0xa1 - field public static final int CLEAR_TIMER_STATUS_TIMER_CLEARED = 128; // 0x80 - field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_INFO_AVAILABLE = 2; // 0x2 - field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_NO_MATCHING = 1; // 0x1 - field public static final int CLEAR_TIMER_STATUS_TIMER_NOT_CLEARED_RECORDING = 0; // 0x0 - field public static final int CONTROL_STATE_CHANGED_REASON_SETTING = 1; // 0x1 - field public static final int CONTROL_STATE_CHANGED_REASON_STANDBY = 3; // 0x3 - field public static final int CONTROL_STATE_CHANGED_REASON_START = 0; // 0x0 - field public static final int CONTROL_STATE_CHANGED_REASON_WAKEUP = 2; // 0x2 - field public static final int DEVICE_EVENT_ADD_DEVICE = 1; // 0x1 - field public static final int DEVICE_EVENT_REMOVE_DEVICE = 2; // 0x2 - field public static final int DEVICE_EVENT_UPDATE_DEVICE = 3; // 0x3 - field public static final String EXTRA_MESSAGE_EXTRA_PARAM1 = "android.hardware.hdmi.extra.MESSAGE_EXTRA_PARAM1"; - field public static final String EXTRA_MESSAGE_ID = "android.hardware.hdmi.extra.MESSAGE_ID"; - field public static final int ONE_TOUCH_RECORD_ALREADY_RECORDING = 18; // 0x12 - field public static final int ONE_TOUCH_RECORD_CEC_DISABLED = 51; // 0x33 - field public static final int ONE_TOUCH_RECORD_CHECK_RECORDER_CONNECTION = 49; // 0x31 - field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_COPY = 13; // 0xd - field public static final int ONE_TOUCH_RECORD_DISALLOW_TO_FUTHER_COPIES = 14; // 0xe - field public static final int ONE_TOUCH_RECORD_FAIL_TO_RECORD_DISPLAYED_SCREEN = 50; // 0x32 - field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PHYSICAL_ADDRESS = 10; // 0xa - field public static final int ONE_TOUCH_RECORD_INVALID_EXTERNAL_PLUG_NUMBER = 9; // 0x9 - field public static final int ONE_TOUCH_RECORD_MEDIA_PROBLEM = 21; // 0x15 - field public static final int ONE_TOUCH_RECORD_MEDIA_PROTECTED = 19; // 0x13 - field public static final int ONE_TOUCH_RECORD_NOT_ENOUGH_SPACE = 22; // 0x16 - field public static final int ONE_TOUCH_RECORD_NO_MEDIA = 16; // 0x10 - field public static final int ONE_TOUCH_RECORD_NO_OR_INSUFFICIENT_CA_ENTITLEMENTS = 12; // 0xc - field public static final int ONE_TOUCH_RECORD_NO_SOURCE_SIGNAL = 20; // 0x14 - field public static final int ONE_TOUCH_RECORD_OTHER_REASON = 31; // 0x1f - field public static final int ONE_TOUCH_RECORD_PARENT_LOCK_ON = 23; // 0x17 - field public static final int ONE_TOUCH_RECORD_PLAYING = 17; // 0x11 - field public static final int ONE_TOUCH_RECORD_PREVIOUS_RECORDING_IN_PROGRESS = 48; // 0x30 - field public static final int ONE_TOUCH_RECORD_RECORDING_ALREADY_TERMINATED = 27; // 0x1b - field public static final int ONE_TOUCH_RECORD_RECORDING_ANALOGUE_SERVICE = 3; // 0x3 - field public static final int ONE_TOUCH_RECORD_RECORDING_CURRENTLY_SELECTED_SOURCE = 1; // 0x1 - field public static final int ONE_TOUCH_RECORD_RECORDING_DIGITAL_SERVICE = 2; // 0x2 - field public static final int ONE_TOUCH_RECORD_RECORDING_EXTERNAL_INPUT = 4; // 0x4 - field public static final int ONE_TOUCH_RECORD_RECORDING_TERMINATED_NORMALLY = 26; // 0x1a - field public static final int ONE_TOUCH_RECORD_UNABLE_ANALOGUE_SERVICE = 6; // 0x6 - field public static final int ONE_TOUCH_RECORD_UNABLE_DIGITAL_SERVICE = 5; // 0x5 - field public static final int ONE_TOUCH_RECORD_UNABLE_SELECTED_SERVICE = 7; // 0x7 - field public static final int ONE_TOUCH_RECORD_UNSUPPORTED_CA = 11; // 0xb - field public static final int OSD_MESSAGE_ARC_CONNECTED_INVALID_PORT = 1; // 0x1 - field public static final int OSD_MESSAGE_AVR_VOLUME_CHANGED = 2; // 0x2 - field public static final int POWER_STATUS_ON = 0; // 0x0 - field public static final int POWER_STATUS_STANDBY = 1; // 0x1 - field public static final int POWER_STATUS_TRANSIENT_TO_ON = 2; // 0x2 - field public static final int POWER_STATUS_TRANSIENT_TO_STANDBY = 3; // 0x3 - field public static final int POWER_STATUS_UNKNOWN = -1; // 0xffffffff - field @Deprecated public static final int RESULT_ALREADY_IN_PROGRESS = 4; // 0x4 - field public static final int RESULT_COMMUNICATION_FAILED = 7; // 0x7 - field public static final int RESULT_EXCEPTION = 5; // 0x5 - field public static final int RESULT_INCORRECT_MODE = 6; // 0x6 - field public static final int RESULT_SOURCE_NOT_AVAILABLE = 2; // 0x2 - field public static final int RESULT_SUCCESS = 0; // 0x0 - field public static final int RESULT_TARGET_NOT_AVAILABLE = 3; // 0x3 - field public static final int RESULT_TIMEOUT = 1; // 0x1 - field public static final int TIMER_RECORDING_RESULT_EXTRA_CEC_DISABLED = 3; // 0x3 - field public static final int TIMER_RECORDING_RESULT_EXTRA_CHECK_RECORDER_CONNECTION = 1; // 0x1 - field public static final int TIMER_RECORDING_RESULT_EXTRA_FAIL_TO_RECORD_SELECTED_SOURCE = 2; // 0x2 - field public static final int TIMER_RECORDING_RESULT_EXTRA_NO_ERROR = 0; // 0x0 - field public static final int TIMER_RECORDING_TYPE_ANALOGUE = 2; // 0x2 - field public static final int TIMER_RECORDING_TYPE_DIGITAL = 1; // 0x1 - field public static final int TIMER_RECORDING_TYPE_EXTERNAL = 3; // 0x3 - field public static final int TIMER_STATUS_MEDIA_INFO_NOT_PRESENT = 2; // 0x2 - field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_NOT_PROTECTED = 0; // 0x0 - field public static final int TIMER_STATUS_MEDIA_INFO_PRESENT_PROTECTED = 1; // 0x1 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_CA_NOT_SUPPORTED = 6; // 0x6 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_CLOCK_FAILURE = 10; // 0xa - field public static final int TIMER_STATUS_NOT_PROGRAMMED_DATE_OUT_OF_RANGE = 2; // 0x2 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_DUPLICATED = 14; // 0xe - field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PHYSICAL_NUMBER = 5; // 0x5 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_EXTERNAL_PLUG_NUMBER = 4; // 0x4 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_INVALID_SEQUENCE = 3; // 0x3 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_CA_ENTITLEMENTS = 7; // 0x7 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_NO_FREE_TIME = 1; // 0x1 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_PARENTAL_LOCK_ON = 9; // 0x9 - field public static final int TIMER_STATUS_NOT_PROGRAMMED_UNSUPPORTED_RESOLUTION = 8; // 0x8 - field public static final int TIMER_STATUS_PROGRAMMED_INFO_ENOUGH_SPACE = 8; // 0x8 - field public static final int TIMER_STATUS_PROGRAMMED_INFO_MIGHT_NOT_ENOUGH_SPACE = 11; // 0xb - field public static final int TIMER_STATUS_PROGRAMMED_INFO_NOT_ENOUGH_SPACE = 9; // 0x9 - field public static final int TIMER_STATUS_PROGRAMMED_INFO_NO_MEDIA_INFO = 10; // 0xa - } - public final class HdmiControlServiceWrapper { ctor public HdmiControlServiceWrapper(); method @NonNull public android.hardware.hdmi.HdmiControlManager createHdmiControlManager(); @@ -1401,68 +673,12 @@ package android.hardware.hdmi { field public static final int DEVICE_PURE_CEC_SWITCH = 6; // 0x6 } - public final class HdmiPortInfo implements android.os.Parcelable { - ctor public HdmiPortInfo(int, int, int, boolean, boolean, boolean); - method public int describeContents(); - method public int getAddress(); - method public int getId(); - method public int getType(); - method public boolean isArcSupported(); - method public boolean isCecSupported(); - method public boolean isMhlSupported(); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.hdmi.HdmiPortInfo> CREATOR; - field public static final int PORT_INPUT = 0; // 0x0 - field public static final int PORT_OUTPUT = 1; // 0x1 - } - - public class HdmiSwitchClient { - method public int getDeviceType(); - method @NonNull public java.util.List<android.hardware.hdmi.HdmiPortInfo> getPortInfo(); - method public void sendKeyEvent(int, boolean); - method public void sendVendorCommand(int, byte[], boolean); - } - } package android.hardware.lights { - public final class Light implements android.os.Parcelable { - method public int describeContents(); - method public int getId(); - method public int getOrdinal(); - method public int getType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.Light> CREATOR; - } - - public final class LightState implements android.os.Parcelable { - ctor public LightState(@ColorInt int); - method public int describeContents(); - method @ColorInt public int getColor(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.lights.LightState> CREATOR; - } - public final class LightsManager { method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public android.hardware.lights.LightState getLightState(@NonNull android.hardware.lights.Light); - method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public java.util.List<android.hardware.lights.Light> getLights(); - method @NonNull @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public android.hardware.lights.LightsManager.LightsSession openSession(); - field public static final int LIGHT_TYPE_MICROPHONE = 8; // 0x8 - } - - public final class LightsManager.LightsSession implements java.lang.AutoCloseable { - method @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public void close(); - method @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_LIGHTS) public void requestLights(@NonNull android.hardware.lights.LightsRequest); - } - - public final class LightsRequest { - } - - public static final class LightsRequest.Builder { - ctor public LightsRequest.Builder(); - method @NonNull public android.hardware.lights.LightsRequest build(); - method @NonNull public android.hardware.lights.LightsRequest.Builder clearLight(@NonNull android.hardware.lights.Light); - method @NonNull public android.hardware.lights.LightsRequest.Builder setLight(@NonNull android.hardware.lights.Light, @NonNull android.hardware.lights.LightState); } } @@ -1493,84 +709,16 @@ package android.hardware.soundtrigger { field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.KeyphraseMetadata> CREATOR; } - public class SoundTrigger { - field public static final int RECOGNITION_MODE_GENERIC = 8; // 0x8 - field public static final int RECOGNITION_MODE_USER_AUTHENTICATION = 4; // 0x4 - field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2 - field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1 - field public static final int STATUS_OK = 0; // 0x0 - } - - public static final class SoundTrigger.Keyphrase implements android.os.Parcelable { - ctor public SoundTrigger.Keyphrase(int, int, @NonNull java.util.Locale, @NonNull String, @Nullable int[]); - method public int getId(); - method @NonNull public java.util.Locale getLocale(); - method public int getRecognitionModes(); - method @NonNull public String getText(); - method @NonNull public int[] getUsers(); - method @NonNull public static android.hardware.soundtrigger.SoundTrigger.Keyphrase readFromParcel(@NonNull android.os.Parcel); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.Keyphrase> CREATOR; - } - - public static final class SoundTrigger.KeyphraseSoundModel extends android.hardware.soundtrigger.SoundTrigger.SoundModel implements android.os.Parcelable { - ctor public SoundTrigger.KeyphraseSoundModel(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[], @Nullable android.hardware.soundtrigger.SoundTrigger.Keyphrase[], int); - ctor public SoundTrigger.KeyphraseSoundModel(@NonNull java.util.UUID, @NonNull java.util.UUID, @Nullable byte[], @Nullable android.hardware.soundtrigger.SoundTrigger.Keyphrase[]); - method @NonNull public android.hardware.soundtrigger.SoundTrigger.Keyphrase[] getKeyphrases(); - method @NonNull public static android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel readFromParcel(@NonNull android.os.Parcel); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel> CREATOR; - } - public static final class SoundTrigger.ModelParamRange implements android.os.Parcelable { ctor public SoundTrigger.ModelParamRange(int, int); - method public int getEnd(); - method public int getStart(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.ModelParamRange> CREATOR; } public static final class SoundTrigger.ModuleProperties implements android.os.Parcelable { ctor public SoundTrigger.ModuleProperties(int, @NonNull String, @NonNull String, @NonNull String, int, @NonNull String, int, int, int, int, boolean, int, boolean, int, boolean, int); - method public int describeContents(); - method public int getAudioCapabilities(); - method @NonNull public String getDescription(); - method public int getId(); - method @NonNull public String getImplementor(); - method public int getMaxBufferMillis(); - method public int getMaxKeyphrases(); - method public int getMaxSoundModels(); - method public int getMaxUsers(); - method public int getPowerConsumptionMw(); - method public int getRecognitionModes(); - method @NonNull public String getSupportedModelArch(); - method @NonNull public java.util.UUID getUuid(); - method public int getVersion(); - method public boolean isCaptureTransitionSupported(); - method public boolean isConcurrentCaptureSupported(); - method public boolean isTriggerReturnedInEvent(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int AUDIO_CAPABILITY_ECHO_CANCELLATION = 1; // 0x1 - field public static final int AUDIO_CAPABILITY_NOISE_SUPPRESSION = 2; // 0x2 - field @NonNull public static final android.os.Parcelable.Creator<android.hardware.soundtrigger.SoundTrigger.ModuleProperties> CREATOR; } public static class SoundTrigger.RecognitionEvent { ctor public SoundTrigger.RecognitionEvent(int, int, boolean, int, int, int, boolean, @NonNull android.media.AudioFormat, @Nullable byte[]); - method @Nullable public android.media.AudioFormat getCaptureFormat(); - method public int getCaptureSession(); - method public byte[] getData(); - method public boolean isCaptureAvailable(); - } - - public static class SoundTrigger.SoundModel { - method @NonNull public byte[] getData(); - method public int getType(); - method @NonNull public java.util.UUID getUuid(); - method @NonNull public java.util.UUID getVendorUuid(); - method public int getVersion(); - field public static final int TYPE_GENERIC_SOUND = 1; // 0x1 - field public static final int TYPE_KEYPHRASE = 0; // 0x0 } } @@ -1669,71 +817,18 @@ package android.location { method public void setType(int); } - public class Location implements android.os.Parcelable { - method public void makeComplete(); - field @Deprecated public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation"; - } - public class LocationManager { method @NonNull public String[] getBackgroundThrottlingWhitelist(); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void getCurrentLocation(@NonNull android.location.LocationRequest, @Nullable android.os.CancellationSignal, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<android.location.Location>); method @NonNull public String[] getIgnoreSettingsWhitelist(); - method @Nullable @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public java.util.List<java.lang.String> getProviderPackages(@NonNull String); + method @Nullable @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public java.util.List<java.lang.String> getProviderPackages(@NonNull String); method @NonNull public java.util.List<android.location.LocationRequest> getTestProviderCurrentRequests(String); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.location.LocationListener, @Nullable android.os.Looper); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@Nullable android.location.LocationRequest, @NonNull android.app.PendingIntent); - method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, @NonNull android.os.UserHandle); field public static final String FUSED_PROVIDER = "fused"; } - public final class LocationRequest implements android.os.Parcelable { - method @NonNull public static android.location.LocationRequest create(); - method public int describeContents(); - method @Deprecated public long getExpireAt(); - method public long getExpireIn(); - method public long getFastestInterval(); - method public long getInterval(); - method public int getNumUpdates(); - method public int getQuality(); - method public boolean isLocationSettingsIgnored(); - method public boolean isLowPowerMode(); - method @Deprecated @NonNull public android.location.LocationRequest setExpireAt(long); - method @NonNull public android.location.LocationRequest setExpireIn(long); - method @NonNull public android.location.LocationRequest setFastestInterval(long); - method @NonNull public android.location.LocationRequest setInterval(long); - method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public android.location.LocationRequest setLocationSettingsIgnored(boolean); - method @NonNull public android.location.LocationRequest setLowPowerMode(boolean); - method @NonNull public android.location.LocationRequest setNumUpdates(int); - method @NonNull public android.location.LocationRequest setProvider(@NonNull String); - method @NonNull public android.location.LocationRequest setQuality(int); - method public void writeToParcel(android.os.Parcel, int); - field public static final int ACCURACY_BLOCK = 102; // 0x66 - field public static final int ACCURACY_CITY = 104; // 0x68 - field public static final int ACCURACY_FINE = 100; // 0x64 - field @NonNull public static final android.os.Parcelable.Creator<android.location.LocationRequest> CREATOR; - field public static final int POWER_HIGH = 203; // 0xcb - field public static final int POWER_LOW = 201; // 0xc9 - field public static final int POWER_NONE = 200; // 0xc8 - } - } package android.media { - public final class AudioFocusInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.media.AudioAttributes getAttributes(); - method @NonNull public String getClientId(); - method public int getClientUid(); - method public int getFlags(); - method public int getGainRequest(); - method public int getLossReceived(); - method @NonNull public String getPackageName(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.media.AudioFocusInfo> CREATOR; - } - public final class AudioFocusRequest { method @Nullable public android.media.AudioManager.OnAudioFocusChangeListener getOnAudioFocusChangeListener(); } @@ -1746,13 +841,7 @@ package android.media { } public class AudioManager { - method @RequiresPermission("android.permission.MODIFY_AUDIO_ROUTING") public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); method public boolean hasRegisteredDynamicPolicy(); - method @RequiresPermission("android.permission.MODIFY_AUDIO_ROUTING") public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy); - method @RequiresPermission("android.permission.MODIFY_AUDIO_ROUTING") public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy); - method @RequiresPermission("android.permission.MODIFY_AUDIO_ROUTING") public void unregisterAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy); - method @RequiresPermission("android.permission.MODIFY_AUDIO_ROUTING") public void unregisterAudioPolicyAsync(@NonNull android.media.audiopolicy.AudioPolicy); - field public static final int SUCCESS = 0; // 0x0 } public static final class AudioRecord.MetricsConstants { @@ -1853,90 +942,8 @@ package android.media.audiofx { package android.media.audiopolicy { - public class AudioMix { - method public int getMixState(); - field public static final int MIX_STATE_DISABLED = -1; // 0xffffffff - field public static final int MIX_STATE_IDLE = 0; // 0x0 - field public static final int MIX_STATE_MIXING = 1; // 0x1 - field public static final int ROUTE_FLAG_LOOP_BACK = 2; // 0x2 - field public static final int ROUTE_FLAG_RENDER = 1; // 0x1 - } - - public static class AudioMix.Builder { - ctor public AudioMix.Builder(android.media.audiopolicy.AudioMixingRule) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix build() throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix.Builder setDevice(@NonNull android.media.AudioDeviceInfo) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix.Builder setFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMix.Builder setRouteFlags(int) throws java.lang.IllegalArgumentException; - } - - public class AudioMixingRule { - field public static final int RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET = 2; // 0x2 - field public static final int RULE_MATCH_ATTRIBUTE_USAGE = 1; // 0x1 - field public static final int RULE_MATCH_UID = 4; // 0x4 - field public static final int RULE_MATCH_USERID = 8; // 0x8 - } - - public static class AudioMixingRule.Builder { - ctor public AudioMixingRule.Builder(); - method public android.media.audiopolicy.AudioMixingRule.Builder addMixRule(int, Object) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMixingRule.Builder addRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException; - method @NonNull public android.media.audiopolicy.AudioMixingRule.Builder allowPrivilegedPlaybackCapture(boolean); - method public android.media.audiopolicy.AudioMixingRule build(); - method public android.media.audiopolicy.AudioMixingRule.Builder excludeMixRule(int, Object) throws java.lang.IllegalArgumentException; - method public android.media.audiopolicy.AudioMixingRule.Builder excludeRule(android.media.AudioAttributes, int) throws java.lang.IllegalArgumentException; - } - - public class AudioPolicy { - method public int attachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>); - method public android.media.AudioRecord createAudioRecordSink(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; - method public android.media.AudioTrack createAudioTrackSource(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; - method public int detachMixes(@NonNull java.util.List<android.media.audiopolicy.AudioMix>); - method public int getFocusDuckingBehavior(); - method public int getStatus(); - method public boolean removeUidDeviceAffinity(int); - method public boolean removeUserIdDeviceAffinity(int); - method public int setFocusDuckingBehavior(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; - method public void setRegistration(String); - method public boolean setUidDeviceAffinity(int, @NonNull java.util.List<android.media.AudioDeviceInfo>); - method public boolean setUserIdDeviceAffinity(int, @NonNull java.util.List<android.media.AudioDeviceInfo>); - method public String toLogFriendlyString(); - field public static final int FOCUS_POLICY_DUCKING_DEFAULT = 0; // 0x0 - field public static final int FOCUS_POLICY_DUCKING_IN_APP = 0; // 0x0 - field public static final int FOCUS_POLICY_DUCKING_IN_POLICY = 1; // 0x1 - field public static final int POLICY_STATUS_REGISTERED = 2; // 0x2 - field public static final int POLICY_STATUS_UNREGISTERED = 1; // 0x1 - } - - public abstract static class AudioPolicy.AudioPolicyFocusListener { - ctor public AudioPolicy.AudioPolicyFocusListener(); - method public void onAudioFocusAbandon(android.media.AudioFocusInfo); - method public void onAudioFocusGrant(android.media.AudioFocusInfo, int); - method public void onAudioFocusLoss(android.media.AudioFocusInfo, boolean); - method public void onAudioFocusRequest(android.media.AudioFocusInfo, int); - } - - public abstract static class AudioPolicy.AudioPolicyStatusListener { - ctor public AudioPolicy.AudioPolicyStatusListener(); - method public void onMixStateUpdate(android.media.audiopolicy.AudioMix); - method public void onStatusChange(); - } - - public abstract static class AudioPolicy.AudioPolicyVolumeCallback { - ctor public AudioPolicy.AudioPolicyVolumeCallback(); - method public void onVolumeAdjustment(int); - } - public static class AudioPolicy.Builder { - ctor public AudioPolicy.Builder(android.content.Context); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder addMix(@NonNull android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; - method @NonNull public android.media.audiopolicy.AudioPolicy build(); - method public void setAudioPolicyFocusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener); - method public void setAudioPolicyStatusListener(android.media.audiopolicy.AudioPolicy.AudioPolicyStatusListener); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setAudioPolicyVolumeCallback(@NonNull android.media.audiopolicy.AudioPolicy.AudioPolicyVolumeCallback); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setIsAudioFocusPolicy(boolean); method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setIsTestFocusPolicy(boolean); - method @NonNull public android.media.audiopolicy.AudioPolicy.Builder setLooper(@NonNull android.os.Looper) throws java.lang.IllegalArgumentException; } } @@ -1950,232 +957,27 @@ package android.media.tv { } -package android.metrics { - - public class LogMaker { - ctor public LogMaker(int); - ctor public LogMaker(Object[]); - method public android.metrics.LogMaker addTaggedData(int, Object); - method public android.metrics.LogMaker clearCategory(); - method public android.metrics.LogMaker clearPackageName(); - method public android.metrics.LogMaker clearSubtype(); - method public android.metrics.LogMaker clearTaggedData(int); - method public android.metrics.LogMaker clearType(); - method public void deserialize(Object[]); - method public int getCategory(); - method public long getCounterBucket(); - method public String getCounterName(); - method public int getCounterValue(); - method public String getPackageName(); - method public int getProcessId(); - method public int getSubtype(); - method public Object getTaggedData(int); - method public long getTimestamp(); - method public int getType(); - method public int getUid(); - method public boolean isLongCounterBucket(); - method public boolean isSubsetOf(android.metrics.LogMaker); - method public boolean isValidValue(Object); - method public Object[] serialize(); - method public android.metrics.LogMaker setCategory(int); - method public android.metrics.LogMaker setPackageName(String); - method public android.metrics.LogMaker setSubtype(int); - method public android.metrics.LogMaker setType(int); - } - - public class MetricsReader { - ctor public MetricsReader(); - method public void checkpoint(); - method public boolean hasNext(); - method public android.metrics.LogMaker next(); - method public void read(long); - method public void reset(); - } - -} - package android.net { - public class CaptivePortal implements android.os.Parcelable { - method public void logEvent(int, @NonNull String); - method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void reevaluateNetwork(); - method public void useNetwork(); - field public static final int APP_REQUEST_REEVALUATION_REQUIRED = 100; // 0x64 - field public static final int APP_RETURN_DISMISSED = 0; // 0x0 - field public static final int APP_RETURN_UNWANTED = 1; // 0x1 - field public static final int APP_RETURN_WANTED_AS_IS = 2; // 0x2 - } - - public final class CaptivePortalData implements android.os.Parcelable { - method public int describeContents(); - method public long getByteLimit(); - method public long getExpiryTimeMillis(); - method public long getRefreshTimeMillis(); - method @Nullable public android.net.Uri getUserPortalUrl(); - method @Nullable public android.net.Uri getVenueInfoUrl(); - method public boolean isCaptive(); - method public boolean isSessionExtendable(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.CaptivePortalData> CREATOR; - } - - public static class CaptivePortalData.Builder { - ctor public CaptivePortalData.Builder(); - ctor public CaptivePortalData.Builder(@Nullable android.net.CaptivePortalData); - method @NonNull public android.net.CaptivePortalData build(); - method @NonNull public android.net.CaptivePortalData.Builder setBytesRemaining(long); - method @NonNull public android.net.CaptivePortalData.Builder setCaptive(boolean); - method @NonNull public android.net.CaptivePortalData.Builder setExpiryTime(long); - method @NonNull public android.net.CaptivePortalData.Builder setRefreshTime(long); - method @NonNull public android.net.CaptivePortalData.Builder setSessionExtendable(boolean); - method @NonNull public android.net.CaptivePortalData.Builder setUserPortalUrl(@Nullable android.net.Uri); - method @NonNull public android.net.CaptivePortalData.Builder setVenueInfoUrl(@Nullable android.net.Uri); - } - public class ConnectivityManager { method @RequiresPermission(anyOf={"android.permission.MANAGE_TEST_NETWORKS", android.Manifest.permission.NETWORK_STACK}) public void simulateDataStall(int, long, @NonNull android.net.Network, @NonNull android.os.PersistableBundle); - method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull android.net.Network, @NonNull android.os.Bundle); - field public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; - field public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; } public class EthernetManager { - method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback); method public void setIncludeTestInterfaces(boolean); } - public static interface EthernetManager.TetheredInterfaceCallback { - method public void onAvailable(@NonNull String); - method public void onUnavailable(); - } - - public static class EthernetManager.TetheredInterfaceRequest { - method public void release(); - } - - public final class IpPrefix implements android.os.Parcelable { - ctor public IpPrefix(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int); - ctor public IpPrefix(@NonNull String); - } - public final class IpSecManager { field public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; // 0x0 } - public class LinkAddress implements android.os.Parcelable { - ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int); - ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int, int, int, long, long); - ctor public LinkAddress(@NonNull java.net.InetAddress, @IntRange(from=0, to=128) int); - ctor public LinkAddress(@NonNull String); - ctor public LinkAddress(@NonNull String, int, int); - method public long getDeprecationTime(); - method public long getExpirationTime(); - method public boolean isGlobalPreferred(); - method public boolean isIpv4(); - method public boolean isIpv6(); - method public boolean isSameAddressAs(@Nullable android.net.LinkAddress); - } - - public final class LinkProperties implements android.os.Parcelable { - ctor public LinkProperties(@Nullable android.net.LinkProperties); - ctor public LinkProperties(@Nullable android.net.LinkProperties, boolean); - method public boolean addDnsServer(@NonNull java.net.InetAddress); - method public boolean addLinkAddress(@NonNull android.net.LinkAddress); - method @Nullable public android.net.Uri getCaptivePortalApiUrl(); - method @Nullable public android.net.CaptivePortalData getCaptivePortalData(); - method @NonNull public java.util.List<java.net.InetAddress> getPcscfServers(); - method @Nullable public String getTcpBufferSizes(); - method @NonNull public java.util.List<java.net.InetAddress> getValidatedPrivateDnsServers(); - method public boolean hasGlobalIpv6Address(); - method public boolean hasIpv4Address(); - method public boolean hasIpv6DefaultRoute(); - method public boolean isIpv4Provisioned(); - method public boolean isIpv6Provisioned(); - method public boolean isProvisioned(); - method public boolean isReachable(@NonNull java.net.InetAddress); - method public boolean removeDnsServer(@NonNull java.net.InetAddress); - method public boolean removeLinkAddress(@NonNull android.net.LinkAddress); - method public boolean removeRoute(@NonNull android.net.RouteInfo); - method public void setCaptivePortalApiUrl(@Nullable android.net.Uri); - method public void setCaptivePortalData(@Nullable android.net.CaptivePortalData); - method public void setPcscfServers(@NonNull java.util.Collection<java.net.InetAddress>); - method public void setPrivateDnsServerName(@Nullable String); - method public void setTcpBufferSizes(@Nullable String); - method public void setUsePrivateDns(boolean); - method public void setValidatedPrivateDnsServers(@NonNull java.util.Collection<java.net.InetAddress>); - } - - public class Network implements android.os.Parcelable { - ctor public Network(@NonNull android.net.Network); - method public int getNetId(); - method @NonNull public android.net.Network getPrivateDnsBypassingCopy(); - } - public final class NetworkCapabilities implements android.os.Parcelable { - method @NonNull public int[] getAdministratorUids(); method public int[] getCapabilities(); - method @Nullable public String getSsid(); - method @NonNull public int[] getTransportTypes(); - method public boolean satisfiedByNetworkCapabilities(@Nullable android.net.NetworkCapabilities); field public static final int TRANSPORT_TEST = 7; // 0x7 } - public static final class NetworkCapabilities.Builder { - ctor public NetworkCapabilities.Builder(); - ctor public NetworkCapabilities.Builder(@NonNull android.net.NetworkCapabilities); - method @NonNull public android.net.NetworkCapabilities.Builder addCapability(int); - method @NonNull public android.net.NetworkCapabilities.Builder addTransportType(int); - method @NonNull public android.net.NetworkCapabilities build(); - method @NonNull public android.net.NetworkCapabilities.Builder removeCapability(int); - method @NonNull public android.net.NetworkCapabilities.Builder removeTransportType(int); - method @NonNull @RequiresPermission("android.permission.NETWORK_FACTORY") public android.net.NetworkCapabilities.Builder setAdministratorUids(@NonNull int[]); - method @NonNull public android.net.NetworkCapabilities.Builder setLinkDownstreamBandwidthKbps(int); - method @NonNull public android.net.NetworkCapabilities.Builder setLinkUpstreamBandwidthKbps(int); - method @NonNull public android.net.NetworkCapabilities.Builder setNetworkSpecifier(@Nullable android.net.NetworkSpecifier); - method @NonNull @RequiresPermission("android.permission.NETWORK_FACTORY") public android.net.NetworkCapabilities.Builder setOwnerUid(int); - method @NonNull @RequiresPermission("android.permission.NETWORK_FACTORY") public android.net.NetworkCapabilities.Builder setRequestorPackageName(@Nullable String); - method @NonNull @RequiresPermission("android.permission.NETWORK_FACTORY") public android.net.NetworkCapabilities.Builder setRequestorUid(int); - method @NonNull @RequiresPermission("android.permission.NETWORK_SIGNAL_STRENGTH_WAKEUP") public android.net.NetworkCapabilities.Builder setSignalStrength(int); - method @NonNull @RequiresPermission("android.permission.NETWORK_FACTORY") public android.net.NetworkCapabilities.Builder setSsid(@Nullable String); - method @NonNull public android.net.NetworkCapabilities.Builder setTransportInfo(@Nullable android.net.TransportInfo); - } - public class NetworkStack { - method @Nullable public static android.os.IBinder getService(); method public static void setServiceForTest(@Nullable android.os.IBinder); - field public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK"; - } - - public final class RouteInfo implements android.os.Parcelable { - ctor public RouteInfo(@Nullable android.net.IpPrefix, @Nullable java.net.InetAddress, @Nullable String, int); - method public int getType(); - field public static final int RTN_THROW = 9; // 0x9 - field public static final int RTN_UNICAST = 1; // 0x1 - field public static final int RTN_UNREACHABLE = 7; // 0x7 - } - - public final class StaticIpConfiguration implements android.os.Parcelable { - ctor public StaticIpConfiguration(); - ctor public StaticIpConfiguration(@Nullable android.net.StaticIpConfiguration); - method public void addDnsServer(@NonNull java.net.InetAddress); - method public void clear(); - method public int describeContents(); - method @NonNull public java.util.List<java.net.InetAddress> getDnsServers(); - method @Nullable public String getDomains(); - method @Nullable public java.net.InetAddress getGateway(); - method @Nullable public android.net.LinkAddress getIpAddress(); - method @NonNull public java.util.List<android.net.RouteInfo> getRoutes(@Nullable String); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.StaticIpConfiguration> CREATOR; - } - - public static final class StaticIpConfiguration.Builder { - ctor public StaticIpConfiguration.Builder(); - method @NonNull public android.net.StaticIpConfiguration build(); - method @NonNull public android.net.StaticIpConfiguration.Builder setDnsServers(@NonNull Iterable<java.net.InetAddress>); - method @NonNull public android.net.StaticIpConfiguration.Builder setDomains(@Nullable String); - method @NonNull public android.net.StaticIpConfiguration.Builder setGateway(@Nullable java.net.InetAddress); - method @NonNull public android.net.StaticIpConfiguration.Builder setIpAddress(@Nullable android.net.LinkAddress); } public final class TestNetworkInterface implements android.os.Parcelable { @@ -2194,100 +996,6 @@ package android.net { method public void teardownTestNetwork(@NonNull android.net.Network); } - public final class TetheredClient implements android.os.Parcelable { - ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int); - method public int describeContents(); - method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses(); - method @NonNull public android.net.MacAddress getMacAddress(); - method public int getTetheringType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR; - } - - public static final class TetheredClient.AddressInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.net.LinkAddress getAddress(); - method @Nullable public String getHostname(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR; - } - - public class TetheringManager { - method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering(); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int); - method @RequiresPermission(anyOf={"android.permission.TETHER_PRIVILEGED", android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback); - field public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; - field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY"; - field public static final String EXTRA_ACTIVE_TETHER = "tetherArray"; - field public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; - field public static final String EXTRA_ERRORED_TETHER = "erroredArray"; - field public static final int TETHERING_BLUETOOTH = 2; // 0x2 - field public static final int TETHERING_ETHERNET = 5; // 0x5 - field public static final int TETHERING_INVALID = -1; // 0xffffffff - field public static final int TETHERING_NCM = 4; // 0x4 - field public static final int TETHERING_USB = 1; // 0x1 - field public static final int TETHERING_WIFI = 0; // 0x0 - field public static final int TETHERING_WIFI_P2P = 3; // 0x3 - field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc - field public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; // 0x9 - field public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; // 0x8 - field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd - field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa - field public static final int TETHER_ERROR_INTERNAL_ERROR = 5; // 0x5 - field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf - field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe - field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0 - field public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; // 0xb - field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2 - field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6 - field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4 - field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1 - field public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; // 0x10 - field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3 - field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7 - field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2 - field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1 - field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0 - } - - public static interface TetheringManager.OnTetheringEntitlementResultListener { - method public void onTetheringEntitlementResult(int); - } - - public static interface TetheringManager.StartTetheringCallback { - method public default void onTetheringFailed(int); - method public default void onTetheringStarted(); - } - - public static interface TetheringManager.TetheringEventCallback { - method public default void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>); - method public default void onError(@NonNull String, int); - method public default void onOffloadStatusChanged(int); - method public default void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheringSupported(boolean); - method public default void onUpstreamChanged(@Nullable android.net.Network); - } - - public static class TetheringManager.TetheringRequest { - method @Nullable public android.net.LinkAddress getClientStaticIpv4Address(); - method @Nullable public android.net.LinkAddress getLocalIpv4Address(); - method public boolean getShouldShowEntitlementUi(); - method public int getTetheringType(); - method public boolean isExemptFromEntitlementCheck(); - } - - public static class TetheringManager.TetheringRequest.Builder { - ctor public TetheringManager.TetheringRequest.Builder(int); - method @NonNull public android.net.TetheringManager.TetheringRequest build(); - method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean); - method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean); - method @NonNull @RequiresPermission("android.permission.TETHER_PRIVILEGED") public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress); - } - public class TrafficStats { method public static long getLoopbackRxBytes(); method public static long getLoopbackRxPackets(); @@ -2297,228 +1005,8 @@ package android.net { } -package android.net.apf { - - public final class ApfCapabilities implements android.os.Parcelable { - ctor public ApfCapabilities(int, int, int); - method public int describeContents(); - method public static boolean getApfDrop8023Frames(); - method @NonNull public static int[] getApfEtherTypeBlackList(); - method public boolean hasDataAccess(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.net.apf.ApfCapabilities> CREATOR; - field public final int apfPacketFormat; - field public final int apfVersionSupported; - field public final int maximumApfProgramSize; - } - -} - -package android.net.metrics { - - public final class ApfProgramEvent implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class ApfProgramEvent.Builder { - ctor public ApfProgramEvent.Builder(); - method @NonNull public android.net.metrics.ApfProgramEvent build(); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setActualLifetime(long); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setCurrentRas(int); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFilteredRas(int); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setFlags(boolean, boolean); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setLifetime(long); - method @NonNull public android.net.metrics.ApfProgramEvent.Builder setProgramLength(int); - } - - public final class ApfStats implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class ApfStats.Builder { - ctor public ApfStats.Builder(); - method @NonNull public android.net.metrics.ApfStats build(); - method @NonNull public android.net.metrics.ApfStats.Builder setDroppedRas(int); - method @NonNull public android.net.metrics.ApfStats.Builder setDurationMs(long); - method @NonNull public android.net.metrics.ApfStats.Builder setMatchingRas(int); - method @NonNull public android.net.metrics.ApfStats.Builder setMaxProgramSize(int); - method @NonNull public android.net.metrics.ApfStats.Builder setParseErrors(int); - method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdates(int); - method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAll(int); - method @NonNull public android.net.metrics.ApfStats.Builder setProgramUpdatesAllowingMulticast(int); - method @NonNull public android.net.metrics.ApfStats.Builder setReceivedRas(int); - method @NonNull public android.net.metrics.ApfStats.Builder setZeroLifetimeRas(int); - } - - public final class DhcpClientEvent implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class DhcpClientEvent.Builder { - ctor public DhcpClientEvent.Builder(); - method @NonNull public android.net.metrics.DhcpClientEvent build(); - method @NonNull public android.net.metrics.DhcpClientEvent.Builder setDurationMs(int); - method @NonNull public android.net.metrics.DhcpClientEvent.Builder setMsg(String); - } - - public final class DhcpErrorEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public DhcpErrorEvent(int); - method public static int errorCodeWithOption(int, int); - field public static final int BOOTP_TOO_SHORT = 67174400; // 0x4010000 - field public static final int BUFFER_UNDERFLOW = 83951616; // 0x5010000 - field public static final int DHCP_BAD_MAGIC_COOKIE = 67239936; // 0x4020000 - field public static final int DHCP_ERROR = 4; // 0x4 - field public static final int DHCP_INVALID_OPTION_LENGTH = 67305472; // 0x4030000 - field public static final int DHCP_NO_COOKIE = 67502080; // 0x4060000 - field public static final int DHCP_NO_MSG_TYPE = 67371008; // 0x4040000 - field public static final int DHCP_UNKNOWN_MSG_TYPE = 67436544; // 0x4050000 - field public static final int L2_ERROR = 1; // 0x1 - field public static final int L2_TOO_SHORT = 16842752; // 0x1010000 - field public static final int L2_WRONG_ETH_TYPE = 16908288; // 0x1020000 - field public static final int L3_ERROR = 2; // 0x2 - field public static final int L3_INVALID_IP = 33751040; // 0x2030000 - field public static final int L3_NOT_IPV4 = 33685504; // 0x2020000 - field public static final int L3_TOO_SHORT = 33619968; // 0x2010000 - field public static final int L4_ERROR = 3; // 0x3 - field public static final int L4_NOT_UDP = 50397184; // 0x3010000 - field public static final int L4_WRONG_PORT = 50462720; // 0x3020000 - field public static final int MISC_ERROR = 5; // 0x5 - field public static final int PARSING_ERROR = 84082688; // 0x5030000 - field public static final int RECEIVE_ERROR = 84017152; // 0x5020000 - } - - public class IpConnectivityLog { - ctor public IpConnectivityLog(); - method public boolean log(long, @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(@NonNull String, @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(@NonNull android.net.Network, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(int, @NonNull int[], @NonNull android.net.metrics.IpConnectivityLog.Event); - method public boolean log(@NonNull android.net.metrics.IpConnectivityLog.Event); - } - - public static interface IpConnectivityLog.Event extends android.os.Parcelable { - } - - public final class IpManagerEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public IpManagerEvent(int, long); - field public static final int COMPLETE_LIFECYCLE = 3; // 0x3 - field public static final int ERROR_INTERFACE_NOT_FOUND = 8; // 0x8 - field public static final int ERROR_INVALID_PROVISIONING = 7; // 0x7 - field public static final int ERROR_STARTING_IPREACHABILITYMONITOR = 6; // 0x6 - field public static final int ERROR_STARTING_IPV4 = 4; // 0x4 - field public static final int ERROR_STARTING_IPV6 = 5; // 0x5 - field public static final int PROVISIONING_FAIL = 2; // 0x2 - field public static final int PROVISIONING_OK = 1; // 0x1 - } - - public final class IpReachabilityEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public IpReachabilityEvent(int); - field public static final int NUD_FAILED = 512; // 0x200 - field public static final int NUD_FAILED_ORGANIC = 1024; // 0x400 - field public static final int PROBE = 256; // 0x100 - field public static final int PROVISIONING_LOST = 768; // 0x300 - field public static final int PROVISIONING_LOST_ORGANIC = 1280; // 0x500 - } - - public final class NetworkEvent implements android.net.metrics.IpConnectivityLog.Event { - ctor public NetworkEvent(int, long); - ctor public NetworkEvent(int); - field public static final int NETWORK_CAPTIVE_PORTAL_FOUND = 4; // 0x4 - field public static final int NETWORK_CONNECTED = 1; // 0x1 - field public static final int NETWORK_CONSECUTIVE_DNS_TIMEOUT_FOUND = 12; // 0xc - field public static final int NETWORK_DISCONNECTED = 7; // 0x7 - field public static final int NETWORK_FIRST_VALIDATION_PORTAL_FOUND = 10; // 0xa - field public static final int NETWORK_FIRST_VALIDATION_SUCCESS = 8; // 0x8 - field public static final int NETWORK_LINGER = 5; // 0x5 - field public static final int NETWORK_PARTIAL_CONNECTIVITY = 13; // 0xd - field public static final int NETWORK_REVALIDATION_PORTAL_FOUND = 11; // 0xb - field public static final int NETWORK_REVALIDATION_SUCCESS = 9; // 0x9 - field public static final int NETWORK_UNLINGER = 6; // 0x6 - field public static final int NETWORK_VALIDATED = 2; // 0x2 - field public static final int NETWORK_VALIDATION_FAILED = 3; // 0x3 - } - - public final class RaEvent implements android.net.metrics.IpConnectivityLog.Event { - } - - public static final class RaEvent.Builder { - ctor public RaEvent.Builder(); - method @NonNull public android.net.metrics.RaEvent build(); - method @NonNull public android.net.metrics.RaEvent.Builder updateDnsslLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixPreferredLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updatePrefixValidLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updateRdnssLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updateRouteInfoLifetime(long); - method @NonNull public android.net.metrics.RaEvent.Builder updateRouterLifetime(long); - } - - public final class ValidationProbeEvent implements android.net.metrics.IpConnectivityLog.Event { - method @NonNull public static String getProbeName(int); - field public static final int DNS_FAILURE = 0; // 0x0 - field public static final int DNS_SUCCESS = 1; // 0x1 - field public static final int PROBE_DNS = 0; // 0x0 - field public static final int PROBE_FALLBACK = 4; // 0x4 - field public static final int PROBE_HTTP = 1; // 0x1 - field public static final int PROBE_HTTPS = 2; // 0x2 - field public static final int PROBE_PAC = 3; // 0x3 - field public static final int PROBE_PRIVDNS = 5; // 0x5 - } - - public static final class ValidationProbeEvent.Builder { - ctor public ValidationProbeEvent.Builder(); - method @NonNull public android.net.metrics.ValidationProbeEvent build(); - method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setDurationMs(long); - method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setProbeType(int, boolean); - method @NonNull public android.net.metrics.ValidationProbeEvent.Builder setReturnCode(int); - } - -} - -package android.net.util { - - public final class SocketUtils { - method public static void bindSocketToInterface(@NonNull java.io.FileDescriptor, @NonNull String) throws android.system.ErrnoException; - method public static void closeSocket(@Nullable java.io.FileDescriptor) throws java.io.IOException; - method @NonNull public static java.net.SocketAddress makeNetlinkSocketAddress(int, int); - method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int); - method @Deprecated @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, @NonNull byte[]); - method @NonNull public static java.net.SocketAddress makePacketSocketAddress(int, int, @NonNull byte[]); - } - -} - package android.os { - public class BatteryManager { - method @RequiresPermission("android.permission.POWER_SAVER") public boolean setChargingStateUpdateDelayMillis(int); - } - - public final class BugreportManager { - method @RequiresPermission(android.Manifest.permission.DUMP) public void cancelBugreport(); - method @RequiresPermission(android.Manifest.permission.DUMP) public void requestBugreport(@NonNull android.os.BugreportParams, @Nullable CharSequence, @Nullable CharSequence); - method @RequiresPermission(android.Manifest.permission.DUMP) public void startBugreport(@NonNull android.os.ParcelFileDescriptor, @Nullable android.os.ParcelFileDescriptor, @NonNull android.os.BugreportParams, @NonNull java.util.concurrent.Executor, @NonNull android.os.BugreportManager.BugreportCallback); - } - - public abstract static class BugreportManager.BugreportCallback { - ctor public BugreportManager.BugreportCallback(); - method public void onError(int); - method public void onFinished(); - method public void onProgress(@FloatRange(from=0.0f, to=100.0f) float); - field public static final int BUGREPORT_ERROR_ANOTHER_REPORT_IN_PROGRESS = 5; // 0x5 - field public static final int BUGREPORT_ERROR_INVALID_INPUT = 1; // 0x1 - field public static final int BUGREPORT_ERROR_RUNTIME = 2; // 0x2 - field public static final int BUGREPORT_ERROR_USER_CONSENT_TIMED_OUT = 4; // 0x4 - field public static final int BUGREPORT_ERROR_USER_DENIED_CONSENT = 3; // 0x3 - } - - public final class BugreportParams { - ctor public BugreportParams(int); - method public int getMode(); - field public static final int BUGREPORT_MODE_FULL = 0; // 0x0 - field public static final int BUGREPORT_MODE_INTERACTIVE = 1; // 0x1 - field public static final int BUGREPORT_MODE_REMOTE = 2; // 0x2 - field public static final int BUGREPORT_MODE_TELEPHONY = 4; // 0x4 - field public static final int BUGREPORT_MODE_WEAR = 3; // 0x3 - field public static final int BUGREPORT_MODE_WIFI = 5; // 0x5 - } - public class Build { method public static boolean is64BitAbi(String); field public static final boolean IS_EMULATOR; @@ -2537,11 +1025,6 @@ package android.os { public class Environment { method public static java.io.File buildPath(java.io.File, java.lang.String...); - method @NonNull public static java.io.File getOdmDirectory(); - method @NonNull public static java.io.File getOemDirectory(); - method @NonNull public static java.io.File getProductDirectory(); - method @NonNull public static java.io.File getSystemExtDirectory(); - method @NonNull public static java.io.File getVendorDirectory(); } public final class FileUtils { @@ -2550,228 +1033,11 @@ package android.os { method @NonNull public static byte[] digest(@NonNull java.io.InputStream, @NonNull String) throws java.io.IOException, java.security.NoSuchAlgorithmException; } - public class HidlMemory implements java.io.Closeable { - ctor public HidlMemory(@NonNull String, @IntRange(from=0) long, @Nullable android.os.NativeHandle); - method public void close() throws java.io.IOException; - method @NonNull public android.os.HidlMemory dup() throws java.io.IOException; - method protected void finalize(); - method @Nullable public android.os.NativeHandle getHandle(); - method @NonNull public String getName(); - method public long getSize(); - method @Nullable public android.os.NativeHandle releaseHandle(); - } - - public abstract class HwBinder implements android.os.IHwBinder { - ctor public HwBinder(); - method public static final void configureRpcThreadpool(long, boolean); - method public static void enableInstrumentation(); - method public static final android.os.IHwBinder getService(String, String) throws java.util.NoSuchElementException, android.os.RemoteException; - method public static final android.os.IHwBinder getService(String, String, boolean) throws java.util.NoSuchElementException, android.os.RemoteException; - method public static final void joinRpcThreadpool(); - method public abstract void onTransact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException; - method public final void registerService(String) throws android.os.RemoteException; - method public final void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException; - } - - public class HwBlob { - ctor public HwBlob(int); - method public final void copyToBoolArray(long, boolean[], int); - method public final void copyToDoubleArray(long, double[], int); - method public final void copyToFloatArray(long, float[], int); - method public final void copyToInt16Array(long, short[], int); - method public final void copyToInt32Array(long, int[], int); - method public final void copyToInt64Array(long, long[], int); - method public final void copyToInt8Array(long, byte[], int); - method public final boolean getBool(long); - method public final double getDouble(long); - method public final long getFieldHandle(long); - method public final float getFloat(long); - method public final short getInt16(long); - method public final int getInt32(long); - method public final long getInt64(long); - method public final byte getInt8(long); - method public final String getString(long); - method public final long handle(); - method public final void putBlob(long, android.os.HwBlob); - method public final void putBool(long, boolean); - method public final void putBoolArray(long, boolean[]); - method public final void putDouble(long, double); - method public final void putDoubleArray(long, double[]); - method public final void putFloat(long, float); - method public final void putFloatArray(long, float[]); - method public final void putHidlMemory(long, @NonNull android.os.HidlMemory); - method public final void putInt16(long, short); - method public final void putInt16Array(long, short[]); - method public final void putInt32(long, int); - method public final void putInt32Array(long, int[]); - method public final void putInt64(long, long); - method public final void putInt64Array(long, long[]); - method public final void putInt8(long, byte); - method public final void putInt8Array(long, byte[]); - method public final void putNativeHandle(long, @Nullable android.os.NativeHandle); - method public final void putString(long, String); - method public static Boolean[] wrapArray(@NonNull boolean[]); - method public static Long[] wrapArray(@NonNull long[]); - method public static Byte[] wrapArray(@NonNull byte[]); - method public static Short[] wrapArray(@NonNull short[]); - method public static Integer[] wrapArray(@NonNull int[]); - method public static Float[] wrapArray(@NonNull float[]); - method public static Double[] wrapArray(@NonNull double[]); - } - - public class HwParcel { - ctor public HwParcel(); - method public final void enforceInterface(String); - method public final boolean readBool(); - method public final java.util.ArrayList<java.lang.Boolean> readBoolVector(); - method public final android.os.HwBlob readBuffer(long); - method public final double readDouble(); - method public final java.util.ArrayList<java.lang.Double> readDoubleVector(); - method public final android.os.HwBlob readEmbeddedBuffer(long, long, long, boolean); - method @NonNull @Nullable public final android.os.HidlMemory readEmbeddedHidlMemory(long, long, long); - method @Nullable public final android.os.NativeHandle readEmbeddedNativeHandle(long, long); - method public final float readFloat(); - method public final java.util.ArrayList<java.lang.Float> readFloatVector(); - method @NonNull public final android.os.HidlMemory readHidlMemory(); - method public final short readInt16(); - method public final java.util.ArrayList<java.lang.Short> readInt16Vector(); - method public final int readInt32(); - method public final java.util.ArrayList<java.lang.Integer> readInt32Vector(); - method public final long readInt64(); - method public final java.util.ArrayList<java.lang.Long> readInt64Vector(); - method public final byte readInt8(); - method public final java.util.ArrayList<java.lang.Byte> readInt8Vector(); - method @Nullable public final android.os.NativeHandle readNativeHandle(); - method @NonNull public final java.util.ArrayList<android.os.NativeHandle> readNativeHandleVector(); - method public final String readString(); - method public final java.util.ArrayList<java.lang.String> readStringVector(); - method public final android.os.IHwBinder readStrongBinder(); - method public final void release(); - method public final void releaseTemporaryStorage(); - method public final void send(); - method public final void verifySuccess(); - method public final void writeBool(boolean); - method public final void writeBoolVector(java.util.ArrayList<java.lang.Boolean>); - method public final void writeBuffer(android.os.HwBlob); - method public final void writeDouble(double); - method public final void writeDoubleVector(java.util.ArrayList<java.lang.Double>); - method public final void writeFloat(float); - method public final void writeFloatVector(java.util.ArrayList<java.lang.Float>); - method public final void writeHidlMemory(@NonNull android.os.HidlMemory); - method public final void writeInt16(short); - method public final void writeInt16Vector(java.util.ArrayList<java.lang.Short>); - method public final void writeInt32(int); - method public final void writeInt32Vector(java.util.ArrayList<java.lang.Integer>); - method public final void writeInt64(long); - method public final void writeInt64Vector(java.util.ArrayList<java.lang.Long>); - method public final void writeInt8(byte); - method public final void writeInt8Vector(java.util.ArrayList<java.lang.Byte>); - method public final void writeInterfaceToken(String); - method public final void writeNativeHandle(@Nullable android.os.NativeHandle); - method public final void writeNativeHandleVector(@NonNull java.util.ArrayList<android.os.NativeHandle>); - method public final void writeStatus(int); - method public final void writeString(String); - method public final void writeStringVector(java.util.ArrayList<java.lang.String>); - method public final void writeStrongBinder(android.os.IHwBinder); - field public static final int STATUS_SUCCESS = 0; // 0x0 - } - - public interface IHwBinder { - method public boolean linkToDeath(android.os.IHwBinder.DeathRecipient, long); - method public android.os.IHwInterface queryLocalInterface(String); - method public void transact(int, android.os.HwParcel, android.os.HwParcel, int) throws android.os.RemoteException; - method public boolean unlinkToDeath(android.os.IHwBinder.DeathRecipient); - } - - public static interface IHwBinder.DeathRecipient { - method public void serviceDied(long); - } - - public interface IHwInterface { - method public android.os.IHwBinder asBinder(); - } - - public class IncidentManager { - method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void approveReport(android.net.Uri); - method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void cancelAuthorization(android.os.IncidentManager.AuthListener); - method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void deleteIncidentReports(android.net.Uri); - method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public void denyReport(android.net.Uri); - method @Nullable @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public android.os.IncidentManager.IncidentReport getIncidentReport(android.net.Uri); - method @NonNull @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public java.util.List<android.net.Uri> getIncidentReportList(String); - method @RequiresPermission(android.Manifest.permission.APPROVE_INCIDENT_REPORTS) public java.util.List<android.os.IncidentManager.PendingReport> getPendingReports(); - method public void registerSection(int, @NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.os.IncidentManager.DumpCallback); - method @RequiresPermission(allOf={android.Manifest.permission.DUMP, android.Manifest.permission.PACKAGE_USAGE_STATS}) public void reportIncident(android.os.IncidentReportArgs); - method @RequiresPermission("android.permission.REQUEST_INCIDENT_REPORT_APPROVAL") public void requestAuthorization(int, String, int, android.os.IncidentManager.AuthListener); - method public void unregisterSection(int); - field public static final int FLAG_CONFIRMATION_DIALOG = 1; // 0x1 - field public static final int PRIVACY_POLICY_AUTO = 200; // 0xc8 - field public static final int PRIVACY_POLICY_EXPLICIT = 100; // 0x64 - field public static final int PRIVACY_POLICY_LOCAL = 0; // 0x0 - } - - public static class IncidentManager.AuthListener { - ctor public IncidentManager.AuthListener(); - method public void onReportApproved(); - method public void onReportDenied(); - } - - public static class IncidentManager.DumpCallback { - ctor public IncidentManager.DumpCallback(); - method public void onDumpSection(int, @NonNull java.io.OutputStream); - } - - public static class IncidentManager.IncidentReport implements java.io.Closeable android.os.Parcelable { - ctor public IncidentManager.IncidentReport(android.os.Parcel); - method public void close(); - method public int describeContents(); - method public java.io.InputStream getInputStream() throws java.io.IOException; - method public long getPrivacyPolicy(); - method public long getTimestamp(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.os.IncidentManager.IncidentReport> CREATOR; - } - - public static class IncidentManager.PendingReport { - ctor public IncidentManager.PendingReport(@NonNull android.net.Uri); - method public int getFlags(); - method @NonNull public String getRequestingPackage(); - method public long getTimestamp(); - method @NonNull public android.net.Uri getUri(); - } - - public final class IncidentReportArgs implements android.os.Parcelable { - ctor public IncidentReportArgs(); - ctor public IncidentReportArgs(android.os.Parcel); - method public void addHeader(byte[]); - method public void addSection(int); - method public boolean containsSection(int); - method public int describeContents(); - method public boolean isAll(); - method public void readFromParcel(android.os.Parcel); - method public int sectionCount(); - method public void setAll(boolean); - method public void setPrivacyPolicy(int); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.os.IncidentReportArgs> CREATOR; - } - public final class MessageQueue { method public int postSyncBarrier(); method public void removeSyncBarrier(int); } - public final class NativeHandle implements java.io.Closeable { - ctor public NativeHandle(); - ctor public NativeHandle(@NonNull java.io.FileDescriptor, boolean); - ctor public NativeHandle(@NonNull java.io.FileDescriptor[], @NonNull int[], boolean); - method public void close() throws java.io.IOException; - method @NonNull public android.os.NativeHandle dup() throws java.io.IOException; - method @NonNull public java.io.FileDescriptor getFileDescriptor(); - method @NonNull public java.io.FileDescriptor[] getFileDescriptors(); - method @NonNull public int[] getInts(); - method public boolean hasSingleFileDescriptor(); - } - public final class Parcel { method public boolean allowSquashing(); method public int readExceptionCode(); @@ -2782,24 +1048,6 @@ package android.os { method public static java.io.File getFile(java.io.FileDescriptor) throws java.io.IOException; } - public final class PowerManager { - method @RequiresPermission("android.permission.POWER_SAVER") public int getPowerSaveModeTrigger(); - method @RequiresPermission("android.permission.POWER_SAVER") public boolean setDynamicPowerSaveHint(boolean, int); - method @RequiresPermission(anyOf={"android.permission.DEVICE_POWER", "android.permission.POWER_SAVER"}) public boolean setPowerSaveModeEnabled(boolean); - field public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; // 0x1 - field public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; // 0x0 - } - - public class PowerWhitelistManager { - method @RequiresPermission("android.permission.DEVICE_POWER") public void addToWhitelist(@NonNull String); - method @RequiresPermission("android.permission.DEVICE_POWER") public void addToWhitelist(@NonNull java.util.List<java.lang.String>); - method @RequiresPermission("android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST") public void whitelistAppTemporarily(@NonNull String, long); - method @RequiresPermission("android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST") public long whitelistAppTemporarilyForEvent(@NonNull String, int, @NonNull String); - field public static final int EVENT_MMS = 2; // 0x2 - field public static final int EVENT_SMS = 1; // 0x1 - field public static final int EVENT_UNSPECIFIED = 0; // 0x0 - } - public class Process { method public static final int getThreadScheduler(int) throws java.lang.IllegalArgumentException; field public static final int FIRST_APP_ZYGOTE_ISOLATED_UID = 90000; // 0x15f90 @@ -2809,19 +1057,6 @@ package android.os { field public static final int NUM_UIDS_PER_APP_ZYGOTE = 100; // 0x64 } - public final class RemoteCallback implements android.os.Parcelable { - ctor public RemoteCallback(android.os.RemoteCallback.OnResultListener); - ctor public RemoteCallback(@NonNull android.os.RemoteCallback.OnResultListener, @Nullable android.os.Handler); - method public int describeContents(); - method public void sendResult(@Nullable android.os.Bundle); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.os.RemoteCallback> CREATOR; - } - - public static interface RemoteCallback.OnResultListener { - method public void onResult(@Nullable android.os.Bundle); - } - public final class StrictMode { method public static void conditionallyCheckInstanceCounts(); method public static void setViolationLogger(android.os.StrictMode.ViolationLogger); @@ -2859,40 +1094,19 @@ package android.os { method @NonNull public android.os.StrictMode.VmPolicy.Builder permitIncorrectContextUse(); } - public class SystemConfigManager { - method @NonNull @RequiresPermission("android.permission.READ_CARRIER_APP_INFO") public java.util.Set<java.lang.String> getDisabledUntilUsedPreinstalledCarrierApps(); - method @NonNull @RequiresPermission("android.permission.READ_CARRIER_APP_INFO") public java.util.Map<java.lang.String,java.util.List<java.lang.String>> getDisabledUntilUsedPreinstalledCarrierAssociatedApps(); - } - - public class SystemProperties { - method @NonNull public static String get(@NonNull String); - method @NonNull public static String get(@NonNull String, @Nullable String); - method public static boolean getBoolean(@NonNull String, boolean); - method public static int getInt(@NonNull String, int); - method public static long getLong(@NonNull String, long); - } - public final class UserHandle implements android.os.Parcelable { - method public static int getAppId(int); - method public int getIdentifier(); method public static int getUid(int, int); method public static int getUserId(int); method public static boolean isApp(int); - method public static int myUserId(); - method public static android.os.UserHandle of(int); - field @NonNull public static final android.os.UserHandle ALL; - field @NonNull public static final android.os.UserHandle CURRENT; field public static final int MIN_SECONDARY_USER_ID = 10; // 0xa - field @NonNull public static final android.os.UserHandle SYSTEM; field public static final int USER_ALL = -1; // 0xffffffff field public static final int USER_NULL = -10000; // 0xffffd8f0 field public static final int USER_SYSTEM = 0; // 0x0 } public class UserManager { - method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.CREATE_USERS"}) public boolean hasBaseUserRestriction(@NonNull String, @NonNull android.os.UserHandle); + method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public boolean hasBaseUserRestriction(@NonNull String, @NonNull android.os.UserHandle); method public static boolean isSplitSystemUser(); - field public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED"; } public final class VibrationAttributes implements android.os.Parcelable { @@ -2955,17 +1169,6 @@ package android.os { field @NonNull public static final android.os.Parcelable.Creator<android.os.VibrationEffect.Waveform> CREATOR; } - public abstract class Vibrator { - method @RequiresPermission("android.permission.ACCESS_VIBRATOR_STATE") public void addVibratorStateListener(@NonNull android.os.Vibrator.OnVibratorStateChangedListener); - method @RequiresPermission("android.permission.ACCESS_VIBRATOR_STATE") public void addVibratorStateListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.Vibrator.OnVibratorStateChangedListener); - method @RequiresPermission("android.permission.ACCESS_VIBRATOR_STATE") public boolean isVibrating(); - method @RequiresPermission("android.permission.ACCESS_VIBRATOR_STATE") public void removeVibratorStateListener(@NonNull android.os.Vibrator.OnVibratorStateChangedListener); - } - - public static interface Vibrator.OnVibratorStateChangedListener { - method public void onVibratorStateChanged(boolean); - } - public class VintfObject { method public static String[] getHalNamesAndVersions(); method public static String getSepolicyVersion(); @@ -2985,16 +1188,10 @@ package android.os { } public class WorkSource implements android.os.Parcelable { - ctor public WorkSource(int); method public boolean add(int); method public boolean add(int, String); method @Deprecated public android.os.WorkSource addReturningNewbs(android.os.WorkSource); - method @Nullable public String getPackageName(int); - method public int getUid(int); - method public boolean isEmpty(); method @Deprecated public android.os.WorkSource[] setReturningDiffs(android.os.WorkSource); - method public int size(); - method @NonNull public android.os.WorkSource withoutNames(); } } @@ -3054,36 +1251,6 @@ package android.os.health { } -package android.os.image { - - public class DynamicSystemClient { - ctor public DynamicSystemClient(@NonNull android.content.Context); - method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void bind(); - method public void setOnStatusChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener); - method public void setOnStatusChangedListener(@NonNull android.os.image.DynamicSystemClient.OnStatusChangedListener); - method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void start(@NonNull android.net.Uri, long); - method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void start(@NonNull android.net.Uri, long, long); - method @RequiresPermission("android.permission.INSTALL_DYNAMIC_SYSTEM") public void unbind(); - field public static final int CAUSE_ERROR_EXCEPTION = 6; // 0x6 - field public static final int CAUSE_ERROR_INVALID_URL = 4; // 0x4 - field public static final int CAUSE_ERROR_IO = 3; // 0x3 - field public static final int CAUSE_ERROR_IPC = 5; // 0x5 - field public static final int CAUSE_INSTALL_CANCELLED = 2; // 0x2 - field public static final int CAUSE_INSTALL_COMPLETED = 1; // 0x1 - field public static final int CAUSE_NOT_SPECIFIED = 0; // 0x0 - field public static final int STATUS_IN_PROGRESS = 2; // 0x2 - field public static final int STATUS_IN_USE = 4; // 0x4 - field public static final int STATUS_NOT_STARTED = 1; // 0x1 - field public static final int STATUS_READY = 3; // 0x3 - field public static final int STATUS_UNKNOWN = 0; // 0x0 - } - - public static interface DynamicSystemClient.OnStatusChangedListener { - method public void onStatusChanged(int, int, long, @Nullable Throwable); - } - -} - package android.os.storage { public final class CrateInfo implements android.os.Parcelable { @@ -3097,10 +1264,6 @@ package android.os.storage { field @NonNull public static final android.os.Parcelable.Creator<android.os.storage.CrateInfo> CREATOR; } - public class StorageManager { - method public static boolean hasIsolatedStorage(); - } - public final class StorageVolume implements android.os.Parcelable { method public String getPath(); } @@ -3117,17 +1280,9 @@ package android.os.strictmode { package android.permission { public final class PermissionControllerManager { - method @RequiresPermission(anyOf={"android.permission.GRANT_RUNTIME_PERMISSIONS", "android.permission.RESTORE_RUNTIME_PERMISSIONS"}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission("android.permission.GET_RUNTIME_PERMISSIONS") public void countPermissionApps(@NonNull java.util.List<java.lang.String>, int, @NonNull android.permission.PermissionControllerManager.OnCountPermissionAppsResultCallback, @Nullable android.os.Handler); - method @RequiresPermission("android.permission.GET_RUNTIME_PERMISSIONS") public void getAppPermissions(@NonNull String, @NonNull android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, @Nullable android.os.Handler); - method @RequiresPermission("android.permission.GET_RUNTIME_PERMISSIONS") public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>); - method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public void revokeRuntimePermission(@NonNull String, @NonNull String); - method @RequiresPermission("android.permission.REVOKE_RUNTIME_PERMISSIONS") public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback); - method @RequiresPermission(anyOf={"android.permission.GRANT_RUNTIME_PERMISSIONS", "android.permission.RESTORE_RUNTIME_PERMISSIONS"}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle); - field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1 - field public static final int COUNT_WHEN_SYSTEM = 2; // 0x2 - field public static final int REASON_INSTALLER_POLICY_VIOLATION = 2; // 0x2 - field public static final int REASON_MALWARE = 1; // 0x1 + method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void countPermissionApps(@NonNull java.util.List<java.lang.String>, int, @NonNull android.permission.PermissionControllerManager.OnCountPermissionAppsResultCallback, @Nullable android.os.Handler); + method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getAppPermissions(@NonNull String, @NonNull android.permission.PermissionControllerManager.OnGetAppPermissionResultCallback, @Nullable android.os.Handler); + method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermission(@NonNull String, @NonNull String); } public static interface PermissionControllerManager.OnCountPermissionAppsResultCallback { @@ -3138,33 +1293,6 @@ package android.permission { method public void onGetAppPermissions(@NonNull java.util.List<android.permission.RuntimePermissionPresentationInfo>); } - public abstract static class PermissionControllerManager.OnRevokeRuntimePermissionsCallback { - ctor public PermissionControllerManager.OnRevokeRuntimePermissionsCallback(); - method public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>); - } - - public final class PermissionManager { - method @IntRange(from=0) @RequiresPermission(anyOf={"android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY", android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion(); - method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions(); - method @RequiresPermission(anyOf={"android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY", android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public void setRuntimePermissionsVersion(@IntRange(from=0) int); - } - - public static final class PermissionManager.SplitPermissionInfo { - method @NonNull public java.util.List<java.lang.String> getNewPermissions(); - method @NonNull public String getSplitPermission(); - method public int getTargetSdk(); - } - - public final class RuntimePermissionPresentationInfo implements android.os.Parcelable { - ctor public RuntimePermissionPresentationInfo(@NonNull CharSequence, boolean, boolean); - method public int describeContents(); - method @NonNull public CharSequence getLabel(); - method public boolean isGranted(); - method public boolean isStandard(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR; - } - } package android.print { @@ -3212,78 +1340,15 @@ package android.provider { } public final class DeviceConfig { - method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static void addOnPropertiesChangedListener(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); - method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static boolean getBoolean(@NonNull String, @NonNull String, boolean); - method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static float getFloat(@NonNull String, @NonNull String, float); - method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static int getInt(@NonNull String, @NonNull String, int); - method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static long getLong(@NonNull String, @NonNull String, long); - method @NonNull @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static android.provider.DeviceConfig.Properties getProperties(@NonNull String, @NonNull java.lang.String...); - method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getProperty(@NonNull String, @NonNull String); - method @RequiresPermission("android.permission.READ_DEVICE_CONFIG") public static String getString(@NonNull String, @NonNull String, @Nullable String); - method public static void removeOnPropertiesChangedListener(@NonNull android.provider.DeviceConfig.OnPropertiesChangedListener); - method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void resetToDefaults(int, @Nullable String); - method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperties(@NonNull android.provider.DeviceConfig.Properties) throws android.provider.DeviceConfig.BadConfigException; - method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean); field public static final String NAMESPACE_ANDROID = "android"; - field public static final String NAMESPACE_AUTOFILL = "autofill"; - field public static final String NAMESPACE_BIOMETRICS = "biometrics"; - field public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture"; - field public static final String NAMESPACE_PERMISSIONS = "permissions"; - field public static final String NAMESPACE_PRIVACY = "privacy"; - field public static final String NAMESPACE_ROLLBACK = "rollback"; - field public static final String NAMESPACE_ROLLBACK_BOOT = "rollback_boot"; - } - - public static class DeviceConfig.BadConfigException extends java.lang.Exception { - ctor public DeviceConfig.BadConfigException(); - } - - public static interface DeviceConfig.OnPropertiesChangedListener { - method public void onPropertiesChanged(@NonNull android.provider.DeviceConfig.Properties); - } - - public static class DeviceConfig.Properties { - method public boolean getBoolean(@NonNull String, boolean); - method public float getFloat(@NonNull String, float); - method public int getInt(@NonNull String, int); - method @NonNull public java.util.Set<java.lang.String> getKeyset(); - method public long getLong(@NonNull String, long); - method @NonNull public String getNamespace(); - method @Nullable public String getString(@NonNull String, @Nullable String); - } - - public static final class DeviceConfig.Properties.Builder { - ctor public DeviceConfig.Properties.Builder(@NonNull String); - method @NonNull public android.provider.DeviceConfig.Properties build(); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setBoolean(@NonNull String, boolean); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setFloat(@NonNull String, float); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setInt(@NonNull String, int); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setLong(@NonNull String, long); - method @NonNull public android.provider.DeviceConfig.Properties.Builder setString(@NonNull String, @Nullable String); - } - - public final class DocumentsContract { - method public static boolean isManageMode(@NonNull android.net.Uri); - method @NonNull public static android.net.Uri setManageMode(@NonNull android.net.Uri); - } - - public final class MediaStore { - method @NonNull @WorkerThread public static android.net.Uri scanFile(@NonNull android.content.ContentResolver, @NonNull java.io.File); - method @WorkerThread public static void scanVolume(@NonNull android.content.ContentResolver, @NonNull String); - method @WorkerThread public static void waitForIdle(@NonNull android.content.ContentResolver); } public final class Settings { - field public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS"; - field public static final String ACTION_MANAGE_APP_OVERLAY_PERMISSION = "android.settings.MANAGE_APP_OVERLAY_PERMISSION"; - field public static final String ACTION_REQUEST_ENABLE_CONTENT_CAPTURE = "android.settings.REQUEST_ENABLE_CONTENT_CAPTURE"; - field public static final String ACTION_TETHER_PROVISIONING_UI = "android.settings.TETHER_PROVISIONING_UI"; field public static final int RESET_MODE_PACKAGE_DEFAULTS = 1; // 0x1 } public static final class Settings.Global extends android.provider.Settings.NameValueTable { field public static final String APP_OPS_CONSTANTS = "app_ops_constants"; - field public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages"; field public static final String AUTOMATIC_POWER_SAVE_MODE = "automatic_power_save_mode"; field public static final String BATTERY_SAVER_CONSTANTS = "battery_saver_constants"; field public static final String DYNAMIC_POWER_SAVINGS_DISABLE_THRESHOLD = "dynamic_power_savings_disable_threshold"; @@ -3296,74 +1361,26 @@ package android.provider { field public static final String LOW_POWER_MODE_STICKY = "low_power_sticky"; field public static final String NOTIFICATION_BUBBLES = "notification_bubbles"; field public static final String OVERLAY_DISPLAY_DEVICES = "overlay_display_devices"; - field public static final String TETHER_OFFLOAD_DISABLED = "tether_offload_disabled"; field public static final String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package"; } public static final class Settings.Secure extends android.provider.Settings.NameValueTable { - method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull android.content.ContentResolver, @Nullable String); field public static final String ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED = "accessibility_display_magnification_enabled"; field public static final String ACCESSIBILITY_SHORTCUT_TARGET_SERVICE = "accessibility_shortcut_target_service"; - field public static final String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification"; field public static final String AUTOFILL_SERVICE = "autofill_service"; - field public static final String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count"; - field public static final String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size"; - field public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size"; - field public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length"; - field public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length"; field public static final String CONTENT_CAPTURE_ENABLED = "content_capture_enabled"; field public static final String DISABLED_PRINT_SERVICES = "disabled_print_services"; - field public static final String DOZE_ALWAYS_ON = "doze_always_on"; field @Deprecated public static final String ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES = "enabled_notification_policy_access_packages"; field public static final String ENABLED_VR_LISTENERS = "enabled_vr_listeners"; field public static final String IMMERSIVE_MODE_CONFIRMATIONS = "immersive_mode_confirmations"; - field public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis"; - field public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis"; - field public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications"; - field public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications"; field public static final String NFC_PAYMENT_DEFAULT_COMPONENT = "nfc_payment_default_component"; field public static final String NOTIFICATION_BADGING = "notification_badging"; field public static final String POWER_MENU_LOCKED_SHOW_CONTENT = "power_menu_locked_show_content"; field public static final String SHOW_IME_WITH_HARD_KEYBOARD = "show_ime_with_hard_keyboard"; field @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static final String SYNC_PARENT_SOUNDS = "sync_parent_sounds"; - field public static final String USER_SETUP_COMPLETE = "user_setup_complete"; field public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service"; } - public static final class Telephony.CellBroadcasts implements android.provider.BaseColumns { - field public static final String CID = "cid"; - field public static final String CMAS_CATEGORY = "cmas_category"; - field public static final String CMAS_CERTAINTY = "cmas_certainty"; - field public static final String CMAS_MESSAGE_CLASS = "cmas_message_class"; - field public static final String CMAS_RESPONSE_TYPE = "cmas_response_type"; - field public static final String CMAS_SEVERITY = "cmas_severity"; - field public static final String CMAS_URGENCY = "cmas_urgency"; - field @NonNull public static final android.net.Uri CONTENT_URI; - field public static final String DATA_CODING_SCHEME = "dcs"; - field public static final String DEFAULT_SORT_ORDER = "date DESC"; - field public static final String DELIVERY_TIME = "date"; - field public static final String ETWS_WARNING_TYPE = "etws_warning_type"; - field public static final String GEOGRAPHICAL_SCOPE = "geo_scope"; - field public static final String GEOMETRIES = "geometries"; - field public static final String LAC = "lac"; - field public static final String LANGUAGE_CODE = "language"; - field public static final String LOCATION_CHECK_TIME = "location_check_time"; - field public static final String MAXIMUM_WAIT_TIME = "maximum_wait_time"; - field public static final String MESSAGE_BODY = "body"; - field public static final String MESSAGE_BROADCASTED = "message_broadcasted"; - field public static final String MESSAGE_DISPLAYED = "message_displayed"; - field public static final String MESSAGE_FORMAT = "format"; - field @NonNull @RequiresPermission(android.Manifest.permission.READ_CELL_BROADCASTS) public static final android.net.Uri MESSAGE_HISTORY_URI; - field public static final String MESSAGE_PRIORITY = "priority"; - field public static final String MESSAGE_READ = "read"; - field public static final String PLMN = "plmn"; - field public static final String RECEIVED_TIME = "received_time"; - field public static final String SERIAL_NUMBER = "serial_number"; - field public static final String SERVICE_CATEGORY = "service_category"; - field public static final String SLOT_INDEX = "slot_index"; - field public static final String SUBSCRIPTION_ID = "sub_id"; - } - public static final class Telephony.Sms.Intents { field public static final String SMS_CARRIER_PROVISION_ACTION = "android.provider.Telephony.SMS_CARRIER_PROVISION"; } @@ -3385,19 +1402,6 @@ package android.security { package android.security.keystore { - public abstract class AttestationUtils { - method @NonNull @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public static java.security.cert.X509Certificate[] attestDeviceIds(android.content.Context, @NonNull int[], @NonNull byte[]) throws android.security.keystore.DeviceIdAttestationException; - field public static final int ID_TYPE_IMEI = 2; // 0x2 - field public static final int ID_TYPE_MEID = 3; // 0x3 - field public static final int ID_TYPE_SERIAL = 1; // 0x1 - field public static final int USE_INDIVIDUAL_ATTESTATION = 4; // 0x4 - } - - public class DeviceIdAttestationException extends java.lang.Exception { - ctor public DeviceIdAttestationException(@Nullable String); - ctor public DeviceIdAttestationException(@Nullable String, @Nullable Throwable); - } - public static final class KeyGenParameterSpec.Builder { method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUniqueIdIncluded(boolean); } @@ -3412,37 +1416,8 @@ package android.security.keystore { } -package android.service.appprediction { - - public abstract class AppPredictionService extends android.app.Service { - ctor public AppPredictionService(); - method @MainThread public abstract void onAppTargetEvent(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull android.app.prediction.AppTargetEvent); - method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); - method public void onCreatePredictionSession(@NonNull android.app.prediction.AppPredictionContext, @NonNull android.app.prediction.AppPredictionSessionId); - method @MainThread public void onDestroyPredictionSession(@NonNull android.app.prediction.AppPredictionSessionId); - method @MainThread public abstract void onLaunchLocationShown(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull String, @NonNull java.util.List<android.app.prediction.AppTargetId>); - method @MainThread public abstract void onRequestPredictionUpdate(@NonNull android.app.prediction.AppPredictionSessionId); - method @MainThread public abstract void onSortAppTargets(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<java.util.List<android.app.prediction.AppTarget>>); - method @MainThread public void onStartPredictionUpdates(); - method @MainThread public void onStopPredictionUpdates(); - method public final void updatePredictions(@NonNull android.app.prediction.AppPredictionSessionId, @NonNull java.util.List<android.app.prediction.AppTarget>); - } - -} - package android.service.autofill { - public abstract class AutofillFieldClassificationService extends android.app.Service { - ctor public AutofillFieldClassificationService(); - method public android.os.IBinder onBind(android.content.Intent); - field public static final String REQUIRED_ALGORITHM_CREDIT_CARD = "CREDIT_CARD"; - field public static final String REQUIRED_ALGORITHM_EDIT_DISTANCE = "EDIT_DISTANCE"; - field public static final String REQUIRED_ALGORITHM_EXACT_MATCH = "EXACT_MATCH"; - field public static final String SERVICE_INTERFACE = "android.service.autofill.AutofillFieldClassificationService"; - field public static final String SERVICE_META_DATA_KEY_AVAILABLE_ALGORITHMS = "android.autofill.field_classification.available_algorithms"; - field public static final String SERVICE_META_DATA_KEY_DEFAULT_ALGORITHM = "android.autofill.field_classification.default_algorithm"; - } - public final class CharSequenceTransformation extends android.service.autofill.InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation { method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception; } @@ -3465,11 +1440,6 @@ package android.service.autofill { method @Nullable public android.util.SparseArray<android.service.autofill.InternalOnClickAction> getActions(); } - public static final class Dataset.Builder { - ctor public Dataset.Builder(@NonNull android.service.autofill.InlinePresentation); - method @NonNull public android.service.autofill.Dataset.Builder setFieldInlinePresentation(@NonNull android.view.autofill.AutofillId, @Nullable android.view.autofill.AutofillValue, @Nullable java.util.regex.Pattern, @NonNull android.service.autofill.InlinePresentation); - } - public final class DateTransformation extends android.service.autofill.InternalTransformation implements android.os.Parcelable android.service.autofill.Transformation { method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception; } @@ -3486,15 +1456,6 @@ package android.service.autofill { method public void apply(@NonNull android.service.autofill.ValueFinder, @NonNull android.widget.RemoteViews, int) throws java.lang.Exception; } - public abstract class InlineSuggestionRenderService extends android.app.Service { - ctor public InlineSuggestionRenderService(); - method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent); - method @NonNull public android.os.Bundle onGetInlineSuggestionsRendererInfo(); - method @Nullable public android.view.View onRenderSuggestion(@NonNull android.service.autofill.InlinePresentation, int, int); - method public final void startIntentSender(@NonNull android.content.IntentSender); - field public static final String SERVICE_INTERFACE = "android.service.autofill.InlineSuggestionRenderService"; - } - public abstract class InternalOnClickAction implements android.service.autofill.OnClickAction android.os.Parcelable { ctor public InternalOnClickAction(); method public abstract void onClick(@NonNull android.view.ViewGroup); @@ -3544,26 +1505,6 @@ package android.service.autofill { package android.service.autofill.augmented { - public abstract class AugmentedAutofillService extends android.app.Service { - ctor public AugmentedAutofillService(); - method protected final void dump(java.io.FileDescriptor, java.io.PrintWriter, String[]); - method protected void dump(@NonNull java.io.PrintWriter, @NonNull String[]); - method @Nullable public final android.service.autofill.FillEventHistory getFillEventHistory(); - method public void onConnected(); - method public void onDisconnected(); - method public void onFillRequest(@NonNull android.service.autofill.augmented.FillRequest, @NonNull android.os.CancellationSignal, @NonNull android.service.autofill.augmented.FillController, @NonNull android.service.autofill.augmented.FillCallback); - method public final boolean requestAutofill(@NonNull android.content.ComponentName, @NonNull android.view.autofill.AutofillId); - field public static final String SERVICE_INTERFACE = "android.service.autofill.augmented.AugmentedAutofillService"; - } - - public final class FillCallback { - method public void onSuccess(@Nullable android.service.autofill.augmented.FillResponse); - } - - public final class FillController { - method public void autofill(@NonNull java.util.List<android.util.Pair<android.view.autofill.AutofillId,android.view.autofill.AutofillValue>>); - } - public final class FillRequest { method @NonNull public android.content.ComponentName getActivityComponent(); method @NonNull public android.view.autofill.AutofillId getFocusedId(); @@ -3573,181 +1514,14 @@ package android.service.autofill.augmented { method public int getTaskId(); } - public final class FillResponse { - } - - public static final class FillResponse.Builder { - ctor public FillResponse.Builder(); - method @NonNull public android.service.autofill.augmented.FillResponse build(); - method @NonNull public android.service.autofill.augmented.FillResponse.Builder setClientState(@NonNull android.os.Bundle); - method @NonNull public android.service.autofill.augmented.FillResponse.Builder setFillWindow(@NonNull android.service.autofill.augmented.FillWindow); - method @NonNull public android.service.autofill.augmented.FillResponse.Builder setInlineSuggestions(@NonNull java.util.List<android.service.autofill.Dataset>); - } - - public final class FillWindow implements java.lang.AutoCloseable { - ctor public FillWindow(); - method public void destroy(); - method public boolean update(@NonNull android.service.autofill.augmented.PresentationParams.Area, @NonNull android.view.View, long); - } - - public abstract class PresentationParams { - method @Nullable public android.service.autofill.augmented.PresentationParams.Area getSuggestionArea(); - } - - public abstract static class PresentationParams.Area { - method @NonNull public android.graphics.Rect getBounds(); - } - -} - -package android.service.contentcapture { - - public final class ActivityEvent implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.content.ComponentName getComponentName(); - method public int getEventType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.ActivityEvent> CREATOR; - field public static final int TYPE_ACTIVITY_DESTROYED = 24; // 0x18 - field public static final int TYPE_ACTIVITY_PAUSED = 2; // 0x2 - field public static final int TYPE_ACTIVITY_RESUMED = 1; // 0x1 - field public static final int TYPE_ACTIVITY_STOPPED = 23; // 0x17 - } - - public abstract class ContentCaptureService extends android.app.Service { - ctor public ContentCaptureService(); - method public final void disableSelf(); - method public void onActivityEvent(@NonNull android.service.contentcapture.ActivityEvent); - method public void onActivitySnapshot(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.service.contentcapture.SnapshotData); - method public void onConnected(); - method public void onContentCaptureEvent(@NonNull android.view.contentcapture.ContentCaptureSessionId, @NonNull android.view.contentcapture.ContentCaptureEvent); - method public void onCreateContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureContext, @NonNull android.view.contentcapture.ContentCaptureSessionId); - method public void onDataRemovalRequest(@NonNull android.view.contentcapture.DataRemovalRequest); - method public void onDataShareRequest(@NonNull android.view.contentcapture.DataShareRequest, @NonNull android.service.contentcapture.DataShareCallback); - method public void onDestroyContentCaptureSession(@NonNull android.view.contentcapture.ContentCaptureSessionId); - method public void onDisconnected(); - method public final void setContentCaptureConditions(@NonNull String, @Nullable java.util.Set<android.view.contentcapture.ContentCaptureCondition>); - method public final void setContentCaptureWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>); - field public static final String SERVICE_INTERFACE = "android.service.contentcapture.ContentCaptureService"; - field public static final String SERVICE_META_DATA = "android.content_capture"; - } - - public interface DataShareCallback { - method public void onAccept(@NonNull java.util.concurrent.Executor, @NonNull android.service.contentcapture.DataShareReadAdapter); - method public void onReject(); - } - - public interface DataShareReadAdapter { - method public void onError(int); - method public void onStart(@NonNull android.os.ParcelFileDescriptor); - } - - public final class SnapshotData implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.app.assist.AssistContent getAssistContent(); - method @NonNull public android.os.Bundle getAssistData(); - method @NonNull public android.app.assist.AssistStructure getAssistStructure(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.contentcapture.SnapshotData> CREATOR; - } - } package android.service.notification { - public final class Adjustment implements android.os.Parcelable { - ctor public Adjustment(String, String, android.os.Bundle, CharSequence, int); - ctor public Adjustment(@NonNull String, @NonNull String, @NonNull android.os.Bundle, @NonNull CharSequence, @NonNull android.os.UserHandle); - method public int describeContents(); - method @NonNull public CharSequence getExplanation(); - method @NonNull public String getKey(); - method @NonNull public String getPackage(); - method @NonNull public android.os.Bundle getSignals(); - method public int getUser(); - method @NonNull public android.os.UserHandle getUserHandle(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR; - field public static final String KEY_CONTEXTUAL_ACTIONS = "key_contextual_actions"; - field public static final String KEY_IMPORTANCE = "key_importance"; - field public static final String KEY_RANKING_SCORE = "key_ranking_score"; - field public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria"; - field public static final String KEY_TEXT_REPLIES = "key_text_replies"; - field public static final String KEY_USER_SENTIMENT = "key_user_sentiment"; - } - @Deprecated public abstract class ConditionProviderService extends android.app.Service { method @Deprecated public boolean isBound(); } - public abstract class NotificationAssistantService extends android.service.notification.NotificationListenerService { - ctor public NotificationAssistantService(); - method public final void adjustNotification(@NonNull android.service.notification.Adjustment); - method public final void adjustNotifications(@NonNull java.util.List<android.service.notification.Adjustment>); - method public void onActionInvoked(@NonNull String, @NonNull android.app.Notification.Action, int); - method public void onAllowedAdjustmentsChanged(); - method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent); - method public void onNotificationDirectReplied(@NonNull String); - method @Nullable public abstract android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification); - method @Nullable public android.service.notification.Adjustment onNotificationEnqueued(@NonNull android.service.notification.StatusBarNotification, @NonNull android.app.NotificationChannel); - method public void onNotificationExpansionChanged(@NonNull String, boolean, boolean); - method public abstract void onNotificationSnoozedUntilContext(@NonNull android.service.notification.StatusBarNotification, @NonNull String); - method public void onNotificationVisibilityChanged(@NonNull String, boolean); - method public void onNotificationsSeen(@NonNull java.util.List<java.lang.String>); - method public void onPanelHidden(); - method public void onPanelRevealed(int); - method public void onSuggestedReplySent(@NonNull String, @NonNull CharSequence, int); - method public final void unsnoozeNotification(@NonNull String); - field public static final String SERVICE_INTERFACE = "android.service.notification.NotificationAssistantService"; - field public static final int SOURCE_FROM_APP = 0; // 0x0 - field public static final int SOURCE_FROM_ASSISTANT = 1; // 0x1 - } - - public abstract class NotificationListenerService extends android.app.Service { - method public void onNotificationRemoved(@NonNull android.service.notification.StatusBarNotification, @NonNull android.service.notification.NotificationListenerService.RankingMap, @NonNull android.service.notification.NotificationStats, int); - } - - public final class NotificationStats implements android.os.Parcelable { - ctor public NotificationStats(); - method public int describeContents(); - method public int getDismissalSentiment(); - method public int getDismissalSurface(); - method public boolean hasDirectReplied(); - method public boolean hasExpanded(); - method public boolean hasInteracted(); - method public boolean hasSeen(); - method public boolean hasSnoozed(); - method public boolean hasViewedSettings(); - method public void setDirectReplied(); - method public void setDismissalSentiment(int); - method public void setDismissalSurface(int); - method public void setExpanded(); - method public void setSeen(); - method public void setSnoozed(); - method public void setViewedSettings(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.NotificationStats> CREATOR; - field public static final int DISMISSAL_AOD = 2; // 0x2 - field public static final int DISMISSAL_NOT_DISMISSED = -1; // 0xffffffff - field public static final int DISMISSAL_OTHER = 0; // 0x0 - field public static final int DISMISSAL_PEEK = 1; // 0x1 - field public static final int DISMISSAL_SHADE = 3; // 0x3 - field public static final int DISMISS_SENTIMENT_NEGATIVE = 0; // 0x0 - field public static final int DISMISS_SENTIMENT_NEUTRAL = 1; // 0x1 - field public static final int DISMISS_SENTIMENT_POSITIVE = 2; // 0x2 - field public static final int DISMISS_SENTIMENT_UNKNOWN = -1000; // 0xfffffc18 - } - - public final class SnoozeCriterion implements android.os.Parcelable { - ctor public SnoozeCriterion(String, CharSequence, CharSequence); - ctor protected SnoozeCriterion(android.os.Parcel); - method public int describeContents(); - method public CharSequence getConfirmation(); - method public CharSequence getExplanation(); - method public String getId(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.SnoozeCriterion> CREATOR; - } - } package android.service.quickaccesswallet { @@ -3788,67 +1562,16 @@ package android.service.quicksettings { } -package android.service.textclassifier { - - public abstract class TextClassifierService extends android.app.Service { - ctor public TextClassifierService(); - method @NonNull public static android.view.textclassifier.TextClassifier getDefaultTextClassifierImplementation(@NonNull android.content.Context); - method @Deprecated public final android.view.textclassifier.TextClassifier getLocalTextClassifier(); - method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent); - method @MainThread public abstract void onClassifyText(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassification.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextClassification>); - method public void onConnected(); - method @MainThread public void onCreateTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationContext, @NonNull android.view.textclassifier.TextClassificationSessionId); - method @MainThread public void onDestroyTextClassificationSession(@NonNull android.view.textclassifier.TextClassificationSessionId); - method @MainThread public void onDetectLanguage(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLanguage.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLanguage>); - method public void onDisconnected(); - method @MainThread public abstract void onGenerateLinks(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextLinks.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextLinks>); - method @Deprecated @MainThread public void onSelectionEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.SelectionEvent); - method @MainThread public void onSuggestConversationActions(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.ConversationActions.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.ConversationActions>); - method @MainThread public abstract void onSuggestSelection(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextSelection.Request, @NonNull android.os.CancellationSignal, @NonNull android.service.textclassifier.TextClassifierService.Callback<android.view.textclassifier.TextSelection>); - method @MainThread public void onTextClassifierEvent(@Nullable android.view.textclassifier.TextClassificationSessionId, @NonNull android.view.textclassifier.TextClassifierEvent); - field public static final String SERVICE_INTERFACE = "android.service.textclassifier.TextClassifierService"; - } - - public static interface TextClassifierService.Callback<T> { - method public void onFailure(@NonNull CharSequence); - method public void onSuccess(T); - } - -} - package android.service.watchdog { public abstract class ExplicitHealthCheckService extends android.app.Service { - ctor public ExplicitHealthCheckService(); - method public final void notifyHealthCheckPassed(@NonNull String); - method @NonNull public final android.os.IBinder onBind(@NonNull android.content.Intent); - method public abstract void onCancelHealthCheck(@NonNull String); - method @NonNull public abstract java.util.List<java.lang.String> onGetRequestedPackages(); - method @NonNull public abstract java.util.List<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> onGetSupportedPackages(); - method public abstract void onRequestHealthCheck(@NonNull String); method public void setCallback(@Nullable android.os.RemoteCallback); - field public static final String BIND_PERMISSION = "android.permission.BIND_EXPLICIT_HEALTH_CHECK_SERVICE"; - field public static final String SERVICE_INTERFACE = "android.service.watchdog.ExplicitHealthCheckService"; - } - - public static final class ExplicitHealthCheckService.PackageConfig implements android.os.Parcelable { - ctor public ExplicitHealthCheckService.PackageConfig(@NonNull String, long); - method public int describeContents(); - method public long getHealthCheckTimeoutMillis(); - method @NonNull public String getPackageName(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.service.watchdog.ExplicitHealthCheckService.PackageConfig> CREATOR; } } package android.telecom { - public final class Call { - method public void enterBackgroundAudioProcessing(); - method public void exitBackgroundAudioProcessing(boolean); - } - public static class Call.Details { method public String getTelecomCallId(); } @@ -3857,42 +1580,6 @@ package android.telecom { ctor public CallAudioState(boolean, int, int, @Nullable android.bluetooth.BluetoothDevice, @NonNull java.util.Collection<android.bluetooth.BluetoothDevice>); } - public static class CallScreeningService.CallResponse.Builder { - method @NonNull public android.telecom.CallScreeningService.CallResponse.Builder setShouldScreenCallViaAudioProcessing(boolean); - } - - public abstract class Conference extends android.telecom.Conferenceable { - method public android.telecom.Connection getPrimaryConnection(); - method @NonNull public final String getTelecomCallId(); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setAddress(@NonNull android.net.Uri, int); - method public final void setCallerDisplayName(@NonNull String, int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setConferenceState(boolean); - } - - public abstract class Connection extends android.telecom.Conferenceable { - method @IntRange(from=0) public final long getConnectTimeMillis(); - method public final long getConnectionStartElapsedRealtimeMillis(); - method @Nullable public android.telecom.PhoneAccountHandle getPhoneAccountHandle(); - method @Nullable public final String getTelecomCallId(); - method public final void resetConnectionTime(); - method public void setCallDirection(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setConnectTimeMillis(@IntRange(from=0) long); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public final void setConnectionStartElapsedRealtimeMillis(long); - method public void setPhoneAccountHandle(@NonNull android.telecom.PhoneAccountHandle); - method public void setTelecomCallId(@NonNull String); - field public static final int CAPABILITY_CONFERENCE_HAS_NO_CHILDREN = 2097152; // 0x200000 - field public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 262144; // 0x40000 - field public static final String EXTRA_DISABLE_ADD_CALL = "android.telecom.extra.DISABLE_ADD_CALL"; - field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 1; // 0x1 - field public static final int PROPERTY_GENERIC_CONFERENCE = 2; // 0x2 - field public static final int PROPERTY_IS_DOWNGRADED_CONFERENCE = 64; // 0x40 - field public static final int PROPERTY_REMOTELY_HOSTED = 2048; // 0x800 - } - - public final class ConnectionRequest implements android.os.Parcelable { - method @Nullable public String getTelecomCallId(); - } - public static final class ConnectionRequest.Builder { ctor public ConnectionRequest.Builder(); method @NonNull public android.telecom.ConnectionRequest build(); @@ -3908,48 +1595,11 @@ package android.telecom { method @NonNull public android.telecom.ConnectionRequest.Builder setVideoState(int); } - public static class PhoneAccount.Builder { - method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telecom.PhoneAccount.Builder setGroupId(@NonNull String); - } - - public class PhoneAccountSuggestionService extends android.app.Service { - ctor public PhoneAccountSuggestionService(); - method public void onAccountSuggestionRequest(@NonNull String); - method public android.os.IBinder onBind(android.content.Intent); - method public final void suggestPhoneAccounts(@NonNull String, @NonNull java.util.List<android.telecom.PhoneAccountSuggestion>); - field public static final String SERVICE_INTERFACE = "android.telecom.PhoneAccountSuggestionService"; - } - - public class TelecomManager { - method @NonNull public android.content.Intent createLaunchEmergencyDialerIntent(@Nullable String); - method @NonNull @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public java.util.List<android.telecom.PhoneAccountHandle> getCallCapablePhoneAccounts(boolean); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public int getCurrentTtyMode(); - method @Nullable @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getDefaultDialerPackage(@NonNull android.os.UserHandle); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall(); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUserSelectedOutgoingPhoneAccount(@Nullable android.telecom.PhoneAccountHandle); - field public static final int TTY_MODE_FULL = 1; // 0x1 - field public static final int TTY_MODE_HCO = 2; // 0x2 - field public static final int TTY_MODE_OFF = 0; // 0x0 - field public static final int TTY_MODE_VCO = 3; // 0x3 - } - } package android.telephony { - public final class AccessNetworkConstants { - field public static final int TRANSPORT_TYPE_INVALID = -1; // 0xffffffff - } - - public static final class AccessNetworkConstants.NgranBands { - method public static int getFrequencyRangeGroup(int); - field public static final int FREQUENCY_RANGE_GROUP_1 = 1; // 0x1 - field public static final int FREQUENCY_RANGE_GROUP_2 = 2; // 0x2 - field public static final int FREQUENCY_RANGE_GROUP_UNKNOWN = 0; // 0x0 - } - public final class BarringInfo implements android.os.Parcelable { - ctor public BarringInfo(); ctor public BarringInfo(@Nullable android.telephony.CellIdentity, @NonNull android.util.SparseArray<android.telephony.BarringInfo.BarringServiceInfo>); } @@ -3957,57 +1607,6 @@ package android.telephony { ctor public BarringInfo.BarringServiceInfo(int, boolean, int, int); } - public final class CallQuality implements android.os.Parcelable { - ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int); - ctor public CallQuality(int, int, int, int, int, int, int, int, int, int, int, boolean, boolean, boolean); - method public int describeContents(); - method public int getAverageRelativeJitter(); - method public int getAverageRoundTripTime(); - method public int getCallDuration(); - method public int getCodecType(); - method public int getDownlinkCallQualityLevel(); - method public int getMaxRelativeJitter(); - method public int getNumRtpPacketsNotReceived(); - method public int getNumRtpPacketsReceived(); - method public int getNumRtpPacketsTransmitted(); - method public int getNumRtpPacketsTransmittedLost(); - method public int getUplinkCallQualityLevel(); - method public boolean isIncomingSilenceDetectedAtCallSetup(); - method public boolean isOutgoingSilenceDetectedAtCallSetup(); - method public boolean isRtpInactivityDetected(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CALL_QUALITY_BAD = 4; // 0x4 - field public static final int CALL_QUALITY_EXCELLENT = 0; // 0x0 - field public static final int CALL_QUALITY_FAIR = 2; // 0x2 - field public static final int CALL_QUALITY_GOOD = 1; // 0x1 - field public static final int CALL_QUALITY_NOT_AVAILABLE = 5; // 0x5 - field public static final int CALL_QUALITY_POOR = 3; // 0x3 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR; - } - - public class CarrierConfigManager { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle); - } - - public final class DataSpecificRegistrationInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.telephony.LteVopsSupportInfo getLteVopsSupportInfo(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.DataSpecificRegistrationInfo> CREATOR; - } - - public final class LteVopsSupportInfo implements android.os.Parcelable { - ctor public LteVopsSupportInfo(int, int); - method public int describeContents(); - method public int getEmcBearerSupport(); - method public int getVopsSupport(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.LteVopsSupportInfo> CREATOR; - field public static final int LTE_STATUS_NOT_AVAILABLE = 1; // 0x1 - field public static final int LTE_STATUS_NOT_SUPPORTED = 3; // 0x3 - field public static final int LTE_STATUS_SUPPORTED = 2; // 0x2 - } - public class MbmsDownloadSession implements java.lang.AutoCloseable { field public static final String MBMS_DOWNLOAD_SERVICE_OVERRIDE_METADATA = "mbms-download-service-override"; } @@ -4020,50 +1619,11 @@ package android.telephony { field public static final String MBMS_STREAMING_SERVICE_OVERRIDE_METADATA = "mbms-streaming-service-override"; } - public final class NetworkRegistrationInfo implements android.os.Parcelable { - method @Nullable public android.telephony.DataSpecificRegistrationInfo getDataSpecificInfo(); - method public int getRegistrationState(); - method public int getRejectCause(); - method public int getRoamingType(); - method public boolean isEmergencyEnabled(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int REGISTRATION_STATE_DENIED = 3; // 0x3 - field public static final int REGISTRATION_STATE_HOME = 1; // 0x1 - field public static final int REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING = 0; // 0x0 - field public static final int REGISTRATION_STATE_NOT_REGISTERED_SEARCHING = 2; // 0x2 - field public static final int REGISTRATION_STATE_ROAMING = 5; // 0x5 - field public static final int REGISTRATION_STATE_UNKNOWN = 4; // 0x4 - } - - public static final class NetworkRegistrationInfo.Builder { - ctor public NetworkRegistrationInfo.Builder(); - method @NonNull public android.telephony.NetworkRegistrationInfo build(); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAccessNetworkTechnology(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setAvailableServices(@NonNull java.util.List<java.lang.Integer>); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setCellIdentity(@Nullable android.telephony.CellIdentity); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setDomain(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setEmergencyOnly(boolean); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegisteredPlmn(@Nullable String); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRegistrationState(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setRejectCause(int); - method @NonNull public android.telephony.NetworkRegistrationInfo.Builder setTransportType(int); - } - public class PhoneNumberUtils { method public static int getMinMatchForTest(); - method @NonNull public static String getUsernameFromUriNumber(@NonNull String); - method public static boolean isUriNumber(@Nullable String); - method public static boolean isVoiceMailNumber(@NonNull android.content.Context, int, @Nullable String); method public static void setMinMatchForTest(int); } - public class PhoneStateListener { - method public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber); - method public void onOutgoingEmergencySms(@NonNull android.telephony.emergency.EmergencyNumber); - field @RequiresPermission("android.permission.READ_ACTIVE_EMERGENCY_SESSION") public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 268435456; // 0x10000000 - field @RequiresPermission("android.permission.READ_ACTIVE_EMERGENCY_SESSION") public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 536870912; // 0x20000000 - } - public final class PreciseDataConnectionState implements android.os.Parcelable { ctor @Deprecated public PreciseDataConnectionState(int, int, int, @NonNull String, @Nullable android.net.LinkProperties, int); } @@ -4089,40 +1649,16 @@ package android.telephony { field public static final int SMS_CATEGORY_STANDARD_SHORT_CODE = 2; // 0x2 } - public class SubscriptionManager { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int); - field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri VT_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_MODE_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_ROAMING_ENABLED_CONTENT_URI; - field @NonNull public static final android.net.Uri WFC_ROAMING_MODE_CONTENT_URI; - } - public class TelephonyManager { method public int addDevicePolicyOverrideApn(@NonNull android.content.Context, @NonNull android.telephony.data.ApnSetting); - method public int checkCarrierPrivilegesForPackage(String); - method @Nullable @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public android.content.ComponentName getAndUpdateDefaultRespondViaMessageApplication(); method public int getCarrierIdListVersion(); - method public java.util.List<java.lang.String> getCarrierPackageNamesForIntent(android.content.Intent); - method @Nullable @RequiresPermission("android.permission.INTERACT_ACROSS_USERS") public android.content.ComponentName getDefaultRespondViaMessageApplication(); method @NonNull public java.util.List<android.telephony.data.ApnSetting> getDevicePolicyOverrideApns(@NonNull android.content.Context); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public int getEmergencyNumberDbVersion(); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getLine1AlphaTag(); method public android.util.Pair<java.lang.Integer,java.lang.Integer> getRadioHalVersion(); method public boolean modifyDevicePolicyOverrideApn(@NonNull android.content.Context, int, @NonNull android.telephony.data.ApnSetting); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void refreshUiccProfile(); - method @RequiresPermission("android.permission.READ_ACTIVE_EMERGENCY_SESSION") public void resetOtaEmergencyNumberDbFilePath(); method @Deprecated public void setCarrierTestOverride(String, String, String, String, String, String, String); method public void setCarrierTestOverride(String, String, String, String, String, String, String, String, String); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull java.util.List<android.telephony.RadioAccessSpecifier>); - method @RequiresPermission("android.permission.READ_ACTIVE_EMERGENCY_SESSION") public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor); - field public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; // 0xfffffffe - field public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; // 0x1 - field public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; // 0x0 - field public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; // 0xffffffff - field public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; // 0xffffffff field public static final int UNKNOWN_CARRIER_ID_LIST_VERSION = -1; // 0xffffffff } @@ -4138,834 +1674,18 @@ package android.telephony.emergency { package android.telephony.ims { - public final class ImsCallForwardInfo implements android.os.Parcelable { - ctor public ImsCallForwardInfo(int, int, int, int, @NonNull String, int); - method public int describeContents(); - method public int getCondition(); - method public String getNumber(); - method public int getServiceClass(); - method public int getStatus(); - method public int getTimeSeconds(); - method public int getToA(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CDIV_CF_REASON_ALL = 4; // 0x4 - field public static final int CDIV_CF_REASON_ALL_CONDITIONAL = 5; // 0x5 - field public static final int CDIV_CF_REASON_BUSY = 1; // 0x1 - field public static final int CDIV_CF_REASON_NOT_LOGGED_IN = 6; // 0x6 - field public static final int CDIV_CF_REASON_NOT_REACHABLE = 3; // 0x3 - field public static final int CDIV_CF_REASON_NO_REPLY = 2; // 0x2 - field public static final int CDIV_CF_REASON_UNCONDITIONAL = 0; // 0x0 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallForwardInfo> CREATOR; - field public static final int STATUS_ACTIVE = 1; // 0x1 - field public static final int STATUS_NOT_ACTIVE = 0; // 0x0 - field public static final int TYPE_OF_ADDRESS_INTERNATIONAL = 145; // 0x91 - field public static final int TYPE_OF_ADDRESS_UNKNOWN = 129; // 0x81 - } - public final class ImsCallProfile implements android.os.Parcelable { - ctor public ImsCallProfile(); - ctor public ImsCallProfile(int, int); - ctor public ImsCallProfile(int, int, android.os.Bundle, android.telephony.ims.ImsStreamMediaProfile); - method public int describeContents(); - method public String getCallExtra(String); - method public String getCallExtra(String, String); - method public boolean getCallExtraBoolean(String); - method public boolean getCallExtraBoolean(String, boolean); - method public int getCallExtraInt(String); - method public int getCallExtraInt(String, int); - method public android.os.Bundle getCallExtras(); - method public int getCallType(); - method public static int getCallTypeFromVideoState(int); - method public int getCallerNumberVerificationStatus(); - method public int getEmergencyCallRouting(); - method public int getEmergencyServiceCategories(); - method @NonNull public java.util.List<java.lang.String> getEmergencyUrns(); - method public android.telephony.ims.ImsStreamMediaProfile getMediaProfile(); - method @NonNull public android.os.Bundle getProprietaryCallExtras(); - method public int getRestrictCause(); - method public int getServiceType(); - method public static int getVideoStateFromCallType(int); - method public static int getVideoStateFromImsCallProfile(android.telephony.ims.ImsCallProfile); - method public boolean hasKnownUserIntentEmergency(); - method public boolean isEmergencyCallTesting(); - method public boolean isVideoCall(); - method public boolean isVideoPaused(); - method public static int presentationToOir(int); - method public void setCallExtra(String, String); - method public void setCallExtraBoolean(String, boolean); - method public void setCallExtraInt(String, int); - method public void setCallRestrictCause(int); - method public void setCallerNumberVerificationStatus(int); - method public void setEmergencyCallRouting(int); - method public void setEmergencyCallTesting(boolean); - method public void setEmergencyServiceCategories(int); - method public void setEmergencyUrns(@NonNull java.util.List<java.lang.String>); - method public void setHasKnownUserIntentEmergency(boolean); - method public void updateCallExtras(android.telephony.ims.ImsCallProfile); - method public void updateCallType(android.telephony.ims.ImsCallProfile); - method public void updateMediaProfile(android.telephony.ims.ImsCallProfile); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CALL_RESTRICT_CAUSE_DISABLED = 2; // 0x2 - field public static final int CALL_RESTRICT_CAUSE_HD = 3; // 0x3 - field public static final int CALL_RESTRICT_CAUSE_NONE = 0; // 0x0 - field public static final int CALL_RESTRICT_CAUSE_RAT = 1; // 0x1 - field public static final int CALL_TYPE_VIDEO_N_VOICE = 3; // 0x3 - field public static final int CALL_TYPE_VOICE = 2; // 0x2 - field public static final int CALL_TYPE_VOICE_N_VIDEO = 1; // 0x1 - field public static final int CALL_TYPE_VS = 8; // 0x8 - field public static final int CALL_TYPE_VS_RX = 10; // 0xa - field public static final int CALL_TYPE_VS_TX = 9; // 0x9 - field public static final int CALL_TYPE_VT = 4; // 0x4 - field public static final int CALL_TYPE_VT_NODIR = 7; // 0x7 - field public static final int CALL_TYPE_VT_RX = 6; // 0x6 - field public static final int CALL_TYPE_VT_TX = 5; // 0x5 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsCallProfile> CREATOR; - field public static final int DIALSTRING_NORMAL = 0; // 0x0 - field public static final int DIALSTRING_SS_CONF = 1; // 0x1 - field public static final int DIALSTRING_USSD = 2; // 0x2 - field public static final String EXTRA_ADDITIONAL_CALL_INFO = "AdditionalCallInfo"; - field public static final String EXTRA_ADDITIONAL_SIP_INVITE_FIELDS = "android.telephony.ims.extra.ADDITIONAL_SIP_INVITE_FIELDS"; - field public static final String EXTRA_CALL_DISCONNECT_CAUSE = "android.telephony.ims.extra.CALL_DISCONNECT_CAUSE"; - field public static final String EXTRA_CALL_NETWORK_TYPE = "android.telephony.ims.extra.CALL_NETWORK_TYPE"; - field @Deprecated public static final String EXTRA_CALL_RAT_TYPE = "CallRadioTech"; - field public static final String EXTRA_CHILD_NUMBER = "ChildNum"; - field public static final String EXTRA_CNA = "cna"; - field public static final String EXTRA_CNAP = "cnap"; - field public static final String EXTRA_CODEC = "Codec"; - field public static final String EXTRA_DIALSTRING = "dialstring"; - field public static final String EXTRA_DISPLAY_TEXT = "DisplayText"; - field public static final String EXTRA_EMERGENCY_CALL = "e_call"; - field public static final String EXTRA_FORWARDED_NUMBER = "android.telephony.ims.extra.FORWARDED_NUMBER"; - field public static final String EXTRA_IS_CALL_PULL = "CallPull"; field public static final String EXTRA_OEM_EXTRAS = "android.telephony.ims.extra.OEM_EXTRAS"; - field public static final String EXTRA_OI = "oi"; - field public static final String EXTRA_OIR = "oir"; - field public static final String EXTRA_REMOTE_URI = "remote_uri"; - field public static final String EXTRA_USSD = "ussd"; - field public static final int OIR_DEFAULT = 0; // 0x0 - field public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2; // 0x2 - field public static final int OIR_PRESENTATION_PAYPHONE = 4; // 0x4 - field public static final int OIR_PRESENTATION_RESTRICTED = 1; // 0x1 - field public static final int OIR_PRESENTATION_UNKNOWN = 3; // 0x3 - field public static final int SERVICE_TYPE_EMERGENCY = 2; // 0x2 - field public static final int SERVICE_TYPE_NONE = 0; // 0x0 - field public static final int SERVICE_TYPE_NORMAL = 1; // 0x1 - field public static final int VERIFICATION_STATUS_FAILED = 2; // 0x2 - field public static final int VERIFICATION_STATUS_NOT_VERIFIED = 0; // 0x0 - field public static final int VERIFICATION_STATUS_PASSED = 1; // 0x1 - } - - public class ImsCallSessionListener { - method public void callQualityChanged(@NonNull android.telephony.CallQuality); - method public void callSessionConferenceExtendFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionConferenceExtendReceived(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); - method public void callSessionConferenceExtended(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); - method public void callSessionConferenceStateUpdated(android.telephony.ims.ImsConferenceState); - method @Deprecated public void callSessionHandover(int, int, android.telephony.ims.ImsReasonInfo); - method @Deprecated public void callSessionHandoverFailed(int, int, android.telephony.ims.ImsReasonInfo); - method public void callSessionHeld(android.telephony.ims.ImsCallProfile); - method public void callSessionHoldFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionHoldReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionInitiated(android.telephony.ims.ImsCallProfile); - method public void callSessionInitiatedFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionInviteParticipantsRequestDelivered(); - method public void callSessionInviteParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo); - method @Deprecated public void callSessionMayHandover(int, int); - method public void callSessionMergeComplete(android.telephony.ims.stub.ImsCallSessionImplBase); - method public void callSessionMergeFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionMergeStarted(android.telephony.ims.stub.ImsCallSessionImplBase, android.telephony.ims.ImsCallProfile); - method public void callSessionMultipartyStateChanged(boolean); - method public void callSessionProgressing(android.telephony.ims.ImsStreamMediaProfile); - method public void callSessionRemoveParticipantsRequestDelivered(); - method public void callSessionRemoveParticipantsRequestFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionResumeFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionResumeReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionResumed(android.telephony.ims.ImsCallProfile); - method public void callSessionRttAudioIndicatorChanged(@NonNull android.telephony.ims.ImsStreamMediaProfile); - method public void callSessionRttMessageReceived(String); - method public void callSessionRttModifyRequestReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionRttModifyResponseReceived(int); - method public void callSessionSuppServiceReceived(android.telephony.ims.ImsSuppServiceNotification); - method public void callSessionTerminated(android.telephony.ims.ImsReasonInfo); - method public void callSessionTtyModeReceived(int); - method public void callSessionUpdateFailed(android.telephony.ims.ImsReasonInfo); - method public void callSessionUpdateReceived(android.telephony.ims.ImsCallProfile); - method public void callSessionUpdated(android.telephony.ims.ImsCallProfile); - method public void callSessionUssdMessageReceived(int, String); - method public void onHandover(int, int, @Nullable android.telephony.ims.ImsReasonInfo); - method public void onHandoverFailed(int, int, @NonNull android.telephony.ims.ImsReasonInfo); - method public void onMayHandover(int, int); - } - - public final class ImsConferenceState implements android.os.Parcelable { - method public int describeContents(); - method public static int getConnectionStateForStatus(String); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsConferenceState> CREATOR; - field public static final String DISPLAY_TEXT = "display-text"; - field public static final String ENDPOINT = "endpoint"; - field public static final String SIP_STATUS_CODE = "sipstatuscode"; - field public static final String STATUS = "status"; - field public static final String STATUS_ALERTING = "alerting"; - field public static final String STATUS_CONNECTED = "connected"; - field public static final String STATUS_CONNECT_FAIL = "connect-fail"; - field public static final String STATUS_DIALING_IN = "dialing-in"; - field public static final String STATUS_DIALING_OUT = "dialing-out"; - field public static final String STATUS_DISCONNECTED = "disconnected"; - field public static final String STATUS_DISCONNECTING = "disconnecting"; - field public static final String STATUS_MUTED_VIA_FOCUS = "muted-via-focus"; - field public static final String STATUS_ON_HOLD = "on-hold"; - field public static final String STATUS_PENDING = "pending"; - field public static final String STATUS_SEND_ONLY = "sendonly"; - field public static final String STATUS_SEND_RECV = "sendrecv"; - field public static final String USER = "user"; - field public final java.util.HashMap<java.lang.String,android.os.Bundle> mParticipants; - } - - public final class ImsException extends java.lang.Exception { - ctor public ImsException(@Nullable String); - ctor public ImsException(@Nullable String, int); - ctor public ImsException(@Nullable String, int, @Nullable Throwable); - } - - public final class ImsExternalCallState implements android.os.Parcelable { - ctor public ImsExternalCallState(@NonNull String, @NonNull android.net.Uri, @Nullable android.net.Uri, boolean, int, int, boolean); - method public int describeContents(); - method @NonNull public android.net.Uri getAddress(); - method public int getCallId(); - method public int getCallState(); - method public int getCallType(); - method @Nullable public android.net.Uri getLocalAddress(); - method public boolean isCallHeld(); - method public boolean isCallPullable(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CALL_STATE_CONFIRMED = 1; // 0x1 - field public static final int CALL_STATE_TERMINATED = 2; // 0x2 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsExternalCallState> CREATOR; - } - - public class ImsMmTelManager implements android.telephony.ims.RegistrationManager { - method @Deprecated @NonNull @RequiresPermission(anyOf={"android.permission.READ_PRIVILEGED_PHONE_STATE", android.Manifest.permission.READ_PRECISE_PHONE_STATE}) public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException; - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public int getVoWiFiRoamingModeSetting(); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isAvailable(int, int); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isCapable(int, int); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void isSupported(int, int, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>) throws android.telephony.ims.ImsException; - method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setAdvancedCallingSettingEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean, int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean); - method @Deprecated @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.ImsMmTelManager.RegistrationCallback); - } - - @Deprecated public static class ImsMmTelManager.RegistrationCallback extends android.telephony.ims.RegistrationManager.RegistrationCallback { - ctor @Deprecated public ImsMmTelManager.RegistrationCallback(); - } - - public class ImsService extends android.app.Service { - ctor public ImsService(); - method public android.telephony.ims.feature.MmTelFeature createMmTelFeature(int); - method public android.telephony.ims.feature.RcsFeature createRcsFeature(int); - method public void disableIms(int); - method public void enableIms(int); - method public android.telephony.ims.stub.ImsConfigImplBase getConfig(int); - method public android.telephony.ims.stub.ImsRegistrationImplBase getRegistration(int); - method public final void onUpdateSupportedImsFeatures(android.telephony.ims.stub.ImsFeatureConfiguration) throws android.os.RemoteException; - method public android.telephony.ims.stub.ImsFeatureConfiguration querySupportedImsFeatures(); - method public void readyForFeatureCreation(); - } - - public final class ImsSsData implements android.os.Parcelable { - ctor public ImsSsData(int, int, int, int, int); - method public int describeContents(); - method @Nullable public java.util.List<android.telephony.ims.ImsCallForwardInfo> getCallForwardInfo(); - method public int getRequestType(); - method public int getResult(); - method public int getServiceClass(); - method public int getServiceType(); - method @NonNull public java.util.List<android.telephony.ims.ImsSsInfo> getSuppServiceInfo(); - method public int getTeleserviceType(); - method public boolean isTypeBarring(); - method public boolean isTypeCf(); - method public boolean isTypeClip(); - method public boolean isTypeClir(); - method public boolean isTypeColp(); - method public boolean isTypeColr(); - method public boolean isTypeCw(); - method public boolean isTypeIcb(); - method public boolean isTypeInterrogation(); - method public boolean isTypeUnConditional(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsData> CREATOR; - field public static final int RESULT_SUCCESS = 0; // 0x0 - field public static final int SERVICE_CLASS_DATA = 2; // 0x2 - field public static final int SERVICE_CLASS_DATA_CIRCUIT_ASYNC = 32; // 0x20 - field public static final int SERVICE_CLASS_DATA_CIRCUIT_SYNC = 16; // 0x10 - field public static final int SERVICE_CLASS_DATA_PACKET_ACCESS = 64; // 0x40 - field public static final int SERVICE_CLASS_DATA_PAD = 128; // 0x80 - field public static final int SERVICE_CLASS_FAX = 4; // 0x4 - field public static final int SERVICE_CLASS_NONE = 0; // 0x0 - field public static final int SERVICE_CLASS_SMS = 8; // 0x8 - field public static final int SERVICE_CLASS_VOICE = 1; // 0x1 - field public static final int SS_ACTIVATION = 0; // 0x0 - field public static final int SS_ALL_BARRING = 18; // 0x12 - field public static final int SS_ALL_DATA_TELESERVICES = 3; // 0x3 - field public static final int SS_ALL_TELESERVICES_EXCEPT_SMS = 5; // 0x5 - field public static final int SS_ALL_TELESEVICES = 1; // 0x1 - field public static final int SS_ALL_TELE_AND_BEARER_SERVICES = 0; // 0x0 - field public static final int SS_BAIC = 16; // 0x10 - field public static final int SS_BAIC_ROAMING = 17; // 0x11 - field public static final int SS_BAOC = 13; // 0xd - field public static final int SS_BAOIC = 14; // 0xe - field public static final int SS_BAOIC_EXC_HOME = 15; // 0xf - field public static final int SS_CFU = 0; // 0x0 - field public static final int SS_CFUT = 6; // 0x6 - field public static final int SS_CF_ALL = 4; // 0x4 - field public static final int SS_CF_ALL_CONDITIONAL = 5; // 0x5 - field public static final int SS_CF_BUSY = 1; // 0x1 - field public static final int SS_CF_NOT_REACHABLE = 3; // 0x3 - field public static final int SS_CF_NO_REPLY = 2; // 0x2 - field public static final int SS_CLIP = 7; // 0x7 - field public static final int SS_CLIR = 8; // 0x8 - field public static final int SS_CNAP = 11; // 0xb - field public static final int SS_COLP = 9; // 0x9 - field public static final int SS_COLR = 10; // 0xa - field public static final int SS_DEACTIVATION = 1; // 0x1 - field public static final int SS_ERASURE = 4; // 0x4 - field public static final int SS_INCOMING_BARRING = 20; // 0x14 - field public static final int SS_INCOMING_BARRING_ANONYMOUS = 22; // 0x16 - field public static final int SS_INCOMING_BARRING_DN = 21; // 0x15 - field public static final int SS_INTERROGATION = 2; // 0x2 - field public static final int SS_OUTGOING_BARRING = 19; // 0x13 - field public static final int SS_REGISTRATION = 3; // 0x3 - field public static final int SS_SMS_SERVICES = 4; // 0x4 - field public static final int SS_TELEPHONY = 2; // 0x2 - field public static final int SS_WAIT = 12; // 0xc - } - - public static final class ImsSsData.Builder { - ctor public ImsSsData.Builder(int, int, int, int, int); - method @NonNull public android.telephony.ims.ImsSsData build(); - method @NonNull public android.telephony.ims.ImsSsData.Builder setCallForwardingInfo(@NonNull java.util.List<android.telephony.ims.ImsCallForwardInfo>); - method @NonNull public android.telephony.ims.ImsSsData.Builder setSuppServiceInfo(@NonNull java.util.List<android.telephony.ims.ImsSsInfo>); - } - - public final class ImsSsInfo implements android.os.Parcelable { - ctor @Deprecated public ImsSsInfo(int, @Nullable String); - method public int describeContents(); - method public int getClirInterrogationStatus(); - method public int getClirOutgoingState(); - method @Deprecated public String getIcbNum(); - method @Nullable public String getIncomingCommunicationBarringNumber(); - method public int getProvisionStatus(); - method public int getStatus(); - method public void writeToParcel(android.os.Parcel, int); - field public static final int CLIR_OUTGOING_DEFAULT = 0; // 0x0 - field public static final int CLIR_OUTGOING_INVOCATION = 1; // 0x1 - field public static final int CLIR_OUTGOING_SUPPRESSION = 2; // 0x2 - field public static final int CLIR_STATUS_NOT_PROVISIONED = 0; // 0x0 - field public static final int CLIR_STATUS_PROVISIONED_PERMANENT = 1; // 0x1 - field public static final int CLIR_STATUS_TEMPORARILY_ALLOWED = 4; // 0x4 - field public static final int CLIR_STATUS_TEMPORARILY_RESTRICTED = 3; // 0x3 - field public static final int CLIR_STATUS_UNKNOWN = 2; // 0x2 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSsInfo> CREATOR; - field public static final int DISABLED = 0; // 0x0 - field public static final int ENABLED = 1; // 0x1 - field public static final int NOT_REGISTERED = -1; // 0xffffffff - field public static final int SERVICE_NOT_PROVISIONED = 0; // 0x0 - field public static final int SERVICE_PROVISIONED = 1; // 0x1 - field public static final int SERVICE_PROVISIONING_UNKNOWN = -1; // 0xffffffff - } - - public static final class ImsSsInfo.Builder { - ctor public ImsSsInfo.Builder(int); - method @NonNull public android.telephony.ims.ImsSsInfo build(); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirInterrogationStatus(int); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setClirOutgoingState(int); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setIncomingCommunicationBarringNumber(@NonNull String); - method @NonNull public android.telephony.ims.ImsSsInfo.Builder setProvisionStatus(int); - } - - public final class ImsStreamMediaProfile implements android.os.Parcelable { - ctor public ImsStreamMediaProfile(int, int, int, int, int); - method public void copyFrom(android.telephony.ims.ImsStreamMediaProfile); - method public int describeContents(); - method public int getAudioDirection(); - method public int getAudioQuality(); - method public int getRttMode(); - method public int getVideoDirection(); - method public int getVideoQuality(); - method public boolean isReceivingRttAudio(); - method public boolean isRttCall(); - method public void setReceivingRttAudio(boolean); - method public void setRttMode(int); - method public void writeToParcel(android.os.Parcel, int); - field public static final int AUDIO_QUALITY_AMR = 1; // 0x1 - field public static final int AUDIO_QUALITY_AMR_WB = 2; // 0x2 - field public static final int AUDIO_QUALITY_EVRC = 4; // 0x4 - field public static final int AUDIO_QUALITY_EVRC_B = 5; // 0x5 - field public static final int AUDIO_QUALITY_EVRC_NW = 7; // 0x7 - field public static final int AUDIO_QUALITY_EVRC_WB = 6; // 0x6 - field public static final int AUDIO_QUALITY_EVS_FB = 20; // 0x14 - field public static final int AUDIO_QUALITY_EVS_NB = 17; // 0x11 - field public static final int AUDIO_QUALITY_EVS_SWB = 19; // 0x13 - field public static final int AUDIO_QUALITY_EVS_WB = 18; // 0x12 - field public static final int AUDIO_QUALITY_G711A = 13; // 0xd - field public static final int AUDIO_QUALITY_G711AB = 15; // 0xf - field public static final int AUDIO_QUALITY_G711U = 11; // 0xb - field public static final int AUDIO_QUALITY_G722 = 14; // 0xe - field public static final int AUDIO_QUALITY_G723 = 12; // 0xc - field public static final int AUDIO_QUALITY_G729 = 16; // 0x10 - field public static final int AUDIO_QUALITY_GSM_EFR = 8; // 0x8 - field public static final int AUDIO_QUALITY_GSM_FR = 9; // 0x9 - field public static final int AUDIO_QUALITY_GSM_HR = 10; // 0xa - field public static final int AUDIO_QUALITY_NONE = 0; // 0x0 - field public static final int AUDIO_QUALITY_QCELP13K = 3; // 0x3 - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsStreamMediaProfile> CREATOR; - field public static final int DIRECTION_INACTIVE = 0; // 0x0 - field public static final int DIRECTION_INVALID = -1; // 0xffffffff - field public static final int DIRECTION_RECEIVE = 1; // 0x1 - field public static final int DIRECTION_SEND = 2; // 0x2 - field public static final int DIRECTION_SEND_RECEIVE = 3; // 0x3 - field public static final int RTT_MODE_DISABLED = 0; // 0x0 - field public static final int RTT_MODE_FULL = 1; // 0x1 - field public static final int VIDEO_QUALITY_NONE = 0; // 0x0 - field public static final int VIDEO_QUALITY_QCIF = 1; // 0x1 - field public static final int VIDEO_QUALITY_QVGA_LANDSCAPE = 2; // 0x2 - field public static final int VIDEO_QUALITY_QVGA_PORTRAIT = 4; // 0x4 - field public static final int VIDEO_QUALITY_VGA_LANDSCAPE = 8; // 0x8 - field public static final int VIDEO_QUALITY_VGA_PORTRAIT = 16; // 0x10 - } - - public final class ImsSuppServiceNotification implements android.os.Parcelable { - ctor public ImsSuppServiceNotification(int, int, int, int, String, String[]); - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsSuppServiceNotification> CREATOR; - field public final int code; - field public final String[] history; - field public final int index; - field public final int notificationType; - field public final String number; - field public final int type; - } - - public class ImsUtListener { - method public void onLineIdentificationSupplementaryServiceResponse(int, @NonNull android.telephony.ims.ImsSsInfo); - method public void onSupplementaryServiceIndication(android.telephony.ims.ImsSsData); - method public void onUtConfigurationCallBarringQueried(int, android.telephony.ims.ImsSsInfo[]); - method public void onUtConfigurationCallForwardQueried(int, android.telephony.ims.ImsCallForwardInfo[]); - method public void onUtConfigurationCallWaitingQueried(int, android.telephony.ims.ImsSsInfo[]); - method @Deprecated public void onUtConfigurationQueried(int, android.os.Bundle); - method public void onUtConfigurationQueryFailed(int, android.telephony.ims.ImsReasonInfo); - method public void onUtConfigurationUpdateFailed(int, android.telephony.ims.ImsReasonInfo); - method public void onUtConfigurationUpdated(int); - field @Deprecated public static final String BUNDLE_KEY_CLIR = "queryClir"; - field @Deprecated public static final String BUNDLE_KEY_SSINFO = "imsSsInfo"; - } - - public abstract class ImsVideoCallProvider { - ctor public ImsVideoCallProvider(); - method public void changeCallDataUsage(long); - method public void changeCameraCapabilities(android.telecom.VideoProfile.CameraCapabilities); - method public void changePeerDimensions(int, int); - method public void changeVideoQuality(int); - method public void handleCallSessionEvent(int); - method public abstract void onRequestCallDataUsage(); - method public abstract void onRequestCameraCapabilities(); - method public abstract void onSendSessionModifyRequest(android.telecom.VideoProfile, android.telecom.VideoProfile); - method public abstract void onSendSessionModifyResponse(android.telecom.VideoProfile); - method public abstract void onSetCamera(String); - method public void onSetCamera(String, int); - method public abstract void onSetDeviceOrientation(int); - method public abstract void onSetDisplaySurface(android.view.Surface); - method public abstract void onSetPauseImage(android.net.Uri); - method public abstract void onSetPreviewSurface(android.view.Surface); - method public abstract void onSetZoom(float); - method public void receiveSessionModifyRequest(android.telecom.VideoProfile); - method public void receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile); - } - - public class ProvisioningManager { - method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @WorkerThread public int getProvisioningIntValue(int); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @WorkerThread public boolean getProvisioningStatusForCapability(int, int); - method @Nullable @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @WorkerThread public String getProvisioningStringValue(int); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") @WorkerThread public boolean getRcsProvisioningStatusForCapability(int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException; - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String); - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean); - method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback); - field public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; // 0x1b - field public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; // 0x1a - field public static final int PROVISIONING_VALUE_DISABLED = 0; // 0x0 - field public static final int PROVISIONING_VALUE_ENABLED = 1; // 0x1 - field public static final String STRING_QUERY_RESULT_ERROR_GENERIC = "STRING_QUERY_RESULT_ERROR_GENERIC"; - field public static final String STRING_QUERY_RESULT_ERROR_NOT_READY = "STRING_QUERY_RESULT_ERROR_NOT_READY"; - } - - public static class ProvisioningManager.Callback { - ctor public ProvisioningManager.Callback(); - method public void onProvisioningIntChanged(int, int); - method public void onProvisioningStringChanged(int, @NonNull String); - } - - public class RcsUceAdapter { - method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException; } } package android.telephony.ims.feature { - public final class CapabilityChangeRequest implements android.os.Parcelable { - method public void addCapabilitiesToDisableForTech(int, int); - method public void addCapabilitiesToEnableForTech(int, int); - method public int describeContents(); - method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToDisable(); - method public java.util.List<android.telephony.ims.feature.CapabilityChangeRequest.CapabilityPair> getCapabilitiesToEnable(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.feature.CapabilityChangeRequest> CREATOR; - } - - public static class CapabilityChangeRequest.CapabilityPair { - ctor public CapabilityChangeRequest.CapabilityPair(int, int); - method public int getCapability(); - method public int getRadioTech(); - } - - public abstract class ImsFeature { - ctor public ImsFeature(); - method public abstract void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); - method public int getFeatureState(); - method public final int getSlotIndex(); - method public abstract void onFeatureReady(); - method public abstract void onFeatureRemoved(); - method public final void setFeatureState(int); - field public static final int CAPABILITY_ERROR_GENERIC = -1; // 0xffffffff - field public static final int CAPABILITY_SUCCESS = 0; // 0x0 - field public static final int FEATURE_EMERGENCY_MMTEL = 0; // 0x0 - field public static final int FEATURE_MMTEL = 1; // 0x1 - field public static final int FEATURE_RCS = 2; // 0x2 - field public static final int STATE_INITIALIZING = 1; // 0x1 - field public static final int STATE_READY = 2; // 0x2 - field public static final int STATE_UNAVAILABLE = 0; // 0x0 - } - @Deprecated public static class ImsFeature.Capabilities { field @Deprecated protected int mCapabilities; } - protected static class ImsFeature.CapabilityCallbackProxy { - method public void onChangeCapabilityConfigurationError(int, int, int); - } - - public class MmTelFeature extends android.telephony.ims.feature.ImsFeature { - ctor public MmTelFeature(); - method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); - method @Nullable public android.telephony.ims.ImsCallProfile createCallProfile(int, int); - method @Nullable public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(@NonNull android.telephony.ims.ImsCallProfile); - method @NonNull public android.telephony.ims.stub.ImsEcbmImplBase getEcbm(); - method @NonNull public android.telephony.ims.stub.ImsMultiEndpointImplBase getMultiEndpoint(); - method @NonNull public android.telephony.ims.stub.ImsSmsImplBase getSmsImplementation(); - method @NonNull public android.telephony.ims.stub.ImsUtImplBase getUt(); - method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities); - method public final void notifyIncomingCall(@NonNull android.telephony.ims.stub.ImsCallSessionImplBase, @NonNull android.os.Bundle); - method public final void notifyRejectedCall(@NonNull android.telephony.ims.ImsCallProfile, @NonNull android.telephony.ims.ImsReasonInfo); - method public final void notifyVoiceMessageCountUpdate(int); - method public void onFeatureReady(); - method public void onFeatureRemoved(); - method public boolean queryCapabilityConfiguration(int, int); - method @NonNull public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus(); - method public void setUiTtyMode(int, @Nullable android.os.Message); - method public int shouldProcessCall(@NonNull String[]); - field public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL"; - field public static final String EXTRA_IS_USSD = "android.telephony.ims.feature.extra.IS_USSD"; - field public static final int PROCESS_CALL_CSFB = 1; // 0x1 - field public static final int PROCESS_CALL_IMS = 0; // 0x0 - } - - public static class MmTelFeature.MmTelCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities { - ctor public MmTelFeature.MmTelCapabilities(); - ctor @Deprecated public MmTelFeature.MmTelCapabilities(android.telephony.ims.feature.ImsFeature.Capabilities); - ctor public MmTelFeature.MmTelCapabilities(int); - method public final void addCapabilities(int); - method public final boolean isCapable(int); - method public final void removeCapabilities(int); - } - - public class RcsFeature extends android.telephony.ims.feature.ImsFeature { - ctor public RcsFeature(); - method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy); - method public void onFeatureReady(); - method public void onFeatureRemoved(); - } - -} - -package android.telephony.ims.stub { - - public class ImsCallSessionImplBase implements java.lang.AutoCloseable { - ctor public ImsCallSessionImplBase(); - method public void accept(int, android.telephony.ims.ImsStreamMediaProfile); - method public void close(); - method public void deflect(String); - method public void extendToConference(String[]); - method public String getCallId(); - method public android.telephony.ims.ImsCallProfile getCallProfile(); - method public android.telephony.ims.ImsVideoCallProvider getImsVideoCallProvider(); - method public android.telephony.ims.ImsCallProfile getLocalCallProfile(); - method public String getProperty(String); - method public android.telephony.ims.ImsCallProfile getRemoteCallProfile(); - method public int getState(); - method public void hold(android.telephony.ims.ImsStreamMediaProfile); - method public void inviteParticipants(String[]); - method public boolean isInCall(); - method public boolean isMultiparty(); - method public void merge(); - method public void reject(int); - method public void removeParticipants(String[]); - method public void resume(android.telephony.ims.ImsStreamMediaProfile); - method public void sendDtmf(char, android.os.Message); - method public void sendRttMessage(String); - method public void sendRttModifyRequest(android.telephony.ims.ImsCallProfile); - method public void sendRttModifyResponse(boolean); - method public void sendUssd(String); - method public void setListener(android.telephony.ims.ImsCallSessionListener); - method public void setMute(boolean); - method public void start(String, android.telephony.ims.ImsCallProfile); - method public void startConference(String[], android.telephony.ims.ImsCallProfile); - method public void startDtmf(char); - method public void stopDtmf(); - method public void terminate(int); - method public void update(int, android.telephony.ims.ImsStreamMediaProfile); - field public static final int USSD_MODE_NOTIFY = 0; // 0x0 - field public static final int USSD_MODE_REQUEST = 1; // 0x1 - } - - public static class ImsCallSessionImplBase.State { - method public static String toString(int); - field public static final int ESTABLISHED = 4; // 0x4 - field public static final int ESTABLISHING = 3; // 0x3 - field public static final int IDLE = 0; // 0x0 - field public static final int INITIATED = 1; // 0x1 - field public static final int INVALID = -1; // 0xffffffff - field public static final int NEGOTIATING = 2; // 0x2 - field public static final int REESTABLISHING = 6; // 0x6 - field public static final int RENEGOTIATING = 5; // 0x5 - field public static final int TERMINATED = 8; // 0x8 - field public static final int TERMINATING = 7; // 0x7 - } - - public class ImsConfigImplBase { - ctor public ImsConfigImplBase(); - method public int getConfigInt(int); - method public String getConfigString(int); - method public final void notifyProvisionedValueChanged(int, int); - method public final void notifyProvisionedValueChanged(int, String); - method public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean); - method public int setConfig(int, int); - method public int setConfig(int, String); - field public static final int CONFIG_RESULT_FAILED = 1; // 0x1 - field public static final int CONFIG_RESULT_SUCCESS = 0; // 0x0 - field public static final int CONFIG_RESULT_UNKNOWN = -1; // 0xffffffff - } - - public class ImsEcbmImplBase { - ctor public ImsEcbmImplBase(); - method public final void enteredEcbm(); - method public void exitEmergencyCallbackMode(); - method public final void exitedEcbm(); - } - - public final class ImsFeatureConfiguration implements android.os.Parcelable { - method public int describeContents(); - method public java.util.Set<android.telephony.ims.stub.ImsFeatureConfiguration.FeatureSlotPair> getServiceFeatures(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.stub.ImsFeatureConfiguration> CREATOR; - } - - public static class ImsFeatureConfiguration.Builder { - ctor public ImsFeatureConfiguration.Builder(); - method public android.telephony.ims.stub.ImsFeatureConfiguration.Builder addFeature(int, int); - method public android.telephony.ims.stub.ImsFeatureConfiguration build(); - } - - public static final class ImsFeatureConfiguration.FeatureSlotPair { - ctor public ImsFeatureConfiguration.FeatureSlotPair(int, int); - field public final int featureType; - field public final int slotId; - } - - public class ImsMultiEndpointImplBase { - ctor public ImsMultiEndpointImplBase(); - method public final void onImsExternalCallStateUpdate(java.util.List<android.telephony.ims.ImsExternalCallState>); - method public void requestImsExternalCallStateInfo(); - } - - public class ImsRegistrationImplBase { - ctor public ImsRegistrationImplBase(); - method public final void onDeregistered(android.telephony.ims.ImsReasonInfo); - method public final void onRegistered(int); - method public final void onRegistering(int); - method public final void onSubscriberAssociatedUriChanged(android.net.Uri[]); - method public final void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo); - field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1 - field public static final int REGISTRATION_TECH_LTE = 0; // 0x0 - field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff - } - - public class ImsSmsImplBase { - ctor public ImsSmsImplBase(); - method public void acknowledgeSms(int, @IntRange(from=0, to=65535) int, int); - method public void acknowledgeSmsReport(int, @IntRange(from=0, to=65535) int, int); - method public String getSmsFormat(); - method public void onReady(); - method @Deprecated public final void onSendSmsResult(int, @IntRange(from=0, to=65535) int, int, int) throws java.lang.RuntimeException; - method public final void onSendSmsResultError(int, @IntRange(from=0, to=65535) int, int, int, int) throws java.lang.RuntimeException; - method public final void onSendSmsResultSuccess(int, @IntRange(from=0, to=65535) int) throws java.lang.RuntimeException; - method public final void onSmsReceived(int, String, byte[]) throws java.lang.RuntimeException; - method @Deprecated public final void onSmsStatusReportReceived(int, @IntRange(from=0, to=65535) int, String, byte[]) throws java.lang.RuntimeException; - method public final void onSmsStatusReportReceived(int, String, byte[]) throws java.lang.RuntimeException; - method public void sendSms(int, @IntRange(from=0, to=65535) int, String, String, boolean, byte[]); - field public static final int DELIVER_STATUS_ERROR_GENERIC = 2; // 0x2 - field public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; // 0x3 - field public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; // 0x4 - field public static final int DELIVER_STATUS_OK = 1; // 0x1 - field public static final int RESULT_NO_NETWORK_ERROR = -1; // 0xffffffff - field public static final int SEND_STATUS_ERROR = 2; // 0x2 - field public static final int SEND_STATUS_ERROR_FALLBACK = 4; // 0x4 - field public static final int SEND_STATUS_ERROR_RETRY = 3; // 0x3 - field public static final int SEND_STATUS_OK = 1; // 0x1 - field public static final int STATUS_REPORT_STATUS_ERROR = 2; // 0x2 - field public static final int STATUS_REPORT_STATUS_OK = 1; // 0x1 - } - - public class ImsUtImplBase { - ctor public ImsUtImplBase(); - method public void close(); - method public int queryCallBarring(int); - method public int queryCallBarringForServiceClass(int, int); - method public int queryCallForward(int, String); - method public int queryCallWaiting(); - method public int queryClip(); - method public int queryClir(); - method public int queryColp(); - method public int queryColr(); - method public void setListener(android.telephony.ims.ImsUtListener); - method public int transact(android.os.Bundle); - method public int updateCallBarring(int, int, String[]); - method public int updateCallBarringForServiceClass(int, int, String[], int); - method public int updateCallForward(int, int, String, int, int); - method public int updateCallWaiting(boolean, int); - method public int updateClip(boolean); - method public int updateClir(int); - method public int updateColp(boolean); - method public int updateColr(int); - } - -} - -package android.telephony.mbms { - - public static class DownloadRequest.Builder { - method public android.telephony.mbms.DownloadRequest.Builder setServiceId(String); - } - - public final class FileInfo implements android.os.Parcelable { - ctor public FileInfo(android.net.Uri, String); - } - - public final class FileServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable { - ctor public FileServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date, java.util.List<android.telephony.mbms.FileInfo>); - } - - public final class StreamingServiceInfo extends android.telephony.mbms.ServiceInfo implements android.os.Parcelable { - ctor public StreamingServiceInfo(java.util.Map<java.util.Locale,java.lang.String>, String, java.util.List<java.util.Locale>, String, java.util.Date, java.util.Date); - } - - public final class UriPathPair implements android.os.Parcelable { - method public int describeContents(); - method public android.net.Uri getContentUri(); - method public android.net.Uri getFilePathUri(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.telephony.mbms.UriPathPair> CREATOR; - } - -} - -package android.telephony.mbms.vendor { - - public class MbmsDownloadServiceBase extends android.os.Binder implements android.os.IInterface { - ctor public MbmsDownloadServiceBase(); - method public int addProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; - method public int addStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; - method public android.os.IBinder asBinder(); - method public int cancelDownload(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public void dispose(int) throws android.os.RemoteException; - method public int download(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public int initialize(int, android.telephony.mbms.MbmsDownloadSessionCallback) throws android.os.RemoteException; - method @NonNull public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(int) throws android.os.RemoteException; - method public void onAppCallbackDied(int, int); - method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; - method public int removeProgressListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadProgressListener) throws android.os.RemoteException; - method public int removeStatusListener(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStatusListener) throws android.os.RemoteException; - method public int requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo) throws android.os.RemoteException; - method public int requestUpdateFileServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; - method public int resetDownloadKnowledge(android.telephony.mbms.DownloadRequest) throws android.os.RemoteException; - method public int setTempFileRootDirectory(int, String) throws android.os.RemoteException; - } - - public class MbmsGroupCallServiceBase extends android.app.Service { - ctor public MbmsGroupCallServiceBase(); - method public void dispose(int) throws android.os.RemoteException; - method public int initialize(@NonNull android.telephony.mbms.MbmsGroupCallSessionCallback, int) throws android.os.RemoteException; - method public void onAppCallbackDied(int, int); - method public android.os.IBinder onBind(android.content.Intent); - method public int startGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>, @NonNull android.telephony.mbms.GroupCallCallback); - method public void stopGroupCall(int, long); - method public void updateGroupCall(int, long, @NonNull java.util.List<java.lang.Integer>, @NonNull java.util.List<java.lang.Integer>); - } - - public class MbmsStreamingServiceBase extends android.os.Binder implements android.os.IInterface { - ctor public MbmsStreamingServiceBase(); - method public android.os.IBinder asBinder(); - method public void dispose(int) throws android.os.RemoteException; - method @Nullable public android.net.Uri getPlaybackUri(int, String) throws android.os.RemoteException; - method public int initialize(android.telephony.mbms.MbmsStreamingSessionCallback, int) throws android.os.RemoteException; - method public void onAppCallbackDied(int, int); - method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; - method public int requestUpdateStreamingServices(int, java.util.List<java.lang.String>) throws android.os.RemoteException; - method public int startStreaming(int, String, android.telephony.mbms.StreamingServiceCallback) throws android.os.RemoteException; - method public void stopStreaming(int, String) throws android.os.RemoteException; - } - - public class VendorUtils { - ctor public VendorUtils(); - method public static android.content.ComponentName getAppReceiverFromPackageName(android.content.Context, String); - field public static final String ACTION_CLEANUP = "android.telephony.mbms.action.CLEANUP"; - field public static final String ACTION_DOWNLOAD_RESULT_INTERNAL = "android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL"; - field public static final String ACTION_FILE_DESCRIPTOR_REQUEST = "android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST"; - field public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT"; - field public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI"; - field public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST"; - field public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST"; - field public static final String EXTRA_PAUSED_URI_LIST = "android.telephony.mbms.extra.PAUSED_URI_LIST"; - field public static final String EXTRA_SERVICE_ID = "android.telephony.mbms.extra.SERVICE_ID"; - field public static final String EXTRA_TEMP_FILES_IN_USE = "android.telephony.mbms.extra.TEMP_FILES_IN_USE"; - field public static final String EXTRA_TEMP_FILE_ROOT = "android.telephony.mbms.extra.TEMP_FILE_ROOT"; - field public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST"; - } - } package android.text { @@ -5209,7 +1929,7 @@ package android.view { field public static final int ACCESSIBILITY_TITLE_CHANGED = 33554432; // 0x2000000 field public static final int PRIVATE_FLAG_NO_MOVE_ANIMATION = 64; // 0x40 field public CharSequence accessibilityTitle; - field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=0x1, equals=0x1, name="FAKE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x2, equals=0x2, name="FORCE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x4, equals=0x4, name="WANTS_OFFSET_NOTIFICATIONS"), @android.view.ViewDebug.FlagToString(mask=0x10, equals=0x10, name="SHOW_FOR_ALL_USERS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, equals=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, name="NO_MOVE_ANIMATION"), @android.view.ViewDebug.FlagToString(mask=0x80, equals=0x80, name="COMPATIBLE_WINDOW"), @android.view.ViewDebug.FlagToString(mask=0x100, equals=0x100, name="SYSTEM_ERROR"), @android.view.ViewDebug.FlagToString(mask=0x800, equals=0x800, name="DISABLE_WALLPAPER_TOUCH_EVENTS"), @android.view.ViewDebug.FlagToString(mask=0x1000, equals=0x1000, name="FORCE_STATUS_BAR_VISIBLE"), @android.view.ViewDebug.FlagToString(mask=0x2000, equals=0x2000, name="PRESERVE_GEOMETRY"), @android.view.ViewDebug.FlagToString(mask=0x4000, equals=0x4000, name="FORCE_DECOR_VIEW_VISIBILITY"), @android.view.ViewDebug.FlagToString(mask=0x8000, equals=0x8000, name="WILL_NOT_REPLACE_ON_RELAUNCH"), @android.view.ViewDebug.FlagToString(mask=0x10000, equals=0x10000, name="LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME"), @android.view.ViewDebug.FlagToString(mask=0x20000, equals=0x20000, name="FORCE_DRAW_STATUS_BAR_BACKGROUND"), @android.view.ViewDebug.FlagToString(mask=0x40000, equals=0x40000, name="SUSTAINED_PERFORMANCE_MODE"), @android.view.ViewDebug.FlagToString(mask=0x80000, equals=0x80000, name="HIDE_NON_SYSTEM_OVERLAY_WINDOWS"), @android.view.ViewDebug.FlagToString(mask=0x100000, equals=0x100000, name="IS_ROUNDED_CORNERS_OVERLAY"), @android.view.ViewDebug.FlagToString(mask=0x400000, equals=0x400000, name="IS_SCREEN_DECOR"), @android.view.ViewDebug.FlagToString(mask=0x800000, equals=0x800000, name="STATUS_FORCE_SHOW_NAVIGATION"), @android.view.ViewDebug.FlagToString(mask=0x1000000, equals=0x1000000, name="COLOR_SPACE_AGNOSTIC"), @android.view.ViewDebug.FlagToString(mask=0x4000000, equals=0x4000000, name="APPEARANCE_CONTROLLED"), @android.view.ViewDebug.FlagToString(mask=0x8000000, equals=0x8000000, name="BEHAVIOR_CONTROLLED"), @android.view.ViewDebug.FlagToString(mask=0x10000000, equals=0x10000000, name="FIT_INSETS_CONTROLLED")}) public int privateFlags; + field public int privateFlags; } } @@ -5218,11 +1938,8 @@ package android.view.accessibility { public final class AccessibilityManager { method public void addAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener, @Nullable android.os.Handler); - method @NonNull @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public java.util.List<java.lang.String> getAccessibilityShortcutTargets(int); - method @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public void performAccessibilityShortcut(); - method @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public void registerSystemAction(@NonNull android.app.RemoteAction, int); + method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_ACCESSIBILITY) public java.util.List<java.lang.String> getAccessibilityShortcutTargets(int); method public void removeAccessibilityServicesStateChangeListener(@NonNull android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener); - method @RequiresPermission("android.permission.MANAGE_ACCESSIBILITY") public void unregisterSystemAction(int); } public static interface AccessibilityManager.AccessibilityServicesStateChangeListener { @@ -5268,7 +1985,6 @@ package android.view.autofill { } public final class AutofillManager { - method public void setAugmentedAutofillWhitelist(@Nullable java.util.Set<java.lang.String>, @Nullable java.util.Set<android.content.ComponentName>); field public static final String DEVICE_CONFIG_AUTOFILL_SMART_SUGGESTION_SUPPORTED_MODES = "smart_suggestion_supported_modes"; field public static final int FLAG_SMART_SUGGESTION_OFF = 0; // 0x0 field public static final int FLAG_SMART_SUGGESTION_SYSTEM = 1; // 0x1 @@ -5279,42 +1995,7 @@ package android.view.autofill { package android.view.contentcapture { - public final class ContentCaptureContext implements android.os.Parcelable { - method @Nullable public android.content.ComponentName getActivityComponent(); - method public int getDisplayId(); - method public int getFlags(); - method @Nullable public android.view.contentcapture.ContentCaptureSessionId getParentSessionId(); - method public int getTaskId(); - field public static final int FLAG_DISABLED_BY_APP = 1; // 0x1 - field public static final int FLAG_DISABLED_BY_FLAG_SECURE = 2; // 0x2 - field public static final int FLAG_RECONNECTED = 4; // 0x4 - } - - public final class ContentCaptureEvent implements android.os.Parcelable { - method public int describeContents(); - method @Nullable public android.view.contentcapture.ContentCaptureContext getContentCaptureContext(); - method public long getEventTime(); - method @Nullable public android.view.autofill.AutofillId getId(); - method @Nullable public java.util.List<android.view.autofill.AutofillId> getIds(); - method @Nullable public android.graphics.Insets getInsets(); - method @Nullable public CharSequence getText(); - method public int getType(); - method @Nullable public android.view.contentcapture.ViewNode getViewNode(); - method public void writeToParcel(android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.view.contentcapture.ContentCaptureEvent> CREATOR; - field public static final int TYPE_CONTEXT_UPDATED = 6; // 0x6 - field public static final int TYPE_SESSION_PAUSED = 8; // 0x8 - field public static final int TYPE_SESSION_RESUMED = 7; // 0x7 - field public static final int TYPE_VIEW_APPEARED = 1; // 0x1 - field public static final int TYPE_VIEW_DISAPPEARED = 2; // 0x2 - field public static final int TYPE_VIEW_INSETS_CHANGED = 9; // 0x9 - field public static final int TYPE_VIEW_TEXT_CHANGED = 3; // 0x3 - field public static final int TYPE_VIEW_TREE_APPEARED = 5; // 0x5 - field public static final int TYPE_VIEW_TREE_APPEARING = 4; // 0x4 - } - public final class ContentCaptureManager { - method public boolean isContentCaptureFeatureEnabled(); field public static final String DEVICE_CONFIG_PROPERTY_IDLE_FLUSH_FREQUENCY = "idle_flush_frequency"; field public static final String DEVICE_CONFIG_PROPERTY_LOGGING_LEVEL = "logging_level"; field public static final String DEVICE_CONFIG_PROPERTY_LOG_HISTORY_SIZE = "log_history_size"; @@ -5327,7 +2008,6 @@ package android.view.contentcapture { } public final class ViewNode extends android.app.assist.AssistStructure.ViewNode { - method @Nullable public android.view.autofill.AutofillId getParentAutofillId(); method @Nullable public static android.view.contentcapture.ViewNode readFromParcel(@NonNull android.os.Parcel); method public static void writeToParcel(@NonNull android.os.Parcel, @Nullable android.view.contentcapture.ViewNode, int); } diff --git a/api/test-removed.txt b/api/test-removed.txt index e47f6edfbff1..d802177e249b 100644 --- a/api/test-removed.txt +++ b/api/test-removed.txt @@ -1,10 +1 @@ // Signature format: 2.0 -package android.app.prediction { - - public static final class AppTarget.Builder { - method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull String, @NonNull android.os.UserHandle); - method @Deprecated @NonNull public android.app.prediction.AppTarget.Builder setTarget(@NonNull android.content.pm.ShortcutInfo); - } - -} - diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp index 0617eb6c0e66..5c7cdd2eaaaa 100644 --- a/cmds/statsd/Android.bp +++ b/cmds/statsd/Android.bp @@ -14,34 +14,6 @@ // limitations under the License. // -// ========================================================== -// Build the library for use on the host -// ========================================================== -cc_library_host_shared { - name: "libstats_proto_host", - srcs: [ - "src/atoms.proto", - "src/atom_field_options.proto", - ], - - shared_libs: [ - "libplatformprotos", - ], - - proto: { - type: "full", - export_proto_headers: true, - include_dirs: [ - "external/protobuf/src", - ], - }, - - export_shared_lib_headers: [ - "libplatformprotos", - ] - -} - cc_defaults { name: "statsd_defaults", @@ -216,10 +188,6 @@ cc_binary { // address: true, //}, }, - debuggable: { - // Add a flag to enable stats log printing from statsd on debug builds. - cflags: ["-DVERY_VERBOSE_PRINTING"], - }, }, proto: { @@ -275,9 +243,8 @@ cc_test { // atom_field_options.proto needs field_options.proto, but that is // not included in libprotobuf-cpp-lite, so compile it here. ":libprotobuf-internal-protos", + ":libstats_internal_protos", - "src/atom_field_options.proto", - "src/atoms.proto", "src/shell/shell_data.proto", "src/stats_log.proto", "tests/AlarmMonitor_test.cpp", @@ -341,7 +308,10 @@ cc_test { proto: { type: "lite", - include_dirs: ["external/protobuf/src"], + include_dirs: [ + "external/protobuf/src", + "frameworks/proto_logging/stats", + ], }, } @@ -358,6 +328,7 @@ cc_benchmark { // atom_field_options.proto needs field_options.proto, but that is // not included in libprotobuf-cpp-lite, so compile it here. ":libprotobuf-internal-protos", + ":libstats_internal_protos", "benchmark/duration_metric_benchmark.cpp", "benchmark/filter_value_benchmark.cpp", @@ -367,14 +338,15 @@ cc_benchmark { "benchmark/main.cpp", "benchmark/metric_util.cpp", "benchmark/stats_write_benchmark.cpp", - "src/atom_field_options.proto", - "src/atoms.proto", "src/stats_log.proto", ], proto: { type: "lite", - include_dirs: ["external/protobuf/src"], + include_dirs: [ + "external/protobuf/src", + "frameworks/proto_logging/stats", + ], }, cflags: [ @@ -406,11 +378,14 @@ java_library { sdk_version: "core_current", proto: { type: "lite", - include_dirs: ["external/protobuf/src"], + include_dirs: [ + "external/protobuf/src", + "frameworks/proto_logging/stats", + ], }, srcs: [ - "src/atoms.proto", + ":libstats_atoms_proto", "src/shell/shell_config.proto", "src/shell/shell_data.proto", "src/stats_log.proto", diff --git a/cmds/statsd/OWNERS b/cmds/statsd/OWNERS index a61babf32e58..4e4e11988b62 100644 --- a/cmds/statsd/OWNERS +++ b/cmds/statsd/OWNERS @@ -1,9 +1 @@ -jeffreyhuang@google.com -joeo@google.com -jtnguyen@google.com -muhammadq@google.com -ruchirr@google.com -singhtejinder@google.com -tsaichristine@google.com -yaochen@google.com -yro@google.com +baligh@google.com diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index e7b32c56551a..b7f23a605142 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -120,10 +120,9 @@ static void flushProtoToBuffer(ProtoOutputStream& proto, vector<uint8_t>* outDat } } -void StatsLogProcessor::onAnomalyAlarmFired( +void StatsLogProcessor::processFiredAnomalyAlarmsLocked( const int64_t& timestampNs, unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet) { - std::lock_guard<std::mutex> lock(mMetricsMutex); for (const auto& itr : mMetricsManagers) { itr.second->onAnomalyAlarmFired(timestampNs, alarmSet); } @@ -409,11 +408,9 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event, int64_t elapsedRealtimeNs) { onWatchdogRollbackOccurredLocked(event); } -#ifdef VERY_VERBOSE_PRINTING if (mPrintAllLogs) { ALOGI("%s", event->ToString().c_str()); } -#endif resetIfConfigTtlExpiredLocked(eventElapsedTimeNs); // Hard-coded logic to update the isolated uid's in the uid-map. @@ -431,6 +428,20 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event, int64_t elapsedRealtimeNs) { return; } + bool fireAlarm = false; + { + std::lock_guard<std::mutex> anomalyLock(mAnomalyAlarmMutex); + if (mNextAnomalyAlarmTime != 0 && + MillisToNano(mNextAnomalyAlarmTime) <= elapsedRealtimeNs) { + mNextAnomalyAlarmTime = 0; + VLOG("informing anomaly alarm at time %lld", (long long)elapsedRealtimeNs); + fireAlarm = true; + } + } + if (fireAlarm) { + informAnomalyAlarmFiredLocked(NanoToMillis(elapsedRealtimeNs)); + } + int64_t curTimeSec = getElapsedRealtimeSec(); if (curTimeSec - mLastPullerCacheClearTimeSec > StatsdStats::kPullerCacheClearIntervalSec) { mPullerManager->ClearPullerCacheIfNecessary(curTimeSec * NS_PER_SEC); @@ -1092,6 +1103,28 @@ void StatsLogProcessor::noteOnDiskData(const ConfigKey& key) { mOnDiskDataConfigs.insert(key); } +void StatsLogProcessor::setAnomalyAlarm(const int64_t elapsedTimeMillis) { + std::lock_guard<std::mutex> lock(mAnomalyAlarmMutex); + mNextAnomalyAlarmTime = elapsedTimeMillis; +} + +void StatsLogProcessor::cancelAnomalyAlarm() { + std::lock_guard<std::mutex> lock(mAnomalyAlarmMutex); + mNextAnomalyAlarmTime = 0; +} + +void StatsLogProcessor::informAnomalyAlarmFiredLocked(const int64_t elapsedTimeMillis) { + VLOG("StatsService::informAlarmForSubscriberTriggeringFired was called"); + std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet = + mAnomalyAlarmMonitor->popSoonerThan(static_cast<uint32_t>(elapsedTimeMillis / 1000)); + if (alarmSet.size() > 0) { + VLOG("Found periodic alarm fired."); + processFiredAnomalyAlarmsLocked(MillisToNano(elapsedTimeMillis), alarmSet); + } else { + ALOGW("Cannot find an periodic alarm that fired. Perhaps it was recently cancelled."); + } +} + } // namespace statsd } // namespace os } // namespace android diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index 23f2584655b0..2384ed8f8ca8 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -66,11 +66,6 @@ public: const DumpLatency dumpLatency, ProtoOutputStream* proto); - /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */ - void onAnomalyAlarmFired( - const int64_t& timestampNs, - unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet); - /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies periodic alarmSet. */ void onPeriodicAlarmFired( const int64_t& timestampNs, @@ -139,15 +134,17 @@ public: int64_t getLastReportTimeNs(const ConfigKey& key); inline void setPrintLogs(bool enabled) { -#ifdef VERY_VERBOSE_PRINTING std::lock_guard<std::mutex> lock(mMetricsMutex); mPrintAllLogs = enabled; -#endif } // Add a specific config key to the possible configs to dump ASAP. void noteOnDiskData(const ConfigKey& key); + void setAnomalyAlarm(const int64_t timeMillis); + + void cancelAnomalyAlarm(); + private: // For testing only. inline sp<AlarmMonitor> getAnomalyAlarmMonitor() const { @@ -160,6 +157,11 @@ private: mutable mutex mMetricsMutex; + // Guards mNextAnomalyAlarmTime. A separate mutex is needed because alarms are set/cancelled + // in the onLogEvent code path, which is locked by mMetricsMutex. + // DO NOT acquire mMetricsMutex while holding mAnomalyAlarmMutex. This can lead to a deadlock. + mutable mutex mAnomalyAlarmMutex; + std::unordered_map<ConfigKey, sp<MetricsManager>> mMetricsManagers; std::unordered_map<ConfigKey, int64_t> mLastBroadcastTimes; @@ -250,6 +252,15 @@ private: // Reset the specified configs. void resetConfigsLocked(const int64_t timestampNs, const std::vector<ConfigKey>& configs); + // An anomaly alarm should have fired. + // Check with anomaly alarm manager to find the alarms and process the result. + void informAnomalyAlarmFiredLocked(const int64_t elapsedTimeMillis); + + /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */ + void processFiredAnomalyAlarmsLocked( + const int64_t& timestampNs, + unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet); + // Function used to send a broadcast so that receiver for the config key can call getData // to retrieve the stored data. std::function<bool(const ConfigKey& key)> mSendBroadcast; @@ -276,9 +287,10 @@ private: //Last time we wrote metadata to disk. int64_t mLastMetadataWriteNs = 0; -#ifdef VERY_VERBOSE_PRINTING + // The time for the next anomaly alarm for alerts. + int64_t mNextAnomalyAlarmTime = 0; + bool mPrintAllLogs = false; -#endif FRIEND_TEST(StatsLogProcessorTest, TestOutOfOrderLogs); FRIEND_TEST(StatsLogProcessorTest, TestRateLimitByteSize); diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index 6f952f637506..fa5b4d1810d2 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -91,17 +91,13 @@ Status checkUid(uid_t expectedUid) { StatsService::StatsService(const sp<Looper>& handlerLooper, shared_ptr<LogEventQueue> queue) : mAnomalyAlarmMonitor(new AlarmMonitor( MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS, - [](const shared_ptr<IStatsCompanionService>& sc, int64_t timeMillis) { - if (sc != nullptr) { - sc->setAnomalyAlarm(timeMillis); - StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); - } + [this](const shared_ptr<IStatsCompanionService>& /*sc*/, int64_t timeMillis) { + mProcessor->setAnomalyAlarm(timeMillis); + StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); }, - [](const shared_ptr<IStatsCompanionService>& sc) { - if (sc != nullptr) { - sc->cancelAnomalyAlarm(); - StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); - } + [this](const shared_ptr<IStatsCompanionService>& /*sc*/) { + mProcessor->cancelAnomalyAlarm(); + StatsdStats::getInstance().noteRegisteredAnomalyAlarmChanged(); })), mPeriodicAlarmMonitor(new AlarmMonitor( MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS, @@ -484,7 +480,8 @@ void StatsService::print_cmd_help(int out) { dprintf(out, " Clear cached puller data.\n"); dprintf(out, "\n"); dprintf(out, "usage: adb shell cmd stats print-logs\n"); - dprintf(out, " Only works on eng build\n"); + dprintf(out, " Requires root privileges.\n"); + dprintf(out, " Can be disabled by calling adb shell cmd stats print-logs 0\n"); } status_t StatsService::cmd_trigger_broadcast(int out, Vector<String8>& args) { @@ -865,18 +862,19 @@ status_t StatsService::cmd_clear_puller_cache(int out) { } status_t StatsService::cmd_print_logs(int out, const Vector<String8>& args) { - VLOG("StatsService::cmd_print_logs with Pid %i, Uid %i", AIBinder_getCallingPid(), - AIBinder_getCallingUid()); - if (checkPermission(kPermissionDump)) { - bool enabled = true; - if (args.size() >= 2) { - enabled = atoi(args[1].c_str()) != 0; - } - mProcessor->setPrintLogs(enabled); - return NO_ERROR; - } else { + Status status = checkUid(AID_ROOT); + if (!status.isOk()) { return PERMISSION_DENIED; } + + VLOG("StatsService::cmd_print_logs with pid %i, uid %i", AIBinder_getCallingPid(), + AIBinder_getCallingUid()); + bool enabled = true; + if (args.size() >= 2) { + enabled = atoi(args[1].c_str()) != 0; + } + mProcessor->setPrintLogs(enabled); + return NO_ERROR; } bool StatsService::getUidFromArgs(const Vector<String8>& args, size_t uidArgIndex, int32_t& uid) { @@ -975,22 +973,6 @@ Status StatsService::informOnePackageRemoved(const string& app, int32_t uid) { return Status::ok(); } -Status StatsService::informAnomalyAlarmFired() { - ENFORCE_UID(AID_SYSTEM); - - VLOG("StatsService::informAnomalyAlarmFired was called"); - int64_t currentTimeSec = getElapsedRealtimeSec(); - std::unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet = - mAnomalyAlarmMonitor->popSoonerThan(static_cast<uint32_t>(currentTimeSec)); - if (alarmSet.size() > 0) { - VLOG("Found an anomaly alarm that fired."); - mProcessor->onAnomalyAlarmFired(currentTimeSec * NS_PER_SEC, alarmSet); - } else { - VLOG("Cannot find an anomaly alarm that fired. Perhaps it was recently cancelled."); - } - return Status::ok(); -} - Status StatsService::informAlarmForSubscriberTriggeringFired() { ENFORCE_UID(AID_SYSTEM); diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index b49fa1d42e66..ad66d0f1c472 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -66,7 +66,6 @@ public: virtual Status systemRunning(); virtual Status statsCompanionReady(); virtual Status bootCompleted(); - virtual Status informAnomalyAlarmFired(); virtual Status informPollAlarmFired(); virtual Status informAlarmForSubscriberTriggeringFired(); @@ -404,6 +403,10 @@ private: FRIEND_TEST(PartialBucketE2eTest, TestGaugeMetricOnBootWithoutMinPartialBucket); FRIEND_TEST(PartialBucketE2eTest, TestGaugeMetricWithoutMinPartialBucket); FRIEND_TEST(PartialBucketE2eTest, TestGaugeMetricWithMinPartialBucket); + + FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket); + FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets); + FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period); }; } // namespace statsd diff --git a/cmds/statsd/src/atom_field_options.proto b/cmds/statsd/src/atom_field_options.proto deleted file mode 100644 index ff5717e4fa78..000000000000 --- a/cmds/statsd/src/atom_field_options.proto +++ /dev/null @@ -1,116 +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. - */ - -syntax = "proto2"; - -package android.os.statsd; -option java_package = "com.android.os"; -option java_multiple_files = true; -option java_outer_classname = "AtomFieldOptions"; - -import "google/protobuf/descriptor.proto"; - -// Used to annotate an atom that represents a state change. A state change atom must have exactly -// ONE exclusive state field, and any number of primary key fields. For example, message -// UidProcessStateChanged { -// optional int32 uid = 1 [(state_field_option).primary_field = true]; -// optional android.app.ProcessStateEnum state = -// 2 [(state_field_option).exclusive_state = true]; -// } -// Each UidProcessStateChanged atom event represents a state change for a specific uid. -// A new state automatically overrides the previous state. -// -// If the atom has 2 or more primary fields, it means the combination of the -// primary fields are the primary key. -// For example: -// message ThreadStateChanged { -// optional int32 pid = 1 [(state_field_option).primary_field = true]; -// optional int32 tid = 2 [(state_field_option).primary_field = true]; -// optional int32 state = 3 [(state_field_option).exclusive_state = true]; -// } -// -// Sometimes, there is no primary key field, when the state is GLOBAL. -// For example, -// message ScreenStateChanged { -// optional android.view.DisplayStateEnum state = -// 1 [(state_field_option).exclusive_state = true]; -// } -// -// For state atoms with attribution chain, sometimes the primary key is the first uid in the chain. -// For example: -// message AudioStateChanged { -// repeated AttributionNode attribution_node = 1 -// [(stateFieldOption).primary_field_first_uid = true]; -// -// enum State { -// OFF = 0; -// ON = 1; -// // RESET indicates all audio stopped. Used when it (re)starts (e.g. after it crashes). -// RESET = 2; -// } -// optional State state = 2 [(stateFieldOption).exclusive_state = true]; -// } -message StateAtomFieldOption { - // Fields that represent the key that the state belongs to. - // Used on simple proto fields. Do not use on attribution chains. - optional bool primary_field = 1 [default = false]; - - // The field that represents the state. It's an exclusive state. - optional bool exclusive_state = 2 [default = false]; - - // Used on an attribution chain field to indicate that the first uid is the - // primary field. - optional bool primary_field_first_uid = 3 [default = false]; - - // Note: We cannot annotate directly on the enums because many enums are imported from other - // proto files in the platform. proto-lite cc library does not support annotations unfortunately - - // Knowing the default state value allows state trackers to remove entries that become the - // default state. If there is no default value specified, the default value is unknown, and all - // states will be tracked in memory. - optional int32 default_state_value = 4; - - // A reset state signals all states go to default value. For example, BLE reset means all active - // BLE scans are to be turned off. - optional int32 trigger_state_reset_value = 5; - - // If the state change needs to count nesting. - optional bool nested = 6 [default = true]; -} - -// Used to generate StatsLog.write APIs. -enum LogMode { - MODE_UNSET = 0; - // Log fields as their actual types e.g., all primary data types. - // Or fields that are hardcoded in stats_log_api_gen tool e.g., AttributionNode - MODE_AUTOMATIC = 1; - // Log fields in their proto binary format. These fields will not be parsed in statsd - MODE_BYTES = 2; -} - -extend google.protobuf.FieldOptions { - // Flags to decorate an atom that presents a state change. - optional StateAtomFieldOption state_field_option = 50000; - - // Flags to decorate the uid fields in an atom. - optional bool is_uid = 50001 [default = false]; - - optional LogMode log_mode = 50002 [default = MODE_AUTOMATIC]; - - repeated string module = 50004; - - optional bool truncate_timestamp = 50005 [default = false]; -} diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto deleted file mode 100644 index 36b46c3d03a3..000000000000 --- a/cmds/statsd/src/atoms.proto +++ /dev/null @@ -1,11179 +0,0 @@ -/* - * Copyright (C) 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. - */ - -syntax = "proto2"; - -package android.os.statsd; -option java_package = "com.android.os"; -option java_outer_classname = "AtomsProto"; - -import "frameworks/base/cmds/statsd/src/atom_field_options.proto"; -import "frameworks/base/core/proto/android/app/enums.proto"; -import "frameworks/base/core/proto/android/app/job/enums.proto"; -import "frameworks/base/core/proto/android/app/settings_enums.proto"; -import "frameworks/base/core/proto/android/app/media_output_enum.proto"; -import "frameworks/base/core/proto/android/app/tvsettings_enums.proto"; -import "frameworks/base/core/proto/android/bluetooth/a2dp/enums.proto"; -import "frameworks/base/core/proto/android/bluetooth/enums.proto"; -import "frameworks/base/core/proto/android/bluetooth/hci/enums.proto"; -import "frameworks/base/core/proto/android/bluetooth/hfp/enums.proto"; -import "frameworks/base/core/proto/android/bluetooth/smp/enums.proto"; -import "frameworks/base/core/proto/android/debug/enums.proto"; -import "frameworks/base/core/proto/android/hardware/biometrics/enums.proto"; -import "frameworks/base/core/proto/android/hardware/sensor/assist/enums.proto"; -import "frameworks/base/core/proto/android/net/networkcapabilities.proto"; -import "frameworks/base/core/proto/android/os/enums.proto"; -import "frameworks/base/core/proto/android/server/connectivity/data_stall_event.proto"; -import "frameworks/base/core/proto/android/server/enums.proto"; -import "frameworks/base/core/proto/android/server/job/enums.proto"; -import "frameworks/base/core/proto/android/server/location/enums.proto"; -import "frameworks/base/core/proto/android/service/procstats_enum.proto"; -import "frameworks/base/core/proto/android/service/usb.proto"; -import "frameworks/base/core/proto/android/stats/connectivity/network_stack.proto"; -import "frameworks/base/core/proto/android/stats/connectivity/tethering.proto"; -import "frameworks/base/core/proto/android/stats/dnsresolver/dns_resolver.proto"; -import "frameworks/base/core/proto/android/stats/devicepolicy/device_policy.proto"; -import "frameworks/base/core/proto/android/stats/devicepolicy/device_policy_enums.proto"; -import "frameworks/base/core/proto/android/stats/docsui/docsui_enums.proto"; -import "frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto"; -import "frameworks/base/core/proto/android/stats/enums.proto"; -import "frameworks/base/core/proto/android/stats/intelligence/enums.proto"; -import "frameworks/base/core/proto/android/stats/launcher/launcher.proto"; -import "frameworks/base/core/proto/android/stats/location/location_enums.proto"; -import "frameworks/base/core/proto/android/stats/mediametrics/mediametrics.proto"; -import "frameworks/base/core/proto/android/stats/mediaprovider/mediaprovider_enums.proto"; -import "frameworks/base/core/proto/android/stats/storage/storage_enums.proto"; -import "frameworks/base/core/proto/android/stats/style/style_enums.proto"; -import "frameworks/base/core/proto/android/stats/sysui/notification_enums.proto"; -import "frameworks/base/core/proto/android/telecomm/enums.proto"; -import "frameworks/base/core/proto/android/telephony/enums.proto"; -import "frameworks/base/core/proto/android/view/enums.proto"; -import "frameworks/base/core/proto/android/wifi/enums.proto"; -import "frameworks/base/core/proto/android/stats/textclassifier/textclassifier_enums.proto"; -import "frameworks/base/core/proto/android/stats/otaupdate/updateengine_enums.proto"; - -/** - * The master atom class. This message defines all of the available - * raw stats log events from the Android system, also known as "atoms." - * - * This field contains a single oneof with all of the available messages. - * The stats-log-api-gen tool runs as part of the Android build and - * generates the android.util.StatsLog class, which contains the constants - * and methods that Android uses to log. - * - * This Atom class is not actually built into the Android system. - * Instead, statsd on Android constructs these messages synthetically, - * in the format defined here and in stats_log.proto. - */ -message Atom { - // Pushed atoms start at 2. - oneof pushed { - // For StatsLog reasons, 1 is illegal and will not work. Must start at 2. - BleScanStateChanged ble_scan_state_changed = 2 - [(module) = "bluetooth", (module) = "statsdtest"]; - ProcessStateChanged process_state_changed = 3 [(module) = "framework"]; - BleScanResultReceived ble_scan_result_received = 4 [(module) = "bluetooth"]; - SensorStateChanged sensor_state_changed = - 5 [(module) = "framework", (module) = "statsdtest"]; - GpsScanStateChanged gps_scan_state_changed = 6 [(module) = "framework"]; - SyncStateChanged sync_state_changed = 7 [(module) = "framework", (module) = "statsdtest"]; - ScheduledJobStateChanged scheduled_job_state_changed = - 8 [(module) = "framework", (module) = "statsdtest"]; - ScreenBrightnessChanged screen_brightness_changed = - 9 [(module) = "framework", (module) = "statsdtest"]; - WakelockStateChanged wakelock_state_changed = - 10 [(module) = "framework", (module) = "statsdtest"]; - LongPartialWakelockStateChanged long_partial_wakelock_state_changed = - 11 [(module) = "framework"]; - MobileRadioPowerStateChanged mobile_radio_power_state_changed = - 12 [(module) = "framework", (truncate_timestamp) = true]; - WifiRadioPowerStateChanged wifi_radio_power_state_changed = 13 [(module) = "framework"]; - ActivityManagerSleepStateChanged activity_manager_sleep_state_changed = - 14 [(module) = "framework"]; - MemoryFactorStateChanged memory_factor_state_changed = 15 [(module) = "framework"]; - ExcessiveCpuUsageReported excessive_cpu_usage_reported = 16 [(module) = "framework"]; - CachedKillReported cached_kill_reported = 17 [(module) = "framework"]; - ProcessMemoryStatReported process_memory_stat_reported = 18 [(module) = "framework"]; - LauncherUIChanged launcher_event = 19 [(module) = "sysui"]; - BatterySaverModeStateChanged battery_saver_mode_state_changed = - 20 [(module) = "framework", (module) = "statsdtest"]; - DeviceIdleModeStateChanged device_idle_mode_state_changed = 21 [(module) = "framework"]; - DeviceIdlingModeStateChanged device_idling_mode_state_changed = 22 [(module) = "framework"]; - AudioStateChanged audio_state_changed = - 23 [(module) = "framework", (truncate_timestamp) = true]; - MediaCodecStateChanged media_codec_state_changed = 24 [(module) = "framework"]; - CameraStateChanged camera_state_changed = 25 [(module) = "framework"]; - FlashlightStateChanged flashlight_state_changed = 26 [(module) = "framework"]; - UidProcessStateChanged uid_process_state_changed = - 27 [(module) = "framework", (module) = "statsdtest"]; - ProcessLifeCycleStateChanged process_life_cycle_state_changed = - 28 [(module) = "framework", (module) = "statsdtest"]; - ScreenStateChanged screen_state_changed = - 29 [(module) = "framework", (module) = "statsdtest"]; - BatteryLevelChanged battery_level_changed = - 30 [(module) = "framework", (module) = "statsdtest"]; - ChargingStateChanged charging_state_changed = 31 [(module) = "framework"]; - PluggedStateChanged plugged_state_changed = 32 - [(module) = "framework", (module) = "statsdtest"]; - InteractiveStateChanged interactive_state_changed = 33 [(module) = "framework"]; - TouchEventReported touch_event_reported = 34; - WakeupAlarmOccurred wakeup_alarm_occurred = 35 [(module) = "framework"]; - KernelWakeupReported kernel_wakeup_reported = 36 [(module) = "framework"]; - WifiLockStateChanged wifi_lock_state_changed = 37 [(module) = "wifi"]; - WifiSignalStrengthChanged wifi_signal_strength_changed = 38 [(module) = "wifi"]; - WifiScanStateChanged wifi_scan_state_changed = 39 [(module) = "wifi"]; - PhoneSignalStrengthChanged phone_signal_strength_changed = - 40 [(module) = "framework", (truncate_timestamp) = true]; - SettingChanged setting_changed = 41 [(module) = "framework"]; - ActivityForegroundStateChanged activity_foreground_state_changed = - 42 [(module) = "framework", (module) = "statsdtest"]; - IsolatedUidChanged isolated_uid_changed = - 43 [(module) = "framework", (module) = "statsd", (module) = "statsdtest"]; - PacketWakeupOccurred packet_wakeup_occurred = 44 [(module) = "framework"]; - WallClockTimeShifted wall_clock_time_shifted = 45 [(module) = "framework"]; - AnomalyDetected anomaly_detected = 46 [(module) = "statsd"]; - AppBreadcrumbReported app_breadcrumb_reported = 47 [(module) = "statsd"]; - AppStartOccurred app_start_occurred = 48 [(module) = "framework", (module) = "statsdtest"]; - AppStartCanceled app_start_canceled = 49 [(module) = "framework"]; - AppStartFullyDrawn app_start_fully_drawn = 50 [(module) = "framework"]; - LmkKillOccurred lmk_kill_occurred = 51 [(module) = "lmkd"]; - PictureInPictureStateChanged picture_in_picture_state_changed = 52 [(module) = "framework"]; - WifiMulticastLockStateChanged wifi_multicast_lock_state_changed = 53 [(module) = "wifi"]; - LmkStateChanged lmk_state_changed = 54 [(module) = "lmkd"]; - AppStartMemoryStateCaptured app_start_memory_state_captured = 55 [(module) = "framework"]; - ShutdownSequenceReported shutdown_sequence_reported = 56 [(module) = "framework"]; - BootSequenceReported boot_sequence_reported = 57; - DaveyOccurred davey_occurred = 58 [(module) = "statsd"]; - OverlayStateChanged overlay_state_changed = - 59 [(module) = "framework", (module) = "statsdtest"]; - ForegroundServiceStateChanged foreground_service_state_changed - = 60 [(module) = "framework"]; - CallStateChanged call_state_changed = - 61 [(module) = "telecom", (truncate_timestamp) = true]; - KeyguardStateChanged keyguard_state_changed = 62 [(module) = "sysui"]; - KeyguardBouncerStateChanged keyguard_bouncer_state_changed = 63 [(module) = "sysui"]; - KeyguardBouncerPasswordEntered keyguard_bouncer_password_entered = 64 [(module) = "sysui"]; - AppDied app_died = 65 [(module) = "framework"]; - ResourceConfigurationChanged resource_configuration_changed = 66 [(module) = "framework"]; - BluetoothEnabledStateChanged bluetooth_enabled_state_changed = 67 [(module) = "framework"]; - BluetoothConnectionStateChanged bluetooth_connection_state_changed = - 68 [(module) = "bluetooth"]; - GpsSignalQualityChanged gps_signal_quality_changed = 69 [(module) = "framework"]; - UsbConnectorStateChanged usb_connector_state_changed = 70 [(module) = "framework"]; - SpeakerImpedanceReported speaker_impedance_reported = 71; - HardwareFailed hardware_failed = 72; - PhysicalDropDetected physical_drop_detected = 73; - ChargeCyclesReported charge_cycles_reported = 74; - MobileConnectionStateChanged mobile_connection_state_changed = 75 [(module) = "telephony"]; - MobileRadioTechnologyChanged mobile_radio_technology_changed = 76 [(module) = "telephony"]; - UsbDeviceAttached usb_device_attached = 77 [(module) = "framework"]; - AppCrashOccurred app_crash_occurred = 78 [(module) = "framework", (module) = "statsdtest"]; - ANROccurred anr_occurred = 79 [(module) = "framework"]; - WTFOccurred wtf_occurred = 80 [(module) = "framework"]; - LowMemReported low_mem_reported = 81 [(module) = "framework"]; - GenericAtom generic_atom = 82; - KeyValuePairsAtom key_value_pairs_atom = 83 [(module) = "framework", (module) = "statsd"]; - VibratorStateChanged vibrator_state_changed = 84 [(module) = "framework"]; - DeferredJobStatsReported deferred_job_stats_reported = 85 [(module) = "framework"]; - ThermalThrottlingStateChanged thermal_throttling = 86 [deprecated=true]; - BiometricAcquired biometric_acquired = 87 [(module) = "framework"]; - BiometricAuthenticated biometric_authenticated = 88 [(module) = "framework"]; - BiometricErrorOccurred biometric_error_occurred = 89 [(module) = "framework"]; - UiEventReported ui_event_reported = 90 [(module) = "framework", (module) = "sysui"]; - BatteryHealthSnapshot battery_health_snapshot = 91; - SlowIo slow_io = 92; - BatteryCausedShutdown battery_caused_shutdown = 93; - PhoneServiceStateChanged phone_service_state_changed = 94 [(module) = "framework"]; - PhoneStateChanged phone_state_changed = 95 [(module) = "framework"]; - UserRestrictionChanged user_restriction_changed = 96; - SettingsUIChanged settings_ui_changed = 97 [(module) = "settings"]; - ConnectivityStateChanged connectivity_state_changed = 98 [(module) = "framework"]; - // TODO: service state change is very noisy shortly after boot, as well - // as at other transitions - coming out of doze, device plugged in, etc. - // Consider removing this if it becomes a problem - ServiceStateChanged service_state_changed = 99 [(module) = "framework"]; - ServiceLaunchReported service_launch_reported = 100 [(module) = "framework"]; - FlagFlipUpdateOccurred flag_flip_update_occurred = 101 [(module) = "framework"]; - BinaryPushStateChanged binary_push_state_changed = 102 [(module) = "statsd"]; - DevicePolicyEvent device_policy_event = 103 [(module) = "framework"]; - DocsUIFileOperationCanceledReported docs_ui_file_op_canceled = 104 [(module) = "docsui"]; - DocsUIFileOperationCopyMoveModeReported docs_ui_file_op_copy_move_mode_reported = - 105 [(module) = "docsui"]; - DocsUIFileOperationFailureReported docs_ui_file_op_failure = 106 [(module) = "docsui"]; - DocsUIFileOperationReported docs_ui_provider_file_op = 107 [(module) = "docsui"]; - DocsUIInvalidScopedAccessRequestReported docs_ui_invalid_scoped_access_request = - 108 [(module) = "docsui"]; - DocsUILaunchReported docs_ui_launch_reported = 109 [(module) = "docsui"]; - DocsUIRootVisitedReported docs_ui_root_visited = 110 [(module) = "docsui"]; - DocsUIStartupMsReported docs_ui_startup_ms = 111 [(module) = "docsui"]; - DocsUIUserActionReported docs_ui_user_action_reported = 112 [(module) = "docsui"]; - WifiEnabledStateChanged wifi_enabled_state_changed = 113 [(module) = "framework"]; - WifiRunningStateChanged wifi_running_state_changed = 114 - [(module) = "framework", deprecated = true]; - AppCompacted app_compacted = 115 [(module) = "framework"]; - NetworkDnsEventReported network_dns_event_reported = 116 [(module) = "resolv"]; - DocsUIPickerLaunchedFromReported docs_ui_picker_launched_from_reported = - 117 [(module) = "docsui"]; - DocsUIPickResultReported docs_ui_pick_result_reported = 118 [(module) = "docsui"]; - DocsUISearchModeReported docs_ui_search_mode_reported = 119 [(module) = "docsui"]; - DocsUISearchTypeReported docs_ui_search_type_reported = 120 [(module) = "docsui"]; - DataStallEvent data_stall_event = 121 [(module) = "network_stack"]; - RescuePartyResetReported rescue_party_reset_reported = 122 [(module) = "framework"]; - SignedConfigReported signed_config_reported = 123 [(module) = "framework"]; - GnssNiEventReported gnss_ni_event_reported = 124 [(module) = "framework"]; - BluetoothLinkLayerConnectionEvent bluetooth_link_layer_connection_event = - 125 [(module) = "bluetooth"]; - BluetoothAclConnectionStateChanged bluetooth_acl_connection_state_changed = - 126 [(module) = "bluetooth"]; - BluetoothScoConnectionStateChanged bluetooth_sco_connection_state_changed = - 127 [(module) = "bluetooth"]; - AppDowngraded app_downgraded = 128 [(module) = "framework"]; - AppOptimizedAfterDowngraded app_optimized_after_downgraded = 129; - LowStorageStateChanged low_storage_state_changed = 130 [(module) = "framework"]; - GnssNfwNotificationReported gnss_nfw_notification_reported = 131 [(module) = "framework"]; - GnssConfigurationReported gnss_configuration_reported = 132 [(module) = "framework"]; - UsbPortOverheatEvent usb_port_overheat_event_reported = 133; - NfcErrorOccurred nfc_error_occurred = 134 [(module) = "nfc"]; - NfcStateChanged nfc_state_changed = 135 [(module) = "nfc"]; - NfcBeamOccurred nfc_beam_occurred = 136 [(module) = "nfc"]; - NfcCardemulationOccurred nfc_cardemulation_occurred = 137 [(module) = "nfc"]; - NfcTagOccurred nfc_tag_occurred = 138 [(module) = "nfc"]; - NfcHceTransactionOccurred nfc_hce_transaction_occurred = 139 [(module) = "nfc"]; - SeStateChanged se_state_changed = 140 [(module) = "secure_element"]; - SeOmapiReported se_omapi_reported = 141 [(module) = "secure_element"]; - BroadcastDispatchLatencyReported broadcast_dispatch_latency_reported = - 142 [(module) = "framework"]; - AttentionManagerServiceResultReported attention_manager_service_result_reported = - 143 [(module) = "framework"]; - AdbConnectionChanged adb_connection_changed = 144 [(module) = "framework"]; - SpeechDspStatReported speech_dsp_stat_reported = 145; - UsbContaminantReported usb_contaminant_reported = 146 [(module) = "framework"]; - WatchdogRollbackOccurred watchdog_rollback_occurred = - 147 [(module) = "framework", (module) = "statsd"]; - BiometricSystemHealthIssueDetected biometric_system_health_issue_detected = - 148 [(module) = "framework"]; - BubbleUIChanged bubble_ui_changed = 149 [(module) = "sysui"]; - ScheduledJobConstraintChanged scheduled_job_constraint_changed = - 150 [(module) = "framework"]; - BluetoothActiveDeviceChanged bluetooth_active_device_changed = - 151 [(module) = "bluetooth"]; - BluetoothA2dpPlaybackStateChanged bluetooth_a2dp_playback_state_changed = - 152 [(module) = "bluetooth"]; - BluetoothA2dpCodecConfigChanged bluetooth_a2dp_codec_config_changed = - 153 [(module) = "bluetooth"]; - BluetoothA2dpCodecCapabilityChanged bluetooth_a2dp_codec_capability_changed = - 154 [(module) = "bluetooth"]; - BluetoothA2dpAudioUnderrunReported bluetooth_a2dp_audio_underrun_reported = - 155 [(module) = "bluetooth"]; - BluetoothA2dpAudioOverrunReported bluetooth_a2dp_audio_overrun_reported = - 156 [(module) = "bluetooth"]; - BluetoothDeviceRssiReported bluetooth_device_rssi_reported = - 157 [(module) = "bluetooth"]; - BluetoothDeviceFailedContactCounterReported - bluetooth_device_failed_contact_counter_reported = 158 [(module) = "bluetooth"]; - BluetoothDeviceTxPowerLevelReported bluetooth_device_tx_power_level_reported = - 159 [(module) = "bluetooth"]; - BluetoothHciTimeoutReported bluetooth_hci_timeout_reported = - 160 [(module) = "bluetooth"]; - BluetoothQualityReportReported bluetooth_quality_report_reported = - 161 [(module) = "bluetooth"]; - BluetoothDeviceInfoReported bluetooth_device_info_reported = - 162 [(module) = "bluetooth"]; - BluetoothRemoteVersionInfoReported bluetooth_remote_version_info_reported = - 163 [(module) = "bluetooth"]; - BluetoothSdpAttributeReported bluetooth_sdp_attribute_reported = - 164 [(module) = "bluetooth"]; - BluetoothBondStateChanged bluetooth_bond_state_changed = - 165 [(module) = "bluetooth"]; - BluetoothClassicPairingEventReported bluetooth_classic_pairing_event_reported = - 166 [(module) = "bluetooth"]; - BluetoothSmpPairingEventReported bluetooth_smp_pairing_event_reported = - 167 [(module) = "bluetooth"]; - ScreenTimeoutExtensionReported screen_timeout_extension_reported = - 168 [(module) = "framework"]; - ProcessStartTime process_start_time = 169 [(module) = "framework"]; - PermissionGrantRequestResultReported permission_grant_request_result_reported = - 170 [(module) = "permissioncontroller"]; - BluetoothSocketConnectionStateChanged bluetooth_socket_connection_state_changed = 171; - DeviceIdentifierAccessDenied device_identifier_access_denied = - 172 [(module) = "telephony_common"]; - BubbleDeveloperErrorReported bubble_developer_error_reported = 173 [(module) = "framework"]; - AssistGestureStageReported assist_gesture_stage_reported = 174 [(module) = "sysui"]; - AssistGestureFeedbackReported assist_gesture_feedback_reported = 175 [(module) = "sysui"]; - AssistGestureProgressReported assist_gesture_progress_reported = 176 [(module) = "sysui"]; - TouchGestureClassified touch_gesture_classified = 177 [(module) = "framework"]; - HiddenApiUsed hidden_api_used = 178 [(module) = "framework"]; - StyleUIChanged style_ui_changed = 179 [(module) = "sysui"]; - PrivacyIndicatorsInteracted privacy_indicators_interacted = - 180 [(module) = "permissioncontroller"]; - AppInstallOnExternalStorageReported app_install_on_external_storage_reported = - 181 [(module) = "framework"]; - NetworkStackReported network_stack_reported = 182 [(module) = "network_stack"]; - AppMovedStorageReported app_moved_storage_reported = 183 [(module) = "framework"]; - BiometricEnrolled biometric_enrolled = 184 [(module) = "framework"]; - SystemServerWatchdogOccurred system_server_watchdog_occurred = 185 [(module) = "framework"]; - TombStoneOccurred tomb_stone_occurred = 186 [(module) = "framework"]; - BluetoothClassOfDeviceReported bluetooth_class_of_device_reported = - 187 [(module) = "bluetooth"]; - IntelligenceEventReported intelligence_event_reported = - 188 [(module) = "intelligence"]; - ThermalThrottlingSeverityStateChanged thermal_throttling_severity_state_changed = - 189 [(module) = "framework"]; - RoleRequestResultReported role_request_result_reported = - 190 [(module) = "permissioncontroller"]; - MediametricsAudiopolicyReported mediametrics_audiopolicy_reported = 191; - MediametricsAudiorecordReported mediametrics_audiorecord_reported = 192; - MediametricsAudiothreadReported mediametrics_audiothread_reported = 193; - MediametricsAudiotrackReported mediametrics_audiotrack_reported = 194; - MediametricsCodecReported mediametrics_codec_reported = 195; - MediametricsDrmWidevineReported mediametrics_drm_widevine_reported = 196; - MediametricsExtractorReported mediametrics_extractor_reported = 197; - MediametricsMediadrmReported mediametrics_mediadrm_reported = 198; - MediametricsNuPlayerReported mediametrics_nuplayer_reported = 199; - MediametricsRecorderReported mediametrics_recorder_reported = 200; - MediametricsDrmManagerReported mediametrics_drmmanager_reported = 201; - CarPowerStateChanged car_power_state_changed = 203 [(module) = "car"]; - GarageModeInfo garage_mode_info = 204 [(module) = "car"]; - TestAtomReported test_atom_reported = 205 [(module) = "cts"]; - ContentCaptureCallerMismatchReported content_capture_caller_mismatch_reported = - 206 [(module) = "framework"]; - ContentCaptureServiceEvents content_capture_service_events = 207 [(module) = "framework"]; - ContentCaptureSessionEvents content_capture_session_events = 208 [(module) = "framework"]; - ContentCaptureFlushed content_capture_flushed = 209 [(module) = "framework"]; - LocationManagerApiUsageReported location_manager_api_usage_reported = - 210 [(module) = "framework"]; - ReviewPermissionsFragmentResultReported review_permissions_fragment_result_reported = - 211 [(module) = "permissioncontroller"]; - RuntimePermissionsUpgradeResult runtime_permissions_upgrade_result = - 212 [(module) = "permissioncontroller"]; - GrantPermissionsActivityButtonActions grant_permissions_activity_button_actions = - 213 [(module) = "permissioncontroller"]; - LocationAccessCheckNotificationAction location_access_check_notification_action = - 214 [(module) = "permissioncontroller"]; - AppPermissionFragmentActionReported app_permission_fragment_action_reported = - 215 [(module) = "permissioncontroller"]; - AppPermissionFragmentViewed app_permission_fragment_viewed = - 216 [(module) = "permissioncontroller"]; - AppPermissionsFragmentViewed app_permissions_fragment_viewed = - 217 [(module) = "permissioncontroller"]; - PermissionAppsFragmentViewed permission_apps_fragment_viewed = - 218 [(module) = "permissioncontroller"]; - TextSelectionEvent text_selection_event = 219 [(module) = "textclassifier"]; - TextLinkifyEvent text_linkify_event = 220 [(module) = "textclassifier"]; - ConversationActionsEvent conversation_actions_event = 221 [(module) = "textclassifier"]; - LanguageDetectionEvent language_detection_event = 222 [(module) = "textclassifier"]; - ExclusionRectStateChanged exclusion_rect_state_changed = 223 [(module) = "framework"]; - BackGesture back_gesture_reported_reported = 224 [(module) = "sysui"]; - UpdateEngineUpdateAttemptReported update_engine_update_attempt_reported = 225; - UpdateEngineSuccessfulUpdateReported update_engine_successful_update_reported = 226; - CameraActionEvent camera_action_event = 227 [(module) = "framework"]; - AppCompatibilityChangeReported app_compatibility_change_reported = - 228 [(module) = "framework"]; - PerfettoUploaded perfetto_uploaded = 229 [(module) = "perfetto"]; - VmsClientConnectionStateChanged vms_client_connection_state_changed = - 230 [(module) = "car"]; - MediaProviderScanOccurred media_provider_scan_occurred = 233 [(module) = "mediaprovider"]; - MediaContentDeleted media_content_deleted = 234 [(module) = "mediaprovider"]; - MediaProviderPermissionRequested media_provider_permission_requested = - 235 [(module) = "mediaprovider"]; - MediaProviderSchemaChanged media_provider_schema_changed = 236 [(module) = "mediaprovider"]; - MediaProviderIdleMaintenanceFinished media_provider_idle_maintenance_finished = - 237 [(module) = "mediaprovider"]; - RebootEscrowRecoveryReported reboot_escrow_recovery_reported = 238 [(module) = "framework"]; - BootTimeEventDuration boot_time_event_duration_reported = 239 [(module) = "framework"]; - BootTimeEventElapsedTime boot_time_event_elapsed_time_reported = - 240 [(module) = "framework"]; - BootTimeEventUtcTime boot_time_event_utc_time_reported = 241; - BootTimeEventErrorCode boot_time_event_error_code_reported = 242 [(module) = "framework"]; - UserspaceRebootReported userspace_reboot_reported = 243 [(module) = "framework"]; - NotificationReported notification_reported = 244 [(module) = "framework"]; - NotificationPanelReported notification_panel_reported = 245 [(module) = "sysui"]; - NotificationChannelModified notification_channel_modified = 246 [(module) = "framework"]; - IntegrityCheckResultReported integrity_check_result_reported = 247 [(module) = "framework"]; - IntegrityRulesPushed integrity_rules_pushed = 248 [(module) = "framework"]; - CellBroadcastMessageReported cb_message_reported = - 249 [(module) = "cellbroadcast"]; - CellBroadcastMessageError cb_message_error = - 250 [(module) = "cellbroadcast"]; - WifiHealthStatReported wifi_health_stat_reported = 251 [(module) = "wifi"]; - WifiFailureStatReported wifi_failure_stat_reported = 252 [(module) = "wifi"]; - WifiConnectionResultReported wifi_connection_result_reported = 253 [(module) = "wifi"]; - AppFreezeChanged app_freeze_changed = 254 [(module) = "framework"]; - SnapshotMergeReported snapshot_merge_reported = 255; - ForegroundServiceAppOpSessionEnded foreground_service_app_op_session_ended = - 256 [(module) = "framework"]; - DisplayJankReported display_jank_reported = 257; - AppStandbyBucketChanged app_standby_bucket_changed = 258 [(module) = "framework"]; - SharesheetStarted sharesheet_started = 259 [(module) = "framework"]; - RankingSelected ranking_selected = 260 [(module) = "framework", (module) = "sysui"]; - TvSettingsUIInteracted tvsettings_ui_interacted = 261 [(module) = "tv_settings"]; - LauncherStaticLayout launcher_snapshot = 262 [(module) = "sysui"]; - PackageInstallerV2Reported package_installer_v2_reported = 263 [(module) = "framework"]; - UserLifecycleJourneyReported user_lifecycle_journey_reported = 264 [(module) = "framework"]; - UserLifecycleEventOccurred user_lifecycle_event_occurred = 265 [(module) = "framework"]; - AccessibilityShortcutReported accessibility_shortcut_reported = - 266 [(module) = "framework"]; - AccessibilityServiceReported accessibility_service_reported = 267 [(module) = "settings"]; - DocsUIDragAndDropReported docs_ui_drag_and_drop_reported = 268 [(module) = "docsui"]; - AppUsageEventOccurred app_usage_event_occurred = 269 [(module) = "framework"]; - AutoRevokeNotificationClicked auto_revoke_notification_clicked = - 270 [(module) = "permissioncontroller"]; - AutoRevokeFragmentAppViewed auto_revoke_fragment_app_viewed = - 271 [(module) = "permissioncontroller"]; - AutoRevokedAppInteraction auto_revoked_app_interaction = - 272 [(module) = "permissioncontroller", (module) = "settings"]; - AppPermissionGroupsFragmentAutoRevokeAction - app_permission_groups_fragment_auto_revoke_action = - 273 [(module) = "permissioncontroller"]; - EvsUsageStatsReported evs_usage_stats_reported = 274 [(module) = "evs"]; - AudioPowerUsageDataReported audio_power_usage_data_reported = 275; - TvTunerStateChanged tv_tuner_state_changed = 276 [(module) = "framework"]; - MediaOutputOpSwitchReported mediaoutput_op_switch_reported = - 277 [(module) = "settings"]; - CellBroadcastMessageFiltered cb_message_filtered = - 278 [(module) = "cellbroadcast"]; - TvTunerDvrStatus tv_tuner_dvr_status = 279 [(module) = "framework"]; - TvCasSessionOpenStatus tv_cas_session_open_status = - 280 [(module) = "framework"]; - AssistantInvocationReported assistant_invocation_reported = 281 [(module) = "framework"]; - DisplayWakeReported display_wake_reported = 282 [(module) = "framework"]; - CarUserHalModifyUserRequestReported car_user_hal_modify_user_request_reported = - 283 [(module) = "car"]; - CarUserHalModifyUserResponseReported car_user_hal_modify_user_response_reported = - 284 [(module) = "car"]; - CarUserHalPostSwitchResponseReported car_user_hal_post_switch_response_reported = - 285 [(module) = "car"]; - CarUserHalInitialUserInfoRequestReported car_user_hal_initial_user_info_request_reported = - 286 [(module) = "car"]; - CarUserHalInitialUserInfoResponseReported car_user_hal_initial_user_info_response_reported = - 287 [(module) = "car"]; - CarUserHalUserAssociationRequestReported car_user_hal_user_association_request_reported = - 288 [(module) = "car"]; - CarUserHalSetUserAssociationResponseReported car_user_hal_set_user_association_response_reported = - 289 [(module) = "car"]; - NetworkIpProvisioningReported network_ip_provisioning_reported = - 290 [(module) = "network_stack"]; - NetworkDhcpRenewReported network_dhcp_renew_reported = 291 [(module) = "network_stack"]; - NetworkValidationReported network_validation_reported = 292 [(module) = "network_stack"]; - NetworkStackQuirkReported network_stack_quirk_reported = 293 [(module) = "network_stack"]; - MediametricsAudioRecordDeviceUsageReported mediametrics_audiorecorddeviceusage_reported = - 294; - MediametricsAudioThreadDeviceUsageReported mediametrics_audiothreaddeviceusage_reported = - 295; - MediametricsAudioTrackDeviceUsageReported mediametrics_audiotrackdeviceusage_reported = - 296; - MediametricsAudioDeviceConnectionReported mediametrics_audiodeviceconnection_reported = - 297; - BlobCommitted blob_committed = 298 [(module) = "framework"]; - BlobLeased blob_leased = 299 [(module) = "framework"]; - BlobOpened blob_opened = 300 [(module) = "framework"]; - ContactsProviderStatusReported contacts_provider_status_reported = 301; - KeystoreKeyEventReported keystore_key_event_reported = 302; - NetworkTetheringReported network_tethering_reported = - 303 [(module) = "network_tethering"]; - ImeTouchReported ime_touch_reported = 304 [(module) = "sysui"]; - - // StatsdStats tracks platform atoms with ids upto 500. - // Update StatsdStats::kMaxPushedAtomId when atom ids here approach that value. - } - - // Pulled events will start at field 10000. - // Next: 10084 - oneof pulled { - WifiBytesTransfer wifi_bytes_transfer = 10000 [(module) = "framework"]; - WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001 [(module) = "framework"]; - MobileBytesTransfer mobile_bytes_transfer = - 10002 [(module) = "framework", (truncate_timestamp) = true]; - MobileBytesTransferByFgBg mobile_bytes_transfer_by_fg_bg = - 10003 [(module) = "framework", (truncate_timestamp) = true]; - BluetoothBytesTransfer bluetooth_bytes_transfer = 10006 [(module) = "framework"]; - KernelWakelock kernel_wakelock = 10004 [(module) = "framework"]; - SubsystemSleepState subsystem_sleep_state = 10005 [(module) = "statsdtest"]; - CpuTimePerFreq cpu_time_per_freq = 10008 [(module) = "framework"]; - CpuTimePerUid cpu_time_per_uid = 10009 [(module) = "framework", (module) = "statsdtest"]; - CpuTimePerUidFreq cpu_time_per_uid_freq = - 10010 [(module) = "framework", (module) = "statsd"]; - WifiActivityInfo wifi_activity_info = 10011 [(module) = "framework"]; - ModemActivityInfo modem_activity_info = 10012 [(module) = "framework"]; - BluetoothActivityInfo bluetooth_activity_info = 10007 [(module) = "framework"]; - ProcessMemoryState process_memory_state = 10013 [(module) = "framework"]; - SystemElapsedRealtime system_elapsed_realtime = 10014 [(module) = "framework"]; - SystemUptime system_uptime = 10015 [(module) = "framework"]; - CpuActiveTime cpu_active_time = 10016 [(module) = "framework", (module) = "statsdtest"]; - CpuClusterTime cpu_cluster_time = 10017 [(module) = "framework"]; - DiskSpace disk_space = 10018 [deprecated=true, (module) = "statsdtest"]; - RemainingBatteryCapacity remaining_battery_capacity = 10019 [(module) = "framework"]; - FullBatteryCapacity full_battery_capacity = 10020 [(module) = "framework"]; - Temperature temperature = 10021 [(module) = "framework", (module) = "statsdtest"]; - BinderCalls binder_calls = 10022 [(module) = "framework", (module) = "statsd"]; - BinderCallsExceptions binder_calls_exceptions = 10023 [(module) = "framework"]; - LooperStats looper_stats = 10024 [(module) = "framework", (module) = "statsd"]; - DiskStats disk_stats = 10025 [(module) = "framework"]; - DirectoryUsage directory_usage = 10026 [(module) = "framework"]; - AppSize app_size = 10027 [(module) = "framework"]; - CategorySize category_size = 10028 [(module) = "framework"]; - ProcStats proc_stats = 10029 [(module) = "framework"]; - BatteryVoltage battery_voltage = 10030 [(module) = "framework"]; - NumFingerprintsEnrolled num_fingerprints_enrolled = 10031 [(module) = "framework"]; - DiskIo disk_io = 10032 [(module) = "framework"]; - PowerProfile power_profile = 10033 [(module) = "framework"]; - ProcStatsPkgProc proc_stats_pkg_proc = 10034 [(module) = "framework"]; - ProcessCpuTime process_cpu_time = 10035 [(module) = "framework"]; - CpuTimePerThreadFreq cpu_time_per_thread_freq = 10037 [(module) = "framework"]; - OnDevicePowerMeasurement on_device_power_measurement = 10038; - DeviceCalculatedPowerUse device_calculated_power_use = 10039 [(module) = "framework"]; - DeviceCalculatedPowerBlameUid device_calculated_power_blame_uid = - 10040 [(module) = "framework"]; - DeviceCalculatedPowerBlameOther device_calculated_power_blame_other = - 10041 [(module) = "framework"]; - ProcessMemoryHighWaterMark process_memory_high_water_mark = 10042 [(module) = "framework"]; - BatteryLevel battery_level = 10043 [(module) = "framework"]; - BuildInformation build_information = 10044 [(module) = "framework"]; - BatteryCycleCount battery_cycle_count = 10045 [(module) = "framework"]; - DebugElapsedClock debug_elapsed_clock = 10046 [(module) = "framework"]; - DebugFailingElapsedClock debug_failing_elapsed_clock = 10047 [(module) = "framework"]; - NumFacesEnrolled num_faces_enrolled = 10048 [(module) = "framework"]; - RoleHolder role_holder = 10049 [(module) = "framework"]; - DangerousPermissionState dangerous_permission_state = 10050 [(module) = "framework"]; - TrainInfo train_info = 10051 [(module) = "statsd"]; - TimeZoneDataInfo time_zone_data_info = 10052 [(module) = "framework"]; - ExternalStorageInfo external_storage_info = 10053 [(module) = "framework"]; - GpuStatsGlobalInfo gpu_stats_global_info = 10054; - GpuStatsAppInfo gpu_stats_app_info = 10055; - SystemIonHeapSize system_ion_heap_size = 10056 [deprecated = true, (module) = "framework"]; - AppsOnExternalStorageInfo apps_on_external_storage_info = 10057 [(module) = "framework"]; - FaceSettings face_settings = 10058 [(module) = "framework"]; - CoolingDevice cooling_device = 10059 [(module) = "framework"]; - AppOps app_ops = 10060 [(module) = "framework"]; - ProcessSystemIonHeapSize process_system_ion_heap_size = 10061 [(module) = "framework"]; - SurfaceflingerStatsGlobalInfo surfaceflinger_stats_global_info = 10062; - SurfaceflingerStatsLayerInfo surfaceflinger_stats_layer_info = 10063; - ProcessMemorySnapshot process_memory_snapshot = 10064 [(module) = "framework"]; - VmsClientStats vms_client_stats = 10065 [(module) = "car"]; - NotificationRemoteViews notification_remote_views = 10066 [(module) = "framework"]; - DangerousPermissionStateSampled dangerous_permission_state_sampled = - 10067 [(module) = "framework"]; - GraphicsStats graphics_stats = 10068; - RuntimeAppOpAccess runtime_app_op_access = 10069 [(module) = "framework"]; - IonHeapSize ion_heap_size = 10070 [(module) = "framework"]; - PackageNotificationPreferences package_notification_preferences = - 10071 [(module) = "framework"]; - PackageNotificationChannelPreferences package_notification_channel_preferences = - 10072 [(module) = "framework"]; - PackageNotificationChannelGroupPreferences package_notification_channel_group_preferences = - 10073 [(module) = "framework"]; - GnssStats gnss_stats = 10074 [(module) = "framework"]; - AttributedAppOps attributed_app_ops = 10075 [(module) = "framework"]; - VoiceCallSession voice_call_session = 10076 [(module) = "telephony"]; - VoiceCallRatUsage voice_call_rat_usage = 10077 [(module) = "telephony"]; - SimSlotState sim_slot_state = 10078 [(module) = "telephony"]; - SupportedRadioAccessFamily supported_radio_access_family = 10079 [(module) = "telephony"]; - SettingSnapshot setting_snapshot = 10080 [(module) = "framework"]; - BlobInfo blob_info = 10081 [(module) = "framework"]; - DataUsageBytesTransfer data_usage_bytes_transfer = 10082 [(module) = "framework"]; - BytesTransferByTagAndMetered bytes_transfer_by_tag_and_metered = - 10083 [(module) = "framework"]; - DNDModeProto dnd_mode_rule = 10084 [(module) = "framework"]; - GeneralExternalStorageAccessStats general_external_storage_access_stats = - 10085 [(module) = "mediaprovider"]; - } - - // DO NOT USE field numbers above 100,000 in AOSP. - // Field numbers 100,000 - 199,999 are reserved for non-AOSP (e.g. OEMs) to use. - // Field numbers 200,000 and above are reserved for future use; do not use them at all. - - reserved 10036; -} - -/** - * This proto represents a node of an attribution chain. - * Note: All attribution chains are represented as a repeated field of type - * AttributionNode. It is understood that in such arrays, the order is that - * of calls, that is [A, B, C] if A calls B that calls C. - */ -message AttributionNode { - // The uid for a given element in the attribution chain. - optional int32 uid = 1; - - // The (optional) string tag for an element in the attribution chain. If the - // element has no tag, it is encoded as an empty string. - optional string tag = 2; -} - -message KeyValuePair { - optional int32 key = 1; - oneof value { - int32 value_int = 2; - int64 value_long = 3; - string value_str = 4; - float value_float = 5; - } -} - -message KeyValuePairsAtom { - optional int32 uid = 1; - repeated KeyValuePair pairs = 2; -} - -/* - * ***************************************************************************** - * Below are all of the individual atoms that are logged by Android via statsd. - * - * RULES: - * - The field ids for each atom must start at 1, and count upwards by 1. - * Skipping field ids is not allowed. - * - These form an API, so renaming, renumbering or removing fields is - * not allowed between android releases. (This is not currently enforced, - * but there will be a tool to enforce this restriction). - * - The types must be built-in protocol buffer types, namely, no sub-messages - * are allowed (yet). The bytes type is also not allowed. - * - The CamelCase name of the message type should match the - * underscore_separated name as defined in Atom. - * - If an atom represents work that can be attributed to an app, there can - * be exactly one AttributionChain field. It must be field number 1. - * - A field that is a uid should be a string field, tagged with the [xxx] - * annotation. The generated code on android will be represented by UIDs, - * and those UIDs will be translated in xxx to those strings. - * - * CONVENTIONS: - * - Events are past tense. e.g. ScreenStateChanged, not ScreenStateChange. - * - If there is a UID, it goes first. Think in an object-oriented fashion. - * ***************************************************************************** - */ - -/** - * This atom is deprecated starting in Q. Please use ThermalThrottlingSeverityStateChanged. - * Logs when the Thermal service HAL notifies the throttling start/stop events. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/stats/StatsCompanionService.java - */ -message ThermalThrottlingStateChanged { - // The type of temperature being reported (CPU, GPU, SKIN, etc) - optional android.os.TemperatureTypeEnum sensor_type = 1; - - // Throttling state, this field is DEPRECATED - enum State { - UNKNOWN = 0; - START = 1; // START indicated that throttling was triggered. - STOP = 2; // STOP indicates that throttling was cleared. - } - optional State state = 2; - - optional float temperature = 3; -} - -/** - * Logs when the screen state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message ScreenStateChanged { - // New screen state, from frameworks/base/core/proto/android/view/enums.proto. - optional android.view.DisplayStateEnum state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs that the process state of the uid, as determined by ActivityManager - * (i.e. the highest process state of that uid's processes) has changed. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message UidProcessStateChanged { - optional int32 uid = 1 [(state_field_option).primary_field = true, (is_uid) = true]; - - // The state, from frameworks/base/core/proto/android/app/enums.proto. - optional android.app.ProcessStateEnum state = 2 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs process state change of a process, as per the activity manager. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java - */ -message ProcessStateChanged { - optional int32 uid = 1; - optional string process_name = 2; - optional string package_name = 3; - // TODO: remove this when validation is done - optional int64 version = 5; - // The state, from frameworks/base/core/proto/android/app/enums.proto. - optional android.app.ProcessStateEnum state = 4; -} - -/** - * Logs when ActivityManagerService sleep state is changed. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityTaskManagerService.java - */ -message ActivityManagerSleepStateChanged { - // TODO: import frameworks proto - enum State { - UNKNOWN = 0; - ASLEEP = 1; - AWAKE = 2; - } - optional State state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs when system memory state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message MemoryFactorStateChanged { - // TODO: import frameworks proto - enum State { - MEMORY_UNKNOWN = 0; - NORMAL = 1; // normal. - MODERATE = 2; // moderate memory pressure. - LOW = 3; // low memory. - CRITICAL = 4; // critical memory. - - } - optional State factor = 1 [(state_field_option).exclusive_state = true]; -} - -/** - * Logs when app is using too much cpu, according to ActivityManagerService. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message ExcessiveCpuUsageReported { - optional int32 uid = 1; - optional string process_name = 2; - optional string package_name = 3; - // package version. TODO: remove this when validation is done - optional int64 version = 4; -} - -/** - * Logs when a cached process is killed, along with its pss. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message CachedKillReported { - optional int32 uid = 1; - optional string process_name = 2; - optional string package_name = 3; - // TODO: remove this when validation is done - optional int64 version = 5; - optional int64 pss = 4; -} - -/** - * Logs the change in wifi health. - * - * Logged from: - * frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiDataStall.java - */ -message WifiHealthStatReported { - enum Band { - UNKNOWN = 0; - // All of 2.4GHz band - BAND_2G = 1; - // Frequencies in the range of [5150, 5250) GHz - BAND_5G_LOW = 2; - // Frequencies in the range of [5250, 5725) GHz - BAND_5G_MIDDLE = 3; - // Frequencies in the range of [5725, 5850) GHz - BAND_5G_HIGH = 4; - // Frequencies in the range of [5925, 6425) GHz - BAND_6G_LOW = 5; - // Frequencies in the range of [6425, 6875) GHz - BAND_6G_MIDDLE = 6; - // Frequencies in the range of [6875, 7125) GHz - BAND_6G_HIGH = 7; - } - // duration this stat is obtained over in milliseconds - optional int32 duration_millis = 1; - // whether wifi is classified as sufficient for the user's data traffic, determined - // by whether the calculated throughput exceeds the average demand within |duration_millis| - optional bool is_sufficient = 2; - // whether cellular data is available - optional bool is_cell_data_available = 3; - // the Band bucket the connected network is on - optional Band band = 4; -} - -/** - * Logged when wifi detects a significant change in connection failure rate. - * - * Logged from: frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiHealthMonitor.java - * - */ -message WifiFailureStatReported { - enum AbnormalityType { - UNKNOWN = 0; - SIGNIFICANT_INCREASE = 1; - SIGNIFICANT_DECREASE = 2; - SIMPLY_HIGH = 3; - } - enum FailureType { - FAILURE_UNKNOWN = 0; - FAILURE_CONNECTION = 1; - FAILURE_ASSOCIATION_REJECTION = 2; - FAILURE_ASSOCIATION_TIMEOUT = 3; - FAILURE_AUTHENTICATION = 4; - FAILURE_NON_LOCAL_DISCONNECTION = 5; - FAILURE_SHORT_CONNECTION_DUE_TO_NON_LOCAL_DISCONNECTION = 6; - } - // Reason for uploading this stat - optional AbnormalityType abnormality_type = 1; - // The particular type of failure - optional FailureType failure_type = 2; - // How many times we have encountered this combination of AbnormalityType and FailureType - optional int32 failure_count = 3; -} - -/** - * Logs whether a wifi connection is successful and reasons for failure if it isn't. - * - * Logged from: - * frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java - */ -message WifiConnectionResultReported { - enum FailureCode { - FAILURE_UNKNOWN = 0; - FAILURE_ASSOCIATION_TIMEOUT = 1; - FAILURE_ASSOCIATION_REJECTION = 2; - FAILURE_AUTHENTICATION_GENERAL = 3; - FAILURE_AUTHENTICATION_EAP = 4; - FAILURE_DHCP = 5; - FAILURE_NETWORK_DISCONNECTION = 6; - FAILURE_ROAM_TIMEOUT = 7; - } - // true represents a successful connection - optional bool connection_result = 1; - // reason for the connection failure - optional FailureCode failure_code = 2; - // scan rssi before the connection attempt - optional int32 rssi = 3; -} - -/** - * Logs when memory stats of a process is reported. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java - */ -message ProcessMemoryStatReported { - optional int32 uid = 1; - optional string process_name = 2; - optional string package_name = 3; - //TODO: remove this when validation is done - optional int64 version = 9; - optional int64 pss = 4; - optional int64 uss = 5; - optional int64 rss = 6; - enum Type { - ADD_PSS_INTERNAL_SINGLE = 0; - ADD_PSS_INTERNAL_ALL_MEM = 1; - ADD_PSS_INTERNAL_ALL_POLL = 2; - ADD_PSS_EXTERNAL = 3; - ADD_PSS_EXTERNAL_SLOW = 4; - } - optional Type type = 7; - optional int64 duration_millis = 8; -} - -/** - * Logs that a process started, finished, crashed, or ANRed. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message ProcessLifeCycleStateChanged { - optional int32 uid = 1 [(is_uid) = true]; - - // The process name (usually same as the app name). - optional string process_name = 2; - - // What lifecycle state the process changed to. - // This enum is specific to atoms.proto. - enum State { - FINISHED = 0; - STARTED = 1; - CRASHED = 2; - } - optional State state = 3; -} - -/** - * Logs when the ble scan state changes. - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/gatt/AppScanStats.java - */ -message BleScanStateChanged { - repeated AttributionNode attribution_node = 1 - [(state_field_option).primary_field_first_uid = true]; - - enum State { - OFF = 0; - ON = 1; - // RESET indicates all ble stopped. Used when it (re)starts (e.g. after it crashes). - RESET = 2; - } - optional State state = 2 [ - (state_field_option).exclusive_state = true, - (state_field_option).default_state_value = 0 /* State.OFF */, - (state_field_option).trigger_state_reset_value = 2 /* State.RESET */, - (state_field_option).nested = true - ]; - - // Does the scan have a filter. - optional bool is_filtered = 3 [(state_field_option).primary_field = true]; - // Whether the scan is a CALLBACK_TYPE_FIRST_MATCH scan. Called 'background' scan internally. - optional bool is_first_match = 4 [(state_field_option).primary_field = true]; - // Whether the scan set to piggy-back off the results of other scans (SCAN_MODE_OPPORTUNISTIC). - optional bool is_opportunistic = 5 [(state_field_option).primary_field = true]; -} - -/** - * Logs reporting of a ble scan finding results. - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/gatt/AppScanStats.java - */ -// TODO: Consider also tracking per-scanner-id. -message BleScanResultReceived { - repeated AttributionNode attribution_node = 1; - - // Number of ble scan results returned. - optional int32 num_results = 2; -} - -/** - * Logs when a sensor state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message SensorStateChanged { - repeated AttributionNode attribution_node = 1; - - // The id (int) of the sensor. - optional int32 sensor_id = 2; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 3; -} - -/** - * Logs when GPS state changes. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message GpsScanStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 2; -} - -/** - * Logs when GPS signal quality. - * - * Logged from: - * /frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java - */ -message GpsSignalQualityChanged { - optional android.server.location.GpsSignalQualityEnum level = 1; -} - - -/** - * Logs when a sync manager sync state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message SyncStateChanged { - repeated AttributionNode attribution_node = 1; - - // Name of the sync (as named in the app). Can be chosen at run-time. - optional string sync_name = 2; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 3; -} - -/* - * Deferred job stats. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java -*/ -message DeferredJobStatsReported { - repeated AttributionNode attribution_node = 1; - - // Number of jobs deferred. - optional int32 num_jobs_deferred = 2; - - // Time since the last job runs. - optional int64 time_since_last_job_millis = 3; -} - -/** - * Logs when a job scheduler job state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message ScheduledJobStateChanged { - repeated AttributionNode attribution_node = 1; - - // Name of the job (as named in the app) - optional string job_name = 2; - - enum State { - FINISHED = 0; - STARTED = 1; - SCHEDULED = 2; - } - optional State state = 3; - - // The reason a job has stopped. - // This is only applicable when the state is FINISHED. - // The default value is STOP_REASON_UNKNOWN. - optional android.app.job.StopReasonEnum stop_reason = 4; - - // The standby bucket of the app that scheduled the job. These match the framework constants - // defined in JobSchedulerService.java with the addition of UNKNOWN using -1, as ACTIVE is - // already assigned 0. - enum Bucket { - UNKNOWN = -1; - ACTIVE = 0; - WORKING_SET = 1; - FREQUENT = 2; - RARE = 3; - NEVER = 4; - RESTRICTED = 5; - } - optional Bucket standby_bucket = 5 [default = UNKNOWN]; - - // The job id (as assigned by the app). - optional int32 job_id = 6; - - // One flag for each of the API constraints defined by Jobscheduler. Does not include implcit - // constraints as they are always assumed to be set. - optional bool has_charging_constraint = 7; - optional bool has_battery_not_low_constraint = 8; - optional bool has_storage_not_low_constraint = 9; - optional bool has_timing_delay_constraint = 10; - optional bool has_deadline_constraint = 11; - optional bool has_idle_constraint = 12; - optional bool has_connectivity_constraint = 13; - optional bool has_content_trigger_constraint = 14; -} - -/** - * Logs when the audio state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message AudioStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - // RESET indicates all audio stopped. Used when it (re)starts (e.g. after it crashes). - RESET = 2; - } - optional State state = 2; -} - -/** - * Logs when the video codec state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message MediaCodecStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - // RESET indicates all mediaCodec stopped. Used when it (re)starts (e.g. after it crashes). - RESET = 2; - } - optional State state = 2; -} - -/** - * Logs when the flashlight state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message FlashlightStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - // RESET indicates all flashlight stopped. Used when it (re)starts (e.g. after it crashes). - RESET = 2; - } - optional State state = 2; -} - -/** - * Logs when the camera state changes. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message CameraStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - // RESET indicates all camera stopped. Used when it (re)starts (e.g. after it crashes). - RESET = 2; - } - optional State state = 2; -} - -/** - * Logs that the state of a wakelock (per app and per wakelock name) has changed. - * - * Logged from: - * TODO - */ -message WakelockStateChanged { - repeated AttributionNode attribution_node = 1 - [(state_field_option).primary_field_first_uid = true]; - - // The type (level) of the wakelock; e.g. a partial wakelock or a full wakelock. - // From frameworks/base/core/proto/android/os/enums.proto. - optional android.os.WakeLockLevelEnum type = 2 [(state_field_option).primary_field = true]; - - // The wakelock tag (Called tag in the Java API, sometimes name elsewhere). - optional string tag = 3 [(state_field_option).primary_field = true]; - - enum State { - RELEASE = 0; - ACQUIRE = 1; - CHANGE_RELEASE = 2; - CHANGE_ACQUIRE = 3; - } - optional State state = 4 [ - (state_field_option).exclusive_state = true, - (state_field_option).default_state_value = 0, - (state_field_option).nested = true - ]; -} - -/** - * Logs when a partial wakelock is considered 'long' (over 1 min). - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message LongPartialWakelockStateChanged { - repeated AttributionNode attribution_node = 1; - - // The wakelock tag (Called tag in the Java API, sometimes name elsewhere). - optional string tag = 2; - - // TODO: I have no idea what this is. - optional string history_tag = 3; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 4; -} - -/** - * Logs when the device is interactive, according to the PowerManager Notifier. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/power/Notifier.java - */ -message InteractiveStateChanged { - enum State { - OFF = 0; - ON = 1; - } - optional State state = 1; -} - -/** - * Logs Battery Saver state change. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message BatterySaverModeStateChanged { - enum State { - OFF = 0; - ON = 1; - } - optional State state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs Doze mode state change. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message DeviceIdleModeStateChanged { - optional android.server.DeviceIdleModeEnum state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - - -/** - * Logs state change of Doze mode including maintenance windows. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message DeviceIdlingModeStateChanged { - optional android.server.DeviceIdleModeEnum state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs screen brightness level. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message ScreenBrightnessChanged { - // Screen brightness level. Should be in [-1, 255] according to PowerManager.java. - optional int32 level = 1; -} - -/** - * Logs battery level (percent full, from 0 to 100). - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message BatteryLevelChanged { - // Battery level. Should be in [0, 100]. - optional int32 battery_level = 1; -} - -/** - * Logs change in charging status of the device. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message ChargingStateChanged { - // State of the battery, from frameworks/base/core/proto/android/os/enums.proto. - optional android.os.BatteryStatusEnum state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs whether the device is plugged in, and what power source it is using. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message PluggedStateChanged { - // Whether the device is plugged in, from frameworks/base/core/proto/android/os/enums.proto. - optional android.os.BatteryPluggedStateEnum state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs when an app's wakeup alarm fires. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message WakeupAlarmOccurred { - repeated AttributionNode attribution_node = 1; - - // Name of the wakeup alarm. - optional string tag = 2; - - // Name of source package (for historical reasons, since BatteryStats tracked it). - optional string package_name = 3; - - // The App Standby bucket of the app that scheduled the alarm at the time the alarm fired. - optional AppStandbyBucketChanged.Bucket app_standby_bucket = 4; -} - -/** - * Logs when an an app causes the mobile radio to change state. - * Changing from LOW to MEDIUM or HIGH can be considered the app waking the mobile radio. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/NetworkManagementService.java - */ -message MobileRadioPowerStateChanged { - repeated AttributionNode attribution_node = 1; - - // Power state, from frameworks/base/core/proto/android/telephony/enums.proto. - optional android.telephony.DataConnectionPowerStateEnum state = 2; -} - -/** - * Logs when an an app causes the wifi radio to change state. - * Changing from LOW to MEDIUM or HIGH can be considered the app waking the wifi radio. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/NetworkManagementService.java - */ -message WifiRadioPowerStateChanged { - repeated AttributionNode attribution_node = 1; - - // Power state, from frameworks/base/core/proto/android/telephony/enums.proto. - optional android.telephony.DataConnectionPowerStateEnum state = 2; -} - -/** - * Logs kernel wakeup reasons and aborts. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message KernelWakeupReported { - // Name of the kernel wakeup reason (or abort). - optional string wakeup_reason_name = 1; - - // Duration (in microseconds) for the wake-up interrupt to be serviced. - optional int64 duration_micros = 2; -} - -/** - * Logs when Wifi is toggled on/off. - * Note that Wifi may still perform certain functions (e.g. location scanning) even when disabled. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message WifiEnabledStateChanged { - enum State { - OFF = 0; - ON = 1; - } - optional State state = 1; -} - -/** - * This atom is deprecated starting in R. - * - * Logs when an app causes Wifi to run. In this context, 'to run' means to use Wifi Client Mode. - * TODO: Include support for Hotspot, perhaps by using an extra field to denote 'mode'. - * Note that Wifi Scanning is monitored separately in WifiScanStateChanged. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java - */ -message WifiRunningStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 2; -} - -/** - * Logs wifi locks held by an app. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message WifiLockStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 2; - - // WifiLock type, from frameworks/base/core/proto/android/wifi/enums.proto. - optional android.net.wifi.WifiModeEnum mode = 3; -} - -/** - * Logs wifi signal strength changes. - * - * Logged from: - * frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java - */ -message WifiSignalStrengthChanged { - // Signal strength, from frameworks/base/core/proto/android/telephony/enums.proto. - optional android.telephony.SignalStrengthEnum signal_strength = 1; -} - -/** - * Logs wifi scans performed by an app. - * - * Logged from: - * frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java - */ -message WifiScanStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 2; -} - -/** - * Logs wifi multicast locks held by an app - * - * Logged from: - * frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMulticastLockManager.java - */ -message WifiMulticastLockStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 2; - - optional string tag = 3; -} - -/** - * Logs shutdown reason and duration on next boot. - * - * Logged from: - * frameworks/base/core/java/com/android/server/BootReceiver.java - */ -message ShutdownSequenceReported { - // True if shutdown is for a reboot. Default: false if we do not know. - optional bool reboot = 1; - - // Reason for shutdown. Eg: userrequested. Default: "<EMPTY>". - optional string reason = 2; - - // Beginning of shutdown time in ms using wall clock time since unix epoch. - // Default: 0 if no start time received. - optional int64 start_time_millis = 3; - - // Duration of shutdown in ms. Default: 0 if no duration received. - optional int64 duration_millis = 4; -} - - -/** - * Logs boot reason and duration. - * - * Logged from: - * system/core/bootstat/bootstat.cpp - */ -message BootSequenceReported { - // Reason for bootloader boot. Eg. reboot. See bootstat.cpp for larger list - // Default: "<EMPTY>" if not available. - optional string bootloader_reason = 1; - - // Reason for system boot. Eg. bootloader, reboot,userrequested - // Default: "<EMPTY>" if not available. - optional string system_reason = 2; - - // End of boot time in ms from unix epoch using system wall clock. - optional int64 end_time_millis = 3; - - // Total boot duration in ms. - optional int64 total_duration_millis = 4; - - // Bootloader duration in ms. - optional int64 bootloader_duration_millis = 5; - - // Time since last boot in ms. Default: 0 if not available. - optional int64 time_since_last_boot = 6; -} - - -/** - * Logs call state and disconnect cause (if applicable). - * - * Logged from: - * packages/services/Telecomm/src/com/android/server/telecom/Call.java - */ -message CallStateChanged { - // The state of the call. Eg. DIALING, ACTIVE, ON_HOLD, DISCONNECTED. - // From frameworks/base/core/proto/android/telecomm/enums.proto. - optional android.telecom.CallStateEnum call_state = 1; - - // The reason the call disconnected. Eg. ERROR, MISSED, REJECTED, BUSY. - // This value is only applicable when the call_state is DISCONNECTED, and - // should always be UNKNOWN if the call_state is not DISCONNECTED. - // From frameworks/base/core/proto/android/telecomm/enums.proto. - optional android.telecom.DisconnectCauseEnum disconnect_cause = 2; - - // True if the call is self-managed, which are apps that use the - // telecom infrastructure to make their own calls. - optional bool self_managed = 3; - - // True if call is external. External calls are calls on connected Wear - // devices but show up in Telecom so the user can pull them onto the device. - optional bool external_call = 4; -} - -/** - * Logs keyguard state. The keyguard is the lock screen. - * - * Logged from: - * frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java - */ -message KeyguardStateChanged { - enum State { - UNKNOWN = 0; - // The keyguard is hidden when the phone is unlocked. - HIDDEN = 1; - // The keyguard is shown when the phone is locked (screen turns off). - SHOWN= 2; - // The keyguard is occluded when something is overlaying the keyguard. - // Eg. Opening the camera while on the lock screen. - OCCLUDED = 3; - } - optional State state = 1; -} - -/** - * Logs keyguard bouncer state. The bouncer is a part of the keyguard, and - * prompts the user to enter a password (pattern, pin, etc). - * - * Logged from: - * frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java - */ - -message KeyguardBouncerStateChanged { - enum State { - UNKNOWN = 0; - // Bouncer is hidden, either as a result of successfully entering the - // password, screen timing out, or user going back to lock screen. - HIDDEN = 1; - // This is when the user is being prompted to enter the password. - SHOWN = 2; - } - optional State state = 1; -} - -/** - * Logs the result of entering a password into the keyguard bouncer. - * - * Logged from: - * frameworks/base/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java - */ -message KeyguardBouncerPasswordEntered { - enum BouncerResult { - UNKNOWN = 0; - // The password entered was incorrect. - FAILURE = 1; - // The password entered was correct. - SUCCESS = 2; - } - optional BouncerResult result = 1; -} - -/* - * Logs changes to the configuration of the device. The configuration is defined - * in frameworks/base/core/java/android/content/res/Configuration.java - * More documentation is at https://d.android.com/reference/android/content/res/Configuration.html - * Please go there to interpret the possible values each field can be. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message ResourceConfigurationChanged { - // Bit mask of color capabilities of the screen. - // Contains information about the color gamut and hdr mode of the screen. - // See: https://d.android.com/reference/android/content/res/Configuration.html#colorMode - optional int32 color_mode = 1; - - // The target screen density being rendered to. - // See: https://d.android.com/reference/android/content/res/Configuration.html#densityDpi - optional int32 density_dpi = 2; - - // Current user preference for the scaling factor for fonts, - // relative to the base density scaling. - // See: https://d.android.com/reference/android/content/res/Configuration.html#fontScale - optional float font_scale = 3; - - // Flag indicating whether the hard keyboard is hidden. - // See: https://d.android.com/reference/android/content/res/Configuration.html#hardKeyboardHidden - optional int32 hard_keyboard_hidden = 4; - - // The type of keyboard attached to the device. - // See: https://d.android.com/reference/android/content/res/Configuration.html#keyboard - optional int32 keyboard = 5; - - // Flag indicating whether any keyboard is available. Takes soft keyboards into account. - // See: https://d.android.com/reference/android/content/res/Configuration.html#keyboardHidden - optional int32 keyboard_hidden = 6; - - // IMSI MCC (Mobile Country Code), corresponding to mcc resource qualifier. - // 0 if undefined. - // See: https://d.android.com/reference/android/content/res/Configuration.html#mcc - optional int32 mcc = 7; - - // IMSI MNC (Mobile Network Code), corresponding to mnc resource qualifier. - // 0 if undefined. Note: the actual MNC may be 0, to check for this use the - // MNC_ZERO symbol defined in Configuration.java. - // See: https://d.android.com/reference/android/content/res/Configuration.html#mnc - optional int32 mnc = 8; - - // The kind of navigation available on the device. - // See: https://developer.android.com/reference/android/content/res/Configuration.html#navigation - optional int32 navigation = 9; - - // Flag indicating whether the navigation is available. - // See: https://d.android.com/reference/android/content/res/Configuration.html#navigationHidden - optional int32 navigation_hidden = 10; - - // Overall orientation of the screen. - // See: https://d.android.com/reference/android/content/res/Configuration.html#orientation - optional int32 orientation = 11; - - // The current height of the available screen space, in dp units. - // See: https://d.android.com/reference/android/content/res/Configuration.html#screenHeightDp - optional int32 screen_height_dp = 12; - - // Bit mask of overall layout of the screen. - // Contains information about screen size, whether the screen is wider/taller - // than normal, whether the screen layout is right-tl-left or left-to-right, - // and whether the screen has a rounded shape. - // See: https://d.android.com/reference/android/content/res/Configuration.html#screenLayout - optional int32 screen_layout = 13; - - // Current width of the available screen space, in dp units. - // See: https://d.android.com/reference/android/content/res/Configuration.html#screenWidthDp - optional int32 screen_width_dp = 14; - - // The smallest screen size an application will see in normal operation. - // This is the smallest value of both screenWidthDp and screenHeightDp - // in portrait and landscape. - // See: https://d.android.com/reference/android/content/res/Configuration.html#smallestScreenWidthDp - optional int32 smallest_screen_width_dp = 15; - - // The type of touch screen attached to the device. - // See: https://d.android.com/reference/android/content/res/Configuration.html#touchscreen - optional int32 touchscreen = 16; - - // Bit mask of the ui mode. - // Contains information about the overall ui mode of the device. - // Eg: NORMAL, DESK, CAR, TELEVISION, WATCH, VR_HEADSET - // Also contains information about whether the device is in night mode. - // See: https://d.android.com/reference/android/content/res/Configuration.html#uiMode - optional int32 ui_mode = 17; -} - - -/** - * Logs changes in the connection state of the mobile radio. - * - * Logged from: - * frameworks/opt/telephony/src/java/com/android/internal/telephony/dataconnection/DataConnection.java - */ -message MobileConnectionStateChanged { - // States are from the state machine DataConnection.java. - enum State { - UNKNOWN = 0; - // The connection is inactive, or disconnected. - INACTIVE = 1; - // The connection is being activated, or connecting. - ACTIVATING = 2; - // The connection is active, or connected. - ACTIVE = 3; - // The connection is disconnecting. - DISCONNECTING = 4; - // The connection is disconnecting after creating a connection. - DISCONNECTION_ERROR_CREATING_CONNECTION = 5; - } - optional State state = 1; - // For multi-sim phones, this distinguishes between the sim cards. - optional int32 sim_slot_index = 2; - // Used to identify the connection. Starts at 0 and increments by 1 for - // every new network created. Resets whenever the device reboots. - optional int32 data_connection_id = 3; - // A bitmask for the capabilities of this connection. - // Eg. DEFAULT (internet), MMS, SUPL, DUN, IMS. - // Default value (if we have no information): 0 - optional int64 capabilities = 4; - // If this connection has internet. - // This just checks if the DEFAULT bit of capabilities is set. - optional bool has_internet = 5; -} - -/** - * Logs changes in mobile radio technology. eg: LTE, EDGE, CDMA. - * - * Logged from: - * frameworks/opt/telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java - */ -message MobileRadioTechnologyChanged { - optional android.telephony.NetworkTypeEnum state = 1; - // For multi-sim phones, this distinguishes between the sim cards. - optional int32 sim_slot_index = 2; -} - -/** - * Logs the VID and PID of any connected USB devices. - * - * Notes if any Audio, HID (input buttons/mouse/keyboard), or Storage interfaces are present. - * - * Logged by Vendor. - */ -message UsbDeviceAttached { - optional int32 vid = 1; - optional int32 pid = 2; - optional bool has_audio = 3; - optional bool has_hid = 4; - optional bool has_storage = 5; - enum State { - STATE_DISCONNECTED = 0; - STATE_CONNECTED = 1; - } - optional State state = 6; - optional int64 last_connect_duration_millis = 7; -} - - -/** - * Logs when Bluetooth is enabled and disabled. - * - * Logged from: - * services/core/java/com/android/server/BluetoothManagerService.java - */ -message BluetoothEnabledStateChanged { - repeated AttributionNode attribution_node = 1; - // Whether or not bluetooth is enabled on the device. - enum State { - UNKNOWN = 0; - ENABLED = 1; - DISABLED = 2; - } - optional State state = 2; - // The reason for being enabled/disabled. - // Eg. Airplane mode, crash, application request. - optional android.bluetooth.EnableDisableReasonEnum reason = 3; - // If the reason is an application request, this will be the package name. - optional string pkg_name = 4; -} - -/** - * Logs when profiles on a Bluetooth device connects and disconnects. - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java - * - * Next Tag: 6 - */ -message BluetoothConnectionStateChanged { - // The state of the connection. - // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED. - optional android.bluetooth.ConnectionStateEnum state = 1; - // An identifier that can be used to match connect and disconnect events. - // Currently is last two bytes of a hash of a device level ID and - // the mac address of the bluetooth device that is connected. - // Deprecated: use obfuscated_id instead, this one is always 0 for Q+ - optional int32 obfuscated_id = 2 [deprecated = true]; - // The profile that is connected. Eg. GATT, A2DP, HEADSET. - // From android.bluetooth.BluetoothAdapter.java - // Default: 0 when not used - optional int32 bt_profile = 3; - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes new_obfuscated_id = 4 [(android.os.statsd.log_mode) = MODE_BYTES]; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 5; -} - -/** - * Logs when a Bluetooth device connects and disconnects over ACL - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java - * - * Next Tag: 4 - */ -message BluetoothAclConnectionStateChanged { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // The state of the connection. - // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED. - optional android.bluetooth.ConnectionStateEnum state = 2; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 3; -} - -/** - * Logs when a Bluetooth device connects and disconnects over SCO - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetStateMachine.java - * packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetClientStateMachine.java - * - * Next Tag: 5 - */ -message BluetoothScoConnectionStateChanged { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // The state of the connection. - // Eg: CONNECTING, CONNECTED, DISCONNECTING, DISCONNECTED. - optional android.bluetooth.ConnectionStateEnum state = 2; - // Codec used for this SCO connection - // Default: UNKNOWN - optional android.bluetooth.hfp.ScoCodec codec = 3; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 4; -} - -/** - * Logged when active device of a profile changes - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java - * packages/apps/Bluetooth/src/com/android/bluetooth/hfp/HeadsetService.java - * packages/apps/Bluetooth/src/com/android/bluetooth/hearingaid/HearingAidService.java - */ -message BluetoothActiveDeviceChanged { - // The profile whose active device has changed. Eg. A2DP, HEADSET, HEARING_AID - // From android.bluetooth.BluetoothProfile - optional int32 bt_profile = 1; - // An identifier that can be used to match events for this new active device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if there is no active device for this profile - optional bytes obfuscated_id = 2 [(android.os.statsd.log_mode) = MODE_BYTES]; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 3; -} - -// Logs when there is an event affecting Bluetooth device's link layer connection. -// - This event is triggered when there is a related HCI command or event -// - Users of this metrics can deduce Bluetooth device's connection state from these events -// - HCI commands are logged before the command is sent, after receiving command status, and after -// receiving command complete -// - HCI events are logged when they arrive -// -// Low level log from system/bt -// -// Bluetooth classic commands: -// - CMD_CREATE_CONNECTION -// - CMD_DISCONNECT -// - CMD_CREATE_CONNECTION_CANCEL -// - CMD_ACCEPT_CONNECTION_REQUEST -// - CMD_REJECT_CONNECTION_REQUEST -// - CMD_SETUP_ESCO_CONNECTION -// - CMD_ACCEPT_ESCO_CONNECTION -// - CMD_REJECT_ESCO_CONNECTION -// - CMD_ENH_SETUP_ESCO_CONNECTION -// - CMD_ENH_ACCEPT_ESCO_CONNECTION -// -// Bluetooth low energy commands: -// - CMD_BLE_CREATE_LL_CONN [Only logged on error or when initiator filter policy is 0x00] -// - CMD_BLE_CREATE_CONN_CANCEL [Only logged when there is an error] -// - CMD_BLE_EXTENDED_CREATE_CONNECTION [Only logged on error or when initiator filter policy is 0x00] -// - CMD_BLE_CLEAR_WHITE_LIST -// - CMD_BLE_ADD_WHITE_LIST -// - CMD_BLE_REMOVE_WHITE_LIST -// -// Bluetooth classic events: -// - EVT_CONNECTION_COMP -// - EVT_CONNECTION_REQUEST -// - EVT_DISCONNECTION_COMP -// - EVT_ESCO_CONNECTION_COMP -// - EVT_ESCO_CONNECTION_CHANGED -// -// Bluetooth low energy meta events: -// - BLE_EVT_CONN_COMPLETE_EVT -// - BLE_EVT_ENHANCED_CONN_COMPLETE_EVT -// -// Next tag: 10 -message BluetoothLinkLayerConnectionEvent { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Connection handle of this connection if available - // Range: 0x0000 - 0x0EFF (12 bits) - // Default: 0xFFFF if the handle is unknown - optional int32 connection_handle = 2; - // Direction of the link - // Default: DIRECTION_UNKNOWN - optional android.bluetooth.DirectionEnum direction = 3; - // Type of this link - // Default: LINK_TYPE_UNKNOWN - optional android.bluetooth.LinkTypeEnum type = 4; - - // Reason metadata for this link layer connection event, rules for interpretation: - // 1. If hci_cmd is set and valid, hci_event can be either EVT_COMMAND_STATUS or - // EVT_COMMAND_COMPLETE, ignore hci_ble_event in this case - // 2. If hci_event is set to EVT_BLE_META, look at hci_ble_event; otherwise, if hci_event is - // set and valid, ignore hci_ble_event - - // HCI command associated with this event - // Default: CMD_UNKNOWN - optional android.bluetooth.hci.CommandEnum hci_cmd = 5; - // HCI event associated with this event - // Default: EVT_UNKNOWN - optional android.bluetooth.hci.EventEnum hci_event = 6; - // HCI BLE meta event associated with this event - // Default: BLE_EVT_UNKNOWN - optional android.bluetooth.hci.BleMetaEventEnum hci_ble_event = 7; - // HCI command status code if this is triggerred by hci_cmd - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum cmd_status = 8; - // HCI reason code associated with this event - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum reason_code = 9; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 10; -} - -/** - * Logs when a module is rolled back by Watchdog. - * - * Logged from: Rollback Manager - */ -message WatchdogRollbackOccurred { - enum RollbackType { - UNKNOWN = 0; - ROLLBACK_INITIATE = 1; - ROLLBACK_SUCCESS = 2; - ROLLBACK_FAILURE = 3; - ROLLBACK_BOOT_TRIGGERED = 4; - } - optional RollbackType rollback_type = 1; - - optional string package_name = 2; - - optional int32 package_version_code = 3; - - enum RollbackReasonType { - REASON_UNKNOWN = 0; - REASON_NATIVE_CRASH = 1; - REASON_EXPLICIT_HEALTH_CHECK = 2; - REASON_APP_CRASH = 3; - REASON_APP_NOT_RESPONDING = 4; - REASON_NATIVE_CRASH_DURING_BOOT = 5; - } - optional RollbackReasonType rollback_reason = 4; - - // Set by RollbackPackageHealthObserver to be the package that is failing when a rollback - // is initiated. Empty if the package is unknown. - optional string failing_package_name = 5; - - optional TrainExperimentIds experiment_ids = 6 [(log_mode) = MODE_BYTES]; -} - -/** - * Logs when there is a change in Bluetooth A2DP playback state - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java - */ -message BluetoothA2dpPlaybackStateChanged { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Current playback state - // Default: PLAYBACK_STATE_UNKNOWN - optional android.bluetooth.a2dp.PlaybackStateEnum playback_state = 2; - // Current audio coding mode - // Default: AUDIO_CODING_MODE_UNKNOWN - optional android.bluetooth.a2dp.AudioCodingModeEnum audio_coding_mode = 3; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 4; -} - -/** - * Logs when there is a change in A2DP codec config for a particular remote device - * - * Logged from: - * frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java - * packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java - */ -message BluetoothA2dpCodecConfigChanged { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig - // Default SOURCE_CODEC_TYPE_INVALID - optional int32 codec_type = 2; - // Codec priroity, the higher the more preferred, -1 for disabled - // Default: CODEC_PRIORITY_DEFAULT - optional int32 codec_priority = 3; - // Sample rate in Hz as defined by various SAMPLE_RATE_* constants in BluetoothCodecConfig - // Default: SAMPLE_RATE_NONE - optional int32 sample_rate = 4; - // Bits per sample as defined by various BITS_PER_SAMPLE_* constants in BluetoothCodecConfig - // Default: BITS_PER_SAMPLE_NONE - optional int32 bits_per_sample = 5; - // Channel mode as defined by various CHANNEL_MODE_* constants in BluetoothCodecConfig - // Default: CHANNEL_MODE_NONE - optional int32 channel_mode = 6; - // Codec specific values - // Default 0 - optional int64 codec_specific_1 = 7; - optional int64 codec_specific_2 = 8; - optional int64 codec_specific_3 = 9; - optional int64 codec_specific_4 = 10; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 11; -} - -/** - * Logs when there is a change in selectable A2DP codec capability for a paricular remote device - * Each codec's capability is logged separately due to statsd restriction - * - * Logged from: - * frameworks/base/core/java/android/bluetooth/BluetoothCodecConfig.java - * packages/apps/Bluetooth/src/com/android/bluetooth/a2dp/A2dpService.java - */ -message BluetoothA2dpCodecCapabilityChanged { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Type of codec as defined by various SOURCE_CODEC_TYPE_* constants in BluetoothCodecConfig - // Default SOURCE_CODEC_TYPE_INVALID - optional int32 codec_type = 2; - // Codec priroity, the higher the more preferred, -1 for disabled - // Default: CODEC_PRIORITY_DEFAULT - optional int32 codec_priority = 3; - // A bit field of supported sample rates as defined by various SAMPLE_RATE_* constants - // in BluetoothCodecConfig - // Default: empty and SAMPLE_RATE_NONE for individual item - optional int32 sample_rate = 4; - // A bit field of supported bits per sample as defined by various BITS_PER_SAMPLE_* constants - // in BluetoothCodecConfig - // Default: empty and BITS_PER_SAMPLE_NONE for individual item - optional int32 bits_per_sample = 5; - // A bit field of supported channel mode as defined by various CHANNEL_MODE_* constants in - // BluetoothCodecConfig - // Default: empty and CHANNEL_MODE_NONE for individual item - optional int32 channel_mode = 6; - // Codec specific values - // Default 0 - optional int64 codec_specific_1 = 7; - optional int64 codec_specific_2 = 8; - optional int64 codec_specific_3 = 9; - optional int64 codec_specific_4 = 10; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 11; -} - -/** - * Logs when A2DP failed to read from PCM source. - * This typically happens when audio HAL cannot supply A2DP with data fast enough for encoding. - * - * Logged from: - * system/bt - */ -message BluetoothA2dpAudioUnderrunReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Encoding interval in nanoseconds - // Default: 0 - optional int64 encoding_interval_nanos = 2; - // Number of bytes of PCM data that could not be read from the source - // Default: 0 - optional int32 num_missing_pcm_bytes = 3; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 4; -} - -/** - * Logs when A2DP failed send encoded data to the remote device fast enough such that the transmit - * buffer queue is full and we have to drop data - * - * Logged from: - * system/bt - */ -message BluetoothA2dpAudioOverrunReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Encoding interval in nanoseconds - // Default: 0 - optional int64 encoding_interval_nanos = 2; - // Number of buffers dropped in this event - // Each buffer is encoded in one encoding interval and consists of multiple encoded frames - // Default: 0 - optional int32 num_dropped_buffers = 3; - // Number of encoded buffers dropped in this event - // Default 0 - optional int32 num_dropped_encoded_frames = 4; - // Number of encoded bytes dropped in this event - // Default: 0 - optional int32 num_dropped_encoded_bytes = 5; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 6; -} - -/** - * Logs when we receive reports regarding a device's RSSI value - * - * Logged from: - * system/bt - */ -message BluetoothDeviceRssiReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Connection handle of this connection if available - // Range: 0x0000 - 0x0EFF (12 bits) - // Default: 0xFFFF if the handle is unknown - optional int32 connection_handle = 2; - // HCI command status code if this is triggerred by hci_cmd - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum hci_status = 3; - // BR/EDR - // Range: -128 ≤ N ≤ 127 (signed integer) - // Units: dB - // LE: - // Range: -127 to 20, 127 (signed integer) - // Units: dBm - // Invalid when an out of range value is reported - optional int32 rssi = 4; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 5; -} - -/** - * Logs when we receive reports regarding how many consecutive failed contacts for a connection - * - * Logged from: - * system/bt - */ -message BluetoothDeviceFailedContactCounterReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Connection handle of this connection if available - // Range: 0x0000 - 0x0EFF (12 bits) - // Default: 0xFFFF if the handle is unknown - optional int32 connection_handle = 2; - // HCI command status code if this is triggerred by hci_cmd - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum cmd_status = 3; - // Number of consecutive failed contacts for a connection corresponding to the Handle - // Range: uint16_t, 0-0xFFFF - // Default: 0xFFFFF - optional int32 failed_contact_counter = 4; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 5; -} - -/** - * Logs when we receive reports regarding the tranmit power level used for a specific connection - * - * Logged from: - * system/bt - */ -message BluetoothDeviceTxPowerLevelReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Connection handle of this connection if available - // Range: 0x0000 - 0x0EFF (12 bits) - // Default: 0xFFFF if the handle is unknown - optional int32 connection_handle = 2; - // HCI command status code if this is triggered by hci_cmd - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum hci_status = 3; - // Range: -30 ≤ N ≤ 20 - // Units: dBm - // Invalid when an out of range value is reported - optional int32 transmit_power_level = 4; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 5; -} - -/** - * Logs when Bluetooth controller failed to reply with command status within a timeout period after - * receiving an HCI command from the host - * - * Logged from: system/bt - */ -message BluetoothHciTimeoutReported { - // HCI command associated with this event - // Default: CMD_UNKNOWN - optional android.bluetooth.hci.CommandEnum hci_command = 1; -} - -/** - * Logs when we receive Bluetooth Link Quality Report event from the controller - * See Android Bluetooth HCI specification for more details - * - * Note: all count and bytes field are counted since last event - * - * Logged from: system/bt - */ -message BluetoothQualityReportReported { - // Quality report ID - // Original type: uint8_t - // Default: BQR_ID_UNKNOWN - optional android.bluetooth.hci.BqrIdEnum quality_report_id = 1; - // Packet type of the connection - // Original type: uint8_t - // Default: BQR_PACKET_TYPE_UNKNOWN - optional android.bluetooth.hci.BqrPacketTypeEnum packet_types = 2; - // Connection handle of the connection - // Original type: uint16_t - optional int32 connection_handle = 3; - // Performing Role for the connection - // Original type: uint8_t - optional int32 connection_role = 4; - // Current Transmit Power Level for the connection. This value is the same as the controller's - // response to the HCI_Read_Transmit_Power_Level HCI command - // Original type: uint8_t - optional int32 tx_power_level = 5; - // Received Signal Strength Indication (RSSI) value for the connection. This value is an - // absolute receiver signal strength value - // Original type: int8_t - optional int32 rssi = 6; - // Signal-to-Noise Ratio (SNR) value for the connection. It is the average SNR of all the - // channels used by the link currently - // Original type: uint8_t - optional int32 snr = 7; - // Indicates the number of unused channels in AFH_channel_map - // Original type: uint8_t - optional int32 unused_afh_channel_count = 8; - // Indicates the number of the channels which are interfered and quality is bad but are still - // selected for AFH - // Original type: uint8_t - optional int32 afh_select_unideal_channel_count = 9; - // Current Link Supervision Timeout Setting - // Unit: N * 0.3125 ms (1 Bluetooth Clock) - // Original type: uint16_t - optional int32 lsto = 10; - // Piconet Clock for the specified Connection_Handle. This value is the same as the controller's - // response to HCI_Read_Clock HCI command with the parameter "Which_Clock" of - // 0x01 (Piconet Clock) - // Unit: N * 0.3125 ms (1 Bluetooth Clock) - // Original type: uint32_t - optional int64 connection_piconet_clock = 11; - // The count of retransmission - // Original type: uint32_t - optional int64 retransmission_count = 12; - // The count of no RX - // Original type: uint32_t - optional int64 no_rx_count = 13; - // The count of NAK (Negative Acknowledge) - // Original type: uint32_t - optional int64 nak_count = 14; - // Controller timestamp of last TX ACK - // Unit: N * 0.3125 ms (1 Bluetooth Clock) - // Original type: uint32_t - optional int64 last_tx_ack_timestamp = 15; - // The count of Flow-off (STOP) - // Original type: uint32_t - optional int64 flow_off_count = 16; - // Controller timestamp of last Flow-on (GO) - // Unit: N * 0.3125 ms (1 Bluetooth Clock) - // Original type: uint32_t - optional int64 last_flow_on_timestamp = 17; - // Buffer overflow count (how many bytes of TX data are dropped) since the last event - // Original type: uint32_t - optional int64 buffer_overflow_bytes = 18; - // Buffer underflow count (in byte) since last event - // Original type: uint32_t - optional int64 buffer_underflow_bytes = 19; -} - -/** - * Logs when a Bluetooth device's manufacturer information is learnt by the Bluetooth stack - * - * Notes: - * - Each event can be partially filled as we might learn different pieces of device - * information at different time - * - Multiple device info events can be combined to give more complete picture - * - When multiple device info events tries to describe the same information, the - * later one wins - * - * Logged from: - * packages/apps/Bluetooth - */ -message BluetoothDeviceInfoReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Where is this device info obtained from - optional android.bluetooth.DeviceInfoSrcEnum source_type = 2; - // Name of the data source - // For EXTERNAL: package name of the data source - // For INTERNAL: null for general case, component name otherwise - optional string source_name = 3; - // Name of the manufacturer of this device - optional string manufacturer = 4; - // Model of this device - optional string model = 5; - // Hardware version of this device - optional string hardware_version = 6; - // Software version of this device - optional string software_version = 7; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 8; -} - -/** - * Logs when we receive Bluetooth Read Remote Version Information Complete Event from the remote - * device, as documented by the Bluetooth Core HCI specification - * Reference: https://www.bluetooth.com/specifications/bluetooth-core-specification - * Vol 2, Part E, Page 1118 - * - * Logged from: - * system/bt - */ -message BluetoothRemoteVersionInfoReported { - // Connection handle of the connection - // Original type: uint16_t - optional int32 connection_handle = 1; - // HCI command status code - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum hci_status = 2; - // 1 byte Version of current LMP in the remote controller - optional int32 lmp_version = 3; - // 2 bytes LMP manufacturer code of the remote controller - // https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers - optional int32 lmp_manufacturer_code = 4; - // 4 bytes subversion of the LMP in the remote controller - optional int32 lmp_subversion = 5; -} - -/** - * Logs when certain Bluetooth SDP attributes are discovered - * Constant definitions are from: - * https://www.bluetooth.com/specifications/assigned-numbers/service-discovery - * - * Current logged attributes: - * - BluetoothProfileDescriptorList - * - Supported Features Bitmask - * - * Logged from: - * system/bt - */ -message BluetoothSdpAttributeReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Short form UUIDs used to identify Bluetooth protocols, profiles, and service classes - // Original type: uint16_t - optional int32 protocol_uuid = 2; - // Short form UUIDs used to identify Bluetooth SDP attribute types - // Original type: uint16_t - optional int32 attribute_id = 3; - // Attribute value for the particular attribute - optional bytes attribute_value = 4 [(android.os.statsd.log_mode) = MODE_BYTES]; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 5; -} - -/** - * Logs when bond state of a Bluetooth device changes - * - * Logged from: - * frameworks/base/core/java/android/bluetooth/BluetoothDevice.java - * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/BondStateMachine.java - */ -message BluetoothBondStateChanged { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Preferred transport type to remote dual mode device - // Default: TRANSPORT_AUTO means no preference - optional android.bluetooth.TransportTypeEnum transport = 2; - // The type of this Bluetooth device (Classic, LE, or Dual mode) - // Default: UNKNOWN - optional android.bluetooth.DeviceTypeEnum type = 3; - // Current bond state (NONE, BONDING, BONDED) - // Default: BOND_STATE_UNKNOWN - optional android.bluetooth.BondStateEnum bond_state = 4; - // Bonding sub state - // Default: BOND_SUB_STATE_UNKNOWN - optional android.bluetooth.BondSubStateEnum bonding_sub_state = 5; - // Unbond Reason - // Default: UNBOND_REASON_UNKNOWN - optional android.bluetooth.UnbondReasonEnum unbond_reason = 6; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 7; -} - -/** - * Logs there is an event related Bluetooth classic pairing - * - * Logged from: - * system/bt - */ -message BluetoothClassicPairingEventReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Connection handle of this connection if available - // Range: 0x0000 - 0x0EFF (12 bits) - // Default: 0xFFFF if the handle is unknown - optional int32 connection_handle = 2; - // HCI command associated with this event - // Default: CMD_UNKNOWN - optional android.bluetooth.hci.CommandEnum hci_cmd = 3; - // HCI event associated with this event - // Default: EVT_UNKNOWN - optional android.bluetooth.hci.EventEnum hci_event = 4; - // HCI command status code if this is triggerred by hci_cmd - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum cmd_status = 5; - // HCI reason code associated with this event - // Default: STATUS_UNKNOWN - optional android.bluetooth.hci.StatusEnum reason_code = 6; - // A status value related to this specific event - // Default: 0 - optional int64 event_value = 7; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 8; -} - -/** - * Logs when there is an event related to Bluetooth Security Manager Protocol (SMP) - * - * Logged from: - * system/bt - */ -message BluetoothSmpPairingEventReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if the device identifier is not known - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // SMP command sent or received over L2CAP - // Default: CMD_UNKNOWN - optional android.bluetooth.smp.CommandEnum smp_command = 2; - // Whether this command is sent or received - // Default: DIRECTION_UNKNOWN - optional android.bluetooth.DirectionEnum direction = 3; - // SMP failure reason code - // Default: PAIRING_FAIL_REASON_DEFAULT - optional android.bluetooth.smp.PairingFailReasonEnum smp_fail_reason = 4; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 5; -} - -/** - * Logs when a Bluetooth socket’s connection state changed - * - * Logged from: - * system/bt - */ -message BluetoothSocketConnectionStateChanged { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if this is a server listener socket - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Temporary port of this socket for the current connection or session only - // Default 0 when unknown or don't care - optional int32 port = 2; - // Socket type as mentioned in - // frameworks/base/core/java/android/bluetooth/BluetoothSocket.java - // Default: SOCKET_TYPE_UNKNOWN - optional android.bluetooth.SocketTypeEnum type = 3; - // Socket connection state - // Default: SOCKET_CONNECTION_STATE_UNKNOWN - optional android.bluetooth.SocketConnectionstateEnum state = 4; - // Number of bytes sent to remote device during this connection - optional int64 tx_bytes = 5; - // Number of bytes received from remote device during this connection - optional int64 rx_bytes = 6; - // Socket owner's UID - optional int32 uid = 7 [(is_uid) = true]; - // Server port of this socket, if any. When both |server_port| and |port| fields are populated, - // |port| must be spawned by |server_port| - // Default 0 when unknown or don't care - optional int32 server_port = 8; - // Whether this is a server listener socket - optional android.bluetooth.SocketRoleEnum is_server = 9; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 10; -} - -/** - * Logs when Class of Device (CoD) value is learnt for a device during pairing or connection - * - * Logged from: - * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/BondStateMachine.java - * packages/apps/Bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java - * - */ -message BluetoothClassOfDeviceReported { - // An identifier that can be used to match events for this device. - // Currently, this is a salted hash of the MAC address of this Bluetooth device. - // Salt: Randomly generated 256 bit value - // Hash algorithm: HMAC-SHA256 - // Size: 32 byte - // Default: null or empty if this is a server listener socket - optional bytes obfuscated_id = 1 [(android.os.statsd.log_mode) = MODE_BYTES]; - // Class of Device (CoD) value including both Major, Minor device class and service class - // Defined in: https://www.bluetooth.com/specifications/assigned-numbers/baseband - // Also defined in: https://developer.android.com/reference/android/bluetooth/BluetoothClass - // Default: 0 - optional int32 class_of_device = 2; - // An identifier that can be used to match events for this device. - // The incremental identifier is locally generated and guaranteed not derived - // from any globally unique hardware id. - // For paired devices, it stays consistent between Bluetooth toggling for the - // same remote device. - // For unpaired devices, it stays consistent within the same Bluetooth adapter - // session for the same remote device. - // Default: 0 if the device's metric id is unknown. - optional int32 metric_id = 3; -} - -/** - * Logs when something is plugged into or removed from the USB-C connector. - * - * Logged from: - * UsbService - */ -message UsbConnectorStateChanged { - enum State { - STATE_DISCONNECTED = 0; - STATE_CONNECTED = 1; - } - optional State state = 1 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; - optional string id = 2 [(state_field_option).primary_field = true]; - // Last active session in ms. - // 0 when the port is in connected state. - optional int64 last_connect_duration_millis = 3; -} - -/** - * Logs the reported speaker impedance. - * - * Logged from: - * Vendor audio implementation. - */ -message SpeakerImpedanceReported { - optional int32 speaker_location = 1; - optional int32 impedance = 2; -} - -/** - * Logs the report of a failed hardware. - * - * Logged from: - * Vendor HALs. - * - */ -message HardwareFailed { - enum HardwareType { - HARDWARE_FAILED_UNKNOWN = 0; - HARDWARE_FAILED_MICROPHONE = 1; - HARDWARE_FAILED_CODEC = 2; - HARDWARE_FAILED_SPEAKER = 3; - HARDWARE_FAILED_FINGERPRINT = 4; - } - optional HardwareType hardware_type = 1; - - /** - * hardware_location allows vendors to differentiate between multiple instances of - * the same hardware_type. The specific locations are vendor defined integers, - * referring to board-specific numbering schemes. - */ - optional int32 hardware_location = 2; - - /** - * failure_code is specific to the HardwareType of the failed hardware. - * It should use one of the enum values defined below. - */ - enum HardwareErrorCode { - UNKNOWN = 0; - COMPLETE = 1; - SPEAKER_HIGH_Z = 2; - SPEAKER_SHORT = 3; - FINGERPRINT_SENSOR_BROKEN = 4; - FINGERPRINT_TOO_MANY_DEAD_PIXELS = 5; - DEGRADE = 6; - } - optional int32 failure_code = 3; -} - -/** - * Log an event when the device has been physically dropped. - * Reported from the /vendor partition. - */ -message PhysicalDropDetected { - // Confidence that the event was actually a drop, 0 -> 100 - optional int32 confidence_pctg = 1; - // Peak acceleration of the drop, in 1/1000s of a g. - optional int32 accel_peak_thousandths_g = 2; - // Duration of freefall in ms - optional int32 freefall_time_millis = 3; -} - -/** - * Log bucketed battery charge cycles. - * - * Each bucket represents cycles of the battery past - * a given charge point. For example, if 10 cycle buckets are - * initialized, bucket 1 is the lowest 1/10th of the battery, - * and bucket 10 is 100%. - * - * Logged from: - * /sys/class/power_supply/bms/cycle_count, via Vendor. - */ -message ChargeCyclesReported { - optional int32 cycle_bucket_1 = 1; - optional int32 cycle_bucket_2 = 2; - optional int32 cycle_bucket_3 = 3; - optional int32 cycle_bucket_4 = 4; - optional int32 cycle_bucket_5 = 5; - optional int32 cycle_bucket_6 = 6; - optional int32 cycle_bucket_7 = 7; - optional int32 cycle_bucket_8 = 8; - optional int32 cycle_bucket_9 = 9; - optional int32 cycle_bucket_10 = 10; -} - -/** - * Log battery health snapshot. - * - * Resistance, Voltage, Open Circuit Voltage, Temperature, and Charge Level - * are snapshotted periodically over 24hrs. - */ -message BatteryHealthSnapshot { - enum BatterySnapshotType { - UNKNOWN = 0; - MIN_TEMP = 1; // Snapshot at min batt temp over 24hrs. - MAX_TEMP = 2; // Snapshot at max batt temp over 24hrs. - MIN_RESISTANCE = 3; // Snapshot at min batt resistance over 24hrs. - MAX_RESISTANCE = 4; // Snapshot at max batt resistance over 24hrs. - MIN_VOLTAGE = 5; // Snapshot at min batt voltage over 24hrs. - MAX_VOLTAGE = 6; // Snapshot at max batt voltage over 24hrs. - MIN_CURRENT = 7; // Snapshot at min batt current over 24hrs. - MAX_CURRENT = 8; // Snapshot at max batt current over 24hrs. - MIN_BATT_LEVEL = 9; // Snapshot at min battery level (SoC) over 24hrs. - MAX_BATT_LEVEL = 10; // Snapshot at max battery level (SoC) over 24hrs. - AVG_RESISTANCE = 11; // Snapshot at average battery resistance over 24hrs. - } - optional BatterySnapshotType type = 1; - // Temperature, in 1/10ths of degree C. - optional int32 temperature_deci_celsius = 2; - // Voltage Battery Voltage, in microVolts. - optional int32 voltage_micro_volt = 3; - // Current Battery current, in microAmps. - optional int32 current_micro_amps = 4; - // OpenCircuitVoltage Battery Open Circuit Voltage, in microVolts. - optional int32 open_circuit_micro_volt = 5; - // Resistance Battery Resistance, in microOhms. - optional int32 resistance_micro_ohm = 6; - // Level Battery Level, as % of full. - optional int32 level_percent = 7; -} - -/** - * Log slow I/O operations on the primary storage. - */ -message SlowIo { - // Classifications of IO Operations. - enum IoOperation { - UNKNOWN = 0; - READ = 1; - WRITE = 2; - UNMAP = 3; - SYNC = 4; - } - optional IoOperation operation = 1; - - // The number of slow IO operations of this type over 24 hours. - optional int32 count = 2; -} - -/** - * Log battery caused shutdown with the last recorded voltage. - */ -message BatteryCausedShutdown { - // The last recorded battery voltage prior to shutdown. - optional int32 last_recorded_micro_volt = 1; -} - -/** - * Logs when ThermalService receives throttling events. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/stats/StatsCompanionService.java - */ -message ThermalThrottlingSeverityStateChanged { - // The type of temperature being reported (CPU, GPU, SKIN, etc) - optional android.os.TemperatureTypeEnum sensor_type = 1; - - // The name of the temperature source. Eg. CPU0 - optional string sensor_name = 2; - - // Temperature in tenths of a degree C. - // For BCL, it is decimillivolt, decimilliamps, and percentage * 10. - optional int32 temperature_deci_celsius = 3; - - // Relative severity of the throttling, see enum definition. - optional android.os.ThrottlingSeverityEnum severity = 4; -} - -/** - * Logs the duration of a davey (jank of >=700ms) when it occurs - * - * Logged from: - * frameworks/base/libs/hwui/JankTracker.cpp - */ -message DaveyOccurred { - // The UID that logged this atom. - optional int32 uid = 1 [(is_uid) = true]; - - // Amount of time it took to render the frame. Should be >=700ms. - optional int64 jank_duration_millis = 2; -} - -/** - * Logs phone signal strength changes. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message PhoneSignalStrengthChanged { - // Signal strength, from frameworks/base/core/proto/android/telephony/enums.proto. - optional android.telephony.SignalStrengthEnum signal_strength = 1; -} - - -/** - * Logs when the phone state, sim state or signal strength changes - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message PhoneServiceStateChanged { - optional android.telephony.ServiceStateEnum state = 1; - optional android.telephony.SimStateEnum sim_state = 2; - optional android.telephony.SignalStrengthEnum signal_strength = 3; -} - -/** - * Logs when the phone becomes on or off. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/TelephonyRegistry.java - */ -message PhoneStateChanged { - enum State { - OFF = 0; - ON = 1; - } - optional State state = 1; -} - -message BackGesture { - enum BackType { - DEFAULT_BACK_TYPE = 0; - COMPLETED = 1; - COMPLETED_REJECTED = 2; // successful because coming from rejected area - INCOMPLETE_EXCLUDED = 3; // would have been successful but in the exclusion area - INCOMPLETE = 4; // Unsuccessful, for reasons other than below. - INCOMPLETE_FAR_FROM_EDGE = 5; // Unsuccessful, far from the edge. - INCOMPLETE_MULTI_TOUCH = 6; // Unsuccessful, multi touch. - INCOMPLETE_LONG_PRESS = 7; // Unsuccessful, long press. - INCOMPLETE_VERTICAL_MOVE = 8; // Unsuccessful, move vertically. - } - optional BackType type = 1; - - optional int32 y_coordinate = 2 [deprecated = true]; // y coordinate for ACTION_DOWN event - optional int32 start_x = 4; // X coordinate for ACTION_DOWN event. - optional int32 start_y = 5; // Y coordinate for ACTION_DOWN event. - optional int32 end_x = 6; // X coordinate for ACTION_MOVE event. - optional int32 end_y = 7; // Y coordinate for ACTION_MOVE event. - optional int32 left_boundary = 8; // left edge width + left inset - optional int32 right_boundary = 9; // screen width - (right edge width + right inset) - - enum WindowHorizontalLocation { - DEFAULT_LOCATION = 0; - LEFT = 1; - RIGHT = 2; - } - optional WindowHorizontalLocation x_location = 3 [deprecated = true]; -} - -message ExclusionRectStateChanged { - optional string component_name = 1; // if not available, simply packageName - optional int32 requested_height = 2; // px - optional int32 rejected_height = 3; // px - - enum WindowHorizontalLocation { - DEFAULT_LOCATION = 0; - LEFT = 1; - RIGHT = 2; - } - optional WindowHorizontalLocation x_location = 4; - optional bool landscape = 5; - optional bool splitscreen = 6; - optional int32 duration_millis = 7; -} - -/** - * Logs when IME is on. - * - * Logged from: /packages/SystemUI/src/com/android/systemui/ - statusbar/phone/NavigationBarView.java - * - */ -message ImeTouchReported { - optional int32 x_coordinate = 1; // X coordinate for ACTION_DOWN event. - optional int32 y_coordinate = 2; // Y coordinate for ACTION_DOWN event. -} - -/** - * Logs when Launcher (HomeScreen) UI has changed or was interacted. - * - * Logged from: - * packages/apps/Launcher3 - */ -message LauncherUIChanged { - optional android.stats.launcher.LauncherAction action = 1 [deprecated = true]; - optional android.stats.launcher.LauncherState src_state = 2; - optional android.stats.launcher.LauncherState dst_state = 3; - optional android.stats.launcher.LauncherExtension extension = 4 [(log_mode) = MODE_BYTES, deprecated = true]; - optional bool is_swipe_up_enabled = 5 [deprecated = true]; - - // The event id (e.g., app launch, drag and drop, long press) - optional int32 event_id = 6; - // The event's source or target id (e.g., icon, task, button) - optional int32 target_id = 7; - // If the target needs to be tracked, use this id field - optional int32 instance_id = 8; - optional int32 uid = 9 [(is_uid) = true]; - optional string package_name = 10; - optional string component_name = 11; - - // (x, y) coordinate and the index information of the target on the container - optional int32 grid_x = 12 [default = -1]; - optional int32 grid_y = 13 [default = -1]; - optional int32 page_id = 14 [default = -2]; - - // e.g., folder icon's (x, y) location and index information on the workspace - optional int32 grid_x_parent = 15 [default = -1]; - optional int32 grid_y_parent = 16 [default = -1]; - optional int32 page_id_parent = 17 [default = -2]; - - // e.g., SEARCHBOX_ALLAPPS, FOLDER_WORKSPACE - optional int32 hierarchy = 18; - - optional bool is_work_profile = 19; - - // Used to store the predicted rank of the target - optional int32 rank = 20 [default = -1]; - - // e.g., folderLabelState can be captured in the following two fields - optional int32 from_state = 21; - optional int32 to_state = 22; - - // e.g., autofilled or suggested texts that are not user entered - optional string edittext = 23; - - // e.g., number of contents inside a container (e.g., icons inside a folder) - optional int32 cardinality = 24; -} - -/** - * Used for snapshot of the HomeScreen UI elements - * - * Logged from: - * packages/apps/Launcher3 - */ -message LauncherStaticLayout { - // The event id (e.g., snapshot, drag and drop) - optional int32 event_id = 1; - // The event's source or target id (e.g., icon, shortcut, widget) - optional int32 target_id = 2; - // If the target needs to be tracked, use this id field - optional int32 instance_id = 3; - optional int32 uid = 4 [(is_uid) = true]; - optional string package_name = 5; - optional string component_name = 6; - - // (x, y) coordinate and the index information of the target on the container - optional int32 grid_x = 7 [default = -1]; - optional int32 grid_y = 8 [default = -1]; - optional int32 page_id = 9 [default = -2]; - - // e.g., folder icon's (x, y) location and index information on the workspace - // e.g., when used with widgets target, use these values for (span_x, span_y) - optional int32 grid_x_parent = 10 [default = -1]; - optional int32 grid_y_parent = 11 [default = -1]; - optional int32 page_id_parent = 12 [default = -2]; - - // UNKNOWN = 0 - // HOTSEAT = 1 - // WORKSPACE = 2 - // FOLDER_HOTSEAT = 3 - // FOLDER_WORKSPACE = 4 - optional int32 hierarchy = 13; - - optional bool is_work_profile = 14; - - // e.g., PIN, WIDGET TRAY, APPS TRAY, PREDICTION - optional int32 origin = 15; - - // e.g., number of icons inside a folder - optional int32 cardinality = 16; - - // e.g., (x, y) span of the widget inside homescreen grid system - optional int32 span_x = 17 [default = 1]; - optional int32 span_y = 18 [default = 1]; -} - -/** - * Logs when Wallpaper or ThemePicker UI has changed. - * - * Logged from: - * packages/apps/ThemePicker - * packages/apps/WallpaperPicker2 - */ -message StyleUIChanged { - optional android.stats.style.Action action = 1; - optional int32 color_package_hash = 2; - optional int32 font_package_hash = 3; - optional int32 shape_package_hash = 4; - optional int32 clock_package_hash = 5; - optional int32 launcher_grid = 6; - optional int32 wallpaper_category_hash = 7; - optional int32 wallpaper_id_hash = 8; - optional int32 color_preference = 9; - optional android.stats.style.LocationPreference location_preference = 10; -} - -/** - * Logs when Settings UI has changed. - * - * Logged from: - * packages/apps/Settings - */ -message SettingsUIChanged { - /** - * Where this SettingsUIChange event comes from. For example, if - * it's a PAGE_VISIBLE event, where the page is opened from. - */ - optional android.app.settings.PageId attribution = 1; - - /** - * What the UI action is. - */ - optional android.app.settings.Action action = 2; - - /** - * Where the action is happening - */ - optional android.app.settings.PageId page_id = 3; - - /** - * What preference changed in this event. - */ - optional string changed_preference_key = 4; - - /** - * The new value of the changed preference. - */ - optional int64 changed_preference_int_value = 5; -} - -/** - * Logs basic timing information about touch events. - * Reported at most every 5 minutes while device is being interacted with. - * - * Logged from: - * frameworks/native/services/inputflinger - */ -message TouchEventReported { - /** - * The fields latency_{min|max|mean|stdev} represent minimum, maximum, mean, - * and the standard deviation of the time spent processing touchscreen events - * in the kernel and inputflinger. The units are microseconds. - * - * On supported devices, the starting point is taken during the hard interrupt inside the - * kernel touch driver. On all other devices, the starting point is taken inside - * the kernel's input event subsystem upon receipt of the input event. - * The ending point is taken inside InputDispatcher, just after the input event - * is sent to the app. - */ - // Minimum value - optional float latency_min_micros = 1; - // Maximum value - optional float latency_max_micros = 2; - // Average value - optional float latency_mean_micros = 3; - // Standard deviation - optional float latency_stdev_micros = 4; - // Number of touch events (input_event) in this report - optional int32 count = 5; -} - -/** - * Logs gesture classification and timing information for touch events. - * - * Logged from: - * frameworks/base/core/java/android/view/GestureDetector.java - * frameworks/base/core/java/android/view/View.java - */ -message TouchGestureClassified { - // The source of the classification (e.g. Java class name). - optional string source = 1; - - enum Classification { - UNKNOWN_CLASSIFICATION = 0; - SINGLE_TAP = 1; - DOUBLE_TAP = 2; - LONG_PRESS = 3; - DEEP_PRESS = 4; - SCROLL = 5; - } - // The classification of the gesture. - optional Classification classification = 2; - - // The interval from the start of a touch event stream until the - // classification was made. - optional int32 latency_millis = 3; - - // The distance from the location of the first touch event to the - // location of the touch event when the classification was made. - optional float displacement_px = 4; -} - -/** - * Logs that a setting was updated. - * Logged from: - * frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java - * The tag and is_default allow resetting of settings to default values based on the specified - * tag. See Settings#putString(ContentResolver, String, String, String, boolean) for more details. - */ -message SettingChanged { - // The name of the setting. - optional string setting = 1; - - // The change being imposed on this setting. May represent a number, eg "3". - optional string value = 2; - - // The new value of this setting. For most settings, this is same as value. For some settings, - // value is +X or -X where X represents an element in a set. For example, if the previous value - // is A,B,C and value is -B, then new_value is A,C and prev_value is A,B,C. - // The +/- feature is currently only used for location_providers_allowed. - optional string new_value = 3; - - // The previous value of this setting. - optional string prev_value = 4; - - // The tag used with the is_default for resetting sets of settings. This is generally null. - optional string tag = 5; - - // True if this setting with tag should be resettable. - optional bool is_default = 6; - - // The associated user (for multi-user feature). Defined in android/os/UserHandle.java - optional int32 user = 7; - - enum ChangeReason { - UPDATED = 1; // Updated can be an insertion or an update. - DELETED = 2; - } - optional ChangeReason reason = 8; -} - -/** - * Logs activity going to foreground or background - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java - */ -message ActivityForegroundStateChanged { - optional int32 uid = 1 [(is_uid) = true]; - optional string pkg_name = 2; - optional string class_name = 3; - - enum State { - BACKGROUND = 0; - FOREGROUND = 1; - } - optional State state = 4; -} - -/** - * Logs when a volume entered low Storage state. - * Logged from: - * frameworks/base/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java - */ -message LowStorageStateChanged { - // Volume that ran out of storage. - optional string volume_description = 1; - - enum State { - UNKNOWN = 0; - OFF = 1; - ON = 2; - } - optional State state = 2; -} - -/** - * Logs when an app is downgraded. - * Logged from: - * frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java - */ -message AppDowngraded { - optional string package_name = 1; - // Size of the package (all data) before being downgraded. - optional int64 size_in_bytes_before = 2; - // Size of the package (all data) after being downgraded. - optional int64 size_in_bytes_after = 3; - - optional bool aggressive = 4; -} - -/** - * Logs when an app is optimized after being downgraded. - * Logged from: - * frameworks/base/services/core/java/com/android/server/pm/BackgroundDexOptService.java - */ -message AppOptimizedAfterDowngraded { - optional string package_name = 1; -} - -/** - * Logs whenever an app is installed on external storage. - * Logged from: - frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java - */ -message AppInstallOnExternalStorageReported { - // The type of external storage. - optional android.stats.storage.ExternalStorageType storage_type = 1; - // The name of the package that is installed on the sd card. - optional string package_name = 2; -} - -/** - * Logs when an app crashes. - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message AppCrashOccurred { - optional int32 uid = 1 [(is_uid) = true]; - - optional string event_type = 2; - - // The name of the process. - // system_server if it is not by an app - optional string process_name = 3; - - // The pid if available. -1 means not available. - optional int32 pid = 4; - - optional string package_name = 5; - - enum InstantApp { - UNAVAILABLE = 0; - FALSE = 1; - TRUE = 2; - } - optional InstantApp is_instant_app = 6; - - enum ForegroundState { - UNKNOWN = 0; - BACKGROUND = 1; - FOREGROUND = 2; - } - optional ForegroundState foreground_state = 7; - - optional android.server.ErrorSource error_source = 8; -} - -/** - * Logs when a WTF (What a Terrible Failure) happened. - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message WTFOccurred { - optional int32 uid = 1 [(is_uid) = true]; - - optional string tag = 2; - - // The name of the process. - // system_server if it is not by an app - optional string process_name = 3; - - // The pid if available. -1 means not available. - optional int32 pid = 4; - - optional android.server.ErrorSource error_source = 5; -} - -/** - * Logs when system server reports low memory. - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message LowMemReported { -} - -/** - * Logs when an app ANR (App Not Responding) occurs. - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/AppErrors.java - */ -message ANROccurred { - optional int32 uid = 1 [(is_uid) = true]; - - optional string process_name = 2; - - optional string short_component_name = 3; - - optional string reason = 4; - - enum InstantApp { - UNAVAILABLE = 0; - FALSE = 1; - TRUE = 2; - } - optional InstantApp is_instant_app = 5; - - enum ForegroundState { - UNKNOWN = 0; - BACKGROUND = 1; - FOREGROUND = 2; - } - optional ForegroundState foreground_state = 6; - - optional android.server.ErrorSource error_source = 7; - - optional string package_name = 8; -} - -/** - * Logs when the vibrator state changes. - * Logged from: - * frameworks/base/services/core/java/com/android/server/VibratorService.java - */ -message VibratorStateChanged { - repeated AttributionNode attribution_node = 1; - - enum State { - OFF = 0; - ON = 1; - } - optional State state = 2; - - // Duration (in milliseconds) requested to keep the vibrator on. - // Only applicable for State == ON. - optional int64 duration_millis = 3; -} - -/* - * Allows other apps to push events into statsd. - * Logged from: - * frameworks/base/core/java/android/util/StatsLog.java - */ -message AppBreadcrumbReported { - // The uid of the application that sent this custom atom. - optional int32 uid = 1 [(is_uid) = true]; - - // An arbitrary label chosen by the developer. For Android P, the label should be in [0, 16). - optional int32 label = 2; - - // Allows applications to easily use a custom event as start/stop boundaries (ie, define custom - // predicates for the metrics). - enum State { - UNKNOWN = 0; - UNSPECIFIED = 1; // For events that are known to not represent START/STOP. - STOP = 2; - START = 3; - } - optional State state = 3; -} - -/** - * Logs the wall-clock time when a significant wall-clock time shift occurs. - * For example, this could be due to the user manually changing the time. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/AlarmManagerService.java - */ -message WallClockTimeShifted { - // New wall-clock time in milliseconds, according to System.currentTimeMillis(). - optional int64 wall_clock_timestamp_millis = 1; -} - -/** - * Logs when statsd detects an anomaly. - * - * Logged from: - * frameworks/base/cmds/statsd/src/anomaly/AnomalyTracker.cpp - */ -message AnomalyDetected { - // Uid that owns the config whose anomaly detection alert fired. - optional int32 config_uid = 1 [(is_uid) = true]; - - // Id of the config whose anomaly detection alert fired. - optional int64 config_id = 2; - - // Id of the alert (i.e. name of the anomaly that was detected). - optional int64 alert_id = 3; -} - -message AppStartOccurred { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The app package name. - optional string pkg_name = 2; - - enum TransitionType { - UNKNOWN = 0; - WARM = 1; - HOT = 2; - COLD = 3; - } - // The transition type. - optional TransitionType type = 3; - - // The activity name. - optional string activity_name = 4; - - // The name of the calling app. Empty if not set. - optional string calling_pkg_name = 5; - - // Whether the app is an instant app. - optional bool is_instant_app = 6; - - // Device uptime when activity started. - optional int64 activity_start_millis = 7; - - optional android.app.AppTransitionReasonEnum reason = 8; - - optional int32 transition_delay_millis = 9; - // -1 if not set. - optional int32 starting_window_delay_millis = 10; - // -1 if not set. - optional int32 bind_application_delay_millis = 11; - optional int32 windows_drawn_delay_millis = 12; - - // Empty if not set. - optional string launch_token = 13; - - // The compiler filter used when when the package was optimized. - optional int32 package_optimization_compilation_filter = 14; - - // The reason why the package was optimized. - optional int32 package_optimization_compilation_reason = 15; -} - -message AppStartCanceled { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The app package name. - optional string pkg_name = 2; - - enum TransitionType { - UNKNOWN = 0; - WARM = 1; - HOT = 2; - COLD = 3; - } - // The transition type. - optional TransitionType type = 3; - - // The activity name. - optional string activity_name = 4; -} - -message AppStartFullyDrawn { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The app package name. - optional string pkg_name = 2; - - enum TransitionType { - UNKNOWN = 0; - WITH_BUNDLE = 1; - WITHOUT_BUNDLE = 2; - } - // The transition type. - optional TransitionType type = 3; - - // The activity name. - optional string activity_name = 4; - - optional bool transition_process_running = 5; - - // App startup time (until call to Activity#reportFullyDrawn()). - optional int64 app_startup_time_millis = 6; -} - -/** - * Logs a picture-in-picture action - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - * frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java - * frameworks/base/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java - */ -message PictureInPictureStateChanged { - // -1 if it is not available - optional int32 uid = 1 [(is_uid) = true]; - - optional string short_name = 2; - - enum State { - ENTERED = 1; - EXPANDED_TO_FULL_SCREEN = 2; - MINIMIZED = 3; - DISMISSED = 4; - } - optional State state = 3; -} - -/** - * Logs overlay action - * Logged from: - * services/core/java/com/android/server/wm/Session.java - */ -message OverlayStateChanged { - optional int32 uid = 1 [(state_field_option).primary_field = true, (is_uid) = true]; - - optional string package_name = 2 [(state_field_option).primary_field = true]; - - optional bool using_alert_window = 3; - - enum State { - ENTERED = 1; - EXITED = 2; - } - optional State state = 4 - [(state_field_option).exclusive_state = true, (state_field_option).nested = false]; -} - -/** - * Logs foreground service starts and stops. - * Note that this is not when a service starts or stops, but when it is - * considered foreground. - * Logged from - * frameworks/base/services/core/java/com/android/server/am/ActiveServices.java - */ -message ForegroundServiceStateChanged { - optional int32 uid = 1 [(is_uid) = true]; - // package_name + "/" + class_name - optional string short_name = 2; - - enum State { - ENTER = 1; - EXIT = 2; - } - optional State state = 3; - - // Whether the fgs is allowed while-in-use permissions, i.e. is considered 'in-use' to the user. - // (If the fgs was started while the app wasn't TOP it usually will be denied these permissions) - optional bool allow_while_in_use_permission = 4; -} - -/** - * Logs the number of times a uid accesses a sensitive AppOp during a foreground service session. - * A foreground service session is any continuous period during which the uid holds at least one - * foreground service; the atom will be pushed when the uid no longer holds any foreground services. - * Accesses initiated while the uid is in the TOP state are ignored. - * Sessions with no attempted accesses are not logged. - * Logged from - * frameworks/base/services/core/java/com/android/server/am/ActiveServices.java - */ -message ForegroundServiceAppOpSessionEnded { - optional int32 uid = 1 [(is_uid) = true]; - - // The operation's name. - // Only following four ops are logged - // COARSE_LOCATION = 0 - // FINE_LOCATION = 1 - // CAMERA = 26 - // RECORD_AUDIO = 27 - optional android.app.AppOpEnum app_op_name = 2 [default = APP_OP_NONE]; - - // The uid's permission mode for accessing the AppOp during this fgs session. - enum Mode { - MODE_UNKNOWN = 0; - MODE_ALLOWED = 1; // Always allowed - MODE_IGNORED = 2; // Denied - MODE_FOREGROUND = 3; // Allow-while-in-use (or allowed-one-time) - } - optional Mode app_op_mode = 3; - - // Number of times this AppOp was requested and allowed. - optional int32 count_ops_accepted = 4; - // Number of times this AppOp was requested but denied. - optional int32 count_ops_rejected = 5; -} - -/** - * Logs creation or removal of an isolated uid. Isolated uid's are temporary uid's to sandbox risky - * behavior in its own uid. However, the metrics of these isolated uid's almost always should be - * attributed back to the parent (host) uid. One example is Chrome. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message IsolatedUidChanged { - // The host UID. Generally, we should attribute metrics from the isolated uid to the host uid. - // NOTE: DO NOT annotate uid field in this atom. This atom is specially handled in statsd. - // This field is ignored when event == REMOVED. - optional int32 parent_uid = 1; - - optional int32 isolated_uid = 2; - - // We expect an isolated uid to be removed before if it's used for another parent uid. - enum Event { - REMOVED = 0; - CREATED = 1; - } - optional Event event = 3; -} - -/* - * Logs the reception of an incoming network packet causing the main system to wake up for - * processing that packet. These events are notified by the kernel via Netlink NFLOG to Netd - * and processed by WakeupController.cpp. - */ -message PacketWakeupOccurred { - // The uid owning the socket into which the packet was delivered, or -1 if the packet was - // delivered nowhere. - optional int32 uid = 1 [(is_uid) = true]; - // The interface name on which the packet was received. - optional string iface = 2; - // The ethertype value of the packet. - optional int32 ethertype = 3; - // String representation of the destination MAC address of the packet. - optional string destination_hardware_address = 4; - // String representation of the source address of the packet if this was an IP packet. - optional string source_ip = 5; - // String representation of the destination address of the packet if this was an IP packet. - optional string destination_ip = 6; - // The value of the protocol field if this was an IPv4 packet or the value of the Next Header - // field if this was an IPv6 packet. The range of possible values is the same for both IP - // families. - optional int32 ip_next_header = 7; - // The source port if this was a TCP or UDP packet. - optional int32 source_port = 8; - // The destination port if this was a TCP or UDP packet. - optional int32 destination_port = 9; -} - -/* - * Logs the memory stats for an app on startup. - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message AppStartMemoryStateCaptured { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The process name. - optional string process_name = 2; - - // The activity name. - optional string activity_name = 3; - - // # of page-faults - optional int64 page_fault = 4; - - // # of major page-faults - optional int64 page_major_fault = 5; - - // RSS - optional int64 rss_in_bytes = 6; - - // CACHE - optional int64 cache_in_bytes = 7; - - // SWAP - optional int64 swap_in_bytes = 8; -} - -/* - * Logs the change in Low Memory Killer Daemon (LMKD) state which is used as start/stop boundaries - * for LMK event. - * Logged from: - * system/core/lmkd/lmkd.c - */ -message LmkStateChanged { - enum State { - UNKNOWN = 0; - START = 1; - STOP = 2; - } - optional State state = 1; -} - -/* - * Logs the event when Low Memory Killer Daemon (LMKD) kills a process to reduce memory pressure. - * Logged from: - * system/core/lmkd/lmkd.c - */ -message LmkKillOccurred { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The process name. - optional string process_name = 2; - - // oom adj score. - optional int32 oom_adj_score = 3; - - // # of page-faults - optional int64 page_fault = 4; - - // # of major page-faults - optional int64 page_major_fault = 5; - - // RSS - optional int64 rss_in_bytes = 6; - - // CACHE - optional int64 cache_in_bytes = 7; - - // SWAP - optional int64 swap_in_bytes = 8; - - // The elapsed real time of start of the process. - optional int64 process_start_time_nanos = 9; - - // Min oom adj score considered by lmkd. - optional int32 min_oom_score = 10; -} - -/* - * Logs when the ActivityManagerService detects that an app died. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message AppDied { - // timestamp(elapsedRealtime) of record creation - optional uint64 timestamp_millis = 1 [(state_field_option).exclusive_state = true]; -} - -/** - * An atom for generic metrics logging. Available from Android Q. - */ -message GenericAtom { - // The uid of the application that sent this custom atom. - optional int32 uid = 1 [(is_uid) = true]; - - // An event_id indicates the type of event. - optional android.stats.EventType event_id = 2; -} - -/** - * Atom for simple logging of user interaction and impression events, such as "the user touched - * this button" or "this dialog was displayed". - * Keep the UI event stream clean: don't use for system or background events. - * Log using the UiEventLogger wrapper - don't write with the StatsLog API directly. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/ - * frameworks/base/packages/SystemUI/src/com/android/systemui/ - */ -message UiEventReported { - // The event_id. - optional int32 event_id = 1; - // The event's source or target uid and package, if applicable. - // For example, the package posting a notification, or the destination package of a share. - optional int32 uid = 2 [(is_uid) = true]; - optional string package_name = 3; - // An identifier used to disambiguate which logs refer to a particular instance of some - // UI element. Useful when there might be multiple instances simultaneously active. - optional int32 instance_id = 4; -} - -/** - * Reports a notification was created or updated. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/notification/ - */ -message NotificationReported { - // The event_id (as for UiEventReported). - optional int32 event_id = 1; - // The notifying app's uid and package. - optional int32 uid = 2 [(is_uid) = true]; - optional string package_name = 3; - // A small system-assigned identifier for the notification. - // Locally probably-unique, but expect collisions across users and/or days. - optional int32 instance_id = 4; - optional int32 notification_id_hash = 5; // Small hash of the app-assigned notif ID + tag - optional int32 channel_id_hash = 6; // Small hash of app-assigned channel ID - - // Grouping information - optional int32 group_id_hash = 7; // Small hash of the group ID of the notification - optional int32 group_instance_id = 8; // Instance_id of the group-summary notification - optional bool is_group_summary = 9; // Tags the group-summary notification - - // Attributes - optional string category = 10; // App-assigned notification category (API-defined strings) - optional int32 style = 11; // App-assigned notification style - optional int32 num_people = 12; // Number of Person records attached to the notification - - // Ordering, importance and interruptiveness - - optional int32 position = 13; // Position in NotificationManager's list - - optional android.stats.sysui.NotificationImportance importance = 14; - optional int32 alerting = 15; // Bitfield, 1=buzz 2=beep 4=blink - - enum NotificationImportanceExplanation { - IMPORTANCE_EXPLANATION_UNKNOWN = 0; - IMPORTANCE_EXPLANATION_APP = 1; // App-specified channel importance. - IMPORTANCE_EXPLANATION_USER = 2; // User-specified channel importance. - IMPORTANCE_EXPLANATION_ASST = 3; // Notification Assistant override. - IMPORTANCE_EXPLANATION_SYSTEM = 4; // System override. - // Like _APP, but based on pre-channels priority signal. - IMPORTANCE_EXPLANATION_APP_PRE_CHANNELS = 5; - } - - optional NotificationImportanceExplanation importance_source = 16; - optional android.stats.sysui.NotificationImportance importance_initial = 17; - optional NotificationImportanceExplanation importance_initial_source = 18; - optional android.stats.sysui.NotificationImportance importance_asst = 19; - optional int32 assistant_hash = 20; - optional float assistant_ranking_score = 21; -} - -message Notification { - // The notifying app's uid and package. - optional int32 uid = 1 [(is_uid) = true]; - optional string package_name = 2; - // A small system-assigned identifier for the notification. - optional int32 instance_id = 3; - - // Grouping information. - optional int32 group_instance_id = 4; - optional bool is_group_summary = 5; - - // The section of the shade that the notification is in. - // See NotificationSectionsManager.PriorityBucket. - enum NotificationSection { - SECTION_UNKNOWN = 0; - SECTION_HEADS_UP = 1; - SECTION_MEDIA_CONTROLS = 2; - SECTION_PEOPLE = 3; - SECTION_ALERTING = 4; - SECTION_SILENT = 5; - } - optional NotificationSection section = 6; -} - -message NotificationList { - repeated Notification notifications = 1; // An ordered sequence of notifications. -} - -/** - * Reports a notification panel was displayed, e.g. from the lockscreen or status bar. - * - * Logged from: - * frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/ - */ -message NotificationPanelReported { - // The event_id (as for UiEventReported). - optional int32 event_id = 1; - optional int32 num_notifications = 2; - // The notifications in the panel, in the order that they appear there. - optional NotificationList notifications = 3 [(log_mode) = MODE_BYTES]; -} - -/** - * Reports a notification channel, or channel group, was created, updated, or deleted. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/notification/ - */ -message NotificationChannelModified { - // The event_id (as for UiEventReported). - optional int32 event_id = 1; - // The notifying app's uid and package. - optional int32 uid = 2 [(is_uid) = true]; - optional string package_name = 3; - // Hash of app-assigned notification channel ID or channel-group ID - optional int32 channel_id_hash = 4; - // Previous importance setting, if applicable - optional android.stats.sysui.NotificationImportance old_importance = 5; - // New importance setting - optional android.stats.sysui.NotificationImportance importance = 6; -} - - -/** - * Logs when a biometric acquire event occurs. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/biometrics - */ -message BiometricAcquired { - // Biometric modality that was acquired. - optional android.hardware.biometrics.ModalityEnum modality = 1; - // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java. - optional int32 user = 2; - // If this acquire is for a crypto operation. e.g. Secure purchases, unlock password storage. - optional bool is_crypto = 3; - // Action that the device is performing. Acquired messages are only expected for enroll and - // authenticate. Other actions may indicate an error. - optional android.hardware.biometrics.ActionEnum action = 4; - // The client that this acquisition was received for. - optional android.hardware.biometrics.ClientEnum client = 5; - // Acquired constants, e.g. ACQUIRED_GOOD. See constants defined by <Biometric>Manager. - optional int32 acquire_info = 6; - // Vendor-specific acquire info. Valid only if acquire_info == ACQUIRED_VENDOR. - optional int32 acquire_info_vendor = 7; - // Dictates if this message should trigger additional debugging. - optional bool debug = 8; -} - -/** - * Logs when a biometric authentication event occurs. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/biometrics - */ -message BiometricAuthenticated { - // Biometric modality that was used. - optional android.hardware.biometrics.ModalityEnum modality = 1; - // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java - optional int32 user = 2; - // If this authentication is for a crypto operation. e.g. Secure purchases, unlock password - // storage. - optional bool is_crypto = 3; - // The client that this acquisition was received for. - optional android.hardware.biometrics.ClientEnum client = 4; - // If authentication requires user confirmation. See BiometricPrompt's - // setRequireConfirmation(bool) method. - optional bool require_confirmation = 5; - - enum State { - UNKNOWN = 0; - REJECTED = 1; - PENDING_CONFIRMATION = 2; - CONFIRMED = 3; - } - - // State of the current auth attempt. - optional State state = 6; - // Time it took to authenticate. For BiometricPrompt where setRequireConfirmation(false) is - // specified and supported by the biometric modality, this is from the first ACQUIRED_GOOD to - // AUTHENTICATED. for setRequireConfirmation(true), this is from PENDING_CONFIRMATION to - // CONFIRMED. - optional int64 latency_millis = 7; - // Dictates if this message should trigger additional debugging. - optional bool debug = 8; -} - -/** - * Logs when a biometric error occurs. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/biometrics - */ -message BiometricErrorOccurred { - // Biometric modality that was used. - optional android.hardware.biometrics.ModalityEnum modality = 1; - // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java - optional int32 user = 2; - // If this error is for a crypto operation. e.g. Secure purchases, unlock password storage. - optional bool is_crypto = 3; - // Action that the device is performing. - optional android.hardware.biometrics.ActionEnum action = 4; - // The client that this acquisition was received for. - optional android.hardware.biometrics.ClientEnum client = 5; - // Error constants. See constants defined by <Biometric>Manager. Enums won't work since errors - // are unique to modality. - optional int32 error_info = 6; - // Vendor-specific error info. Valid only if acquire_info == ACQUIRED_VENDOR. These are defined - // by the vendor and not specified by the HIDL interface. - optional int32 error_info_vendor = 7; - // Dictates if this message should trigger additional debugging. - optional bool debug = 8; - // Time spent during the authentication attempt. - optional int64 latency_millis = 9; -} - -/** - * Logs when a system health issue is detected. - * Logged from: - * frameworks/base/services/core/java/com/android/server/biometrics - */ -message BiometricSystemHealthIssueDetected { - // Biometric modality. - optional android.hardware.biometrics.ModalityEnum modality = 1; - // Type of issue detected. - optional android.hardware.biometrics.IssueEnum issue = 2; - // Dictates if this message should trigger additional debugging. - optional bool debug = 3; -} - -/** - * Logs when a biometric enrollment occurs. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/biometrics - */ -message BiometricEnrolled { - // Biometric modality that was used. - optional android.hardware.biometrics.ModalityEnum modality = 1; - // The associated user. Eg: 0 for owners, 10+ for others. Defined in android/os/UserHandle.java - optional int32 user = 2; - // The amount of time the enrollment took in milliseconds. - optional int64 latency_millis = 3; - // Whether or not the enrollment was successful. - optional bool success = 4; -} - -/* - * Logs when a flag flip update occurrs. Used for mainline modules that update via flag flips. - */ -message FlagFlipUpdateOccurred { - // If the event is from a flag config package, specify the package name. - optional string flag_flip_package_name = 1; - - // The order id of the package - optional int64 order_id = 2; -} - -/** - * Potential experiment ids that goes with a train install. - * Should be kept in sync with experiment_ids.proto. - */ -message TrainExperimentIds { - repeated int64 experiment_id = 1; -} - -/* - * Logs when a binary push state changes. - * Logged by the installer via public api. - */ -message BinaryPushStateChanged { - // Name of the train. - optional string train_name = 1; - // Version code for a "train" of packages that need to be installed atomically - optional int64 train_version_code = 2; - // After installation of this package, device requires a restart. - optional bool requires_staging = 3; - // Rollback should be enabled for this install. - optional bool rollback_enabled = 4; - // Requires low latency monitoring if possible. - optional bool requires_low_latency_monitor = 5; - - enum State { - UNKNOWN = 0; - INSTALL_REQUESTED = 1; - INSTALL_STARTED = 2; - INSTALL_STAGED_NOT_READY = 3; - INSTALL_STAGED_READY = 4; - INSTALL_SUCCESS = 5; - // Replaced by INSTALL_FAILURE_DOWNLOAD, INSTALL_FAILURE_STATE_MISMATCH, - // and INSTALL_FAILURE_COMMIT. - INSTALL_FAILURE = 6 [deprecated = true]; - // This enum is for installs that are manually cancelled via the Manual Update UI. - INSTALL_CANCELLED = 7; - INSTALLER_ROLLBACK_REQUESTED = 8; - INSTALLER_ROLLBACK_INITIATED = 9; - INSTALLER_ROLLBACK_INITIATED_FAILURE = 10; - INSTALLER_ROLLBACK_STAGED = 11; - INSTALLER_ROLLBACK_STAGED_FAILURE = 12; - INSTALLER_ROLLBACK_BOOT_TRIGGERED = 13; - INSTALLER_ROLLBACK_BOOT_TRIGGERED_FAILURE = 14; - INSTALLER_ROLLBACK_SUCCESS = 15; - INSTALLER_ROLLBACK_FAILURE = 16; - INSTALLER_ROLLBACK_STAGED_CANCEL_REQUESTED = 17; - INSTALLER_ROLLBACK_STAGED_CANCEL_SUCCESS = 18; - INSTALLER_ROLLBACK_STAGED_CANCEL_FAILURE = 19; - INSTALL_STAGED_CANCEL_REQUESTED = 20; - INSTALL_STAGED_CANCEL_SUCCESS = 21; - INSTALL_STAGED_CANCEL_FAILURE = 22; - INSTALL_FAILURE_DOWNLOAD = 23; - INSTALL_FAILURE_STATE_MISMATCH = 24; - INSTALL_FAILURE_COMMIT = 25; - REBOOT_TRIGGERED = 26; - } - optional State state = 6; - // Possible experiment ids for monitoring this push. - optional TrainExperimentIds experiment_ids = 7 [(log_mode) = MODE_BYTES]; - // user id - optional int32 user_id = 8; - optional int32 reason = 9; - // Whether or not this is a rollback event - optional bool is_rollback = 10; -} - -/* Test atom, is not logged anywhere */ -message TestAtomReported { - repeated AttributionNode attribution_node = 1; - optional int32 int_field = 2; - optional int64 long_field = 3; - optional float float_field = 4; - optional string string_field = 5; - optional bool boolean_field = 6; - enum State { - UNKNOWN = 0; - OFF = 1; - ON = 2; - } - optional State state = 7; - optional TrainExperimentIds bytes_field = 8 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** Represents USB port overheat event. */ -message UsbPortOverheatEvent { - /* Temperature of USB port at USB plug event, in 1/10ths of degree C. */ - optional int32 plug_temperature_deci_c = 1; - - /* Maximum temperature of USB port during overheat event, in 1/10ths of degree C. */ - optional int32 max_temperature_deci_c = 2; - - /* Time between USB plug event and overheat threshold trip, in seconds. */ - optional int32 time_to_overheat_secs = 3; - - /* Time between overheat threshold trip and hysteresis, in seconds. */ - optional int32 time_to_hysteresis_secs = 4; - - /* Time between hysteresis and active mitigation ending, in seconds. */ - optional int32 time_to_inactive_secs = 5; -}; - -/** - * Logs total effective full charge and discharge cycles on a battery. - * Here are some examples of one effective cycle: - * 1) the battery charges from 0% to 100% and drains back to 0%, - * 2) charging from 50% to 100% and draining back to 50% twice. - * Pulled from: - * frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp - */ -message BatteryCycleCount { - /* Number of total charge and discharge cycles on the system battery. */ - optional int32 cycle_count = 1; -} - -/** - * Logs that external storage is mounted and information about it, the storage type (sd card/usb/ - * others), its type (public or private) and the size in bytes. - * Pulled from: - * StatsCompanionService - */ - -message ExternalStorageInfo { - - enum VolumeType { - UNKNOWN = 0; - PUBLIC = 1; - PRIVATE = 2; - OTHER = 3; - } - - // The type of external storage. - optional android.stats.storage.ExternalStorageType storage_type = 1; - // Type of the volume: TYPE_PUBLIC if portable and TYPE_PRIVATE if internal. - optional VolumeType volume_type = 2; - // Total size of the sd card in bytes. - optional int64 size_bytes = 3; -} - -/* - * Logs when a connection becomes available and lost. - * Logged in StatsCompanionService.java - */ -message ConnectivityStateChanged { - // Id of the network. - optional int32 net_id = 1; - - enum State { - UNKNOWN = 0; - CONNECTED = 1; - DISCONNECTED = 2; - } - // Connected state of a network. - optional State state = 2; -} - -/** - * Logs when a service starts and stops. - * Logged from: - * services/core/java/com/android/server/am/ActiveServices.java - */ -message ServiceStateChanged { - - optional int32 uid = 1 [(is_uid) = true]; - - optional string package_name = 2; - - optional string service_name = 3; - - enum State { - START = 1; - STOP = 2; - } - - optional State state = 4; -} - -/** - * Logs when a service is launched. - * Logged from: - * services/core/java/com/android/server/am/ActiveServices.java - */ -message ServiceLaunchReported { - - optional int32 uid = 1 [(is_uid) = true]; - - optional string package_name = 2; - - optional string service_name = 3; -} - -/** - * Logs when a hidden API is used. - * - * Logged from: - * libcore/libart/src/main/java/dalvik/system/VMRuntime.java - */ -message HiddenApiUsed { - // The uid of the app making the hidden access. - optional int32 uid = 1 [(is_uid) = true]; - - // Signature of the method or field accessed. - optional string signature = 2; - - enum AccessMethod { - NONE = 0; - REFLECTION = 1; - JNI = 2; - LINKING = 3; - } - - // Type of access. - optional AccessMethod access_method = 3; - - // Whether the access was prevented or not. - optional bool access_denied = 4; -} - -/** - * Logs user interaction with the Privacy Indicators added in Q. In particular: - * - When user sees privacy chip - * - When user clicks privacy chip - * - How does the user exit the Privacy Dialog - * Logged from: - * packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java - */ -message PrivacyIndicatorsInteracted { - - enum Type { - UNKNOWN = 0; - CHIP_VIEWED = 1; - CHIP_CLICKED = 2; - DIALOG_PRIVACY_SETTINGS = 3; - DIALOG_DISMISS = 4; - DIALOG_LINE_ITEM = 5; - } - - optional Type type = 1 [(state_field_option).exclusive_state = true]; - - // Used if the type is LINE_ITEM - optional string package_name = 2; -} - -/** - * Logs information about a package that is moved from the internal to external storage and vice - * versa. - * It logs the package name, the type of the external storage where the package is installed - * (if moved to external storage, or UNKNOWN if moved to internal storage), - * and the move type: if it's from internal to external or the other way around. - * - * Logged from: - frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java - */ -message AppMovedStorageReported { - enum MoveType { - UNKNOWN = 0; - TO_EXTERNAL = 1; - TO_INTERNAL = 2; - } - // The type of the external storage. - optional android.stats.storage.ExternalStorageType external_storage_type = 1; - // The type of move. - optional MoveType move_type = 2; - // The name of the package that was moved. - optional string package_name = 3; -} - -/** - * Logs when system server watchdog occurs. - * Logged from: - * frameworks/base/services/core/java/com/android/server/Watchdog.java - */ -message SystemServerWatchdogOccurred { - optional string subject = 1; -} - -/** - * Logs when new file added to tombstones. - * Logged from: - * frameworks/base/core/java/com/android/server/BootReceiver.java - */ -message TombStoneOccurred { -} - -/* - * Information about a role request - * - * Logged from: - * packages/apps/PermissionController/src/com/android/packageinstaller/role/ui/RequestRoleFragment.java - */ -message RoleRequestResultReported { - // UID of application requesting the role - optional int32 requesting_uid = 1; - - // Package name of application requesting the role - optional string requesting_package_name = 2; - - // The role to be granted - optional string role_name = 3; - - // The count of applications qualifying for the role - optional int32 qualifying_count = 4; - - // UID of application current granted the role - optional int32 current_uid = 5; - - // Package name of application current granted the role - optional string current_package_name = 6; - - // UID of another application that user chose to grant the role to, instead of the requesting - // application - optional int32 granted_another_uid = 7; - - // Package name of another application that user chose to grant the role to, instead of the - // requesting application - optional string granted_another_package_name = 8; - - enum Result { - UNDEFINED = 0; - // role request was ignored - IGNORED = 1; - // role request was ignored because it's already granted - IGNORED_ALREADY_GRANTED = 2; - // role request was ignored because the application isn't qualified - IGNORED_NOT_QUALIFIED = 3; - // role request was ignored because user said it should be always denied - IGNORED_USER_ALWAYS_DENIED = 4; - // role was granted by user action - USER_GRANTED = 5; - // role was denied by user action - USER_DENIED = 6; - // role was denied by user granting another application the role - USER_DENIED_GRANTED_ANOTHER = 7; - // role was denied and set to be always denied by the user - USER_DENIED_WITH_ALWAYS = 8; - } - // The result of the role request - optional Result result = 9; -} - -/** - * Logs when a Vehicle Maps Service client's connection state has changed - * - * Logged from: - * packages/services/Car/service/src/com/android/car/stats/VmsClientLog.java - */ -message VmsClientConnectionStateChanged { - // The UID of the VMS client app - optional int32 uid = 1 [(is_uid) = true]; - - enum State { - UNKNOWN = 0; - // Attempting to connect to the client - CONNECTING = 1; - // Client connection established - CONNECTED = 2; - // Client connection closed unexpectedly - DISCONNECTED = 3; - // Client connection closed by VMS - TERMINATED = 4; - // Error establishing the client connection - CONNECTION_ERROR = 5; - } - - optional State state = 2; -} - -message MimeTypes { - repeated string mime_types = 1; -} - -/** - * Logs statistics regarding accesses to external storage. - * All stats are normalized for one day period. - * - * Logged from: - * packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java - */ -message GeneralExternalStorageAccessStats { - optional int32 uid = 1 [(is_uid) = true]; - // Total number of accesses like creation, open, delete and rename/update. - // Includes file path and ContentResolver accesses - optional uint32 total_accesses = 2; - // Number of file path accesses, as opposed to file path and ContentResolver. - optional uint32 file_path_accesses = 3; - // Number of accesses on secondary volumes like SD cards. - // Includes file path and ContentResolver accesses - optional uint32 secondary_storage_accesses = 4; - // Comma-separated list of mime types that were accessed. - optional MimeTypes mime_types_accessed = 5; -} - -/** - * Logs when MediaProvider has successfully finished scanning a storage volume. - * - * Logged from: - * packages/providers/MediaProvider/src/com/android/providers/media/scan/ModernMediaScanner.java - */ -message MediaProviderScanOccurred { - enum Reason { - // Scan triggered due to unknown reason - UNKNOWN = 0; - // Scan triggered due to storage volume being mounted - MOUNTED = 1; - // Scan triggered due to explicit user action or app request - DEMAND = 2; - // Scan triggered due to idle maintenance - IDLE = 3; - } - - // Volume type that this event pertains to - optional android.stats.mediaprovider.VolumeType volume_type = 1; - // Reason why this scan was triggered - optional Reason reason = 2; - // Total number of files scanned - optional int64 item_count = 3; - // Duration of scan, normalized per file - optional float normalized_duration_millis = 4; - // Number of database inserts, normalized per file - optional float normalized_insert_count = 5; - // Number of database updates, normalized per file - optional float normalized_update_count = 6; - // Number of database deletes, normalized per file - optional float normalized_delete_count = 7; -} - -/** - * Logs when an app has asked MediaProvider to delete media belonging to the user. - * - * Logged from: - * packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java - */ -message MediaContentDeleted { - // Volume type that this event pertains to - optional android.stats.mediaprovider.VolumeType volume_type = 1; - // UID of app that requested deletion - optional int32 uid = 2 [(is_uid) = true]; - // Number of items that were deleted - optional int32 item_count = 3; -} - -/** - * Logs when an app has asked MediaProvider to grant them access to media belonging to the user. - * - * Logged from: - * packages/providers/MediaProvider/src/com/android/providers/media/PermissionActivity.java - */ -message MediaProviderPermissionRequested { - enum Result { - UNKNOWN = 0; - USER_GRANTED = 1; - AUTO_GRANTED = 2; - USER_DENIED = 3; - USER_DENIED_WITH_PREJUDICE = 4; - AUTO_DENIED = 5; - } - - // Volume type that this event pertains to - optional android.stats.mediaprovider.VolumeType volume_type = 1; - // UID of app that requested permission - optional int32 uid = 2 [(is_uid) = true]; - // Number of items that were requested - optional int32 item_count = 3; - // Result of this request - optional Result result = 4; -} - -/** - * Logs when MediaProvider has finished upgrading or downgrading its database schema. - * - * Logged from: - * packages/providers/MediaProvider/src/com/android/providers/media/DatabaseHelper.java - */ -message MediaProviderSchemaChanged { - // Volume type that this event pertains to - optional android.stats.mediaprovider.VolumeType volume_type = 1; - // Old database version code - optional int32 version_from = 2; - // New database version code - optional int32 version_to = 3; - // Total number of files in database - optional int64 item_count = 4; - // Duration of schema change, normalized per file - optional float normalized_duration_millis = 5; -} - -/** - * Logs when MediaProvider has finished an idle maintenance job. - * - * Logged from: - * packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java - */ -message MediaProviderIdleMaintenanceFinished { - // Volume type that this event pertains to - optional android.stats.mediaprovider.VolumeType volume_type = 1; - - // Total number of files in database - optional int64 item_count = 2; - // Duration of idle maintenance, normalized per file - optional float normalized_duration_millis = 3; - // Number of thumbnails found to be stale, normalized per file - optional float normalized_stale_thumbnails = 4; - // Number of items found to be expired, normalized per file - optional float normalized_expired_media = 5; -} - -/** - * Represents boot time event with duration in ms. - * - * Logged from: bootstat and various system server components. Check each enums for details. - */ -message BootTimeEventDuration { - enum DurationEvent { - UNKNOWN = 0; - // Bootloader time excluding BOOTLOADER_UI_WAIT + boot complete time. Logged from bootstat. - ABSOLUTE_BOOT_TIME = 1; - // Bootloader's 1st stage execution time. - // Logged from bootstat. - BOOTLOADER_FIRST_STAGE_EXEC = 2; - // Bootloader's 1st stage loading time. - // Logged from bootstat. - BOOTLOADER_FIRST_STAGE_LOAD = 3; - // Bootloader's kernel loading time. - // Logged from bootstat. - BOOTLOADER_KERNEL_LOAD = 4; - // Bootloader's 2nd stage execution time. - // Logged from bootstat. - BOOTLOADER_SECOND_STAGE_EXEC = 5; - // Bootloader's 2nd stage loading time. - // Logged from bootstat. - BOOTLOADER_SECOND_STAGE_LOAD = 6; - // Duration for Bootloader to show unlocked device's warning UI. This should not happen - // for locked device. - // Logged from bootstat. - BOOTLOADER_UI_WAIT = 7; - // Total time spend in bootloader. This is the sum of all BOOTLOADER_* listed above. - // Logged from bootstat. - BOOTLOADER_TOTAL = 8; - // Shutdown duration inside init for the reboot before the current boot up. - // Logged from f/b/services/.../BootReceiver.java. - SHUTDOWN_DURATION = 9; - // Total time for mounting of disk devices during bootup. - // Logged from f/b/services/.../BootReceiver.java. - MOUNT_DEFAULT_DURATION = 10; - // Total time for early stage mounting of disk devices during bootup. - // Logged from f/b/services/.../BootReceiver.java. - MOUNT_EARLY_DURATION = 11; - // Total time for late stage mounting of disk devices during bootup. - // Logged from f/b/services/.../BootReceiver.java. - MOUNT_LATE_DURATION = 12; - // Average time to scan non-system app after OTA - // Logged from f/b/services/.../PackageManagerService.java - OTA_PACKAGE_MANAGER_INIT_TIME = 13; - // Time to initialize Package manager after OTA - // Logged from f/b/services/.../PackageManagerService.java - OTA_PACKAGE_MANAGER_DATA_APP_AVG_SCAN_TIME = 14; - // Time to scan all system app from Package manager after OTA - // Logged from f/b/services/.../PackageManagerService.java - OTA_PACKAGE_MANAGER_SYSTEM_APP_AVG_SCAN_TIME = 15; - // Init's total time for cold boot stage. - // Logged from bootstat. - COLDBOOT_WAIT = 16; - // Init's total time for initializing selinux. - // Logged from bootstat. - SELINUX_INIT = 17; - // Time since last factory reset. - // Logged from bootstat. - FACTORY_RESET_TIME_SINCE_RESET = 18; - // Init's total time spent for completing the 1st stage. - // Logged from bootstat. - ANDROID_INIT_STAGE_1 = 19; - } - - // Type of the event. - optional DurationEvent event = 1; - // Duration of the event in ms. - optional int64 duration_millis = 2; -} - -/** - * Represents the start of specific boot time event during bootup in ms. This is usually a time - * since boot-up. - * - * Logged from: bootstat and various system server components. Check each enums for details. - */ -message BootTimeEventElapsedTime { - enum ElapsedTimeEvent { - UNKNOWN = 0; - // Time when init starts 1st stage. Logged from bootstat. - ANDROID_INIT_STAGE_1 = 1; - // Time when sys.boot_completed prop is set. - // Logged from bootstat. - BOOT_COMPLETE = 2; - // BOOT_COMPLETE for encrypted device. - BOOT_COMPLETE_ENCRYPTION = 3; - // BOOT_COMPLETE for device with no encryption. - BOOT_COMPLETE_NO_ENCRYPTION = 4; - // Adjusted BOOT_COMPLETE for encrypted device extracting decryption time. - BOOT_COMPLETE_POST_DECRYPT = 5; - // BOOT_COMPLETE after factory reset. - FACTORY_RESET_BOOT_COMPLETE = 6; - // BOOT_COMPLETE_NO_ENCRYPTION after factory reset. - FACTORY_RESET_BOOT_COMPLETE_NO_ENCRYPTION = 7; - // BOOT_COMPLETE_POST_DECRYPT after factory reset. - FACTORY_RESET_BOOT_COMPLETE_POST_DECRYPT = 8; - // BOOT_COMPLETE after OTA. - OTA_BOOT_COMPLETE = 9; - // BOOT_COMPLETE_NO_ENCRYPTION after OTA. - OTA_BOOT_COMPLETE_NO_ENCRYPTION = 10; - // BOOT_COMPLETE_POST_DECRYPT after OTA. - OTA_BOOT_COMPLETE_POST_DECRYPT = 11; - // Time when the system starts sending LOCKED_BOOT_COMPLETED broadcast. - // Logged from f/b/services/.../UserController.java - FRAMEWORK_LOCKED_BOOT_COMPLETED = 12; - // Time when the system starts sending BOOT_COMPLETED broadcast. - // Logged from f/b/services/.../UserController.java - FRAMEWORK_BOOT_COMPLETED = 13; - // Time when the package manager starts init. - // Logged from f/b/services/.../SystemServer.java - PACKAGE_MANAGER_INIT_START = 14; - // Time when package manager is ready - // Logged from f/b/services/.../SystemServer.java - PACKAGE_MANAGER_INIT_READY = 15; - // Represents the time when user has entered unlock credential for system with user pin. - // Logged from bootstat. - POST_DECRYPT = 16; - // Represents the start of zygote's init. - // Logged from zygote itself. - ZYGOTE_INIT_START = 17; - // Represents the start of secondary zygote's init. - // TODO: add logging to zygote - SECONDARY_ZYGOTE_INIT_START = 18; - // Represents the start of system server's init. - // Logged from f/b/services/.../SystemServer.java - SYSTEM_SERVER_INIT_START = 19; - // Represents the completion of system server's init. - // Logged from f/b/services/.../SystemServer.java - SYSTEM_SERVER_READY = 20; - // Represents the start of launcher during boot-up. - // TODO: add logging - LAUNCHER_START = 21; - // Represents the completion of launcher's initial rendering. User can use other apps from - // launcher from this point. - // TODO: add logging - LAUNCHER_SHOWN = 22; - } - - // Type of the event. - optional ElapsedTimeEvent event = 1; - // Time since bootup for the event. - // It should be acquired from SystemClock elapsedRealtime() call or equivalent. - optional int64 time_millis = 2; -} - -/** - * Boot time events with UTC time. - * - * Logged from: bootstat and various system server components. Check each enums for details. - */ -message BootTimeEventUtcTime { - enum UtcTimeEvent { - UNKNOWN = 0; - // Time of the bootstat's marking of 1st boot after the last factory reset. - // Logged from bootstat. - FACTORY_RESET_RESET_TIME = 1; - // The time when bootstat records FACTORY_RESET_* events. This is close to - // BOOT_COMPLETE time for the current bootup. - // Logged from bootstat. - FACTORY_RESET_CURRENT_TIME = 2; - // DUplicate of FACTORY_RESET_RESET_TIME added for debugging purpose. - // Logged from bootstat. - FACTORY_RESET_RECORD_VALUE = 3; - } - - // Type of the event. - optional UtcTimeEvent event = 1; - // UTC time for the event. - optional int64 utc_time_secs = 2; -} - -/** - * Boot time events representing specific error code during bootup. - * Meaning of error code can be different per each event type. - * - * Logged from: bootstat and various system server components. Check each enums for details. - */ -message BootTimeEventErrorCode { - enum ErrorCodeEvent { - UNKNOWN = 0; - // Linux error code for time() call to get the current UTC time. - // Logged from bootstat. - FACTORY_RESET_CURRENT_TIME_FAILURE = 1; - // Represents UmountStat before the reboot for the current boot up. Error codes defined - // as UMOUNT_STAT_* from init/reboot.cpp. - // Logged from f/b/services/.../BootReceiver.java. - SHUTDOWN_UMOUNT_STAT = 2; - // Reprepsents fie system mounting error code of /data partition for the current boot. - // Error codes defined as combination of FsStatFlags from system/core/fs_mgr/fs_mgr.cpp. - // Logged from f/b/services/.../BootReceiver.java. - FS_MGR_FS_STAT_DATA_PARTITION = 3; - } - - // Type of the event. - optional ErrorCodeEvent event = 1; - // error code defined per each event type. - // For example, this can have a value of FsStatFlags.FS_STAT_FULL_MOUNT_FAILED for the event of - // FS_MGR_FS_STAT. - optional int32 error_code = 2; -} - -/** - * Collects Virtual A/B statistics related to the use of dm-snapshot performed - * after an OTA. - * - * Logged from: - * - system/update_engine/cleanup_previous_update_action.cc - */ -message SnapshotMergeReported { - // Keep in sync with - // system/core/fs_mgr/libsnapshot/android/snapshot/snapshot.proto - enum UpdateState { - // No update or merge is in progress. - NONE = 0; - // An update is applying; snapshots may already exist. - INITIATED = 1; - // An update is pending, but has not been successfully booted yet. - UNVERIFIED = 2; - // The kernel is merging in the background. - MERGING = 3; - // Post-merge cleanup steps could not be completed due to a transient - // error, but the next reboot will finish any pending operations. - MERGE_NEEDS_REBOOT = 4; - // Merging is complete, and needs to be acknowledged. - MERGE_COMPLETED = 5; - // Merging failed due to an unrecoverable error. - MERGE_FAILED = 6; - // The update was implicitly cancelled, either by a rollback or a flash - // operation via fastboot. This state can only be returned by WaitForMerge. - CANCELLED = 7; - }; - - // Status of the update after the merge attempts. - optional UpdateState final_state = 1; - - // Time to complete a merge operation in milliseconds. - // A negative value corresponds to the case in which the merge operation - // was interrupted and resumed (e.g. in case of a system reboot during the - // merge). - optional int64 duration_millis = 2; - - // Number of reboots that occurred after issuing and before completing the - // merge of all the snapshot devices. - optional int32 intermediate_reboots = 3; - - // The device has been upgraded to Virtual A/B. - optional bool is_vab_retrofit = 4; - - // Space that has been temporarily allocated in the /data partition - // containing the dm-snapshot's copy-on-write data generated during a - // Virtual A/B update. - optional int64 cow_file_size_bytes = 5; -} - -/** - * Event representing when BlobStoreManager.Session#commit() is called - * - * Logged from: - * frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java - */ -message BlobCommitted { - // Uid of the Blob committer - optional int32 uid = 1 [(is_uid) = true]; - - // Id of the Blob committed - optional int64 blob_id = 2; - - // Size of the Blob - optional int64 size = 3; - - enum Result { - UNKNOWN = 0; - // Commit Succeeded - SUCCESS = 1; - // Commit Failed: Error occurred during commit - ERROR_DURING_COMMIT = 2; - // Commit Failed: Digest of the data did not match Blob digest - DIGEST_MISMATCH = 3; - // Commit Failed: Allowed count limit exceeded - COUNT_LIMIT_EXCEEDED = 4; - } - optional Result result = 4; -} - -/** - * Event representing when BlobStoreManager#acquireLease() is called - * - * Logged from: - * frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java - */ -message BlobLeased{ - // Uid of the Blob leasee - optional int32 uid = 1 [(is_uid) = true]; - - // Id of the Blob leased or 0 if the Blob does not exist - optional int64 blob_id = 2; - - // Size of the Blob or 0 if the Blob does not exist - optional int64 size = 3; - - enum Result { - UNKNOWN = 0; - // Lease Succeeded - SUCCESS = 1; - // Lease Failed: Blob does not exist - BLOB_DNE = 2; - // Lease Failed: Leasee does not have access to the Blob - ACCESS_NOT_ALLOWED = 3; - // Lease Failed: Leasee requested an invalid expiry duration - LEASE_EXPIRY_INVALID = 4; - // Lease Failed: Leasee has exceeded the total data lease limit - DATA_SIZE_LIMIT_EXCEEDED = 5; - // Leasee Failed: Allowed count limit exceeded - COUNT_LIMIT_EXCEEDED = 6; - } - optional Result result = 4; -} - -/** - * Event representing when BlobStoreManager#openBlob() is called - * - * Logged from: - * frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java - */ -message BlobOpened{ - // Uid of the Blob opener - optional int32 uid = 1 [(is_uid) = true]; - - // Id of the Blob opened or 0 if the Blob does not exist - optional int64 blob_id = 2; - - // Size of the Blob or 0 if the Blob does not exist - optional int64 size = 3; - - enum Result { - UNKNOWN = 0; - // Open Succeeded - SUCCESS = 1; - // Open Failed: Blob does not exist - BLOB_DNE = 2; - // Open Failed: Opener does not have access to the Blob - ACCESS_NOT_ALLOWED = 3; - } - optional Result result = 4; -} - -////////////////////////////////////////////////////////////////////// -// Pulled atoms below this line // -////////////////////////////////////////////////////////////////////// - -/** - * Pulls bytes transferred via wifi (Sum of foreground and background usage). - * - * Pulled from: - * StatsCompanionService (using BatteryStats to get which interfaces are wifi) - */ -message WifiBytesTransfer { - optional int32 uid = 1 [(is_uid) = true]; - - optional int64 rx_bytes = 2; - - optional int64 rx_packets = 3; - - optional int64 tx_bytes = 4; - - optional int64 tx_packets = 5; -} - -/** - * Pulls bytes transferred via wifi (separated by foreground and background usage). - * - * Pulled from: - * StatsCompanionService (using BatteryStats to get which interfaces are wifi) - */ -message WifiBytesTransferByFgBg { - optional int32 uid = 1 [(is_uid) = true]; - - // 1 denotes foreground and 0 denotes background. This is called Set in NetworkStats. - optional bool is_foreground = 2; - - optional int64 rx_bytes = 3; - - optional int64 rx_packets = 4; - - optional int64 tx_bytes = 5; - - optional int64 tx_packets = 6; -} - -/** - * Pulls bytes transferred via mobile networks (Sum of foreground and background usage). - * - * Pulled from: - * StatsCompanionService (using BatteryStats to get which interfaces are mobile data) - */ -message MobileBytesTransfer { - optional int32 uid = 1 [(is_uid) = true]; - - optional int64 rx_bytes = 2; - - optional int64 rx_packets = 3; - - optional int64 tx_bytes = 4; - - optional int64 tx_packets = 5; -} - -/** - * Pulls bytes transferred via mobile networks (separated by foreground and background usage). - * - * Pulled from: - * StatsCompanionService (using BatteryStats to get which interfaces are mobile data) - */ -message MobileBytesTransferByFgBg { - optional int32 uid = 1 [(is_uid) = true]; - - // 1 denotes foreground and 0 denotes background. This is called Set in - // NetworkStats. - optional bool is_foreground = 2; - - optional int64 rx_bytes = 3; - - optional int64 rx_packets = 4; - - optional int64 tx_bytes = 5; - - optional int64 tx_packets = 6; -} - -/** - * Used for pull network statistics via mobile|wifi networks, and sliced by interesting dimensions. - * Note that the data is expected to be sliced into more dimensions in future. In other words, - * the caller must not assume any row of data is one full report when filtering with a set of - * matching conditions, because future data may represent with multiple rows what is currently - * represented by one. - * To avoid being broken by future slicing, callers must take care to aggregate rows even if they - * query all the existing columns. - * - * Pulled from: - * StatsPullAtomService (using NetworkStatsService to get NetworkStats) - */ -message DataUsageBytesTransfer { - // State of this record. Should be NetworkStats#SET_DEFAULT or NetworkStats#SET_FOREGROUND to - // indicate the foreground state, or NetworkStats#SET_ALL to indicate the record is for all - // states combined, not including debug states. See NetworkStats#SET_*. - optional int32 state = 1; - - optional int64 rx_bytes = 2; - - optional int64 rx_packets = 3; - - optional int64 tx_bytes = 4; - - optional int64 tx_packets = 5; - - // Radio Access Technology (RAT) type of this record, should be one of - // TelephonyManager#NETWORK_TYPE_* constants, or NetworkTemplate#NETWORK_TYPE_ALL to indicate - // the record is for all rat types combined. - optional int32 rat_type = 6; - - // Mcc/Mnc read from sim if the record is for a specific subscription, null indicates the - // record is combined across subscriptions. - optional string sim_mcc = 7; - optional string sim_mnc = 8; - - // Allows mobile virtual network operators (MVNOs) to be identified with individual IDs. - // See TelephonyManager#getSimCarrierId. - optional int32 carrier_id = 9; - - // Enumeration of opportunistic states with an additional ALL state indicates the record is - // combined regardless of the boolean value in its field. - enum DataSubscriptionState { - UNKNOWN = 0; // For server side backward compatibility. - ALL = 1; - OPPORTUNISTIC = 2; - NOT_OPPORTUNISTIC = 3; - } - // Mark whether the subscription is an opportunistic data subscription, and ALL indicates the - // record is combined across opportunistic data subscriptions. - // See {@link SubscriptionManager#setOpportunistic}. - optional DataSubscriptionState opportunistic_data_sub = 10; - - // Indicate whether NR is connected, server side could use this with RAT type to determine if - // the record is for 5G NSA (Non Stand Alone) mode, where the primary cell is still LTE and - // network allocates a secondary 5G cell so telephony reports RAT = LTE along with NR state as - // connected. - optional bool is_nr_connected = 11; -} - -/** - * Pulls bytes transferred via bluetooth. It is pulled from Bluetooth controller. - * - * Pulled from: - * StatsCompanionService - */ -message BluetoothBytesTransfer { - optional int32 uid = 1 [(is_uid) = true]; - - optional int64 rx_bytes = 2; - - optional int64 tx_bytes = 3; -} - -/** - * Pulls the kernel wakelock durations. This atom is adapted from - * android/internal/os/KernelWakelockStats.java - * - * Pulled from: - * StatsCompanionService using KernelWakelockReader. - */ -message KernelWakelock { - optional string name = 1; - - optional int32 count = 2; - - optional int32 version = 3; - - optional int64 time_micros = 4; -} - -/** - * Pulls low power state information. If power.stats HAL is not available, this - * includes platform and subsystem sleep state information, - * PowerStatePlatformSleepState, PowerStateVoter or PowerStateSubsystemSleepState - * as defined in: - * hardware/interfaces/power/1.0/types.hal - * hardware/interfaces/power/1.1/types.hal - * If power.stats HAL is available, this includes PowerEntityStateResidencyResult - * as defined in: - * hardware/interfaces/power/stats/1.0/types.hal - */ -message SubsystemSleepState { - // Subsystem name - optional string subsystem_name = 1; - // For PlatformLowPowerStats (hal 1.0), this is the voter name, which could be empty. - // For SubsystemLowPowerStats (hal 1.1), this is the sleep state name. - // For PowerEntityStateResidencyResult (hal power/stats/1.0) this is the - // powerEntityStateName from the corresponding PowerEntityStateInfo. - optional string subname = 2; - // The number of times it entered, or voted for entering the sleep state - optional uint64 count = 3; - // The length of time spent in, or spent voting for, the sleep state - optional uint64 time_millis = 4; -} - -/** - * Pulls on-device power measurement information. - * Data defined by hardware/interfaces/power/stats/1.0/types.hal. - * Pulled from: - * frameworks/base/cmds/statsd/src/external/PowerStatsPuller.cpp - */ -message OnDevicePowerMeasurement { - // Name of the subsystem (to which the rail belongs). - optional string subsystem_name = 1; - - // Rail name. The rail lies within the subsystem. - optional string rail_name = 2; - - // Time (in ms since boot) at which the rail energy value was measured. - // This may differ slightly from the time that statsd logs this information. - optional uint64 measurement_timestamp_millis = 3; - - // Accumulated energy used via the rail since device boot in uWs. - optional uint64 energy_microwatt_secs = 4; -} - -/** - * Pulls Cpu time per frequency. - * Pulls the time the cpu spend on the frequency index. Frequency index - * starts from highest to lowest. The value should be monotonically - * increasing since boot. However, if there is a cpu - * hotplug event, the value would be reset as well. - */ -message CpuTimePerFreq { - optional uint32 cluster = 1; - optional uint32 freq_index = 2; - optional uint64 time_millis = 3; -} - -/** - * Pulls Cpu Time Per Uid. - * Note that isolated process uid time should be attributed to host uids. - */ -message CpuTimePerUid { - optional int32 uid = 1 [(is_uid) = true]; - optional uint64 user_time_micros = 2; - optional uint64 sys_time_micros = 3; -} - -/** - * Pulls Cpu Time Per Uid per frequency. - * Note that isolated process uid time should be attributed to host uids. - * For each uid, we order the time by descending frequencies. - */ -message CpuTimePerUidFreq { - optional int32 uid = 1 [(is_uid) = true]; - optional uint32 freq_index = 2; - optional uint64 time_millis = 3; -} - -/** - * Pulls Wifi Controller Activity Energy Info - */ -message WifiActivityInfo { - // timestamp(wall clock) of record creation - optional uint64 timestamp_millis = 1; - // stack reported state - // TODO: replace this with proto enum - optional int32 stack_state = 2; - // tx time in millis - optional uint64 controller_tx_time_millis = 3; - // rx time in millis - optional uint64 controller_rx_time_millis = 4; - // idle time in millis - optional uint64 controller_idle_time_millis = 5; - // product of current(mA), voltage(V) and time(ms) - optional uint64 controller_energy_used = 6; -} - -/** - * Pulls Modem Activity Energy Info - */ -message ModemActivityInfo { - // timestamp(wall clock) of record creation - optional uint64 timestamp_millis = 1; - // sleep time in millis. - optional uint64 sleep_time_millis = 2; - // idle time in millis - optional uint64 controller_idle_time_millis = 3; - /** - * Tx power index - * index 0 = tx_power < 0dBm - * index 1 = 0dBm < tx_power < 5dBm - * index 2 = 5dBm < tx_power < 15dBm - * index 3 = 15dBm < tx_power < 20dBm - * index 4 = tx_power > 20dBm - */ - // tx time in ms at power level 0 - optional uint64 controller_tx_time_pl0_millis = 4; - // tx time in ms at power level 1 - optional uint64 controller_tx_time_pl1_millis = 5; - // tx time in ms at power level 2 - optional uint64 controller_tx_time_pl2_millis = 6; - // tx time in ms at power level 3 - optional uint64 controller_tx_time_pl3_millis = 7; - // tx time in ms at power level 4 - optional uint64 controller_tx_time_pl4_millis = 8; - // rx time in ms at power level 5 - optional uint64 controller_rx_time_millis = 9; - // product of current(mA), voltage(V) and time(ms) - optional uint64 energy_used = 10 [deprecated=true]; -} - -/** - * Pulls Bluetooth Activity Energy Info - * Note: BluetoothBytesTransfer is pulled at the same time from the controller. - */ -message BluetoothActivityInfo { - // timestamp(wall clock) of record creation - optional uint64 timestamp_millis = 1; - // bluetooth stack state - optional int32 bluetooth_stack_state = 2; - // tx time in millis - optional uint64 controller_tx_time_millis = 3; - // rx time in millis - optional uint64 controller_rx_time_millis = 4; - // idle time in millis - optional uint64 controller_idle_time_millis = 5; - // product of current(mA), voltage(V) and time(ms) - optional uint64 energy_used = 6; -} - -/* - * Logs the memory stats for a process. - * - * Pulled from StatsCompanionService for all managed processes (from ActivityManagerService). - */ -message ProcessMemoryState { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The process name. - // Usually package name, "system" for system server. - // Provided by ActivityManagerService. - optional string process_name = 2; - - // Current OOM score adjustment. Value read from ProcessRecord. - optional int32 oom_adj_score = 3; - - // # of page-faults - optional int64 page_fault = 4; - - // # of major page-faults - optional int64 page_major_fault = 5; - - // RSS - // Value is read from memory.stat, field total_rss if per-app memory - // cgroups are enabled. Otherwise, value from /proc/pid/stat. - optional int64 rss_in_bytes = 6; - - // CACHE - // Value is read from memory.stat, field total_cache if per-app memory - // cgroups are enabled. Otherwise, 0. - optional int64 cache_in_bytes = 7; - - // SWAP - // Value is read from memory.stat, field total_swap if per-app memory - // cgroups are enabled. Otherwise, 0. - optional int64 swap_in_bytes = 8; - - // Deprecated: use ProcessMemoryHighWaterMark atom instead. Always -1. - optional int64 rss_high_watermark_in_bytes = 9 [deprecated = true]; - - // Deprecated: use ProcessMemorySnapshot atom instead. Always -1. - optional int64 start_time_nanos = 10 [deprecated = true]; - - // Deprecated: use ProcessMemorySnapshot atom instead. Always -1. - optional int32 anon_rss_and_swap_in_kilobytes = 11 [deprecated = true]; -} - -/* - * Logs the memory high-water mark for a process. - * - * Pulled from StatsCompanionService for all managed processes (from ActivityManagerServie) - * and for selected native processes. - * - * Pulling this atom resets high-water mark counters for all processes. - */ -message ProcessMemoryHighWaterMark { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The process name. - // Usually package name or process cmdline. - // Provided by ActivityManagerService or read from /proc/PID/cmdline. - optional string process_name = 2; - - // Deprecated: use rss_high_water_mark_in_kilobytes instead. This field is - // computed by converting kilobytes to bytes. - optional int64 rss_high_water_mark_in_bytes = 3 [deprecated = true]; - - // RSS high-water mark. Peak RSS usage of the process. Read from the VmHWM field in - // /proc/PID/status. - optional int32 rss_high_water_mark_in_kilobytes = 4; -} - -/* - * Logs the memory stats for a process. - * - * Pulled from StatsCompanionService for all managed processes (from ActivityManagerService) - * and for selected native processes. - */ -message ProcessMemorySnapshot { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The process name. - // Usually package name or process cmdline. - // Provided by ActivityManagerService or read from /proc/PID/cmdline. - optional string process_name = 2; - - // The pid of the process. - // Allows to disambiguate instances of the process. - optional int32 pid = 3; - - // The current OOM score adjustment value. - // Read from ProcessRecord for managed processes. - // Placeholder -1001 (OOM_SCORE_ADJ_MIN - 1, outside of allowed range) for native ones. - optional int32 oom_score_adj = 4; - - // The current RSS of the process. - // VmRSS from /proc/pid/status. - optional int32 rss_in_kilobytes = 5; - - // The current anon RSS of the process. - // RssAnon from /proc/pid/status. - optional int32 anon_rss_in_kilobytes = 6; - - // The current swap size of the process. - // VmSwap from /proc/pid/status. - optional int32 swap_in_kilobytes = 7; - - // The sum of rss_in_kilobytes and swap_in_kilobytes. - optional int32 anon_rss_and_swap_in_kilobytes = 8; -} - -/* - * Elapsed real time from SystemClock. - */ -message SystemElapsedRealtime { - optional uint64 time_millis = 1; -} - -/* - * Up time from SystemClock. - */ -message SystemUptime { - // Milliseconds since the system was booted. - // This clock stops when the system enters deep sleep (CPU off, display dark, device waiting - // for external input). - // It is not affected by clock scaling, idle, or other power saving mechanisms. - optional uint64 uptime_millis = 1; -} - -/* - * Reads from /proc/uid_concurrent_active_time which has the format: - * active: X (X is # cores) - * [uid0]: [time-0] [time-1] [time-2] ... (# entries = # cores) - * [uid1]: [time-0] [time-1] [time-2] ... ... - * ... - * Time-N means the CPU time a UID spent running concurrently with N other processes. - * The file contains a monotonically increasing count of time for a single boot. - */ -message CpuActiveTime { - optional int32 uid = 1 [(is_uid) = true]; - optional uint64 time_millis = 2; -} - -/** - * Reads from /proc/uid_concurrent_policy_time which has the format: - * policy0: X policy4: Y (there are X cores on policy0, Y cores on policy4) - * [uid0]: [time-0-0] [time-0-1] ... [time-1-0] [time-1-1] ... - * [uid1]: [time-0-0] [time-0-1] ... [time-1-0] [time-1-1] ... - * ... - * Time-X-Y means the time a UID spent on clusterX running concurrently with Y other processes. - * The file contains a monotonically increasing count of time for a single boot. - */ -message CpuClusterTime { - optional int32 uid = 1 [(is_uid) = true]; - optional int32 cluster_index = 2; - optional uint64 time_millis = 3; -} - -/* - * Pulls free disk space, for data, system partition and temporary directory. - */ -message DiskSpace { - // available bytes in data partition - optional uint64 data_available_bytes = 1; - // available bytes in system partition - optional uint64 system_available_bytes = 2; - // available bytes in download cache or temp directories - optional uint64 temp_available_bytes = 3; -} - -/** - * Pulls battery coulomb counter, which is the remaining battery charge in uAh. - * - * Pulled from StatsCompanionService.java - */ -message RemainingBatteryCapacity { - optional int32 charge_micro_ampere_hour = 1; -} - -/** - * Pulls battery capacity, which is the battery capacity when full in uAh. - * Pulled from: - * frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp - */ -message FullBatteryCapacity { - optional int32 capacity_micro_ampere_hour = 1; -} - -/** - * Pulls battery voltage. - * Pulled from: - * frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp - */ -message BatteryVoltage { - // The voltage of the battery, in millivolts. - optional int32 voltage_millivolt = 1; -} - -/** - * Pulls battery level (percent full, from 0 to 100). - * - * Pulled from: - * frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp - */ -message BatteryLevel { - // Battery level. Should be in [0, 100]. - optional int32 battery_level = 1; -} - -/** - * Pulls the temperature of various parts of the device. - * The units are tenths of a degree Celsius. Eg: 30.3C is reported as 303. - * - * Pulled from StatsCompanionService.java - */ -message Temperature { - // The type of temperature being reported. Eg. CPU, GPU, SKIN, BATTERY, BCL_. - optional android.os.TemperatureTypeEnum sensor_location = 1; - - // The name of the temperature source. Eg. CPU0 - optional string sensor_name = 2; - - // Temperature in tenths of a degree C. - // For BCL, it is decimillivolt, decimilliamps, and percentage * 10. - optional int32 temperature_deci_celsius = 3; - - // Relative severity of the throttling, see enum definition. - optional android.os.ThrottlingSeverityEnum severity = 4; -} - -/** - * Pulls the statistics of calls to Binder. - * - * Binder stats will be reset every time the data is pulled. It means it can only be pulled by one - * config on the device. - * - * Next tag: 15 - */ -message BinderCalls { - // UID of the process responsible for the binder transaction. It will be set if the process - // executing the binder transaction attribute the transaction to another uid using - // Binder.setThreadWorkSource(). - // - // If not set, the value will be -1. - optional int32 uid = 1 [(is_uid) = true]; - // UID of the process executing the binder transaction. - optional int32 direct_caller_uid = 14; - // Fully qualified class name of the API call. - // - // This is a system server class name. - // - // TODO(gaillard): figure out if binder call stats includes data from isolated uids, if a uid - // gets recycled and we have isolated uids, we might attribute the data incorrectly. - // TODO(gaillard): there is a high dimensions cardinality, figure out if we should drop the less - // commonly used APIs. - optional string service_class_name = 2; - // Method name of the API call. It can also be a transaction code if we cannot - // resolve it to a name. See Binder#getTransactionName. - // - // This is a system server method name. - optional string service_method_name = 3; - // Total number of API calls. - optional int64 call_count = 4; - // True if the screen was interactive PowerManager#isInteractive at the end of the call. - optional bool screen_interactive = 13; - // Total number of API calls we have data recorded for. If we collected data for all the calls, - // call_count will be equal to recorded_call_count. - // - // If recorded_call_count is different than call_count, it means data collection has been - // sampled. All the fields below will be sampled in this case. - optional int64 recorded_call_count = 12; - // Number of exceptions thrown by the API. - optional int64 recorded_exception_count = 5; - // Total latency of all API calls. - // Average can be computed using total_latency_micros / recorded_call_count. - optional int64 recorded_total_latency_micros = 6; - // Maximum latency of one API call. - optional int64 recorded_max_latency_micros = 7; - // Total CPU usage of all API calls. - // Average can be computed using total_cpu_micros / recorded_call_count. - // Total can be computed using total_cpu_micros / recorded_call_count * call_count. - optional int64 recorded_total_cpu_micros = 8; - // Maximum CPU usage of one API call. - optional int64 recorded_max_cpu_micros = 9; - // Maximum parcel reply size of one API call. - optional int64 recorded_max_reply_size_bytes = 10; - // Maximum parcel request size of one API call. - optional int64 recorded_max_request_size_bytes = 11; -} - -/** - * Pulls the statistics of exceptions during calls to Binder. - * - * Binder stats are cumulative from boot unless somebody reset the data using - * > adb shell dumpsys binder_calls_stats --reset - */ -message BinderCallsExceptions { - // Exception class name, e.g. java.lang.IllegalArgumentException. - // - // This is an exception class name thrown by the system server. - optional string exception_class_name = 1; - // Total number of exceptions. - optional int64 exception_count = 2; -} - -/** - * Pulls the statistics of message dispatching on HandlerThreads. - * - * Looper stats will be reset every time the data is pulled. It means it can only be pulled by one - * config on the device. - * - * Next tag: 11 - */ -message LooperStats { - // The uid that made a call to the System Server and caused the message to be enqueued. - optional int32 uid = 1 [(is_uid) = true]; - - // Fully qualified class name of the handler target class. - // - // This field does not contain PII. This is a system server class name. - optional string handler_class_name = 2; - - // The name of the thread that runs the Looper. - // - // This field does not contain PII. This is a system server thread name. - optional string looper_thread_name = 3; - - // The name of the dispatched message. - // - // This field does not contain PII. This is a system server constant or class - // name. - optional string message_name = 4; - - // Total number of successfully dispatched messages. - optional int64 message_count = 5; - - // Total number of messages that failed dispatching. - optional int64 exception_count = 6; - - // Total number of processed messages we have data recorded for. If we - // collected data for all the messages, message_count will be equal to - // recorded_message_count. - // - // If recorded_message_count is different than message_count, it means data - // collection has been sampled. The fields below will be sampled in this case. - optional int64 recorded_message_count = 7; - - // Total latency of all processed messages. - // Average can be computed using recorded_total_latency_micros / - // recorded_message_count. - optional int64 recorded_total_latency_micros = 8; - - // Total CPU usage of all processed message. - // Average can be computed using recorded_total_cpu_micros / - // recorded_message_count. Total can be computed using - // recorded_total_cpu_micros / recorded_message_count * message_count. - optional int64 recorded_total_cpu_micros = 9; - - // True if the screen was interactive PowerManager#isInteractive at the end of the call. - optional bool screen_interactive = 10; - - // Max recorded CPU usage of all processed messages. - optional int64 recorded_max_cpu_micros = 11; - - // Max recorded latency of all processed messages. - optional int64 recorded_max_latency_micros = 12; - - // Total number of messages we tracked the dispatching delay for. If we - // collected data for all the messages, message_count will be equal to - // recorded_delay_message_count. - // - // If recorded_delay_message_count is different than message_count, it means data - // collection has been sampled or/and not all messages specified the target dispatch time. - // The fields below will be sampled in this case. - optional int64 recorded_delay_message_count = 13; - - // Total dispatching delay of all processed messages. - // Calculated as a difference between the target dispatching time (Message.when) - // and the actual dispatching time. - // Average can be computed using recorded_total_delay_millis / recorded_delay_message_count. - optional int64 recorded_total_delay_millis = 14; - - // Max dispatching delay of all processed messages. - // Calculated as a difference between the target dispatching time (Message.when) - // and the actual dispatching time. - optional int64 recorded_max_delay_millis = 15; -} - -/** - * Pulls disk information, such as write speed and latency. - */ -message DiskStats { - // Time taken to open, write 512B to, and close a file. - // -1 if error performing the check. - optional int64 data_write_latency_millis = 1; - - optional bool file_based_encryption = 2; - - // Recent disk write speed in kB/s. - // -1 if error querying storageed. - // 0 if data is unavailable. - optional int32 recent_disk_write_speed = 3; -} - - -/** - * Free and total bytes of the Data, Cache, and System partition. - */ -message DirectoryUsage { - enum Directory { - UNKNOWN = 0; - DATA = 1; - CACHE = 2; - SYSTEM = 3; - } - optional Directory directory = 1; - optional int64 free_bytes = 2; - optional int64 total_bytes = 3; -} - - -/** - * Size of an application: apk size, data size, and cache size. - * Reads from a cached file produced daily by DiskStatsLoggingService.java. - * Information is only reported for apps with the primary user (user 0). - * Sizes are aggregated by package name. - */ -message AppSize { - // Including uids will involve modifying diskstats logic. - optional string package_name = 1; - // App size in bytes. -1 if unavailable. - optional int64 app_size_bytes = 2; - // App data size in bytes. -1 if unavailable. - optional int64 app_data_size_bytes = 3; - // App cache size in bytes. -1 if unavailable. - optional int64 app_cache_size_bytes = 4; - // Time that the cache file was produced. - // Uses System.currentTimeMillis(), which is wall clock time. - optional int64 cache_time_millis = 5; -} - - -/** - * Size of a particular category. Eg: photos, videos. - * Reads from a cached file produced daily by DiskStatsLoggingService.java. - */ -message CategorySize { - enum Category { - UNKNOWN = 0; - APP_SIZE = 1; - APP_DATA_SIZE = 2; - APP_CACHE_SIZE = 3; - PHOTOS = 4; - VIDEOS = 5; - AUDIO = 6; - DOWNLOADS = 7; - SYSTEM = 8; - OTHER = 9; - } - optional Category category = 1; - // Category size in bytes. - optional int64 size_bytes = 2; - // Time that the cache file was produced. - // Uses System.currentTimeMillis(), which is wall clock time. - optional int64 cache_time_millis = 3; -} - -/** - * Pulls per uid I/O stats. The stats are cumulative since boot. - * - * Read/write bytes are I/O events from a storage device - * Read/write chars are data requested by read/write syscalls, and can be - * satisfied by caching. - * - * Pulled from StatsCompanionService, which reads proc/uid_io/stats. - */ -message DiskIo { - optional int32 uid = 1 [(is_uid) = true]; - optional int64 fg_chars_read = 2; - optional int64 fg_chars_write = 3; - optional int64 fg_bytes_read = 4; - optional int64 fg_bytes_write = 5; - optional int64 bg_chars_read = 6; - optional int64 bg_chars_write = 7; - optional int64 bg_bytes_read = 8; - optional int64 bg_bytes_write = 9; - optional int64 fg_fsync = 10; - optional int64 bg_fsync= 11; -} - - -/** - * Pulls the number of fingerprints for each user. - * - * Pulled from StatsCompanionService, which queries <Biometric>Manager. - */ -message NumFingerprintsEnrolled { - // The associated user. Eg: 0 for owners, 10+ for others. - // Defined in android/os/UserHandle.java - optional int32 user = 1; - // Number of fingerprints registered to that user. - optional int32 num_fingerprints_enrolled = 2; -} - -/** - * Pulls the number of faces for each user. - * - * Pulled from StatsCompanionService, which queries <Biometric>Manager. - */ -message NumFacesEnrolled { - // The associated user. Eg: 0 for owners, 10+ for others. - // Defined in android/os/UserHandle.java - optional int32 user = 1; - // Number of faces registered to that user. - optional int32 num_faces_enrolled = 2; -} -/** - * A mapping of role holder -> role - */ -message RoleHolder { - // uid of the role holder - optional int32 uid = 1 [(is_uid) = true]; - - // package name of the role holder - optional string package_name = 2; - - // the role held - optional string role = 3; -} - -message AggStats { - // These are all in byte resolution. - optional int64 min = 1 [deprecated = true]; - optional int64 average = 2 [deprecated = true]; - optional int64 max = 3 [deprecated = true]; - - // These are all in kilobyte resolution. Can fit in int32, so smaller on the wire than the above - // int64 fields. - optional int32 mean_kb = 4; - optional int32 max_kb = 5; -} - -// A reduced subset of process states; reducing the number of possible states allows more -// aggressive device-side aggregation of statistics and hence reduces metric upload size. -enum ProcessStateAggregated { - PROCESS_STATE_UNKNOWN = 0; - // Persistent system process. - PROCESS_STATE_PERSISTENT = 1; - // Top activity; actually any visible activity. - PROCESS_STATE_TOP = 2; - // Process binding to top or a foreground service. - PROCESS_STATE_BOUND_TOP_OR_FGS = 3; - // Processing running a foreground service. - PROCESS_STATE_FGS = 4; - // Important foreground process (ime, wallpaper, etc). - PROCESS_STATE_IMPORTANT_FOREGROUND = 5; - // Important background process. - PROCESS_STATE_BACKGROUND = 6; - // Process running a receiver. - PROCESS_STATE_RECEIVER = 7; - // All kinds of cached processes. - PROCESS_STATE_CACHED = 8; -} - -// Next tag: 13 -message ProcessStatsStateProto { - optional android.service.procstats.ScreenState screen_state = 1; - - optional android.service.procstats.MemoryState memory_state = 2 [deprecated = true]; - - // this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java - // and not frameworks/base/core/java/android/app/ActivityManager.java - optional android.service.procstats.ProcessState process_state = 3 [deprecated = true]; - - optional ProcessStateAggregated process_state_aggregated = 10; - - // Millisecond uptime duration spent in this state - optional int64 duration_millis = 4 [deprecated = true]; - // Same as above, but with minute resolution so it fits into an int32. - optional int32 duration_minutes = 11; - - // Millisecond elapsed realtime duration spent in this state - optional int64 realtime_duration_millis = 9 [deprecated = true]; - // Same as above, but with minute resolution so it fits into an int32. - optional int32 realtime_duration_minutes = 12; - - // # of samples taken - optional int32 sample_size = 5; - - // PSS is memory reserved for this process - optional AggStats pss = 6 [deprecated = true]; - - // USS is memory shared between processes, divided evenly for accounting - optional AggStats uss = 7 [deprecated = true]; - - // RSS is memory resident for this process - optional AggStats rss = 8; -} - -// Next Tag: 8 -message ProcessStatsProto { - // Name of process. - optional string process = 1; - - // Uid of the process. - optional int32 uid = 2 [(is_uid) = true]; - - // Information about how often kills occurred - message Kill { - // Count of excessive CPU kills - optional int32 cpu = 1; - - // Count of kills when cached - optional int32 cached = 2; - - // PSS stats during cached kill - optional AggStats cached_pss = 3; - } - optional Kill kill = 3 [deprecated = true]; - - // Time and memory spent in various states. - repeated ProcessStatsStateProto states = 5; - - // Total time process has been running... screen_state, memory_state, and process_state - // will not be set. - optional ProcessStatsStateProto total_running_state = 6; - - // Association data for this process in this state; - // each entry here is one association. - repeated ProcessStatsAssociationProto assocs = 7; -} - -// Next Tag: 6 -message ProcessStatsAssociationProto { - // Procss Name of the associated process (client process of service binding) - optional string assoc_process_name = 1; - - // Package Name of the associated package (client package of service binding) - optional string assoc_package_name = 2 [deprecated = true]; - - // UID of the associated process/package (client package of service binding) - optional int32 assoc_uid = 5 [(is_uid) = true]; - - // Total count of the times this association (service binding) appeared. - optional int32 total_count = 3; - - // Uptime total duration in seconds this association (service binding) was around. - optional int32 total_duration_secs = 4; -} - -message PackageServiceOperationStatsProto { - // Operate enum: Started, Foreground, Bound, Executing - optional android.service.procstats.ServiceOperationState operation = 1; - - // Number of times the service was in this operation. - optional int32 count = 2; - - // Information about a state the service can be in. - message StateStats { - // Screen state enum. - optional android.service.procstats.ScreenState screen_state = 1; - // Memory state enum. - optional android.service.procstats.MemoryState memory_state = 2; - - // duration in milliseconds. - optional int64 duration_millis = 3; - // Millisecond elapsed realtime duration spent in this state - optional int64 realtime_duration_millis = 4; - } - repeated StateStats state_stats = 3; -} - -message PackageServiceStatsProto { - // Name of service component. - optional string service_name = 1; - - // The operation stats. - // The package_name, package_uid, package_version, service_name will not be set to save space. - repeated PackageServiceOperationStatsProto operation_stats = 2; -} - -message PackageAssociationSourceProcessStatsProto { - // Uid of the process. - optional int32 process_uid = 1; - // Process name. - optional string process_name = 2; - // Package name. - optional string package_name = 7; - // Total count of the times this association appeared. - optional int32 total_count = 3; - - // Millisecond uptime total duration this association was around. - optional int64 total_duration_millis = 4; - - // Total count of the times this association became actively impacting its target process. - optional int32 active_count = 5; - - // Information on one source in this association. - message StateStats { - // Process state enum. - optional android.service.procstats.ProcessState process_state = 1; - // Millisecond uptime duration spent in this state - optional int64 duration_millis = 2; - // Millisecond elapsed realtime duration spent in this state - optional int64 realtime_duration_mmillis = 3; - } - repeated StateStats active_state_stats = 6; -} - -message PackageAssociationProcessStatsProto { - // Name of the target component. - optional string component_name = 1; - // Information on one source in this association. - repeated PackageAssociationSourceProcessStatsProto sources = 2; -} - - -message ProcessStatsPackageProto { - // Name of package. - optional string package = 1; - - // Uid of the package. - optional int32 uid = 2; - - // Version of the package. - optional int64 version = 3; - - // Stats for each process running with the package loaded in to it. - repeated ProcessStatsProto process_stats = 4; - - // Stats for each of the package's services. - repeated PackageServiceStatsProto service_stats = 5; - - // Stats for each association with the package. - repeated PackageAssociationProcessStatsProto association_stats = 6; -} - -message ProcessStatsSectionProto { - // Elapsed realtime at start of report. - optional int64 start_realtime_millis = 1; - - // Elapsed realtime at end of report. - optional int64 end_realtime_millis = 2; - - // CPU uptime at start of report. - optional int64 start_uptime_millis = 3; - - // CPU uptime at end of report. - optional int64 end_uptime_millis = 4; - - // System runtime library. e.g. "libdvm.so", "libart.so". - optional string runtime = 5; - - // whether kernel reports swapped pss. - optional bool has_swapped_pss = 6; - - // Data completeness. e.g. "complete", "partial", shutdown", or "sysprops". - enum Status { - STATUS_UNKNOWN = 0; - STATUS_COMPLETE = 1; - STATUS_PARTIAL = 2; - STATUS_SHUTDOWN = 3; - STATUS_SYSPROPS = 4; - } - repeated Status status = 7; - - // Number of pages available of various types and sizes, representation fragmentation. - repeated ProcessStatsAvailablePagesProto available_pages = 10; - - // Stats for each process. - repeated ProcessStatsProto process_stats = 8; - - // Stats for each package. - repeated ProcessStatsPackageProto package_stats = 9; -} - -message ProcessStatsAvailablePagesProto { - // Node these pages are in (as per /proc/pagetypeinfo) - optional int32 node = 1; - - // Zone these pages are in (as per /proc/pagetypeinfo) - optional string zone = 2; - - // Label for the type of these pages (as per /proc/pagetypeinfo) - optional string label = 3; - - // Distribution of number of pages available by order size. First entry in array is - // order 0, second is order 1, etc. Each order increase is a doubling of page size. - repeated int32 pages_per_order = 4; -} - -/** - * Pulled from ProcessStatsService.java - */ -message ProcStats { - optional ProcessStatsSectionProto proc_stats_section = 1; - // Data pulled from device into this is sometimes sharded across multiple atoms to work around - // a size limit. When this happens, this shard ID will contain an increasing 1-indexed integer - // with the number of this shard. - optional int32 shard_id = 2; -} - -/** - * Pulled from ProcessStatsService.java - */ -message ProcStatsPkgProc { - optional ProcessStatsSectionProto proc_stats_section = 1; -} - -// Next Tag: 2 -message PackageRemoteViewInfoProto { - optional string package_name = 1; - // add per-package additional info here (like channels) -} - -// Next Tag: 2 -message NotificationRemoteViewsProto { - repeated PackageRemoteViewInfoProto package_remote_view_info = 1; -} - -/** - * Pulled from NotificationManagerService.java - */ -message NotificationRemoteViews { - optional NotificationRemoteViewsProto notification_remote_views = 1; -} - -/** - * Atom that contains a list of a package's preferences, pulled from NotificationManagerService.java - */ -message PackageNotificationPreferences { - // Uid under which the package is installed. - optional int32 uid = 1 [(is_uid) = true]; - // Notification importance, which specifies when and how a notification is displayed. - // Specified under core/java/android/app/NotificationManager.java. - optional int32 importance = 2; - // Lockscreen visibility as set by the user. - optional int32 visibility = 3; - // Bitfield mask indicating what fields were locked by the user (see LockableAppfields in - // PreferencesHelper.java) - optional int32 user_locked_fields = 4; -} - -/** - * Atom that contains a list of a package's channel preferences, pulled from - * NotificationManagerService.java. - */ -message PackageNotificationChannelPreferences { - // Uid under which the package is installed. - optional int32 uid = 1 [(is_uid) = true]; - // Channel's ID. Should always be available. - optional string channel_id = 2; - // Channel's name. Should always be available. - optional string channel_name = 3; - // Channel's description. Optionally set by the channel creator. - optional string description = 4; - // Notification importance, which specifies when and how a notification is displayed. Specified - // under core/java/android/app/NotificationManager.java. - optional int32 importance = 5; - // Bitmask representing which fields have been set by the user. See field bitmask descriptions - // at core/java/android/app/NotificationChannel.java - optional int32 user_locked_fields = 6; - // Indicates if the channel was deleted by the app. - optional bool is_deleted = 7; - // Indicates if the channel was marked as a conversation by the app. - optional bool is_conversation = 8; - // Indicates if the channel is a conversation that was demoted by the user. - optional bool is_demoted_conversation = 9; - // Indicates if the channel is a conversation that was marked as important by the user. - optional bool is_important_conversation = 10; -} - -/** - * Atom that represents an item in the list of Do Not Disturb rules, pulled from - * NotificationManagerService.java. - */ -message DNDModeProto { - enum Mode { - ROOT_CONFIG = -1; // Used to distinguish the config (one per user) from the rules. - ZEN_MODE_OFF = 0; - ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1; - ZEN_MODE_NO_INTERRUPTIONS = 2; - ZEN_MODE_ALARMS = 3; - } - optional int32 user = 1; // Android user ID (0, 1, 10, ...) - optional bool enabled = 2; // true for ROOT_CONFIG if a manualRule is enabled - optional bool channels_bypassing = 3; // only valid for ROOT_CONFIG - optional Mode zen_mode = 4; - // id is one of the system default rule IDs, or empty - // May also be "MANUAL_RULE" to indicate app-activation of the manual rule. - optional string id = 5; - optional int32 uid = 6 [(is_uid) = true]; // currently only SYSTEM_UID or 0 for other - optional DNDPolicyProto policy = 7; -} - -/** - * Atom that represents a Do Not Disturb policy, an optional detail proto for DNDModeProto. - */ -message DNDPolicyProto { - enum State { - STATE_UNSET = 0; - STATE_ALLOW = 1; - STATE_DISALLOW = 2; - } - optional State calls = 1; - optional State repeat_callers = 2; - optional State messages = 3; - optional State conversations = 4; - optional State reminders = 5; - optional State events = 6; - optional State alarms = 7; - optional State media = 8; - optional State system = 9; - optional State fullscreen = 10; - optional State lights = 11; - optional State peek = 12; - optional State status_bar = 13; - optional State badge = 14; - optional State ambient = 15; - optional State notification_list = 16; - - enum PeopleType { - PEOPLE_UNSET = 0; - PEOPLE_ANYONE = 1; - PEOPLE_CONTACTS = 2; - PEOPLE_STARRED = 3; - PEOPLE_NONE = 4; - } - - optional PeopleType allow_calls_from = 17; - optional PeopleType allow_messages_from = 18; - - enum ConversationType { - CONV_UNSET = 0; - CONV_ANYONE = 1; - CONV_IMPORTANT = 2; - CONV_NONE = 3; - } - - optional ConversationType allow_conversations_from = 19; -} - -/** - * Atom that contains a list of a package's channel group preferences, pulled from - * NotificationManagerService.java. - */ -message PackageNotificationChannelGroupPreferences { - // Uid under which the package is installed. - optional int32 uid = 1 [(is_uid) = true]; - // Channel Group's ID. Should always be available. - optional string group_id = 2; - // Channel Group's name. Should always be available. - optional string group_name = 3; - // Channel Group's description. Optionally set by group creator. - optional string description = 4; - // Indicates if notifications from this channel group are blocked. - optional bool is_blocked = 5; - // Bitmask representing which fields have been set by the user. See field bitmask descriptions - // at core/java/android/app/NotificationChannelGroup.java - optional int32 user_locked_fields = 6; -} - -message PowerProfileProto { - optional double cpu_suspend = 1; - - optional double cpu_idle = 2; - - optional double cpu_active = 3; - - message CpuCluster { - optional int32 id = 1; - optional double cluster_power = 2; - optional int32 cores = 3; - repeated int64 speed = 4; - repeated double core_power = 5; - } - - repeated CpuCluster cpu_cluster = 40; - - optional double wifi_scan = 4; - - optional double wifi_on = 5; - - optional double wifi_active = 6; - - optional double wifi_controller_idle = 7; - - optional double wifi_controller_rx = 8; - - optional double wifi_controller_tx = 9; - - repeated double wifi_controller_tx_levels = 10; - - optional double wifi_controller_operating_voltage = 11; - - optional double bluetooth_controller_idle = 12; - - optional double bluetooth_controller_rx = 13; - - optional double bluetooth_controller_tx = 14; - - optional double bluetooth_controller_operating_voltage = 15; - - optional double modem_controller_sleep = 16; - - optional double modem_controller_idle = 17; - - optional double modem_controller_rx = 18; - - repeated double modem_controller_tx = 19; - - optional double modem_controller_operating_voltage = 20; - - optional double gps_on = 21; - - repeated double gps_signal_quality_based = 22; - - optional double gps_operating_voltage = 23; - - optional double bluetooth_on = 24; - - optional double bluetooth_active = 25; - - optional double bluetooth_at_cmd = 26; - - optional double ambient_display = 27; - - optional double screen_on = 28; - - optional double radio_on = 29; - - optional double radio_scanning = 30; - - optional double radio_active = 31; - - optional double screen_full = 32; - - optional double audio = 33; - - optional double video = 34; - - optional double flashlight = 35; - - optional double memory = 36; - - optional double camera = 37; - - optional double wifi_batched_scan = 38; - - optional double battery_capacity = 39; -} - -/** - * power_profile.xml and other constants for power model calculations. - * Pulled from PowerProfile.java - */ -message PowerProfile { - optional PowerProfileProto power_profile = 1; -} - -/** - * Logs when a user restriction was added or removed. - * - * Logged from: - * frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java - */ -message UserRestrictionChanged { - // The raw string of the user restriction as defined in UserManager. - // Allowed values are defined in UserRestrictionsUtils#USER_RESTRICTIONS. - optional string restriction = 1; - // Whether the restriction is enabled or disabled. - optional bool enabled = 2; -} - -/** - * Pulls process user time and system time. Puller takes a snapshot of all pids - * in the system and returns cpu stats for those that are working at the time. - * Dead pids will be dropped. Kernel processes are excluded. - * Min cool-down is 5 sec. - */ -message ProcessCpuTime { - optional int32 uid = 1 [(is_uid) = true]; - - optional string process_name = 2; - // Process cpu time in user space, cumulative from boot/process start - optional int64 user_time_millis = 3; - // Process cpu time in system space, cumulative from boot/process start - optional int64 system_time_millis = 4; -} - -/** - * Pulls the CPU usage for each thread. - * - * Read from /proc/$PID/task/$TID/time_in_state files. - * - * TODO(mishaw): This is an experimental atom. Issues with big/little CPU frequencies, and - * time_in_state files not being present on some phones, have not been addressed. These should be - * considered before a public release. - */ -message CpuTimePerThreadFreq { - // UID that owns the process. - optional int32 uid = 1 [(is_uid) = true]; - // ID of the process. - optional int32 process_id = 2; - // ID of the thread. - optional int32 thread_id = 3; - // Name of the process taken from `/proc/$PID/cmdline`. - optional string process_name = 4; - // Name of the thread taken from `/proc/$PID/task/$TID/comm` - optional string thread_name = 5; - - // Report eight different frequencies, and how much time is spent in each frequency. Frequencies - // are given in KHz, and time is given in milliseconds since the thread started. All eight - // frequencies are given here as the alternative is sending eight separate atoms. This method - // significantly reduces the amount of data created - optional int32 frequency1_khz = 6; - optional int32 time1_millis = 7; - optional int32 frequency2_khz = 8; - optional int32 time2_millis = 9; - optional int32 frequency3_khz = 10; - optional int32 time3_millis = 11; - optional int32 frequency4_khz = 12; - optional int32 time4_millis = 13; - optional int32 frequency5_khz = 14; - optional int32 time5_millis = 15; - optional int32 frequency6_khz = 16; - optional int32 time6_millis = 17; - optional int32 frequency7_khz = 18; - optional int32 time7_millis = 19; - optional int32 frequency8_khz = 20; - optional int32 time8_millis = 21; -} - -/** - * Pulls information about the device's build. - */ -message BuildInformation { - // Build.FINGERPRINT. A string that uniquely identifies this build. Do not parse. - // E.g. may be composed of the brand, product, device, release, id, incremental, type, and tags. - optional string fingerprint = 1; - - // Build.BRAND. The consumer-visible brand with which the product/hardware will be associated. - optional string brand = 2; - - // Build.PRODUCT. The name of the overall product. - optional string product = 3; - - // Build.DEVICE. The name of the industrial design. - optional string device = 4; - - // Build.VERSION.RELEASE. The user-visible version string. E.g., "1.0" or "3.4b5" or "bananas". - optional string version_release = 5; - - // Build.ID. E.g. a label like "M4-rc20". - optional string id = 6; - - // Build.VERSION.INCREMENTAL. The internal value used by the underlying source control to - // represent this build. - optional string version_incremental = 7; - - // Build.TYPE. The type of build, like "user" or "eng". - optional string type = 8; - - // Build.TAGS. Comma-separated tags describing the build, like "unsigned,debug". - optional string tags = 9; -} - -/** - * Logs information about mismatched caller for content capture. - * - * Logged from: - * frameworks/base/core/java/android/service/contentcapture/ContentCaptureService.java - */ -message ContentCaptureCallerMismatchReported { - optional string intended_package = 1; - optional string calling_package = 2; -} - -/** - * Logs information about content capture service events. - * - * Logged from: - * frameworks/base/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureMetricsLogger.java - */ -message ContentCaptureServiceEvents { - // The type of event. - enum Event { - UNKNOWN = 0; - ON_CONNECTED = 1; - ON_DISCONNECTED = 2; - SET_WHITELIST = 3; - SET_DISABLED = 4; - ON_USER_DATA_REMOVED = 5; - ON_DATA_SHARE_REQUEST = 6; - ACCEPT_DATA_SHARE_REQUEST = 7; - REJECT_DATA_SHARE_REQUEST = 8; - DATA_SHARE_WRITE_FINISHED = 9; - DATA_SHARE_ERROR_IOEXCEPTION = 10; - DATA_SHARE_ERROR_EMPTY_DATA = 11; - DATA_SHARE_ERROR_CLIENT_PIPE_FAIL = 12; - DATA_SHARE_ERROR_SERVICE_PIPE_FAIL = 13; - DATA_SHARE_ERROR_CONCURRENT_REQUEST = 14; - DATA_SHARE_ERROR_TIMEOUT_INTERRUPTED = 15; - } - optional Event event = 1; - // component/package of content capture service. - optional string service_info = 2; - // component/package of target. - // it's a concatenated list of component/package for SET_WHITELIST event - // separated by " ". - optional string target_info = 3; -} - -/** - * Logs information about content capture session events. - * - * Logged from: - * frameworks/base/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureMetricsLogger.java - */ -message ContentCaptureSessionEvents { - // The type of event. - enum Event { - UNKNOWN = 0; - ON_SESSION_STARTED = 1; - ON_SESSION_FINISHED = 2; - SESSION_NOT_CREATED = 3; - } - optional int32 session_id = 1; - optional Event event = 2; - // (n/a on session finished) - optional int32 state_flags = 3; - // component/package of content capture service. - optional string service_info = 4; - // component/package of app. - // (n/a on session finished) - optional string app_info = 5; - optional bool is_child_session = 6; -} - -/** - * Logs information about session being flushed. - * - * Logged from: - * frameworks/base/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureMetricsLogger.java - */ -message ContentCaptureFlushed { - optional int32 session_id = 1; - // component/package of content capture service. - optional string service_info = 2; - // component/package of app. - optional string app_info = 3; - // session start/finish events - optional int32 child_session_started = 4; - optional int32 child_session_finished = 5; - // count of view events. - optional int32 view_appeared_count = 6; - optional int32 view_disappeared_count = 7; - optional int32 view_text_changed_count = 8; - - // Flush stats. - optional int32 max_events = 9; - optional int32 idle_flush_freq = 10; - optional int32 text_flush_freq = 11; - optional int32 flush_reason = 12; -} - -/** - * Pulls on-device BatteryStats power use calculations for the overall device. - */ -message DeviceCalculatedPowerUse { - // Power used by the device in nAs (i.e. nanocoulombs (nC)), as computed by BatteryStats, since - // BatteryStats last reset (i.e. roughly since device was last significantly charged). - // Currently, this is from BatteryStatsHelper.getComputedPower() (not getTotalPower()). - optional int64 computed_power_nano_amp_secs = 1; -} - -/** - * Pulls on-device BatteryStats power use calculations broken down by uid. - * This atom should be complemented by DeviceCalculatedPowerBlameOther, which contains the power use - * that is attributed to non-uid items. They must all be included to get the total power use. - */ -message DeviceCalculatedPowerBlameUid { - // Uid being blamed. Note: isolated uids have already been mapped to host uid. - optional int32 uid = 1 [(is_uid) = true]; - - // Power used by this uid in nAs (i.e. nanocoulombs (nC)), as computed by BatteryStats, since - // BatteryStats last reset (i.e. roughly since device was last significantly charged). - optional int64 power_nano_amp_secs = 2; -} - -/** - * Pulls on-device BatteryStats power use calculations that are not due to a uid, broken down by - * drain type. - * This atom should be complemented by DeviceCalculatedPowerBlameUid, which contains the blame that - * is attributed uids. They must all be included to get the total power use. - */ -message DeviceCalculatedPowerBlameOther { - // The type of item whose power use is being reported. - enum DrainType { - AMBIENT_DISPLAY = 0; - // reserved 1; reserved "APP"; // Logged instead in DeviceCalculatedPowerBlameUid. - BLUETOOTH = 2; - CAMERA = 3; - // Cell-standby - CELL = 4; - FLASHLIGHT = 5; - IDLE = 6; - MEMORY = 7; - // Amount that total computed drain exceeded the drain estimated using the - // battery level changes and capacity. - OVERCOUNTED = 8; - PHONE = 9; - SCREEN = 10; - // Amount that total computed drain was below the drain estimated using the - // battery level changes and capacity. - UNACCOUNTED = 11; - // reserved 12; reserved "USER"; // Entire drain for a user. This is NOT supported. - WIFI = 13; - } - optional DrainType drain_type = 1; - - // Power used by this item in nAs (i.e. nanocoulombs (nC)), as computed by BatteryStats, since - // BatteryStats last reset (i.e. roughly since device was last significantly charged). - optional int64 power_nano_amp_secs = 2; -} - -/** - * Logs device policy features. - * - * Logged from: - * frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java - * packages/apps/ManagedProvisioning/src/com/android/managedprovisioning/ - */ -message DevicePolicyEvent { - // The event id - unique for each event. - optional android.stats.devicepolicy.EventId event_id = 1; - // The admin package name. - optional string admin_package_name = 2; - // A generic integer parameter. - optional int32 integer_value = 3; - // A generic boolean parameter. - optional bool boolean_value = 4; - // A parameter specifying a time period in milliseconds. - optional uint64 time_period_millis = 5; - // A parameter specifying a list of package names, bundle extras or string parameters. - optional android.stats.devicepolicy.StringList string_list_value = 6 [(log_mode) = MODE_BYTES]; -} - -/** - * Logs when DocumentsUI is started, and how. Call this when DocumentsUI first starts up. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUILaunchReported { - optional android.stats.docsui.LaunchAction launch_action = 1; - optional bool has_initial_uri = 2; - optional android.stats.docsui.MimeType mime_type = 3; - optional android.stats.docsui.Root initial_root = 4; -} - -/** - * Logs root/app visited event in file managers/picker. Call this when the user - * taps on root/app in hamburger menu. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIRootVisitedReported { - optional android.stats.docsui.ContextScope scope = 1; - optional android.stats.docsui.Root root = 2; -} - -/** - * Logs file operation stats. Call this when a file operation has completed. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIFileOperationReported { - optional android.stats.docsui.Provider provider = 1; - optional android.stats.docsui.FileOperation file_op = 2; -} - -/** - * Logs file operation stats. Call this when a copy/move operation has completed with a specific - * mode. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIFileOperationCopyMoveModeReported { - optional android.stats.docsui.FileOperation file_op = 1; - optional android.stats.docsui.CopyMoveOpMode mode = 2; -} - - -/** - * Logs file sub operation stats. Call this when a file operation has failed. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIFileOperationFailureReported { - optional android.stats.docsui.Authority authority = 1; - optional android.stats.docsui.SubFileOperation sub_op = 2; -} - -/** -* Logs the cancellation of a file operation. Call this when a job is canceled -* -* Logged from: -* package/app/DocumentsUI/src/com/android/documentsui/Metrics.java -*/ -message DocsUIFileOperationCanceledReported { - optional android.stats.docsui.FileOperation file_op = 1; -} - -/** - * Logs startup time in milliseconds. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIStartupMsReported { - optional int32 startup_millis = 1; -} - -/** - * Logs the action that was started by user. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIUserActionReported { - optional android.stats.docsui.UserAction action = 1; -} - -/** - * Logs the invalid type when invalid scoped access is requested. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/ScopedAccessMetrics.java - */ -message DocsUIInvalidScopedAccessRequestReported { - optional android.stats.docsui.InvalidScopedAccess type = 1; -} - -/** - * Logs the package name that launches docsui picker mode. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIPickerLaunchedFromReported { - optional string package_name = 1; -} - -/** - * Logs the search type. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUISearchTypeReported { - optional android.stats.docsui.SearchType search_type = 1; -} - -/** - * Logs the search mode. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUISearchModeReported { - optional android.stats.docsui.SearchMode search_mode = 1; -} - -/** - * Logs the pick result information. - * - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIPickResultReported { - optional int32 total_action_count = 1; - optional int64 duration_millis = 2; - optional int32 file_count= 3; - optional bool is_searching = 4; - optional android.stats.docsui.Root picked_from = 5; - optional android.stats.docsui.MimeType mime_type = 6; - optional int32 repeatedly_pick_times = 7; -} - -/** Logs the drag and drop of files. - - * Logged from: - * package/app/DocumentsUI/src/com/android/documentsui/Metrics.java - */ -message DocsUIDragAndDropReported { - optional bool drag_initiated_from_docsui = 1; -} - -/** - * Logs when an app's memory is compacted. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java - */ -message AppCompacted { - // The pid of the process being compacted. - optional int32 pid = 1; - - // The name of the process being compacted. - optional string process_name = 2; - - // The type of compaction. - enum Action { - UNKNOWN = 0; - SOME = 1; - FULL = 2; - PERSISTENT = 3; - BFGS = 4; - } - optional Action action = 3; - - // Total RSS in kilobytes consumed by the process prior to compaction. - optional int64 before_rss_total_kilobytes = 4; - - // File RSS in kilobytes consumed by the process prior to compaction. - optional int64 before_rss_file_kilobytes = 5; - - // Anonymous RSS in kilobytes consumed by the process prior to compaction. - optional int64 before_rss_anon_kilobytes = 6; - - // Swap in kilobytes consumed by the process prior to compaction. - optional int64 before_swap_kilobytes = 7; - - // Total RSS in kilobytes consumed by the process after compaction. - optional int64 after_rss_total_kilobytes = 8; - - // File RSS in kilobytes consumed by the process after compaction. - optional int64 after_rss_file_kilobytes = 9; - - // Anonymous RSS in kilobytes consumed by the process after compaction. - optional int64 after_rss_anon_kilobytes = 10; - - // Swap in kilobytes consumed by the process after compaction. - optional int64 after_swap_kilobytes = 11; - - // The time taken to perform compaction in milliseconds. - optional int64 time_to_compact_millis = 12; - - // The last compaction action performed for this app. - optional Action last_action = 13; - - // The last time that compaction was attempted on this process in milliseconds - // since boot, not including sleep (see SystemClock.uptimeMillis()). - optional int64 last_compact_timestamp_ms_since_boot = 14; - - // The "setAdj" (i.e. previous) oom_score_adj at the time of compaction. - optional int32 oom_score_adj = 15; - - // The process state at the time of compaction. - optional android.app.ProcessStateEnum process_state = 16 [default = PROCESS_STATE_UNKNOWN]; - - // Free ZRAM in kilobytes before compaction. - optional int64 before_zram_free_kilobytes = 17; - - // Free ZRAM in kilobytes after compaction. - optional int64 after_zram_free_kilobytes = 18; -} - -/** - * Logs when a Tethering event occurs. - * - */ -message NetworkTetheringReported { - // tethering error code - optional android.stats.connectivity.ErrorCode error_code = 1; - - // tethering downstream type - optional android.stats.connectivity.DownstreamType downstream_type = 2; - - // transport type of upstream network - optional android.stats.connectivity.UpstreamType upstream_type = 3; - - // The user type of Tethering - optional android.stats.connectivity.UserType user_type= 4; -} - -/** - * Logs a DNS lookup operation initiated by the system resolver on behalf of an application - * invoking native APIs such as getaddrinfo() or Java APIs such as Network#getAllByName(). - * - * The NetworkDnsEventReported message represents the entire lookup operation, which may - * result one or more queries to the recursive DNS resolvers. Those are individually logged - * in DnsQueryEvents to enable computing error rates and network latency and timeouts - * broken up by query type, transport, network interface, etc. - */ -message NetworkDnsEventReported { - optional android.stats.dnsresolver.EventType event_type = 1; - - optional android.stats.dnsresolver.ReturnCode return_code = 2; - - // The latency in microseconds of the entire DNS lookup operation. - optional int32 latency_micros = 3; - - // Only valid for event_type = EVENT_GETADDRINFO. - optional int32 hints_ai_flags = 4; - - // Flags passed to android_res_nsend() defined in multinetwork.h - // Only valid for event_type = EVENT_RESNSEND. - optional int32 res_nsend_flags = 5; - - optional android.stats.dnsresolver.NetworkType network_type = 6; - - // The DNS over TLS mode on a specific netId. - optional android.stats.dnsresolver.PrivateDnsModes private_dns_modes = 7; - - // Additional pass-through fields opaque to statsd. - // The DNS resolver Mainline module can add new fields here without requiring an OS update. - optional android.stats.dnsresolver.DnsQueryEvents dns_query_events = 8 [(log_mode) = MODE_BYTES]; - - // The sample rate of DNS stats (to statsd) is 1/sampling_rate_denom. - optional int32 sampling_rate_denom = 9; -} - -/** - * logs the CapportApiData info - * Logged from: - * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java - */ -message CapportApiData { - // The TTL of the network connection provided by captive portal - optional int32 remaining_ttl_secs = 1; - - // The limit traffic data of the network connection provided by captive portal - optional int32 remaining_bytes = 2; - - // Is portal url option included in the DHCP packet (Yes, No) - optional bool has_portal_url = 3; - - // Is venue info (e.g. store info, maps, flight status) included (Yes, No) - optional bool has_venue_info = 4; -} - -/** - * logs a network Probe Event - * Logged from: - * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java - */ -message ProbeEvent { - // The probe type (http or https, or captive portal API...) - optional android.stats.connectivity.ProbeType probe_type = 1; - - // The latency in microseconds of the probe event - optional int32 latency_micros = 2; - - // The result of the probe event - optional android.stats.connectivity.ProbeResult probe_result = 3; - - // The CaptivePortal API info - optional CapportApiData capport_api_data = 4; -} - -/** - * log each ProbeEvent in ProbeEvents - * Logged from: - * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java - */ -message ProbeEvents { - // Record probe event during the validation - repeated ProbeEvent probe_event = 1; -} - -/** - * The DHCP (Dynamic Host Configuration Protocol) session info - * Logged from: - * packages/modules/NetworkStack/src/android/net/dhcp/DhcpClient.java - */ -message DhcpSession { - // The DHCP Feature(s) enabled in this session - repeated android.stats.connectivity.DhcpFeature used_features = 1; - - // The discover packet (re)transmit count - optional int32 discover_count = 2; - - // The request packet (re)transmit count - optional int32 request_count = 3; - - // The IPv4 address conflict count - // (only be meaningful when duplicate address detection is enabled) - optional int32 conflict_count = 4; - - // The DHCP packet parsing error code in this session - // (defined in android.net.metrics.DhcpErrorEvent) - repeated android.stats.connectivity.DhcpErrorCode error_code = 5; - - // The result of DHCP hostname transliteration - optional android.stats.connectivity.HostnameTransResult ht_result = 6; -} - -/** - * Logs Network IP provisioning event - * Logged from: - * packages/modules/NetworkStack/src/com/android/networkstack/metrics/NetworkIpProvisioningMetrics.java - */ -message NetworkIpProvisioningReported { - // Transport type (WIFI, CELLULAR, BLUETOOTH, ..) - optional android.stats.connectivity.TransportType transport_type = 1; - - // The latency in microseconds of IP Provisioning over IPV4 - optional int32 ipv4_latency_micros = 2; - - // The latency in microseconds of IP Provisioning over IPV6 - optional int32 ipv6_latency_micros = 3; - - // The time duration between provisioning start and end (success or failure) - optional int64 provisioning_duration_micros = 4; - - // The specific disconnect reason for this IP provisioning - optional android.stats.connectivity.DisconnectCode disconnect_code = 5; - - // Log DHCP session info (Only valid for IPv4) - optional DhcpSession dhcp_session = 6 [(log_mode) = MODE_BYTES]; - - // The random number between 0 ~ 999 for sampling - optional int32 random_number = 7; -} - -/** - * Logs Network DHCP Renew event - * Logged from: - * packages/modules/NetworkStack/src/android/net/dhcp/DhcpClient.java - */ -message NetworkDhcpRenewReported { - // Transport type (WIFI, CELLULAR, BLUETOOTH, ..) - optional android.stats.connectivity.TransportType transport_type = 1; - - // The request packet (re)transmit count - optional int32 request_count = 2; - - // The latency in microseconds of DHCP Renew - optional int32 latency_micros = 3; - - // The DHCP error code is defined in android.net.metrics.DhcpErrorEvent - optional android.stats.connectivity.DhcpErrorCode error_code = 4; - - // The result of DHCP renew - optional android.stats.connectivity.DhcpRenewResult renew_result = 5; - - // The random number between 0 ~ 999 for sampling - optional int32 random_number = 6; -} - -/** - * Logs Network Validation event - * Logged from: - * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java - */ -message NetworkValidationReported { - // Transport type (WIFI, CELLULAR, BLUETOOTH, ..) - optional android.stats.connectivity.TransportType transport_type = 1; - - // Record each probe event - optional ProbeEvents probe_events = 2 [(log_mode) = MODE_BYTES]; - - // The result of the network validation - optional android.stats.connectivity.ValidationResult validation_result = 3; - - // The latency in microseconds of network validation - optional int32 latency_micros = 4; - - // The validation index (the first validation attempt or second, third...) - optional int32 validation_index = 5; - - // The random number between 0 ~ 999 for sampling - optional int32 random_number = 6; -} - -/** - * Logs NetworkStack Quirk event - * Logged from: - * packages/modules/NetworkStack/src/com/android/networkstack/ - */ -message NetworkStackQuirkReported { - // Transport type (WIFI, CELLULAR, BLUETOOTH, ..) - optional android.stats.connectivity.TransportType transport_type = 1; - - // Record each Quirk event - optional android.stats.connectivity.NetworkQuirkEvent event = 2; -} - -/** - * Logs when a data stall event occurs. - * - * Log from: - * packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java - */ -message DataStallEvent { - // Data stall evaluation type. - // See packages/modules/NetworkStack/src/com/android/server/connectivity/NetworkMonitor.java - // Refer to the definition of DATA_STALL_EVALUATION_TYPE_*. - optional int32 evaluation_type = 1; - // See definition in data_stall_event.proto. - optional com.android.server.connectivity.ProbeResult validation_result = 2; - // See definition in data_stall_event.proto. - optional android.net.NetworkCapabilitiesProto.Transport network_type = 3; - // See definition in data_stall_event.proto. - optional com.android.server.connectivity.WifiData wifi_info = 4 [(log_mode) = MODE_BYTES]; - // See definition in data_stall_event.proto. - optional com.android.server.connectivity.CellularData cell_info = 5 [(log_mode) = MODE_BYTES]; - // See definition in data_stall_event.proto. - optional com.android.server.connectivity.DnsEvent dns_event = 6 [(log_mode) = MODE_BYTES]; - // The tcp packets fail rate from the latest tcp polling. - optional int32 tcp_fail_rate = 7; - // Number of packets sent since the last received packet. - optional int32 tcp_sent_since_last_recv = 8; -} - -/* - * Logs when RescueParty resets some set of experiment flags. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/RescueParty.java - */ -message RescuePartyResetReported { - // The rescue level of this reset. A value of 0 indicates missing or unknown level information. - optional int32 rescue_level = 1; -} - -/** - * Logs when signed config is received from an APK, and if that config was applied successfully. - * Logged from: - * frameworks/base/services/core/java/com/android/server/signedconfig/SignedConfigService.java - */ -message SignedConfigReported { - enum Type { - UNKNOWN_TYPE = 0; - GLOBAL_SETTINGS = 1; - } - optional Type type = 1; - - // The final status of the signed config received. - enum Status { - UNKNOWN_STATUS = 0; - APPLIED = 1; - BASE64_FAILURE_CONFIG = 2; - BASE64_FAILURE_SIGNATURE = 3; - SECURITY_EXCEPTION = 4; - INVALID_CONFIG = 5; - OLD_CONFIG = 6; - SIGNATURE_CHECK_FAILED = 7; - NOT_APPLICABLE = 8; - SIGNATURE_CHECK_FAILED_PROD_KEY_ABSENT = 9; - } - optional Status status = 2; - - // The version of the signed config processed. - optional int32 version = 3; - - // The package name that the config was extracted from. - optional string from_package = 4; - - enum Key { - NO_KEY = 0; - DEBUG = 1; - PRODUCTION = 2; - } - // Which key was used to verify the config. - optional Key verified_with = 5; -} - -/* - * Logs GNSS Network-Initiated (NI) location events. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java - */ -message GnssNiEventReported { - // The type of GnssNiEvent. - enum EventType { - UNKNOWN = 0; - NI_REQUEST = 1; - NI_RESPONSE = 2; - } - optional EventType event_type = 1; - - // An ID generated by HAL to associate NI notifications and UI responses. - optional int32 notification_id = 2; - - // A type which distinguishes different categories of NI request, such as VOICE, UMTS_SUPL etc. - optional android.server.location.GnssNiType ni_type = 3; - - // NI requires notification. - optional bool need_notify = 4; - - // NI requires verification. - optional bool need_verify = 5; - - // NI requires privacy override, no notification/minimal trace. - optional bool privacy_override = 6; - - // Timeout period to wait for user response. Set to 0 for no timeout limit. Specified in - // seconds. - optional int32 timeout = 7; - - // Default response when timeout. - optional android.server.location.GnssUserResponseType default_response = 8; - - // String representing the requester of the network inititated location request. - optional string requestor_id = 9; - - // Notification message text string representing the service(for eg. SUPL-service) who sent the - // network initiated location request. - optional string text = 10; - - // requestorId decoding scheme. - optional android.server.location.GnssNiEncodingType requestor_id_encoding = 11; - - // Notification message text decoding scheme. - optional android.server.location.GnssNiEncodingType text_encoding = 12; - - // True if SUPL ES is enabled. - optional bool is_supl_es_enabled = 13; - - // True if GNSS location is enabled. - optional bool is_location_enabled = 14; - - // GNSS NI responses which define the response in NI structures. - optional android.server.location.GnssUserResponseType user_response = 15; -} - -/** - * Logs GNSS non-framework (NFW) location notification. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/location/GnssLocationProvider.java - */ -message GnssNfwNotificationReported { - // Package name of the Android proxy application representing the non-framework entity that - // requested location. Set to empty string if unknown. - optional string proxy_app_package_name = 1; - - // Protocol stack that initiated the non-framework location request. - optional android.server.location.NfwProtocolStack protocol_stack = 2; - - // Name of the protocol stack if protocol_stack field is set to OTHER_PROTOCOL_STACK. Otherwise, - // set to empty string. This field is opaque to the framework and used for logging purposes. - optional string other_protocol_stack_name = 3; - - // Source initiating/receiving the location information. - optional android.server.location.NfwRequestor requestor = 4; - - // Identity of the endpoint receiving the location information. For example, carrier name, OEM - // name, SUPL SLP/E-SLP FQDN, chipset vendor name, etc. This field is opaque to the framework - // and used for logging purposes. - optional string requestor_id = 5; - - // Indicates whether location information was provided for this request. - optional android.server.location.NfwResponseType response_type = 6; - - // True if the device is in user initiated emergency session. - optional bool in_emergency_mode = 7; - - // True if cached location is provided. - optional bool is_cached_location = 8; - - // True if proxy app permission mismatch between framework and GNSS HAL. - optional bool is_permission_mismatched = 9; -} - -/** - * Logs GNSS configuration as defined in IGnssConfiguration.hal. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/location/GnssConfiguration.java - */ -message GnssConfigurationReported { - // SUPL host name. - optional string supl_host = 1; - - // SUPL port number. - optional int32 supl_port = 2; - - // C2K host name. - optional string c2k_host = 3; - - // C2K port number. - optional int32 c2k_port = 4; - - // The SUPL version requested by Carrier. - optional int32 supl_ver = 5; - - // The SUPL mode. - optional android.server.location.SuplMode supl_mode = 6; - - // True if NI emergency SUPL restrictions is enabled. - optional bool supl_es = 7; - - // LTE Positioning Profile settings - optional android.server.location.LppProfile lpp_profile = 8; - - // Positioning protocol on A-Glonass system. - optional android.server.location.GlonassPosProtocol a_glonass_pos_protocol_select = 9; - - // True if emergency PDN is used. Otherwise, regular PDN is used. - optional bool use_emergency_pdn_for_emergency_supl= 10; - - // Configurations of how GPS functionalities should be locked when user turns off GPS On setting. - optional android.server.location.GpsLock gps_lock = 11; - - // Number of seconds to extend the emergency session duration post emergency call. - optional int32 es_extension_sec = 12; - - // The full list of package names of proxy Android applications representing the non-framework - // location access entities (on/off the device) for which the framework user has granted - // non-framework location access permission. The package names are concatenated in one string - // with spaces as separators. - optional string enabled_proxy_app_package_name_list = 13; -} - -/** - * Logs when a NFC device's error occurred. - * Logged from: - * system/nfc/src/nfc/nfc/nfc_ncif.cc - * packages/apps/Nfc/src/com/android/nfc/cardemulation/AidRoutingManager.java - */ -message NfcErrorOccurred { - enum Type { - UNKNOWN = 0; - CMD_TIMEOUT = 1; - ERROR_NOTIFICATION = 2; - AID_OVERFLOW = 3; - } - optional Type type = 1; - // If it's nci cmd timeout, log the timeout command. - optional uint32 nci_cmd = 2; - - optional uint32 error_ntf_status_code = 3; -} - -/** - * Logs when a NFC device's state changed event - * Logged from: - * packages/apps/Nfc/src/com/android/nfc/NfcService.java - */ -message NfcStateChanged { - enum State { - UNKNOWN = 0; - OFF = 1; - ON = 2; - ON_LOCKED = 3; // Secure Nfc enabled. - CRASH_RESTART = 4; // NfcService watchdog timeout restart. - } - optional State state = 1; -} - -/** - * Logs when a NFC Beam Transaction occurred. - * Logged from: - * packages/apps/Nfc/src/com/android/nfc/P2pLinkManager.java - */ -message NfcBeamOccurred { - enum Operation { - UNKNOWN = 0; - SEND = 1; - RECEIVE = 2; - } - optional Operation operation = 1; -} - -/** - * Logs when a NFC Card Emulation Transaction occurred. - * Logged from: - * packages/apps/Nfc/src/com/android/nfc/cardemulation/HostEmulationManager.java - * packages/apps/Nfc/src/com/android/nfc/cardemulation/HostNfcFEmulationManager.java - */ -message NfcCardemulationOccurred { - enum Category { - UNKNOWN = 0; - HCE_PAYMENT = 1; - HCE_OTHER = 2; - OFFHOST = 3; - } - // Transaction belongs to HCE payment or HCE other category, or offhost. - optional Category category = 1; - // SeName from transaction: SIMx, eSEx, HCE, HCEF. - optional string se_name = 2; -} - -/** - * Logs when a NFC Tag event occurred. - * Logged from: - * packages/apps/Nfc/src/com/android/nfc/NfcDispatcher.java - */ -message NfcTagOccurred { - enum Type { - UNKNOWN = 0; - URL = 1; - BT_PAIRING = 2; - PROVISION = 3; - WIFI_CONNECT = 4; - APP_LAUNCH = 5; - OTHERS = 6; - } - optional Type type = 1; -} - -/** - * Logs when Hce transaction triggered - * Logged from: - * system/nfc/src/nfc/nfc/nfc_ncif.cc - */ -message NfcHceTransactionOccurred { - // The latency period(in microseconds) it took for the first HCE data - // exchange. - optional uint32 latency_micros = 1; -} - -/** - * Logs when SecureElement state event changed - * Logged from: - * packages/apps/SecureElement/src/com/android/se/Terminal.java - */ -message SeStateChanged { - enum State { - UNKNOWN = 0; - INITIALIZED = 1; - DISCONNECTED = 2; - CONNECTED = 3; - HALCRASH = 4; - } - optional State state = 1; - - optional string state_change_reason = 2; - // SIMx or eSEx. - optional string terminal = 3; -} - -/** - * Information about a permission grant request - */ -message PermissionGrantRequestResultReported { - // unique value identifying an API call. A API call might result in multiple of these atoms - optional int64 request_id = 1; - - // UID of package requesting the permission grant - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package requesting the permission grant - optional string package_name = 3; - - // The permission to be granted - optional string permission_name = 4; - - // If the permission was explicitly requested via the API or added by the system - optional bool is_implicit = 5; - - enum Result { - UNDEFINED = 0; - // permission request was ignored - IGNORED = 1; - // permission request was ignored because it was user fixed - IGNORED_USER_FIXED = 2; - // permission request was ignored because it was policy fixed - IGNORED_POLICY_FIXED = 3; - // permission was granted by user action - USER_GRANTED = 4; - // permission was automatically granted - AUTO_GRANTED = 5; - // permission was denied by user action - USER_DENIED = 6; - // permission was denied with prejudice by the user - USER_DENIED_WITH_PREJUDICE = 7; - // permission was automatically denied - AUTO_DENIED = 8; - // permission request was ignored because permission is restricted - IGNORED_RESTRICTED_PERMISSION = 9; - // one time permission was granted by user action - USER_GRANTED_ONE_TIME = 10; - // user ignored request by leaving the request screen without choosing any option - USER_IGNORED = 11; - // user granted the permission after being linked to settings - USER_GRANTED_IN_SETTINGS = 12; - // user denied the permission after being linked to settings - USER_DENIED_IN_SETTINGS = 13; - // user denied the permission with prejudice after being linked to settings - USER_DENIED_WITH_PREJUDICE_IN_SETTINGS = 14; - // permission was automatically revoked after one-time permission expired - AUTO_ONE_TIME_PERMISSION_REVOKED = 15; - // permission was automatically revoked for unused app - AUTO_UNUSED_APP_PERMISSION_REVOKED = 16; - } - // The result of the permission grant - optional Result result = 6; -} - -/** - * Logs when Omapi API used - * Logged from: - * packages/apps/SecureElement/src/com/android/se/Terminal.java - */ -message SeOmapiReported { - enum Operation { - UNKNOWN = 0; - OPEN_CHANNEL = 1; - } - optional Operation operation = 1; - // SIMx or eSEx. - optional string terminal = 2; - - optional string package_name = 3; -} - -/** - * Logs the dispatch latency of a broadcast during processing of BOOT_COMPLETED. - * The dispatch latency is the dispatchClockTime - enqueueClockTime. - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java - */ -message BroadcastDispatchLatencyReported { - optional int64 dispatch_latency_millis = 1; -} - -/** - * Logs AttentionManagerService attention check result. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/attention/AttentionManagerService.java - */ -message AttentionManagerServiceResultReported { - // See core/java/android/service/attention/AttentionService.java - enum AttentionCheckResult { - UNKNOWN = 20; - ATTENTION_SUCCESS_ABSENT = 0; - ATTENTION_SUCCESS_PRESENT = 1; - ATTENTION_FAILURE_UNKNOWN = 2; - ATTENTION_FAILURE_CANCELLED = 3; - ATTENTION_FAILURE_PREEMPTED = 4; - ATTENTION_FAILURE_TIMED_OUT = 5; - ATTENTION_FAILURE_CAMERA_PERMISSION_ABSENT = 6; - } - optional AttentionCheckResult attention_check_result = 1 [default = UNKNOWN]; -} - -/** - * Logs when an adb connection changes state. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/adb/AdbDebuggingManager.java - */ -message AdbConnectionChanged { - // The last time this system connected via adb, or 0 if the 'always allow' option was not - // previously selected for this system. - optional int64 last_connection_time_millis = 1; - - // The time in ms within which a subsequent connection from an 'always allow' system is allowed - // to reconnect via adb without user interaction. - optional int64 auth_window_millis = 2; - - // The state of the adb connection from frameworks/base/core/proto/android/debug/enums.proto. - optional android.debug.AdbConnectionStateEnum state = 3; - - // True if the 'always allow' option was selected for this system. - optional bool always_allow = 4; -} - -/* - * Logs the reported speech DSP status. - * - * Logged from: - * Vendor audio implementation. - */ -message SpeechDspStatReported { - // The total Speech DSP uptime in milliseconds. - optional int32 total_uptime_millis = 1; - // The total Speech DSP downtime in milliseconds. - optional int32 total_downtime_millis = 2; - optional int32 total_crash_count = 3; - optional int32 total_recover_count = 4; -} - -/** - * Logs USB connector contaminant status. - * - * Logged from: USB Service. - */ -message UsbContaminantReported { - optional string id = 1; - optional android.service.usb.ContaminantPresenceStatus status = 2; -} - -/** - * This atom is for debugging purpose. - */ -message DebugElapsedClock { - // Monotically increasing value for each pull. - optional int64 pull_count = 1; - // Time from System.elapsedRealtime. - optional int64 elapsed_clock_millis = 2; - // Time from System.elapsedRealtime. - optional int64 same_elapsed_clock_millis = 3; - // Diff between current elapsed time and elapsed time from previous pull. - optional int64 elapsed_clock_diff_millis = 4; - - enum Type { - TYPE_UNKNOWN = 0; - ALWAYS_PRESENT = 1; - PRESENT_ON_ODD_PULLS = 2; - } - // Type of behavior for the pulled data. - optional Type type = 5; -} - -/** - * This atom is for debugging purpose. - */ -message DebugFailingElapsedClock { - // Monotically increasing value for each pull. - optional int64 pull_count = 1; - // Time from System.elapsedRealtime. - optional int64 elapsed_clock_millis = 2; - // Time from System.elapsedRealtime. - optional int64 same_elapsed_clock_millis = 3; - // Diff between current elapsed time and elapsed time from previous pull. - optional int64 elapsed_clock_diff_millis = 4; -} - -/** Logs System UI bubbles event changed. - * - * Logged from: - * frameworks/base/packages/SystemUI/src/com/android/systemui/bubbles - */ -message BubbleUIChanged { - - // The app package that is posting the bubble. - optional string package_name = 1; - - // The notification channel that is posting the bubble. - optional string notification_channel = 2; - - // The notification id associated with the posted bubble. - optional int32 notification_id = 3; - - // The position of the bubble within the bubble stack. - optional int32 position = 4; - - // The total number of bubbles within the bubble stack. - optional int32 total_number = 5; - - // User interactions with the bubble. - enum Action { - UNKNOWN = 0; - POSTED = 1; - UPDATED = 2; - EXPANDED = 3; - COLLAPSED = 4; - DISMISSED = 5; - STACK_DISMISSED = 6; - STACK_MOVED = 7; - HEADER_GO_TO_APP = 8; - HEADER_GO_TO_SETTINGS = 9; - PERMISSION_OPT_IN = 10; - PERMISSION_OPT_OUT = 11; - PERMISSION_DIALOG_SHOWN = 12; - SWIPE_LEFT = 13; - SWIPE_RIGHT = 14; - STACK_EXPANDED = 15; - FLYOUT = 16; - } - optional Action action = 6; - - // Normalized screen position of the bubble stack. The range is between 0 and 1. - optional float normalized_x_position = 7; - optional float normalized_y_position = 8; - - // Whether the bubble is unread. If it is unread, a dot is shown in the bubble stack icon. - optional bool is_unread = 9; - - // Whether the bubble is an on-going one. - optional bool is_ongoing = 10; - - // Whether the bubble is produced by an app running in foreground. - // This is deprecated and the value should be ignored. - optional bool is_foreground = 11 [deprecated = true]; -} - -/** - * Logs System UI bubbles developer errors. - * - * Logged from: - * frameworks/base/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java - */ -message BubbleDeveloperErrorReported { - - // The app package that is posting the bubble. - optional string package_name = 1; - - // Bubble developer error type enums. - enum Error { - UNKNOWN = 0; - ACTIVITY_INFO_MISSING = 1; - ACTIVITY_INFO_NOT_RESIZABLE = 2; - DOCUMENT_LAUNCH_NOT_ALWAYS = 3; - } - optional Error error = 2 [default = UNKNOWN]; -} - -/** - * Logs that a constraint for a scheduled job has changed. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/job/controllers/JobStatus.java - */ -message ScheduledJobConstraintChanged { - repeated AttributionNode attribution_node = 1; - - // Name of the job. - optional string job_name = 2; - - optional com.android.server.job.ConstraintEnum constraint = 3; - - enum State { - UNKNOWN = 0; - UNSATISFIED = 1; - SATISFIED = 2; - } - optional State state = 4; -} - -/** - * Logs PowerManagerService screen timeout resets (extensions) that happen when an attention check - * returns true. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java - */ -message ScreenTimeoutExtensionReported { - // Describes how many times in a row did the power manager reset the screen off timeout. - optional uint32 consecutive_timeout_extended_count = 1; -} - -/* -* Logs number of milliseconds it takes to start a process. -* The definition of app process start time is from the app launch time to -* the time that Zygote finished forking the app process and loaded the -* application package's java classes. - -* This metric is different from AppStartOccurred which is for foreground -* activity only. - -* ProcessStartTime can report all processes (both foreground and background) -* start time. -* -* Logged from: -* frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java -*/ -message ProcessStartTime { - // The uid of the ProcessRecord. - optional int32 uid = 1 [(is_uid) = true]; - - // The process pid. - optional int32 pid = 2; - - // The process name. - // Usually package name, "system" for system server. - // Provided by ActivityManagerService. - optional string process_name = 3; - - enum StartType { - UNKNOWN = 0; - WARM = 1; - HOT = 2; - COLD = 3; - } - - // The start type. - optional StartType type = 4; - - // The elapsed realtime at the start of the process. - optional int64 process_start_time_millis = 5; - - // Number of milliseconds it takes to reach bind application. - optional int32 bind_application_delay_millis = 6; - - // Number of milliseconds it takes to finish start of the process. - optional int32 process_start_delay_millis = 7; - - // hostingType field in ProcessRecord, the component type such as "activity", - // "service", "content provider", "broadcast" or other strings. - optional string hosting_type = 8; - - // hostingNameStr field in ProcessRecord. The component class name that runs - // in this process. - optional string hosting_name = 9; -} - -/** - * Track Media Codec usage - * Logged from: - * frameworks/av/media/libstagefright/MediaCodec.cpp - * frameworks/av/services/mediaanalytics/statsd_codec.cpp - */ -message MediametricsCodecReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.CodecData codec_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track Media Extractor (pulling video/audio streams out of containers) usage - * Logged from: - * frameworks/av/media/libstagefright/RemoteMediaExtractor.cpp - * frameworks/av/services/mediaanalytics/statsd_extractor.cpp - */ -message MediametricsExtractorReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.ExtractorData extractor_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track how we arbitrate between microphone/input requests. - * Logged from - * frameworks/av/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp - * frameworks/av/services/mediaanalytics/statsd_audiopolicy.cpp - */ -message MediametricsAudiopolicyReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.AudioPolicyData audiopolicy_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track how we arbitrate between microphone requests. - * Logged from - * frameworks/av/media/libaudioclient/AudioRecord.cpp - * frameworks/av/services/mediaanalytics/statsd_audiorecord.cpp - */ -message MediametricsAudiorecordReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.AudioRecordData audiorecord_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track how we arbitrate between microphone/input requests. - * Logged from - * frameworks/av/media/libnblog/ReportPerformance.cpp - * frameworks/av/services/mediaanalytics/statsd_audiothread.cpp - */ -message MediametricsAudiothreadReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.AudioThreadData audiothread_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track how we arbitrate between microphone/input requests. - * Logged from - * frameworks/av/media/libaudioclient/AudioTrack.cpp - * frameworks/av/services/mediaanalytics/statsd_audiotrack.cpp - */ -message MediametricsAudiotrackReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.AudioTrackData audiotrack_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track information about DRM framework performance - * Logged from - * frameworks/av/drm/libmediadrm/DrmHal.cpp - * frameworks/av/services/mediaanalytics/statsd_drm.cpp - */ -message MediametricsMediadrmReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - // vendor+description tell about which DRM plugin is in use on this device - optional string vendor = 5; - optional string description = 6; - // from frameworks/av/drm/libmediadrm/protos/metrics.proto - optional bytes framework_stats = 7 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track information about the widevine DRM plugin performance - * Logged from - * vendor/widevine/libwvdrmengine/cdm/metrics - * frameworks/av/services/mediaanalytics/statsd_drm.cpp - */ -message MediametricsDrmWidevineReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional bytes vendor_specific_stats = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track information about recordings (e.g. camcorder) - * Logged from - * frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp - * frameworks/av/services/mediaanalytics/statsd_recorder.cpp - */ -message MediametricsRecorderReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.RecorderData recorder_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track Media Player usage - * Logged from: - * frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp - * frameworks/av/services/mediaanalytics/statsd_nuplayer.cpp - */ -message MediametricsNuPlayerReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - optional android.stats.mediametrics.NuPlayerData nuplayer_data = 5 [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Track Legacy DRM usage - * Logged from - * frameworks/av/drm/drmserver/DrmManager.cpp - */ -message MediametricsDrmManagerReported { - optional int64 timestamp_nanos = 1; - optional string package_name = 2; - optional int64 package_version_code = 3; - optional int64 media_apex_version = 4; - - enum Method { - METHOD_NOT_FOUND = -1; - GET_CONSTRAINTS = 0; - GET_METADATA = 1; - CAN_HANDLE = 2; - PROCESS_DRM_INFO = 3; - ACQUIRE_DRM_INFO = 4; - SAVE_RIGHTS = 5; - GET_ORIGINAL_MIME_TYPE = 6; - GET_DRM_OBJECT_TYPE = 7; - CHECK_RIGHTS_STATUS = 8; - REMOVE_RIGHTS = 9; - REMOVE_ALL_RIGHTS = 10; - OPEN_CONVERT_SESSION = 11; - OPEN_DECRYPT_SESSION = 12; - } - - // plugin_id+description inform which Legacy DRM plugins are still in use on device - optional string plugin_id = 5; - optional string description = 6; - optional Method method = 7; - optional string mime_types = 8; - - optional int64 get_constraints_count = 9; - optional int64 get_metadata_count = 10; - optional int64 can_handle_count = 11; - optional int64 process_drm_info_count = 12; - optional int64 acquire_drm_info_count = 13; - optional int64 save_rights_count = 14; - optional int64 get_original_mime_type_count = 15; - optional int64 get_drm_object_type_count = 16; - optional int64 check_rights_status_count = 17; - optional int64 remove_rights_count = 18; - optional int64 remove_all_rights_count = 19; - optional int64 open_convert_session_count = 20; - optional int64 open_decrypt_session_count = 21; -} - -/** - * State of a dangerous permission requested by a package - * Pulled from: StatsCompanionService -*/ -message DangerousPermissionState { - // Name of the permission - optional string permission_name = 1; - - // Uid of the package - optional int32 uid = 2 [(is_uid) = true]; - - // Package requesting the permission - optional string package_name = 3; - - // If the permission is granted to the uid - optional bool is_granted = 4; - - // Permission flags as per android.content.pm.PermissionFlags - optional int32 permission_flags = 5; -} - -/** - * Logs when a package is denied access to a device identifier based on the new access requirements. - * - * Logged from: - * frameworks/base/telephony/java/com/android/internal/telephony/TelephonyPermissions.java - */ -message DeviceIdentifierAccessDenied { - // The name of the package denied access to the requested device identifier. - optional string package_name = 1; - - // The name of the device identifier method the package attempted to invoke. - optional string method_name = 2; - - // True if the package is preinstalled. - // Starting from Android 11, this boolean is not set and will always be false. - optional bool is_preinstalled = 3 [deprecated = true]; - - // True if the package is privileged. - // Starting from Android 11, this boolean is not set and will always be false. - optional bool is_priv_app = 4 [deprecated = true]; -} - -/** - * Pulls the ongoing mainline install train version code. - * Pulled from StatsCompanionService - */ -message TrainInfo { - optional int64 train_version_code = 1; - - optional TrainExperimentIds train_experiment_id = 2; - - optional string train_name = 3; - - enum Status { - UNKNOWN = 0; - INSTALL_REQUESTED = 1; - INSTALL_STARTED = 2; - INSTALL_STAGED_NOT_READY = 3; - INSTALL_STAGED_READY = 4; - INSTALL_SUCCESS = 5; - // Replaced by INSTALL_FAILURE_DOWNLOAD, INSTALL_FAILURE_STATE_MISMATCH, - // and INSTALL_FAILURE_COMMIT. - INSTALL_FAILURE = 6 [deprecated = true]; - // This enum is for installs that are manually cancelled via the Manual Update UI. - INSTALL_CANCELLED = 7; - INSTALLER_ROLLBACK_REQUESTED = 8; - INSTALLER_ROLLBACK_INITIATED = 9; - INSTALLER_ROLLBACK_INITIATED_FAILURE = 10; - INSTALLER_ROLLBACK_STAGED = 11; - INSTALLER_ROLLBACK_STAGED_FAILURE = 12; - INSTALLER_ROLLBACK_BOOT_TRIGGERED = 13; - INSTALLER_ROLLBACK_BOOT_TRIGGERED_FAILURE = 14; - INSTALLER_ROLLBACK_SUCCESS = 15; - INSTALLER_ROLLBACK_FAILURE = 16; - INSTALLER_ROLLBACK_STAGED_CANCEL_REQUESTED = 17; - INSTALLER_ROLLBACK_STAGED_CANCEL_SUCCESS = 18; - INSTALLER_ROLLBACK_STAGED_CANCEL_FAILURE = 19; - INSTALL_STAGED_CANCEL_REQUESTED = 20; - INSTALL_STAGED_CANCEL_SUCCESS = 21; - INSTALL_STAGED_CANCEL_FAILURE = 22; - INSTALL_FAILURE_DOWNLOAD = 23; - INSTALL_FAILURE_STATE_MISMATCH = 24; - INSTALL_FAILURE_COMMIT = 25; - REBOOT_TRIGGERED = 26; - } - optional Status status = 4; -} - -/** - * Logs the gesture stage changed event. - * - * Logged from: - * frameworks/base/packages/SystemUI/ - */ -message AssistGestureStageReported { - optional android.hardware.sensor.assist.AssistGestureStageEnum gesture_stage = 1; -} - -/** - * Logs the feedback type. - * - * Logged from: - * frameworks/base/packages/SystemUI/ - */ -message AssistGestureFeedbackReported { - // Whether or not the gesture was used. - optional android.hardware.sensor.assist.AssistGestureFeedbackEnum feedback_type = 1; -} - -/** - * Logs the progress. - * - * Logged from: - * frameworks/base/packages/SystemUI/ - */ -message AssistGestureProgressReported { - // [0,100] progress for the assist gesture. - optional int32 progress = 1; -} - -/* - * Information about the time zone data on a device. - */ -message TimeZoneDataInfo { - // A version identifier for the data set on device. e.g. "2018i" - optional string tzdb_version = 1; -} - -/** - * Logs the GPU stats global health information. - * - * Logged from: - * frameworks/native/services/gpuservice/gpustats/ - */ -message GpuStatsGlobalInfo { - // Package name of the gpu driver. - optional string driver_package_name = 1; - - // Version name of the gpu driver. - optional string driver_version_name = 2; - - // Version code of the gpu driver. - optional int64 driver_version_code = 3; - - // Build time of the gpu driver in UTC as seconds since January 1, 1970. - optional int64 driver_build_time = 4; - - // Total count of the gl driver gets loaded. - optional int64 gl_loading_count = 5; - - // Total count of the gl driver fails to be loaded. - optional int64 gl_loading_failure_count = 6; - - // Total count of the Vulkan driver gets loaded. - optional int64 vk_loading_count = 7; - - // Total count of the Vulkan driver fails to be loaded. - optional int64 vk_loading_failure_count = 8; - - // Api version of the system Vulkan driver. - optional int32 vulkan_version = 9; - - // Api version of the system CPU Vulkan driver. - optional int32 cpu_vulkan_version = 10; - - // Api version of the system GLES driver. - optional int32 gles_version = 11; - - // Total count of the angle driver gets loaded. - optional int64 angle_loading_count = 12; - - // Total count of the angle driver fails to be loaded. - optional int64 angle_loading_failure_count = 13; -} - -/** - * GPU driver loading time info. - */ -message GpuDriverLoadingTime { - // List of all the driver loading times for this app. The list size is - // capped at 50. - repeated int64 driver_loading_time = 1; -} - -/** - * Logs the GPU stats per app health information. - * - * Logged from: - * frameworks/native/services/gpuservice/gpustats/ - */ -message GpuStatsAppInfo { - // Package name of the application that loads the gpu driver. Total number - // of different packages is capped at 100. - optional string app_package_name = 1; - - // Version code of the gpu driver this app loads. - optional int64 driver_version_code = 2; - - // gl driver loading time info. - optional GpuDriverLoadingTime gl_driver_loading_time = 3 - [(android.os.statsd.log_mode) = MODE_BYTES]; - - // Vulkan driver loading time info. - optional GpuDriverLoadingTime vk_driver_loading_time = 4 - [(android.os.statsd.log_mode) = MODE_BYTES]; - - // Angle driver loading time info. - optional GpuDriverLoadingTime angle_driver_loading_time = 5 - [(android.os.statsd.log_mode) = MODE_BYTES]; - - // CPU Vulkan implementation is in use. - optional bool cpu_vulkan_in_use = 6; - - // App is not doing pre-rotation correctly. - optional bool false_prerotation = 7; - - // App creates GLESv1 context. - optional bool gles_1_in_use = 8; -} - -/* - * Logs the size of the system ion heap. - * - * Pulled from StatsCompanionService. - */ -message SystemIonHeapSize { - // Deprecated due to limited support of ion stats in debugfs. - // Use `IonHeapSize` instead. - option deprecated = true; - - // Size of the system ion heap in bytes. - // Read from debugfs. - optional int64 size_in_bytes = 1; -} - -/* - * Logs the total size of the ion heap. - * - * Pulled from StatsCompanionService. - */ -message IonHeapSize { - // Total size of all ion heaps in kilobytes. - // Read from: /sys/kernel/ion/total_heaps_kb. - optional int32 total_size_kb = 1; -} - -/* - * Logs the per-process size of the system ion heap. - * - * Pulled from StatsCompanionService. - */ -message ProcessSystemIonHeapSize { - // The uid if available. -1 means not available. - optional int32 uid = 1 [(is_uid) = true]; - - // The process name (from /proc/PID/cmdline). - optional string process_name = 2; - - // Sum of sizes of all allocations. - optional int32 total_size_in_kilobytes = 3; - - // Number of allocations. - optional int32 allocation_count = 4; - - // Size of the largest allocation. - optional int32 max_size_in_kilobytes = 5; -} - -/** - * Push network stack events. - * - * Log from: - * frameworks/base/packages/NetworkStack/ - */ -message NetworkStackReported { - // The id that indicates the event reported from NetworkStack. - optional int32 event_id = 1; - // The data for the reported events. - optional android.stats.connectivity.NetworkStackEventData network_stack_event = 2 [(log_mode) = MODE_BYTES]; -} - -/** - * Logs the apps that are installed on the external storage. - * Pulled from: - * StatsCompanionService - */ -message AppsOnExternalStorageInfo { - // The type of the external storage. - optional android.stats.storage.ExternalStorageType external_storage_type = 1; - // The name of the package that is installed on the external storage. - optional string package_name = 2; -} - -/** - * Logs the settings related to Face. - * Logged from: - * frameworks/base/services/core/java/com/android/server/stats - */ -message FaceSettings { - // Whether or not face unlock is allowed on Keyguard. - optional bool unlock_keyguard_enabled = 1; - // Whether or not face unlock dismisses the Keyguard. - optional bool unlock_dismisses_keyguard = 2; - // Whether or not face unlock requires attention. - optional bool unlock_attention_required = 3; - // Whether or not face unlock is allowed for apps (through BiometricPrompt). - optional bool unlock_app_enabled = 4; - // Whether or not face unlock always requires user confirmation. - optional bool unlock_always_require_confirmation = 5; - // Whether or not a diverse set of poses are required during enrollment. - optional bool unlock_diversity_required = 6; -} - -/** - * Logs cooling devices maintained by the kernel. - * - * Pulled from StatsCompanionService.java - */ -message CoolingDevice { - // The type of cooling device being reported. Eg. CPU, GPU... - optional android.os.CoolingTypeEnum device_location = 1; - // The name of the cooling device source. Eg. CPU0 - optional string device_name = 2; - // Current throttle state of the cooling device. The value can any unsigned - // integer between 0 and max_state defined in its driver. 0 means device is - // not in throttling, higher value means deeper throttling. - optional int32 state = 3; -} - -/** - * Intelligence has several counter-type events that don't warrant a - * full separate atom. These are primarily API call counters but also include - * counters for feature usage and specific failure modes. - * - * Logged from the Intelligence mainline module. - */ -message IntelligenceEventReported { - // The event type. - optional android.stats.intelligence.EventType event_id = 1; - // Success, failure. - optional android.stats.intelligence.Status status = 2; - // How many times the event occured (to report a batch of high frequency events). - optional int32 count = 3; - // How long the event took (sum of durations if count > 1) - optional int64 duration_millis = 4; -} - -/** - * Logs when Car Power state changed. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/CarStatsLog.java - */ -message CarPowerStateChanged { - // States come from CpmsState in CarPowerManagementService.java. - enum State { - WAIT_FOR_VHAL = 0; - ON = 1; - SHUTDOWN_PREPARE = 2; - WAIT_FOR_FINISH = 3; - SUSPEND = 4; - SIMULATE_SLEEP = 5; - } - optional State state = 1; -} - -/** - * Logs when Car User Hal is requested to switch/create/remove user. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/hal/UserHalService.java - */ -message CarUserHalModifyUserRequestReported { - // Request id for the request. - optional int32 request_id = 1; - // Request type. - enum RequestType { - UNKNOWN = 0; - // Car user manager requested user switch. - SWITCH_REQUEST_ANDROID = 1; - // OEM requested User switch. - SWITCH_REQUEST_OEM = 2; - // Hal switch requested after android switch using activity manager. - SWITCH_REQUEST_LEGACY = 3; - // Create User - CREATE_REQUEST = 4; - // Remove User - REMOVE_REQUEST = 5; - } - optional RequestType request_type = 2; - // Android User id of the current user which can only be 0, 10, 11 and so on. - // -1 if not available. - optional int32 user_id = 3; - // VHAL flags of the current user. (-1 if not available) - optional int32 user_flags = 4; - // Android User id of the target user for switch/create/remove. It can only - // be 0, 10, 11 and so on. -1 if not available. - optional int32 target_user_id = 5; - // VHAL flags of the target user for switch/create/remove. (-1 if not available) - optional int32 target_user_flags = 6; - // Request timeout Milliseconds (-1 if not available) - optional int32 timeout_millis = 7; -} - -/** - * Logs when Car User Hal responds to switch/create user request. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/hal/UserHalService.java - */ -message CarUserHalModifyUserResponseReported { - // Request id of the request associated with the response. - optional int32 request_id = 1; - // Car user hal callback status. - enum CallbackStatus { - UNKNOWN = 0; - // Hal response was invalid. - INVALID = 1; - // Hal response was ok. - OK = 2; - // Hal timeout during set call. - HAL_SET_TIMEOUT = 3; - // Hal response timeout. - HAL_RESPONSE_TIMEOUT = 4; - // Hal responded with wrong info. - WRONG_HAL_RESPONSE = 5; - // Hal is processing multiple requests simultaneously. - CONCURRENT_OPERATION = 6; - } - optional CallbackStatus callback_status = 2; - - // Hal request status for user switch/create/remove. - enum HalRequestStatus { - UNSPECIFIED = 0; - // Hal request for user switch/create is successful. - SUCCESS = 1; - // Hal request for user switch/create failed. - FAILURE = 2; - } - optional HalRequestStatus request_status = 3; -} - -/** - * Logs when post switch response is posted to Car User Hal. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/hal/UserHalService.java - */ -message CarUserHalPostSwitchResponseReported { - // Request id. - optional int32 request_id = 1; - - // Android user switch status. - enum UserSwitchStatus { - UNKNOWN = 0; - // Android user switch is successful. - SUCCESS = 1; - // Android user switch failed. - FAILURE = 2; - } - optional UserSwitchStatus switch_status = 2; -} - -/** - * Logs when initial user information is requested from Car User Hal. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/hal/UserHalService.java - */ -message CarUserHalInitialUserInfoRequestReported { - // Request id for the request. - optional int32 request_id = 1; - - // Request type for initial user information. - enum InitialUserInfoRequestType { - UNKNOWN = 0; - // At the first time Android was booted (or after a factory reset). - FIRST_BOOT = 1; - // At the first time Android was booted after the system was updated. - FIRST_BOOT_AFTER_OTA = 2; - // When Android was booted "from scratch". - COLD_BOOT = 3; - // When Android was resumed after the system was suspended to memory. - RESUME = 4; - } - optional InitialUserInfoRequestType request_type = 2; - // Request timeout Milliseconds (-1 if not available) - optional int32 timeout_millis = 3; -} - -/** - * Logs when Car User Hal responds to initial user information requests. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/hal/UserHalService.java - */ -message CarUserHalInitialUserInfoResponseReported { - // Request id of the request associated with the response. - optional int32 request_id = 1; - // Car user hal callback status. - enum CallbackStatus { - UNKNOWN = 0; - // Hal response was invalid. - INVALID = 1; - // Hal response was ok. - OK = 2; - // Hal timeout during set call. - HAL_SET_TIMEOUT = 3; - // Hal response timeout. - HAL_RESPONSE_TIMEOUT = 4; - // Hal responded with wrong info. - WRONG_HAL_RESPONSE = 5; - // Hal is processing multiple requests simultaneously. - CONCURRENT_OPERATION = 6; - } - optional CallbackStatus callback_status = 2; - // Response for initial user information request. - enum InitialUserInfoResponseAction { - UNSPECIFIED = 0; - // Let the Android System decide what to do. - DEFAULT = 1; - // Switch to an existing Android user. - SWITCH = 2; - // Create a new Android user (and switch to it). - CREATE = 3; - } - optional InitialUserInfoResponseAction response_action = 3; - // Android User id of the target user which can only be 0, 10, 11 and so on. - // -1 if not available. - optional int32 target_user = 4; - // VHAL flags of the current user. (-1 if not available) - optional int32 target_user_flags = 5; - // User locales - optional string user_locales = 6; -} - -/** - * Logs when set user association is requested from Car User Hal. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/hal/UserHalService.java - */ -message CarUserHalUserAssociationRequestReported { - // Request id for the request. - optional int32 request_id = 1; - // Request type. - enum RequestType { - UNKNOWN = 0; - // For setting user association information. - SET = 1; - // For getting user association information. - GET = 2; - } - optional RequestType request_type = 2; - // Android User id of the current user which can only be 0, 10, 11 and so on. - // -1 if not available. - optional int32 current_user_id = 3; - // VHAL flags of the current user. (-1 if not available) - optional int32 current_user_flags = 4; - // Number of the set associations requested. - optional int32 number_associations = 5; - // Concatenated string for the types from set associations request. - // This is a string converted from an array of integers. - optional string user_identification_association_types = 6; - // Concatenated string for the values from set associations request. - // This is a string converted from an array of integers. - optional string user_identification_association_values = 7; -} - -/** - * Logs when Car User Hal responds to set user association requests. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/hal/UserHalService.java - */ -message CarUserHalSetUserAssociationResponseReported { - // Request id of the request associated with the response. - optional int32 request_id = 1; - // Car user hal callback status. - enum CallbackStatus { - UNKNOWN = 0; - // Hal response was invalid. - INVALID = 1; - // Hal response was ok. - OK = 2; - // Hal timeout during set call. - HAL_SET_TIMEOUT = 3; - // Hal response timeout. - HAL_RESPONSE_TIMEOUT = 4; - // Hal responded with wrong info. - WRONG_HAL_RESPONSE = 5; - // Hal is processing multiple requests simultaneously. - CONCURRENT_OPERATION = 6; - } - optional CallbackStatus callback_status = 2; - // Number of the set associations in the response. - optional int32 number_associations = 3; - // Concatenated string for the types from set associations request. - // This is a string converted from an array of integers. - optional string user_identification_association_types = 4; - // Concatenated string for the values from set associations request. - // This is a string converted from an array of integers. - optional string user_identification_association_values = 5; -} - -/** - * Logs whether GarageMode is entered. - * - * Logged from: - * packages/services/Car/service/src/com/android/car/CarStatsLog.java - */ -message GarageModeInfo { - // Whether GarageMode is entered. - optional bool is_garage_mode = 1; -} - -/** - * Historical app ops data per package. - */ -message AppOps { - // Uid of the package requesting the op - optional int32 uid = 1 [(is_uid) = true]; - - // Name of the package performing the op - optional string package_name = 2; - - // operation id - optional android.app.AppOpEnum op_id = 3 [default = APP_OP_NONE]; - - // The number of times the op was granted while the app was in the - // foreground (only for trusted requests) - optional int64 trusted_foreground_granted_count = 4; - - // The number of times the op was granted while the app was in the - // background (only for trusted requests) - optional int64 trusted_background_granted_count = 5; - - // The number of times the op was rejected while the app was in the - // foreground (only for trusted requests) - optional int64 trusted_foreground_rejected_count = 6; - - // The number of times the op was rejected while the app was in the - // background (only for trusted requests) - optional int64 trusted_background_rejected_count = 7; - - // For long-running operations, total duration of the operation - // while the app was in the foreground (only for trusted requests) - optional int64 trusted_foreground_duration_millis = 8; - - // For long-running operations, total duration of the operation - // while the app was in the background (only for trusted requests) - optional int64 trusted_background_duration_millis = 9; - - // Whether AppOps is guarded by Runtime permission - optional bool is_runtime_permission = 10; -} - -/** - * Historical app ops data per package and attribution tag. - */ -message AttributedAppOps { - // Uid of the package requesting the op - optional int32 uid = 1 [(is_uid) = true]; - - // Name of the package performing the op - optional string package_name = 2; - - // tag; provided by developer when accessing related API, limited at 50 chars by API. - // Attributions must be provided through manifest using <attribution> tag available in R and - // above. - optional string tag = 3; - - // operation id - optional android.app.AppOpEnum op = 4 [default = APP_OP_NONE]; - - // The number of times the op was granted while the app was in the - // foreground (only for trusted requests) - optional int64 trusted_foreground_granted_count = 5; - - // The number of times the op was granted while the app was in the - // background (only for trusted requests) - optional int64 trusted_background_granted_count = 6; - - // The number of times the op was rejected while the app was in the - // foreground (only for trusted requests) - optional int64 trusted_foreground_rejected_count = 7; - - // The number of times the op was rejected while the app was in the - // background (only for trusted requests) - optional int64 trusted_background_rejected_count = 8; - - // For long-running operations, total duration of the operation - // while the app was in the foreground (only for trusted requests) - optional int64 trusted_foreground_duration_millis = 9; - - // For long-running operations, total duration of the operation - // while the app was in the background (only for trusted requests) - optional int64 trusted_background_duration_millis = 10; - - // Whether AppOps is guarded by Runtime permission - optional bool is_runtime_permission = 11; - - // Sampling rate used on device, from 0 to 100 - optional int32 sampling_rate = 12; -} - -/** - * Location Manager API Usage information(e.g. API under usage, - * API call's parameters). - * Logged from: - * frameworks/base/services/core/java/com/android/server/LocationManagerService.java - */ -message LocationManagerApiUsageReported { - - // Indicating if usage starts or usage ends. - optional android.stats.location.UsageState state = 1; - - // LocationManagerService's API in use. - // We can identify which API from LocationManager is - // invoking current LMS API by the combination of - // API parameter(e.g. is_listener_null, is_intent_null, - // is_location_request_null) - optional android.stats.location.LocationManagerServiceApi api_in_use = 2; - - // Name of the package calling the API. - optional string calling_package_name = 3; - - // Type of the location provider. - optional android.stats.location.ProviderType provider = 4; - - // Quality of the location request - optional android.stats.location.LocationRequestQuality quality = 5; - - // The desired interval for active location updates, in milliseconds. - // Bucketized to reduce cardinality. - optional android.stats.location.LocationRequestIntervalBucket bucketized_interval = 6; - - // Minimum distance between location updates, in meters. - // Bucketized to reduce cardinality. - optional android.stats.location.SmallestDisplacementBucket - bucketized_smallest_displacement = 7; - - // The number of location updates. - optional int64 num_updates = 8; - - // The request expiration time, in millisecond since boot. - // Bucketized to reduce cardinality. - optional android.stats.location.ExpirationBucket - bucketized_expire_in = 9; - - // Type of Callback passed in for this API. - optional android.stats.location.CallbackType callback_type = 10; - - // The radius of the central point of the alert - // region, in meters. Only for API REQUEST_GEOFENCE. - // Bucketized to reduce cardinality. - optional android.stats.location.GeofenceRadiusBucket bucketized_radius = 11; - - // Activity Importance of API caller. - // Categorized to 3 types that are interesting from location's perspective. - optional android.stats.location.ActivityImportance activiy_importance = 12; -} - -/** - * Information about a permission grant or denial made by user inside ReviewPermissionsFragment - */ -message ReviewPermissionsFragmentResultReported { - // unique value identifying a permission group change. A permission group change might result - // in multiple of these atoms - optional int64 change_id = 1; - - // UID of package the permission belongs to - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package the permission belongs to - optional string package_name = 3; - - // The permission to be granted - optional string permission_name = 4; - - // The result of the permission grant - optional bool permission_granted = 5; -} - -/** -* Information about results of permission upgrade by RuntimePermissionsUpgradeController -* Logged from: RuntimePermissionUpdgradeController -*/ -message RuntimePermissionsUpgradeResult { - // Permission granted as result of upgrade - optional string permission_name = 1; - - // UID of package granted permission - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package granted permission - optional string package_name = 3; -} - -/** -* Information about a buttons presented in GrantPermissionsActivty and choice made by user -*/ -message GrantPermissionsActivityButtonActions { - // Permission granted as result of upgrade - optional string permission_group_name = 1; - - // UID of package granted permission - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package requesting permission - optional string package_name = 3; - - // Buttons presented in the dialog - bit flags, bit numbers are in accordance with - // LABEL_ constants in GrantPermissionActivity.java - optional int32 buttons_presented = 4; - - // Button clicked by user - same as bit flags in buttons_presented with only single bit set - optional int32 button_clicked = 5; - - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 6; -} - -/** - * Information about LocationAccessCheck notification presented to user - */ -message LocationAccessCheckNotificationAction { - - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // Uid of package for which location access check is presented - optional int32 package_uid = 2; - - // Name of package for which location access check is presented - optional string package_name = 3; - - enum Result { - UNDEFINED = 0; - // notification was presented to the user - NOTIFICATION_PRESENTED = 1; - // notification was declined by the user - NOTIFICATION_DECLINED = 2; - // notification was clicked by the user - NOTIFICATION_CLICKED = 3; - } - - // View / interaction recorded - optional Result result = 4; -} - -/** - * Information about a permission grant or revoke made by user inside AppPermissionFragment - */ -message AppPermissionFragmentActionReported { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // unique value identifying a permission group change. A permission group change might result - // in multiple of these atoms - optional int64 change_id = 2; - - // UID of package the permission belongs to - optional int32 uid = 3 [(is_uid) = true]; - - // Name of package the permission belongs to - optional string package_name = 4; - - // The permission to be granted - optional string permission_name = 5; - - // The result of the permission grant - optional bool permission_granted = 6; - - // State of Permission Flags after grant as per android.content.pm.PermissionFlags - optional int32 permission_flags = 7; - - enum Button { - UNDEFINED = 0; - // Allow button - ALLOW = 1; - // Deny button - DENY = 2; - // Ask every time button - ASK_EVERY_TIME = 3; - // Allow all the time button - ALLOW_ALWAYS = 4; - // Allow only while using the app button - ALLOW_FOREGROUND = 5; - // Same is Deny button but shown in while in use dialog - DENY_FOREGROUND = 6; - } - - // Button pressed in the dialog - optional Button button_pressed = 8; -} - -/** -* Information about a AppPermissionFragment viewed by user -*/ -message AppPermissionFragmentViewed { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // UID of package for which permissions are viewed - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package for which permissions are viewed - optional string package_name = 3; - - // Permission group viewed - optional string permission_group_name = 4; -} - -/** -* Information about a AppPermissionGroupsFragment viewed by user. Fragment has been renamed, but -* the log retains the old fragment name. -*/ -message AppPermissionsFragmentViewed { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // id which identifies single view as every view might have several logging records - // with different package information attached - optional int64 view_id = 2; - - // Permission group viewed - optional string permission_group_name = 3; - - // UID of package for which permissions are viewed - optional int32 uid = 4 [(is_uid) = true]; - - // Name of package for which permissions are viewed - optional string package_name = 5; - - // Category in which permission is included - enum Category { - UNDEFINED = 0; - ALLOWED = 1; - ALLOWED_FOREGROUND = 2; - DENIED = 3; - } - optional Category category = 6; -} -/** -* Information about a PermissionAppsFragment viewed by user. -* Logged from ui/handheld/PermissionAppsFragment.java -*/ -message PermissionAppsFragmentViewed { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // id which identifies single view as every view might have several logging records - // with different package information attached - optional int64 view_id = 2; - - // Permission group viewed - optional string permission_group_name = 3; - - // UID of package for which permissions are viewed - optional int32 uid = 4 [(is_uid) = true]; - - // Name of package for which permissions are viewed - optional string package_name = 5; - - // Category in which app is included - enum Category { - UNDEFINED = 0; - ALLOWED = 1; - ALLOWED_FOREGROUND = 2; - DENIED = 3; - } - optional Category category = 6; -} - -/** -* Log that the Auto Revoke notification has been clicked -* Logged from ui/ManagePermissionsActivity -*/ -message AutoRevokeNotificationClicked { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; -} - -/** -* Log that an app has been displayed on the auto revoke page, and lists one permission that was -* auto revoked for it. -* Logged from ui/handheld/AutoRevokeFragment -*/ -message AutoRevokeFragmentAppViewed { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // UID of package for which permissions are viewed - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package for which permissions are viewed - optional string package_name = 3; - - // The name of a permission group that has been revoked - optional string permission_group_name = 4; - - // The age of the app- more than three months old, or more than six months - enum Age { - UNDEFINED = 0; - NEWER_BUCKET = 1; - OLDER_BUCKET = 2; - } - - // How long the app has been unused. Currently, newer bucket is 3 months, older is 6 months - optional Age age = 5; -} - -/** -* Log that the user has interacted with an app on the auto revoke fragment -* Logged from ui/handheld/AutoRevokeFragment -*/ -message AutoRevokedAppInteraction { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // UID of package for which permissions are viewed - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package for which permissions are viewed - optional string package_name = 3; - - enum Action { - UNDEFINED = 0; - REMOVE = 1; - OPEN = 2; - APP_INFO = 3; - PERMISSIONS = 4; - REMOVE_IN_SETTINGS = 5; - OPEN_IN_SETTINGS = 6; - } - - // The action the user took to interact with the app - optional Action action = 4; -} - -/** -* Log that the AppPermissionGroupsFragment has been interacted with for the possible purposes of -* auto revoke, or that the auto revoke switch has been changed -* Logged from ui/handheld/AppPermissionGroupsFragment - */ -message AppPermissionGroupsFragmentAutoRevokeAction { - // id which identifies single session of user interacting with permission controller - optional int64 session_id = 1; - - // UID of package for which permissions are viewed - optional int32 uid = 2 [(is_uid) = true]; - - // Name of package for which permissions are viewed - optional string package_name = 3; - - enum Action { - UNDEFINED = 0; - OPENED_FOR_AUTO_REVOKE = 1; - OPENED_FROM_INTENT = 2; - SWITCH_ENABLED = 3; - SWITCH_DISABLED = 4; - } - - // The action the user took to interact with the fragment - optional Action action = 4; -} - -/** - * Logs when there is a smart selection related event. - * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java - * Logged from: TextClassifierEventLogger.java - */ -message TextSelectionEvent { - // A session ID. - optional string session_id = 1; - - // Event type of this event. - optional android.stats.textclassifier.EventType event_type = 2; - - // Name of the annotator model that is involved in this event. - optional string model_name = 3; - - // Type of widget that was involved in triggering this event. - optional android.stats.textclassifier.WidgetType widget_type = 4; - - // Index of this event in a session. - optional int32 event_index = 5; - - // Entity type that is involved. - optional string entity_type = 6; - - // Relative word index of the start of the selection. - optional int32 relative_word_start_index = 7; - - // Relative word (exclusive) index of the end of the selection. - optional int32 relative_word_end_index = 8; - - // Relative word index of the start of the smart selection. - optional int32 relative_suggested_word_start_index = 9; - - // Relative word (exclusive) index of the end of the smart selection. - optional int32 relative_suggested_word_end_index = 10; - - // Name of source package. - optional string package_name = 11; - - // Name of the LangID model that is involved in this event. - optional string langid_model_name = 12; -} - -/** - * Logs when there is a smart linkify related event. - * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java - * Logged from: TextClassifierEventLogger.java - */ -message TextLinkifyEvent { - // A session ID. - optional string session_id = 1; - - // Event type of this event. - optional android.stats.textclassifier.EventType event_type = 2; - - // Name of the annotator model that is involved in this event. - optional string model_name = 3; - - // Type of widget that was involved in triggering this event. - optional android.stats.textclassifier.WidgetType widget_type = 4; - - // Index of this event in a session. - optional int32 event_index = 5; - - // Entity type that is involved. - optional string entity_type = 6; - - // Number of links detected. - optional int32 num_links = 7; - - // The total length of all links. - optional int32 linked_text_length = 8; - - // Length of input text. - optional int32 text_length = 9; - - // Time spent on generating links in ms. - optional int64 latency_millis = 10; - - // Name of source package. - optional string package_name = 11; - - // Name of the LangID model that is involved in this event. - optional string langid_model_name = 12; -} - -/** - * Logs when there is a conversation actions related event. - * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java - * Logged from: TextClassifierEventLogger.java - */ -message ConversationActionsEvent { - // A session ID. - optional string session_id = 1; - - // Event type of this event. - optional android.stats.textclassifier.EventType event_type = 2; - - // Name of the actions model that is involved in this event. - optional string model_name = 3; - - // Type of widget that was involved in triggering this event. - optional android.stats.textclassifier.WidgetType widget_type = 4; - - // The first entity type that is involved. - optional string first_entity_type = 5; - - // The second entity type that is involved. - optional string second_entity_type = 6; - - // The third entity type that is involved. - optional string third_entity_type = 7; - - // The score of the first entity type. - optional float score = 8; - - // Name of source package. - optional string package_name = 9; - - // Name of the annotator model that is involved in this event. - optional string annotator_model_name = 10; - - // Name of the LangID model that is involved in this event. - optional string langid_model_name = 11; -} - -/** - * Logs when there is a language detection related event. - * See frameworks/base/core/java/android/view/textclassifier/TextClassifierEvent.java - * Logged from: TextClassifierEventLogger.java - */ -message LanguageDetectionEvent { - // A session ID. - optional string session_id = 1; - - // Event type of this event. - optional android.stats.textclassifier.EventType event_type = 2; - - // Name of the language detection model that is involved in this event. - optional string model_name = 3; - - // Type of widget that was involved in triggering this event. - optional android.stats.textclassifier.WidgetType widget_type = 4; - - // Detected language. - optional string language_tag = 5; - - // Score of the detected language. - optional float score = 6; - - // Position of this action. - optional int32 action_index = 7; - - // Name of source package. - optional string package_name = 8; -} - -/** - * Information about an OTA update attempt by update_engine. - * Logged from platform/system/update_engine/metrics_reporter_android.cc - */ -message UpdateEngineUpdateAttemptReported { - // The number of attempts for the update engine to apply a given payload. - optional int32 attempt_number = 1; - - optional android.stats.otaupdate.PayloadType payload_type = 2; - - // The total time in minutes for the update engine to apply a given payload. - // The time is calculated by calling clock_gettime() / CLOCK_BOOTTIME; and - // it's increased when the system is sleeping. - optional int32 duration_boottime_in_minutes = 3; - - // The total time in minutes for the update engine to apply a given payload. - // The time is calculated by calling clock_gettime() / CLOCK_MONOTONIC_RAW; - // and it's not increased when the system is sleeping. - optional int32 duration_monotonic_in_minutes = 4; - - // The size of the payload in MiBs. - optional int32 payload_size_mib = 5; - - // The attempt result reported by the update engine for an OTA update. - optional android.stats.otaupdate.AttemptResult attempt_result = 6; - - // The error code reported by the update engine after an OTA update attempt - // on A/B devices. - optional android.stats.otaupdate.ErrorCode error_code = 7; - - // The build fingerprint of the source system. The value is read from a - // system property when the device takes the update. e.g. - // Android/aosp_sailfish/sailfish:10/QP1A.190425.004/5507117:userdebug/test-keys - optional string source_fingerprint = 8; - - // Size of super partition. - optional int64 super_partition_size_bytes = 9; - - // Size of current slot within the super partition. - optional int64 slot_size_bytes = 10; - - // Free space available in the super partition. - optional int64 super_free_space_bytes = 11; -} - -/** - * Information about all the attempts the device make before finishing the - * successful update. - * Logged from platform/system/update_engine/metrics_reporter_android.cc - */ -message UpdateEngineSuccessfulUpdateReported { - // The number of attempts for the update engine to apply the payload for a - // successful update. - optional int32 attempt_count = 1; - - optional android.stats.otaupdate.PayloadType payload_type = 2; - - optional int32 payload_size_mib = 3; - - // The total number of bytes downloaded by update_engine since the last - // successful update. - optional int32 total_bytes_downloaded_mib = 4; - - // The ratio in percentage of the over-downloaded bytes compared to the - // total bytes needed to successfully install the update. e.g. 200 if we - // download 200MiB in total for a 100MiB package. - optional int32 download_overhead_percentage = 5; - - // The total time in minutes for the update engine to apply the payload for a - // successful update. - optional int32 total_duration_minutes = 6; - - // The number of reboot of the device during a successful update. - optional int32 reboot_count = 7; -} - -/** - * Reported when the RebootEscrow HAL has attempted to recover the escrowed - * key to indicate whether it was successful or not. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/locksettings/RebootEscrowManager.java - */ -message RebootEscrowRecoveryReported { - optional bool successful = 1; -} - -/** - * Global display pipeline metrics reported by SurfaceFlinger. - * Pulled from: - * frameworks/native/services/surfaceflinger/TimeStats/TimeStats.cpp - */ -message SurfaceflingerStatsGlobalInfo { - // Total number of frames presented during the tracing period - optional int64 total_frames = 1; - // Total number of frames missed - optional int64 missed_frames = 2; - // Total number of frames that fell back to client composition - optional int64 client_composition_frames = 3; - // Total time the display was turned on - optional int64 display_on_millis = 4; - // Total time that was spent performing animations. - // This is derived from the present-to-present layer histogram - optional int64 animation_millis = 5; - // Total number of event connections tracked by SurfaceFlinger at the time - // of this pull. If this number grows prohibitively large, then this can - // cause jank due to resource contention. - optional int32 event_connection_count = 6; - // Set of timings measured from when SurfaceFlinger began compositing a - // frame, until the frame was requested to be presented to the display. This - // measures SurfaceFlinger's total CPU walltime on the critical path per - // frame. - optional FrameTimingHistogram frame_duration = 7 - [(android.os.statsd.log_mode) = MODE_BYTES]; - // Set of timings measured from when SurfaceFlinger first began using the - // GPU to composite a frame, until the GPU has finished compositing that - // frame. This measures the total additional time SurfaceFlinger needed to - // perform due to falling back into GPU composition. - optional FrameTimingHistogram render_engine_timing = 8 - [(android.os.statsd.log_mode) = MODE_BYTES]; -} - -/** - * Per-layer display pipeline metrics reported by SurfaceFlinger. - * The number of layers uploaded will be restricted due to size limitations. - * Pulled from: - * frameworks/native/services/surfaceflinger/TimeStats/TimeStats.cpp - */ -message SurfaceflingerStatsLayerInfo { - // The layer for this set of metrics - // For now we can infer that the package name is included in the layer - // name. - optional string layer_name = 1; - // Total number of frames presented - optional int64 total_frames = 2; - // Total number of dropped frames while latching a buffer for this layer. - optional int64 dropped_frames = 3; - // Set of timings measured between successive presentation timestamps. - optional FrameTimingHistogram present_to_present = 4 - [(android.os.statsd.log_mode) = MODE_BYTES]; - // Set of timings measured from when an app queued a buffer for - // presentation, until the buffer was actually presented to the - // display. - optional FrameTimingHistogram post_to_present = 5 - [(android.os.statsd.log_mode) = MODE_BYTES]; - // Set of timings measured from when a buffer is ready to be presented, - // until the buffer was actually presented to the display. - optional FrameTimingHistogram acquire_to_present = 6 - [(android.os.statsd.log_mode) = MODE_BYTES]; - // Set of timings measured from when a buffer was latched by - // SurfaceFlinger, until the buffer was presented to the display - optional FrameTimingHistogram latch_to_present = 7 - [(android.os.statsd.log_mode) = MODE_BYTES]; - // Set of timings measured from the desired presentation to the actual - // presentation time - optional FrameTimingHistogram desired_to_present = 8 - [(android.os.statsd.log_mode) = MODE_BYTES]; - // Set of timings measured from when an app queued a buffer for - // presentation, until the buffer was ready to be presented. - optional FrameTimingHistogram post_to_acquire = 9 - [(android.os.statsd.log_mode) = MODE_BYTES]; - // Frames missed latch because the acquire fence didn't fire - optional int64 late_acquire_frames = 10; - // Frames latched early because the desired present time was bad - optional int64 bad_desired_present_frames = 11; -} - -/** - * Histogram of frame counts bucketed by time in milliseconds. - * Because of size limitations, we hard-cap the number of buckets, with - * buckets for corresponding to larger milliseconds being less precise. - */ -message FrameTimingHistogram { - // Timings in milliseconds that describes a set of histogram buckets - repeated int32 time_millis_buckets = 1; - // Number of frames that match to each time_millis, i.e. the bucket - // contents - // It's required that len(time_millis) == len(frame_count) - repeated int64 frame_counts = 2; -} - -/** - * Janky event as reported by SurfaceFlinger. - * This event is intended to be consumed by a Perfetto subscriber for - * automated trace collection. - * - * Logged from: - * frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp - */ -message DisplayJankReported { - // Informational field for how long the janky event lasted in milliseconds - optional int64 event_duration_millis = 1; - // Number of frame deadlines missed, where SurfaceFlinger failed to update - // the display on time. - optional int32 present_deadlines_missed = 2; -} - -/** - * Information about camera facing and API level usage. - * Logged from: - * frameworks/base/services/core/java/com/android/server/camera/CameraServiceProxy.java - */ -message CameraActionEvent { - // Camera session duration - optional int64 duration_millis = 1; - - // Camera API level used - optional int32 api_level = 2; - - // Name of client package - optional string package_name = 3; - - // Camera facing - enum Facing { - UNKNOWN = 0; - BACK = 1; - FRONT = 2; - EXTERNAL = 3; - } - optional Facing facing = 4; -} - -/** - * Logs when a compatibility change is affecting an app. - * - * Logged from: - * frameworks/base/core/java/android/app/AppCompatCallbacks.java and - * frameworks/base/services/core/java/com/android/server/compat/PlatformCompat.java - */ -message AppCompatibilityChangeReported { - // The UID of the app being affected by the compatibilty change. - optional int32 uid = 1 [(is_uid) = true]; - - // The ID of the change affecting the app. - optional int64 change_id = 2; - - enum State { - UNKNOWN_STATE = 0; - ENABLED = 1; - DISABLED = 2; - LOGGED = 3; - } - - // The state of the change - if logged from gating whether it was enabled or disabled, or just - // logged otherwise. - optional State state = 3; - - enum Source { - UNKNOWN_SOURCE = 0; - APP_PROCESS = 1; - SYSTEM_SERVER = 2; - } - - // Where it was logged from. - optional Source source = 4; - -} - -/** - * Logged from - * external/perfetto/src/perfetto_cmd/perfetto_cmd.cc - */ -message PerfettoUploaded { - enum Event { - PERFETTO_UNDEFINED = 0; - PERFETTO_TRACE_BEGIN = 1; - PERFETTO_BACKGROUND_TRACE_BEGIN = 2; - PERFETTO_ON_CONNECT = 3; - PERFETTO_ON_TRACING_DISABLED = 4; - PERFETTO_UPLOAD_DROPBOX_BEGIN = 5; - PERFETTO_UPLOAD_DROPBOX_SUCCESS = 6; - PERFETTO_UPLOAD_DROPBOX_FAILURE = 7; - PERFETTO_UPLOAD_INCIDENT_BEGIN = 8; - PERFETTO_UPLOAD_INCIDENT_SUCCESS = 9; - PERFETTO_UPLOAD_INCIDENT_FAILURE = 10; - PERFETTO_FINALIZE_TRACE_AND_EXIT = 11; - PERFETTO_TRIGGER_BEGIN = 12; - PERFETTO_TRIGGER_SUCCESS = 13; - PERFETTO_TRIGGER_FAILURE = 14; - PERFETTO_HIT_GUARDRAILS = 15; - PERFETTO_ON_TIMEOUT = 16; - PERFETTO_NOT_UPLOADING_EMPTY_TRACE = 17; - } - - // Which stage of the pipeline we are reporting from. - optional Event event = 1; - - // UUID matching the one set inside the SystemInfo trace packet. - optional int64 trace_uuid_lsb = 2; - optional int64 trace_uuid_msb = 3; -} - -/** - * Pulls client metrics on data transferred via Vehicle Maps Service. - * Metrics are keyed by uid + layer. - * - * Pulled from: - * packages/services/Car/service/src/com/android/car/stats/CarStatsService.java - */ -message VmsClientStats { - // UID of the VMS client app - optional int32 uid = 1 [(is_uid) = true]; - - // VMS layer definition - optional int32 layer_type = 2; - optional int32 layer_channel = 3; - optional int32 layer_version = 4; - - // Bytes and packets sent by the client for the layer - optional int64 tx_bytes = 5; - optional int64 tx_packets = 6; - - // Bytes and packets received by the client for the layer - optional int64 rx_bytes = 7; - optional int64 rx_packets = 8; - - // Bytes and packets dropped due to client error - optional int64 dropped_bytes = 9; - optional int64 dropped_packets = 10; -} - -/** - * State of a dangerous permission requested by a package - sampled - * Pulled from: StatsCompanionService.java with data obtained from PackageManager API -*/ -message DangerousPermissionStateSampled { - // Name of the permission - optional string permission_name = 1; - - // Uid of the package - optional int32 uid = 2 [(is_uid) = true]; - - // If the permission is granted to the uid - optional bool is_granted = 3; - - // Permission flags as per android.content.pm.PermissionFlags - optional int32 permission_flags = 4; -} - -/** - * HWUI stats for a given app. - */ -message GraphicsStats { - // The package name of the app - optional string package_name = 1; - - // The version code of the app - optional int64 version_code = 2; - - // The start & end timestamps in UTC as - // milliseconds since January 1, 1970 - // Compatible with java.util.Date#setTime() - optional int64 start_millis = 3; - - optional int64 end_millis = 4; - - // HWUI renders pipeline type: GL (1) or Vulkan (2). - enum PipelineType { - UNKNOWN = 0; - GL = 1; - VULKAN = 2; - } - - // HWUI renders pipeline type: GL or Vulkan. - optional PipelineType pipeline = 5; - - // Distinct frame count. - optional int32 total_frames = 6; - - // Number of "missed vsync" events. - optional int32 missed_vsync_count = 7; - - // Number of frames in triple-buffering scenario (high input latency) - optional int32 high_input_latency_count = 8; - - // Number of "slow UI thread" events. - optional int32 slow_ui_thread_count = 9; - - // Number of "slow bitmap upload" events. - optional int32 slow_bitmap_upload_count = 10; - - // Number of "slow draw" events. - optional int32 slow_draw_count = 11; - - // Number of frames that missed their deadline (aka, visibly janked) - optional int32 missed_deadline_count = 12; - - // The frame time histogram for the package - optional FrameTimingHistogram cpu_histogram = 13 - [(android.os.statsd.log_mode) = MODE_BYTES]; - - // The gpu frame time histogram for the package - optional FrameTimingHistogram gpu_histogram = 14 - [(android.os.statsd.log_mode) = MODE_BYTES]; - - // UI mainline module version. - optional int64 version_ui_module = 15; - - // If true, these are HWUI stats for up to a 24h period for a given app from today. - // If false, these are HWUI stats for a 24h period for a given app from the last complete - // day (yesterday). Stats from yesterday stay constant, while stats from today may change as - // more apps are running / rendering. - optional bool is_today = 16; -} - -/** - * Message related to dangerous (runtime) app ops access - */ -message RuntimeAppOpAccess { - // Uid of the package accessing app op - optional int32 uid = 1 [(is_uid) = true]; - - // Name of the package accessing app op - optional string package_name = 2; - - // deprecated - set to empty string - optional string op_deprecated = 3 [deprecated = true]; - - // attribution_tag; provided by developer when accessing related API, limited at 50 chars by - // API. Attributions must be provided through manifest using <attribution> tag available in R - // and above. - optional string attribution_tag = 4; - - // message related to app op access, limited to 600 chars by API - optional string message = 5; - - enum SamplingStrategy { - DEFAULT = 0; - UNIFORM = 1; - RARELY_USED = 2; - BOOT_TIME_SAMPLING = 3; - UNIFORM_OPS = 4; - } - - // sampling strategy used to collect this message - optional SamplingStrategy sampling_strategy = 6; - - // operation id - optional android.app.AppOpEnum op = 7 [default = APP_OP_NONE]; -} - -/* - * Logs userspace reboot outcome and duration. - * - * Logged from: - * frameworks/base/core/java/com/android/server/BootReceiver.java - */ -message UserspaceRebootReported { - // Possible outcomes of userspace reboot. - enum Outcome { - // Default value in case platform failed to determine the outcome. - OUTCOME_UNKNOWN = 0; - // Userspace reboot succeeded (i.e. boot completed without a fall back to hard reboot). - SUCCESS = 1; - // Userspace reboot shutdown sequence was aborted. - FAILED_SHUTDOWN_SEQUENCE_ABORTED = 2; - // Remounting userdata into checkpointing mode failed. - FAILED_USERDATA_REMOUNT = 3; - // Device didn't finish booting before timeout and userspace reboot watchdog issued a hard - // reboot. - FAILED_USERSPACE_REBOOT_WATCHDOG_TRIGGERED = 4; - } - // Outcome of userspace reboot. Always set. - optional Outcome outcome = 1; - // Duration of userspace reboot in case it has a successful outcome. - // Duration is measured as time between userspace reboot was initiated and until boot completed - // (e.g. sys.boot_completed=1). - optional int64 duration_millis = 2; - // State of primary user's (user0) credential encryption storage. - enum UserEncryptionState { - // Default value. - USER_ENCRYPTION_STATE_UNKNOWN = 0; - // Credential encrypted storage is unlocked. - UNLOCKED = 1; - // Credential encrypted storage is locked. - LOCKED = 2; - } - // State of primary user's encryption storage at the moment boot completed. Always set. - optional UserEncryptionState user_encryption_state = 3; -} - -/* - * Logs integrity check information during each install. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java - */ -message IntegrityCheckResultReported { - optional string package_name = 1; - optional string app_certificate_hash = 2; - optional int64 version_code = 3; - optional string installer_package_name = 4; - enum Response { - UNKNOWN = 0; - ALLOWED = 1; - REJECTED = 2; - FORCE_ALLOWED = 3; - } - optional Response response = 5; - // An estimate on the cause of the response. This will only be populated for - // REJECTED and FORCE_ALLOWED - optional bool caused_by_app_cert_rule = 6; - optional bool caused_by_installer_rule = 7; -} - -/** - * Logs the information about the rules and the provider whenever rules are - * pushed into AppIntegrityManager. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java - */ -message IntegrityRulesPushed { - optional bool success = 1; - // Package name of the app that pushed the rules. - optional string rule_provider = 2; - // Version string of arbitrary format provided by the rule provider to - // identify the rules. - optional string rule_version = 3; -} - -/** - * Logs when a cell broadcast message is received on the device. - * - * Logged from Cell Broadcast module and platform: - * packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice/ - * packages/apps/CellBroadcastReceiver/ - * frameworks/opt/telephony/src/java/com/android/internal/telephony/CellBroadcastServiceManager.java - */ -message CellBroadcastMessageReported { - // The type of Cell Broadcast message - enum CbType { - UNKNOWN_TYPE = 0; - GSM = 1; - CDMA = 2; - CDMA_SPC = 3; - } - - // The parts of the cell broadcast message pipeline - enum ReportSource { - UNKNOWN_SOURCE = 0; - FRAMEWORK = 1; - CB_SERVICE = 2; - CB_RECEIVER_APP = 3; - } - - // GSM, CDMA, CDMA-SCP - optional CbType type = 1; - - // The source of the report - optional ReportSource source = 2; -} - -/** - * Logs when a cell broadcast message is filtered out, or otherwise intentionally not sent to CBR. - * - * Logged from CellBroadcastService module: - * packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice/ - */ -message CellBroadcastMessageFiltered { - enum FilterReason { - NOT_FILTERED = 0; - DUPLICATE_MESSAGE = 1; - GEOFENCED_MESSAGE = 2; - AREA_INFO_MESSAGE = 3; - } - - // GSM, CDMA, CDMA-SCP - optional CellBroadcastMessageReported.CbType type = 1; - - // The source of the report - optional FilterReason filter = 2; -} - -/** - * Logs when an error occurs while handling a cell broadcast message; - * - * Logged from CellBroadcastService module: - * packages/modules/CellBroadcastService/src/com/android/cellbroadcastservice/ - */ -message CellBroadcastMessageError { - // The type of error raised when trying to handle a cell broadcast message - enum ErrorType { - UNKNOWN_TYPE = 0; - CDMA_DECODING_ERROR = 1; - CDMA_SCP_EMPTY = 2; - CDMA_SCP_HANDLING_ERROR = 3; - GSM_INVALID_HEADER_LENGTH = 4; - GSM_UNSUPPORTED_HEADER_MESSAGE_TYPE = 5; - GSM_UNSUPPORTED_HEADER_DATA_CODING_SCHEME = 6; - GSM_INVALID_PDU = 7; - GSM_INVALID_GEO_FENCING_DATA = 8; - GSM_UMTS_INVALID_WAC = 9; - FAILED_TO_INSERT_TO_DB = 10; - UNEXPECTED_GEOMETRY_FROM_FWK = 11; - UNEXPECTED_GSM_MESSAGE_TYPE_FROM_FWK = 12; - UNEXPECTED_CDMA_MESSAGE_TYPE_FROM_FWK = 13; - UNEXPECTED_CDMA_SCP_MESSAGE_TYPE_FROM_FWK = 14; - NO_CONNECTION_TO_CB_SERVICE = 15; - } - - // What kind of error occurred - optional ErrorType type = 1; - - // Exception message (or log message) associated with the error (max 1000 chars) - optional string exception_message = 2; -} - -/** - * Logs when a tune occurs through device's Frontend. - * This is atom ID 276. - * - * Logged from: - * frameworks/base/media/java/android/media/tv/tuner/Tuner.java - */ -message TvTunerStateChanged { - enum State { - UNKNOWN = 0; - TUNING = 1; // Signal is tuned - LOCKED = 2; // the signal is locked - NOT_LOCKED = 3; // the signal isn’t locked. - SIGNAL_LOST = 4; // the signal was locked, but is lost now. - SCANNING = 5; // the signal is scanned - SCAN_STOPPED = 6; // the scan is stopped. - } - // The uid of the application that sent this custom atom. - optional int32 uid = 1 [(is_uid) = true]; - // new state - optional State state = 2; -} - -/** - * Logs the status of a dvr playback or record. - * This is atom ID 279. - * - * Logged from: - * frameworks/base/media/java/android/media/tv/tuner/dvr - */ -message TvTunerDvrStatus { - enum Type { - UNKNOWN_TYPE = 0; - PLAYBACK = 1; // is a playback - RECORD = 2; // is a record - } - enum State { - UNKNOWN_STATE = 0; - STARTED = 1; // DVR is started - STOPPED = 2; // DVR is stopped - } - // The uid of the application that sent this custom atom. - optional int32 uid = 1 [(is_uid) = true]; - // DVR type - optional Type type = 2; - // DVR state - optional State state = 3; - // Identify the segment of a record or playback - optional int32 segment_id = 4; - // indicate how many overflow or underflow happened between started to stopped - optional int32 overflow_underflow_count = 5; -} - -/** - * Logs when a cas session opened through MediaCas. - * This is atom ID 280. - * - * Logged from: - * frameworks/base/media/java/android/media/MediaCas.java - */ -message TvCasSessionOpenStatus { - enum State { - UNKNOWN = 0; - SUCCEEDED = 1; // indicate that the session is opened successfully. - FAILED = 2; // indicate that the session isn’t opened successfully. - } - // The uid of the application that sent this custom atom. - optional int32 uid = 1 [(is_uid) = true]; - // Cas system Id - optional int32 cas_system_id = 2; - // State of the session - optional State state = 3; -} - -/** - * Logs for ContactsProvider general usage. - * This is atom ID 301. - * - * Logged from: - * packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java - */ -message ContactsProviderStatusReported { - enum ApiType { - UNKNOWN_API = 0; - QUERY = 1; - // INSERT includes insert and bulkInsert, and inserts triggered by applyBatch. - INSERT = 2; - // UPDATE and DELETE includes update/delete and the ones triggered by applyBatch. - UPDATE = 3; - DELETE = 4; - } - - enum ResultType { - UNKNOWN_RESULT = 0; - SUCCESS = 1; - FAIL = 2; - ILLEGAL_ARGUMENT = 3; - UNSUPPORTED_OPERATION = 4; - } - - enum CallerType { - UNSPECIFIED_CALLER_TYPE = 0; - CALLER_IS_SYNC_ADAPTER = 1; - CALLER_IS_NOT_SYNC_ADAPTER = 2; - } - - optional ApiType api_type = 1; - // Defined in - // packages/providers/ContactsProvider/src/com/android/providers/contacts/ContactsProvider2.java - optional int32 uri_type = 2; - optional CallerType caller_type = 3; - optional ResultType result_type = 4; - optional int32 result_count = 5; - optional int64 latency_micros = 6; -} - -/** - * Logs when an app is frozen or unfrozen. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/CachedAppOptimizer.java - */ -message AppFreezeChanged { - // The type of event. - enum Action { - UNKNOWN = 0; - FREEZE_APP = 1; - UNFREEZE_APP = 2; - } - optional Action action = 1; - - // Pid of the process being frozen. - optional int32 pid = 2; - - // Name of the process being frozen. - optional string process_name = 3; - - // Time since last unfrozen. - optional int64 time_unfrozen_millis = 4; -} - -/** - * Pulls information for a single voice call. - * - * Each pull creates multiple atoms, one for each call. The sequence is randomized when pulled. - * - * Pulled from: - * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java - */ -message VoiceCallSession { - // Bearer (IMS or CS) when the call started. - optional android.telephony.CallBearerEnum bearer_at_start = 1; - - // Bearer (IMS or CS) when the call ended. - // The bearer may change during the call, e.g. due to SRVCC. - optional android.telephony.CallBearerEnum bearer_at_end = 2; - - // Direction of the call (incoming or outgoing). - optional android.telephony.CallDirectionEnum direction = 3; - - // Time spent setting up the call. - optional android.telephony.CallSetupDurationEnum setup_duration = 4; - - // Whether the call ended before the setup was completed. - optional bool setup_failed = 5; - - // IMS reason code or CS disconnect cause. - // For IMS, see: frameworks/base/telephony/java/android/telephony/ims/ImsReasonInfo.java - // For CS, see: frameworks/base/telephony/java/android/telephony/DisconnectCause.java - optional int32 disconnect_reason_code = 6; - - // IMS extra code or CS precise disconnect cause. - // For IMS, this code is vendor-specific - // For CS, see: frameworks/base/telephony/java/android/telephony/PreciseDisconnectCause.java - optional int32 disconnect_extra_code = 7; - - // IMS extra message or CS vendor cause. - optional string disconnect_extra_message = 8; - - // Radio access technology (RAT) used when call started. - optional android.telephony.NetworkTypeEnum rat_at_start = 9; - - // Radio access technology (RAT) used when call terminated. - optional android.telephony.NetworkTypeEnum rat_at_end = 10; - - // Number of times RAT changed during the call. - optional int64 rat_switch_count = 11; - - // A bitmask of all codecs used during the call. - // See: frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java - optional int64 codec_bitmask = 12; - - // Number of other calls going on during call setup, for the same SIM slot. - optional int32 concurrent_call_count_at_start = 13; - - // Number of other calls going on during call termination, for the same SIM slot. - optional int32 concurrent_call_count_at_end = 14; - - // Index of the SIM is used, 0 for single-SIM devices. - optional int32 sim_slot_index = 15; - - // Whether the device was in multi-SIM mode (with multiple active SIM profiles). - optional bool is_multi_sim = 16; - - // Whether the call was made with an eSIM profile. - optional bool is_esim = 17; - - // Carrier ID of the SIM card. - // See https://source.android.com/devices/tech/config/carrierid. - optional int32 carrier_id = 18; - - // Whether an SRVCC has been completed successfully for this call. - optional bool srvcc_completed = 19; - - // Number of SRVCC failures. - optional int64 srvcc_failure_count = 20; - - // Number of SRVCC cancellations. - optional int64 srvcc_cancellation_count = 21; - - // Whether the Real-Time Text (RTT) was ever used in the call (rather than whether RTT was - // enabled in the dialer's settings). - optional bool rtt_enabled = 22; - - // Whether this was an emergency call. - optional bool is_emergency = 23; - - // Whether the call was performed while roaming. - optional bool is_roaming = 24; - - // A random number used as the dimension field to pull multiple atoms. - optional int32 dimension = 25; -} - -/** - * Pulls voice call radio access technology (RAT) usage. - * - * Each pull creates multiple atoms, one for each carrier/RAT, the order of which is irrelevant to - * time. The atom will be skipped if not enough data is available. - * - * Pulled from: - * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java - */ -message VoiceCallRatUsage { - // Carrier ID (https://source.android.com/devices/tech/config/carrierid). - optional int32 carrier_id = 1; - - // Radio access technology. - optional android.telephony.NetworkTypeEnum rat = 2; - - // Total duration that voice calls spent on this carrier and RAT. - optional int64 total_duration_seconds = 3; - - // Total number of calls using this carrier and RAT. - // A call is counted once even if it used the RAT multiple times. - optional int64 call_count = 4; -} - -/** - * Pulls the number of active SIM slots and SIMs/eSIM profiles. - * - * Pulled from: - * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java - */ -message SimSlotState { - // Number of active SIM slots (both physical and eSIM profiles) in the device. - optional int32 active_slot_count = 1; - - // Number of SIM cards (both physical and active eSIM profiles). - // This number is always equal to or less than the number of active SIM slots. - optional int32 sim_count = 2; - - // Number of active eSIM profiles. - // This number is always equal to or less than the number of SIMs. - optional int32 esim_count = 3; -} - -/** - * Pulls supported cellular radio access technologies. - * - * This atom reports the capabilities of the device, rather than the network it has access to. - * - * Pulled from: - * frameworks/opt/telephony/src/java/com/android/internal/telephony/metrics/MetricsCollector.java - */ -message SupportedRadioAccessFamily { - // A bitmask of supported radio technologies. - // See android.telephony.TelephonyManager.NetworkTypeBitMask. - optional int64 network_type_bitmask = 1; -} - -/** - * Logs gnss stats from location service provider - * - * Pulled from: - * frameworks/base/location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java - */ - -message GnssStats { - // Number of location reports since boot - optional int64 location_reports = 1; - - // Total pulled reports of Location failures since boot - optional int64 location_failure_reports = 2; - - // Number of time to first fix reports since boot - optional int64 time_to_first_fix_reports = 3; - - // Total pulled reported time to first fix (in milli-seconds) since boot - optional int64 time_to_first_fix_millis = 4; - - // Number of position accuracy reports since boot - optional int64 position_accuracy_reports = 5; - - // Total pulled reported position accuracy (in meters) since boot - optional int64 position_accuracy_meters = 6; - - // Number of top 4 average CN0 reports since boot - optional int64 top_four_average_cn0_reports = 7; - - // Total pulled reported of top 4 average CN0 (dB-mHz) since boot - optional int64 top_four_average_cn0_db_mhz = 8; - - // Number of l5 top 4 average CN0 reports since boot - optional int64 l5_top_four_average_cn0_reports = 9; - - // Total pulled reported of l5 top 4 average CN0 (dB-mHz) since boot - optional int64 l5_top_four_average_cn0_db_mhz = 10; - - // Total number of sv status messages reports since boot - optional int64 sv_status_reports = 11; - - // Total number of sv status messages reports, where sv is used in fix since boot - optional int64 sv_status_reports_used_in_fix = 12; - - // Total number of L5 sv status messages reports since boot - optional int64 l5_sv_status_reports = 13; - - // Total number of L5 sv status messages reports, where sv is used in fix since boot - optional int64 l5_sv_status_reports_used_in_fix = 14; -} - -/** - * Logs when an app is moved to a different standby bucket. - * - * Logged from: - * frameworks/base/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java - */ -message AppStandbyBucketChanged { - optional string package_name = 1; - - // Should be 0, 10, 11, 12, etc. where 0 is the owner. See UserHandle for more documentation. - optional int32 user_id = 2; - - // These enum values match the constants defined in UsageStatsManager.java. - enum Bucket { - BUCKET_UNKNOWN = 0; - BUCKET_EXEMPTED = 5; - BUCKET_ACTIVE = 10; - BUCKET_WORKING_SET = 20; - BUCKET_FREQUENT = 30; - BUCKET_RARE = 40; - BUCKET_RESTRICTED = 45; - BUCKET_NEVER = 50; - } - optional Bucket bucket = 3; - - enum MainReason { - MAIN_UNKNOWN = 0; - MAIN_DEFAULT = 0x0100; - MAIN_TIMEOUT = 0x0200; - MAIN_USAGE = 0x0300; - MAIN_FORCED_BY_USER = 0x0400; - MAIN_PREDICTED = 0x0500; - MAIN_FORCED_BY_SYSTEM = 0x0600; - } - optional MainReason main_reason = 4; - - // A more detailed reason for the standby bucket change. The sub reason name is dependent on - // the main reason. Values are one of the REASON_SUB_XXX constants defined in - // UsageStatsManager.java. - optional int32 sub_reason = 5; -} - -/** -* Reports a started sharesheet transaction. -* -* Logged from: -* frameworks/base/core/java/com/android/internal/app/ChooserActivity.java -*/ -message SharesheetStarted { - // The event_id (as for UiEventReported). - optional int32 event_id = 1; - // The calling app's package name. - optional string package_name = 2; - // An identifier to tie together multiple logs relating to the same share event - optional int32 instance_id = 3; - // The mime type of the share - optional string mime_type = 4; - // The number of direct targets the calling app is providing that will be shown. - optional int32 num_app_provided_direct_targets = 5; - // The number of app targets the calling app is providing that will be shown. - optional int32 num_app_provided_app_targets = 6; - // True if the share originates from the workprofile - optional bool is_workprofile = 7; - - enum SharesheetPreviewType { // Constants from ChooserActivity.java - CONTENT_PREVIEW_TYPE_UNKNOWN = 0; // Default for proto 2 / 3 compatibility. - CONTENT_PREVIEW_IMAGE = 1; // The preview shown in the sharesheet is an image. - CONTENT_PREVIEW_FILE = 2; // The preview shown in the sharesheet is a file. - CONTENT_PREVIEW_TEXT = 3; // The preview shown in the sharesheet is text. - } - // How the sharesheet preview is presented. - optional SharesheetPreviewType preview_type = 8; - - enum ResolverActivityIntent { // Intents handled by ResolverActivity.java - INTENT_DEFAULT = 0; - INTENT_ACTION_VIEW = 1; - INTENT_ACTION_EDIT = 2; - INTENT_ACTION_SEND = 3; - INTENT_ACTION_SENDTO = 4; - INTENT_ACTION_SEND_MULTIPLE = 5; - INTENT_ACTION_IMAGE_CAPTURE = 6; - INTENT_ACTION_MAIN = 7; - } - // The intent being processed (only SEND and SEND_MULTIPLE are system sharesheet) - optional ResolverActivityIntent intent_type = 9; -} - -/** - * Reports a ranking selection event. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/app/ChooserActivity.java (sharesheet) - */ -message RankingSelected { - // The event_id (as for UiEventReported). - optional int32 event_id = 1; - // The relevant app's package name (can be source or picked package). - optional string package_name = 2; - // An identifier to tie together multiple logs relating to the same share event. - optional int32 instance_id = 3; - // Which of the ranked targets got picked, default starting position 0. - optional int32 position_picked = 4; -} - -/** - * Logs when TvSettings UI is interacted at. - * - * Logged from: packages/apps/TvSettings - */ -message TvSettingsUIInteracted { - - /** The UI action category */ - optional android.app.tvsettings.Action action = 1; - - /** The ID of the entry that the users actioned on */ - optional android.app.tvsettings.ItemId item_id = 2; -} - -/** - * Logs information about a package installation using package installer V2 APIs. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/pm/PackageInstallerSession.java - */ -message PackageInstallerV2Reported { - // Whether this installation uses Incremental File System - optional bool is_incremental = 1; - // Name of the package that is intended to be installed - optional string package_name = 2; - // The duration between when the install was requested to when the install has completed - optional int64 duration_millis = 3; - // Installation result in final integer, which are SystemApi's. - // Return_code 1 indicates success. - // For full list, see frameworks/base/core/java/android/content/pm/PackageManager.java - optional int32 return_code = 4; - // Total size of the APKs installed for this package - optional int64 apks_size_bytes = 5; -} - -/** - * Logs settings provider values. - * - * Use DeviceConfig.getProperties to get a list Setting key, query the data from content provider, - * then write the value to proto. - * - */ -message SettingSnapshot { - - // Setting key - optional string name = 1; - - enum SettingsValueType { - NOTASSIGNED = 0; - ASSIGNED_BOOL_TYPE = 1; - ASSIGNED_INT_TYPE = 2; - ASSIGNED_FLOAT_TYPE = 3; - ASSIGNED_STRING_TYPE = 4; - }; - // Setting value type - optional SettingsValueType type = 2; - - optional bool bool_value = 3; - - optional int32 int_value = 4; - - optional float float_value = 5; - - optional string str_value = 6; - - // Android user index. 0 for primary user, 10, 11 for secondary or profile user - optional int32 user_id = 7; -} - -/** - * An event logged to indicate that a user journey is about to be performed. This atom includes - * relevant information about the users involved in the journey. A UserLifecycleEventOccurred event - * will immediately follow this atom which will describe the event(s) and its state. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/UserController.java - * frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java - */ -message UserLifecycleJourneyReported { - // An identifier to track a chain of user lifecycle events occurring (referenced in the - // UserLifecycleEventOccurred atom) - optional int64 session_id = 1; - - // Indicates what type of user journey this session is related to - enum Journey { - UNKNOWN = 0; // Undefined user lifecycle journey - USER_SWITCH_UI = 1; // A user switch journey where a UI is shown - USER_SWITCH_FG = 2; // A user switch journey without a UI shown - USER_START = 3; // A user start journey - USER_CREATE = 4; // A user creation journey - } - optional Journey journey = 2; - // Which user the journey is originating from - could be -1 for certain phases (eg USER_CREATE) - // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest) - optional int32 origin_user = 3; - // Which user the journey is targeting - // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest) - optional int32 target_user = 4; - - // What is the user type of the target user - // These should be in sync with USER_TYPE_* flags defined in UserManager.java - enum UserType { - TYPE_UNKNOWN = 0; - FULL_SYSTEM = 1; - FULL_SECONDARY = 2; - FULL_GUEST = 3; - FULL_DEMO = 4; - FULL_RESTRICTED = 5; - PROFILE_MANAGED = 6; - SYSTEM_HEADLESS = 7; - } - optional UserType user_type = 5; - // What are the flags attached to the target user - optional int32 user_flags = 6; -} - -/** - * An event logged when a specific user lifecycle event is performed. These events should be - * correlated with a UserLifecycleJourneyReported atom via the session_id. - * Note: journeys can span over multiple events, hence some events may share a single session id. - * - * Logged from: - * frameworks/base/services/core/java/com/android/server/am/UserController.java - * frameworks/base/services/core/java/com/android/server/pm/UserManagerService.java - */ -message UserLifecycleEventOccurred { - // An id which links back to user details (reported in the UserLifecycleJourneyReported atom) - optional int64 session_id = 1; - // The target user for this event (same as target_user in the UserLifecycleJourneyReported atom) - // This integer is a UserIdInt (eg 0 for the system user, 10 for secondary/guest) - optional int32 user_id = 2; - - enum Event { - UNKNOWN = 0; // Indicates that the associated user journey timed-out or resulted in an error - SWITCH_USER = 1; // Indicates that this is a user switch event - START_USER = 2; // Indicates that this is a user start event - CREATE_USER = 3; // Indicates that this is a user create event - USER_RUNNING_LOCKED = 4; // Indicates that user is running in locked state - UNLOCKING_USER = 5; // Indicates that this is a user unlocking event - UNLOCKED_USER = 6; // Indicates that this is a user unlocked event - } - optional Event event = 3; - - enum State { - NONE = 0; // Indicates the associated event has no start/end defined - BEGIN = 1; - FINISH = 2; - } - optional State state = 4; // Represents the state of an event (beginning/ending) -} - -/** - * Logs when accessibility shortcut clicked. - * - * Logged from: - * frameworks/base/services/accessibility/java/com/android/server/accessibility - */ -message AccessibilityShortcutReported { - // The accessibility feature(including installed a11y service, framework a11y feature, - // and installed a11y activity) package name that is assigned to the accessibility shortcut. - optional string package_name = 1; - - // The definition of the accessibility shortcut. - // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto. - optional android.stats.accessibility.ShortcutType shortcut_type = 2; - - // The definition of the service status. - // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto. - optional android.stats.accessibility.ServiceStatus service_status = 3; -} - -/** - * Logs when accessibility service status changed. - * - * Logged from: - * packages/apps/Settings/src/com/android/settings/accessibility - */ -message AccessibilityServiceReported { - // The accessibility service package name. - optional string package_name = 1; - - // The definition of the service status. - // From frameworks/base/core/proto/android/stats/accessibility/accessibility_enums.proto. - optional android.stats.accessibility.ServiceStatus service_status = 2; -} - -/** - * Logs when display wake up. - * - * Logged from: - * services/core/java/com/android/server/power/Notifier.java - */ - -message DisplayWakeReported { - // Wake_up_reason code - // If LOWORD(wake_up_reason) = 0 - // reference to HIWORD(wake_up_reason) PowerManager.WAKE_REASON_XXX - // else reference wake_up_reason to - // services/core/java/com/android/server/power/Notifier.java#onWakeUp - optional int32 wake_up_reason = 1; -} - -/** - * Logs app usage events. - */ -message AppUsageEventOccurred { - optional int32 uid = 1 [(is_uid) = true]; - optional string package_name = 2; - optional string class_name = 3; - - enum EventType { - NONE = 0; - MOVE_TO_FOREGROUND = 1; - MOVE_TO_BACKGROUND = 2; - } - optional EventType event_type = 4; -} - -/* - * Quality metrics logged when EVS cameras are active. - * - * Logged from: - * packages/services/Car/evs/manager/1.1/Enumerator.cpp - */ -message EvsUsageStatsReported { - - // Camera identifier to distinguish the source camera device. This is not - // globally unique and therefore cannot be used to identify the user and/or - // the device. - optional int32 device_id = 1; - - // Peak number of clients during the service - optional int32 peak_num_clients = 2; - - // Number of erroneous events during the service - optional int32 num_errors = 3; - - // Round trip latency of the very first frame - optional int64 first_latency_millis = 4; - - // Average frame round trip latency - optional float avg_latency_millis = 5; - - // Peak frame round trip latency - optional int64 peak_latency_millis = 6; - - // Total number of frames received - optional int64 total_frames = 7; - - // Number of frames ignored - optional int64 ignored_frames = 8; - - // Number of dropped frames to synchronize camera devices - optional int64 dropped_frames_to_sync = 9; - - // The duration of the service - optional int64 duration_millis = 10; -} - -/** - * Logs audio power usage stats. - * - * Pushed from: - * frameworks/av/services/mediametrics/AudioPowerUsage.cpp - */ -message AudioPowerUsageDataReported { - /** - * Device used for input/output - * - * All audio devices please refer to below file: - * system/media/audio/include/system/audio-base.h - * - * Define our own enum values because we don't report all audio devices. - * Currently, we only report built-in audio devices such as handset, speaker, - * built-in mics, common audio devices such as wired headset, usb headset - * and bluetooth devices. - */ - enum AudioDevice { - OUTPUT_EARPIECE = 0x1; // handset - OUTPUT_SPEAKER = 0x2; // dual speaker - OUTPUT_WIRED_HEADSET = 0x4; // 3.5mm headset - OUTPUT_USB_HEADSET = 0x8; // usb headset - OUTPUT_BLUETOOTH_SCO = 0x10; // bluetooth sco - OUTPUT_BLUETOOTH_A2DP = 0x20; // a2dp - OUTPUT_SPEAKER_SAFE = 0x40; // bottom speaker - - INPUT_DEVICE_BIT = 0x40000000; // non-negative positive int32. - INPUT_BUILTIN_MIC = 0x40000001; // buildin mic - INPUT_BUILTIN_BACK_MIC = 0x40000002; // buildin back mic - INPUT_WIRED_HEADSET_MIC = 0x40000004; // 3.5mm headset mic - INPUT_USB_HEADSET_MIC = 0x40000008; // usb headset mic - INPUT_BLUETOOTH_SCO = 0x40000010; // bluetooth sco mic - } - optional AudioDevice audio_device = 1; - - // Duration of the audio in seconds - optional int32 duration_secs = 2; - - // Average volume (0 ... 1.0) - optional float average_volume = 3; - - enum AudioType { - UNKNOWN_TYPE = 0; - VOICE_CALL_TYPE = 1; // voice call - VOIP_CALL_TYPE = 2; // voip call, including uplink and downlink - MEDIA_TYPE = 3; // music and system sound - RINGTONE_NOTIFICATION_TYPE = 4; // ringtone and notification - ALARM_TYPE = 5; // alarm type - // record type - CAMCORDER_TYPE = 6; // camcorder - RECORD_TYPE = 7; // other recording - } - optional AudioType type = 4; -} - -/** - * Pulls bytes transferred over WiFi and mobile networks sliced by uid, is_metered, and tag. - * - * Pulled from: - * StatsPullAtomService, which uses NetworkStatsService to query NetworkStats. - */ -message BytesTransferByTagAndMetered { - optional int32 uid = 1 [(is_uid) = true]; - - optional bool is_metered = 2; - - optional int32 tag = 3; - - optional int64 rx_bytes = 4; - - optional int64 rx_packets = 5; - - optional int64 tx_bytes = 6; - - optional int64 tx_packets = 7; -} - -/* - * Logs when the Media Output Switcher finishes a media switch operation. - * - * Logged from: - * packages/apps/Settings/src/com/android/settings/media/MediaOutputSliceWorker.java - */ -message MediaOutputOpSwitchReported { - // Source medium type before switching. - optional android.app.settings.mediaoutput.MediumType source = 1; - - // Target medium type after switching. - optional android.app.settings.mediaoutput.MediumType target = 2; - - // The result of switching. - optional android.app.settings.mediaoutput.SwitchResult result = 3; - - // The detail code of a switching result. - optional android.app.settings.mediaoutput.SubResult subresult = 4; - - /* - * The package name of a pre-installed app, whose media session is being switched. - */ - optional string media_session_package_name = 5; - - // The amount of available wired devices when a switching is being performed. - optional int32 available_wired_device_count = 6; - - // The amount of available Bluetooth devices a switching is being performed. - optional int32 available_bt_device_count = 7; - - // The amount of available remote devices when a switching is being performed. - optional int32 available_remote_device_count = 8; - - // The amount of applied devices within a remote dynamic group after a switching is done. - optional int32 applied_device_count_within_remote_group = 9; -} - -/** - * Logs when the Assistant is invoked. - * - * Logged from: - * frameworks/base/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java - */ -message AssistantInvocationReported { - - // The event_id (as for UiEventReported). - optional int32 event_id = 1; - - // The registered Assistant's uid and package (as for UiEventReported). - optional int32 uid = 2 [(is_uid) = true]; - optional string package_name = 3; - - // An identifier used to disambiguate which logs refer to a particular invocation of the - // Assistant (as for UiEventReported). - optional int32 instance_id = 4; - - // The state of the device at the time of invocation. - enum DeviceState { - UNKNOWN_DEVICE_STATE = 0; - AOD1 = 1; - AOD2 = 2; - BOUNCER = 3; - UNLOCKED_LOCKSCREEN = 4; - LAUNCHER_HOME = 5; - LAUNCHER_OVERVIEW = 6; - LAUNCHER_ALL_APPS = 7; - APP_DEFAULT = 8; - APP_IMMERSIVE = 9; - APP_FULLSCREEN = 10; - } - optional DeviceState device_state = 5; - - // Whether the Assistant handles were showing at the time of invocation. - optional bool assistant_handles_showing = 6; -} - -/** - * Logs when an AudioRecord finishes running on an audio device - * - * Logged from: - * frameworks/av/services/mediametrics/AudioAnalytics.cpp - */ -message MediametricsAudioRecordDeviceUsageReported { - // The devices connected to this AudioRecord. - // A string OR of various input device categories, e.g. "DEVICE1|DEVICE2". - // See lookup<INPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp - // See audio_device_t in system/media/audio/include/system/audio-base.h - optional string devices = 1; - - // The name of the remote device attached to the device, typically available for USB or BT. - // This may be empty for a fixed device, or separated by "|" if more than one. - optional string device_names = 2; - - // The amount of time spent in the device as measured by the active track in AudioFlinger. - optional int64 device_time_nanos = 3; - - // The audio data format used for encoding. - // An enumeration from system/media/audio/include/system/audio-base.h audio_format_t - optional string encoding = 4; - - // The client-server buffer framecount. - // The framecount is generally between 960 - 48000 for PCM encoding. - // The framecount represents raw buffer size in bytes for non-PCM encoding. - optional int32 frame_count = 5; - - // The number of audio intervals (contiguous, continuous playbacks). - optional int32 interval_count = 6; - - // The sample rate of the AudioRecord. - // A number generally between 8000-96000 (frames per second). - optional int32 sample_rate = 7; - - // The audio input flags used to construct the AudioRecord. - // A string OR from system/media/audio/include/system/audio-base.h audio_input_flags_t - optional string flags = 8; - - // The santized package name of the audio client associated with the AudioRecord. - // See getSanitizedPackageNameAndVersionCode() in - // frameworks/av/services/mediametrics/MediaMetricsService.cpp - optional string package_name = 9; - - // The selected device id (nonzero if a non-default device is selected) - optional int32 selected_device_id = 10; - - // The caller of the AudioRecord. - // See lookup<CALLER_NAME>() in frameworks/av/services/mediametrics/AudioTypes.cpp - optional string caller = 11; - - // The audio source for AudioRecord. - // An enumeration from system/media/audio/include/system/audio-base.h audio_source_t - optional string source = 12; -} - -/** - * Logs when an AudioThread finishes running on an audio device - * - * Logged from: - * frameworks/av/services/mediametrics/AudioAnalytics.cpp - */ -message MediametricsAudioThreadDeviceUsageReported { - // The devices connected to this audio thread. - // A string OR of various input device categories, e.g. "DEVICE1|DEVICE2". - // (for record threads): - // See lookup<INPUT_DEVICE> in frameworks/av/services/mediametrics/AudioTypes.cpp - // (for playback threads): - // See lookup<OUTPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp - // See audio_device_t in system/media/audio/include/system/audio-base.h - optional string devices = 1; - - // The name of the remote device attached to the device, typically available for USB or BT. - // This may be empty for a fixed device, or separated by "|" if more than one. - optional string device_names = 2; - - // The amount of time spent in the device as measured by the active track in AudioFlinger. - optional int64 device_time_nanos = 3; - - // The audio data format used for encoding. - // An enumeration from system/media/audio/include/system/audio-base.h audio_format_t - optional string encoding = 4; - - // The framecount of the buffer delivered to (or from) the HAL. - // The framecount is generally ~960 for PCM encoding. - // The framecount represents raw buffer size in bytes for non-PCM encoding. - optional int32 frame_count = 5; - - // The number of audio intervals (contiguous, continuous playbacks). - optional int32 interval_count = 6; - - // The sample rate of the audio thread. - // A number generally between 8000-96000 (frames per second). - optional int32 sample_rate = 7; - - // The audio flags used to construct the thread - // (for record threads): - // A string OR from system/media/audio/include/system/audio-base.h audio_input_flags_t - // (for playback threads): - // A string OR from system/media/audio/include/system/audio-base.h audio_output_flags_t - optional string flags = 8; - - // The number of underruns encountered for a playback thread or the - // number of overruns encountered for a capture thread. - optional int32 xruns = 9; - - // The type of thread - // A thread type enumeration from - // frameworks/av/mediametrics/services/Translate.h - optional string type = 10; -} - -/** - * Logs when an AudioTrack finishes running on an audio device - * - * Logged from: - * frameworks/av/services/mediametrics/AudioAnalytics.cpp - */ -message MediametricsAudioTrackDeviceUsageReported { - // The output devices connected to this AudioTrack. - // A string OR of various output device categories, e.g. "DEVICE1|DEVICE2". - // See lookup<OUTPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp - // See audio_device_t in system/media/audio/include/system/audio-base.h - optional string devices = 1; - - // The name of the remote device attached to the device, typically available for USB or BT. - // This may be empty for a fixed device, or separated by "|" if more than one. - optional string device_names = 2; - - // The amount of time spent in the device as measured by the active track in AudioFlinger. - optional int64 device_time_nanos = 3; - - // The audio data format used for encoding. - // An enumeration from system/media/audio/include/system/audio-base.h audio_format_t - optional string encoding = 4; - - // The client-server buffer framecount. - // The framecount is generally between 960 - 48000 for PCM encoding. - // The framecount represents raw buffer size in bytes for non-PCM encoding. - // A static track (see traits) may have a very large framecount. - optional int32 frame_count = 5; - - // The number of audio intervals (contiguous, continuous playbacks). - optional int32 interval_count = 6; - - // The sample rate of the AudioTrack. - // A number generally between 8000-96000 (frames per second). - optional int32 sample_rate = 7; - - // The audio flags used to construct the AudioTrack. - // A string OR from system/media/audio/include/system/audio-base.h audio_output_flags_t - optional string flags = 8; - - // The number of underruns encountered. - optional int32 xruns = 9; - - // The santized package name of the audio client associated with the AudioTrack. - // See getSanitizedPackageNameAndVersionCode() in - // frameworks/av/services/mediametrics/MediaMetricsService.cpp - optional string package_name = 10; - - // The latency of the last sample in the buffer in milliseconds. - optional float device_latency_millis = 11; - - // The startup time in milliseconds from start() to sample played. - optional float device_startup_millis = 12; - - // The average volume of the track on the device [ 0.f - 1.f ] - optional float device_volume = 13; - - // The selected device id (nonzero if a non-default device is selected) - optional int32 selected_device_id = 14; - - // The stream_type category for the AudioTrack. - // An enumeration from system/media/audio/include/system/audio-base.h audio_stream_type_t - optional string stream_type = 15; - - // The usage for the AudioTrack. - // An enumeration from system/media/audio/include/system/audio-base.h audio_usage_t - optional string usage = 16; - - // The content type of the AudioTrack. - // An enumeration from system/media/audio/include/system/audio-base.h audio_content_type_t - optional string content_type = 17; - - // The caller of the AudioTrack. - // See lookup<CALLER_NAME>() in frameworks/av/services/mediametrics/AudioTypes.cpp - optional string caller = 18; - - // The traits of the AudioTrack. - // A string OR of different traits, may be empty string. - // Only "static" is supported for R. - // See lookup<TRACK_TRAITS>() in frameworks/av/services/mediametrics/AudioTypes.cpp - optional string traits = 19; -} - -/** - * Logs the status of an audio device connection attempt. - * - * Logged from: - * frameworks/av/services/mediametrics/AudioAnalytics.cpp - */ -message MediametricsAudioDeviceConnectionReported { - // The input devices represented by this report. - // A string OR of various input device categories, e.g. "DEVICE1|DEVICE2". - // See lookup<INPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp - // See audio_device_t in system/media/audio/include/system/audio-base.h - optional string input_devices = 1; - - // The output devices represented by this report. - // A string OR of various output device categories. - // See lookup<OUTPUT_DEVICE>() in frameworks/av/services/mediametrics/AudioTypes.cpp - // See audio_device_t in system/media/audio/include/system/audio-base.h - optional string output_devices = 2; - - // The name of the remote device attached to the device, typically available for USB or BT. - // This may be empty for a fixed device, or separated by "|" if more than one. - optional string device_names = 3; - - // The result of the audio device connection. - // 0 indicates success: connection verified. - // 1 indicates unknown: connection not verified or not known if diverted properly. - // Other values indicate specific status. - // See DeviceConnectionResult in frameworks/av/services/mediametrics/AudioTypes.h - optional int32 result = 4; - - // Average milliseconds of time to connect - optional float time_to_connect_millis = 5; - - // Number of connections if aggregated statistics, otherwise 1. - optional int32 connection_count = 6; -} - -/** - * Logs: i) creation of different types of cryptographic keys in the keystore, - * ii) operations performed using the keys, - * iii) attestation of the keys - * Logged from: system/security/keystore/key_event_log_handler.cpp - */ -message KeystoreKeyEventReported { - - enum Algorithm { - /** Asymmetric algorithms. */ - RSA = 1; - // 2 removed, do not reuse. - EC = 3; - /** Block cipher algorithms */ - AES = 32; - TRIPLE_DES = 33; - /** MAC algorithms */ - HMAC = 128; - }; - /** Algorithm associated with the key */ - optional Algorithm algorithm = 1; - - /** Size of the key */ - optional int32 key_size = 2; - - enum KeyOrigin { - /** Generated in keymaster. Should not exist outside the TEE. */ - GENERATED = 0; - /** Derived inside keymaster. Likely exists off-device. */ - DERIVED = 1; - /** Imported into keymaster. Existed as cleartext in Android. */ - IMPORTED = 2; - /** Keymaster did not record origin. */ - UNKNOWN = 3; - /** Securely imported into Keymaster. */ - SECURELY_IMPORTED = 4; - }; - /* Logs whether the key was generated, imported, securely imported, or derived.*/ - optional KeyOrigin key_origin = 3; - - enum HardwareAuthenticatorType { - NONE = 0; - PASSWORD = 1; - FINGERPRINT = 2; - // Additional entries must be powers of 2. - }; - /** - * What auth types does this key require? If none, - * then no auth required. - */ - optional HardwareAuthenticatorType user_auth_type = 4; - - /** - * If user authentication is required, is the requirement time based? If it - * is not time based then this field will not be used and the key is per - * operation. Per operation keys must be user authenticated on each usage. - */ - optional int32 user_auth_key_timeout_secs = 5; - - /** - * padding mode, digest, block_mode and purpose should ideally be repeated - * fields. However, since statsd does not support repeated fields in - * pushed atoms, they are represented using bitmaps. - */ - - /** Track which padding mode is being used.*/ - optional int32 padding_mode_bitmap = 6; - - /** Track which digest is being used. */ - optional int32 digest_bitmap = 7; - - /** Track what block mode is being used (for encryption). */ - optional int32 block_mode_bitmap = 8; - - /** Track what purpose is this key serving. */ - optional int32 purpose_bitmap = 9; - - enum EcCurve { - P_224 = 0; - P_256 = 1; - P_384 = 2; - P_521 = 3; - }; - /** Which ec curve was selected if elliptic curve cryptography is in use **/ - optional EcCurve ec_curve = 10; - - enum KeyBlobUsageRequirements { - STANDALONE = 0; - REQUIRES_FILE_SYSTEM = 1; - }; - /** Standalone or is a file system required */ - optional KeyBlobUsageRequirements key_blob_usage_reqs = 11; - - enum Type { - key_operation = 0; - key_creation = 1; - key_attestation = 2; - } - /** Key creation event, operation event or attestation event? */ - optional Type type = 12; - - /** Was the key creation, operation, or attestation successful? */ - optional bool was_successful = 13; - - /** Response code or error code */ - optional int32 error_code = 14; -} - -// Blob Committer stats -// Keep in sync between: -// frameworks/base/core/proto/android/server/blobstoremanagerservice.proto -// frameworks/base/cmds/statsd/src/atoms.proto -message BlobCommitterProto { - // Committer app's uid - optional int32 uid = 1 [(is_uid) = true]; - - // Unix epoch timestamp of the commit in milliseconds - optional int64 commit_timestamp_millis = 2; - - // Flags of what access types the committer has set for the Blob - optional int32 access_mode = 3; - - // Number of packages that have been whitelisted for ACCESS_TYPE_WHITELIST - optional int32 num_whitelisted_package = 4; -} - -// Blob Leasee stats -// Keep in sync between: -// frameworks/base/core/proto/android/server/blobstoremanagerservice.proto -// frameworks/base/cmds/statsd/src/atoms.proto -message BlobLeaseeProto { - // Leasee app's uid - optional int32 uid = 1 [(is_uid) = true]; - - // Unix epoch timestamp for lease expiration in milliseconds - optional int64 lease_expiry_timestamp_millis = 2; -} - -// List of Blob Committers -// Keep in sync between: -// frameworks/base/core/proto/android/server/blobstoremanagerservice.proto -// frameworks/base/cmds/statsd/src/atoms.proto -message BlobCommitterListProto { - repeated BlobCommitterProto committer = 1; -} - -// List of Blob Leasees -// Keep in sync between: -// frameworks/base/core/proto/android/server/blobstoremanagerservice.proto -// frameworks/base/cmds/statsd/src/atoms.proto -message BlobLeaseeListProto { - repeated BlobLeaseeProto leasee = 1; -} - -/** - * Logs the current state of a Blob committed with BlobStoreManager - * - * Pulled from: - * frameworks/base/apex/blobstore/service/java/com/android/server/blob/BlobStoreManagerService.java - */ -message BlobInfo { - // Id of the Blob - optional int64 blob_id = 1; - - // Size of the Blob data - optional int64 size = 2; - - // Unix epoch timestamp of the Blob's expiration in milliseconds - optional int64 expiry_timestamp_millis = 3; - - // List of committers of this Blob - optional BlobCommitterListProto committers = 4; - - // List of leasees of this Blob - optional BlobLeaseeListProto leasees = 5; -} diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index 8a9ec7456e55..8334b6b4db90 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -92,63 +92,43 @@ StatsPullerManager::StatsPullerManager() } bool StatsPullerManager::Pull(int tagId, const ConfigKey& configKey, const int64_t eventTimeNs, - vector<shared_ptr<LogEvent>>* data, bool useUids) { + vector<shared_ptr<LogEvent>>* data) { std::lock_guard<std::mutex> _l(mLock); - return PullLocked(tagId, configKey, eventTimeNs, data, useUids); + return PullLocked(tagId, configKey, eventTimeNs, data); } bool StatsPullerManager::Pull(int tagId, const vector<int32_t>& uids, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool useUids) { + vector<std::shared_ptr<LogEvent>>* data) { std::lock_guard<std::mutex> _l(mLock); - return PullLocked(tagId, uids, eventTimeNs, data, useUids); + return PullLocked(tagId, uids, eventTimeNs, data); } bool StatsPullerManager::PullLocked(int tagId, const ConfigKey& configKey, - const int64_t eventTimeNs, vector<shared_ptr<LogEvent>>* data, - bool useUids) { + const int64_t eventTimeNs, vector<shared_ptr<LogEvent>>* data) { vector<int32_t> uids; - if (useUids) { - auto uidProviderIt = mPullUidProviders.find(configKey); - if (uidProviderIt == mPullUidProviders.end()) { - ALOGE("Error pulling tag %d. No pull uid provider for config key %s", tagId, - configKey.ToString().c_str()); - StatsdStats::getInstance().notePullUidProviderNotFound(tagId); - return false; - } - sp<PullUidProvider> pullUidProvider = uidProviderIt->second.promote(); - if (pullUidProvider == nullptr) { - ALOGE("Error pulling tag %d, pull uid provider for config %s is gone.", tagId, - configKey.ToString().c_str()); - StatsdStats::getInstance().notePullUidProviderNotFound(tagId); - return false; - } - uids = pullUidProvider->getPullAtomUids(tagId); + const auto& uidProviderIt = mPullUidProviders.find(configKey); + if (uidProviderIt == mPullUidProviders.end()) { + ALOGE("Error pulling tag %d. No pull uid provider for config key %s", tagId, + configKey.ToString().c_str()); + StatsdStats::getInstance().notePullUidProviderNotFound(tagId); + return false; + } + sp<PullUidProvider> pullUidProvider = uidProviderIt->second.promote(); + if (pullUidProvider == nullptr) { + ALOGE("Error pulling tag %d, pull uid provider for config %s is gone.", tagId, + configKey.ToString().c_str()); + StatsdStats::getInstance().notePullUidProviderNotFound(tagId); + return false; } - return PullLocked(tagId, uids, eventTimeNs, data, useUids); + uids = pullUidProvider->getPullAtomUids(tagId); + return PullLocked(tagId, uids, eventTimeNs, data); } bool StatsPullerManager::PullLocked(int tagId, const vector<int32_t>& uids, - const int64_t eventTimeNs, vector<shared_ptr<LogEvent>>* data, - bool useUids) { + const int64_t eventTimeNs, vector<shared_ptr<LogEvent>>* data) { VLOG("Initiating pulling %d", tagId); - if (useUids) { - for (int32_t uid : uids) { - PullerKey key = {.atomTag = tagId, .uid = uid}; - auto pullerIt = kAllPullAtomInfo.find(key); - if (pullerIt != kAllPullAtomInfo.end()) { - bool ret = pullerIt->second->Pull(eventTimeNs, data); - VLOG("pulled %zu items", data->size()); - if (!ret) { - StatsdStats::getInstance().notePullFailed(tagId); - } - return ret; - } - } - StatsdStats::getInstance().notePullerNotFound(tagId); - ALOGW("StatsPullerManager: Unknown tagId %d", tagId); - return false; // Return early since we don't know what to pull. - } else { - PullerKey key = {.atomTag = tagId, .uid = -1}; + for (int32_t uid : uids) { + PullerKey key = {.atomTag = tagId, .uid = uid}; auto pullerIt = kAllPullAtomInfo.find(key); if (pullerIt != kAllPullAtomInfo.end()) { bool ret = pullerIt->second->Pull(eventTimeNs, data); @@ -158,9 +138,10 @@ bool StatsPullerManager::PullLocked(int tagId, const vector<int32_t>& uids, } return ret; } - ALOGW("StatsPullerManager: Unknown tagId %d", tagId); - return false; // Return early since we don't know what to pull. } + StatsdStats::getInstance().notePullerNotFound(tagId); + ALOGW("StatsPullerManager: Unknown tagId %d", tagId); + return false; // Return early since we don't know what to pull. } bool StatsPullerManager::PullerForMatcherExists(int tagId) const { @@ -334,6 +315,7 @@ void StatsPullerManager::OnAlarmFired(int64_t elapsedTimeNs) { } int StatsPullerManager::ForceClearPullerCache() { + std::lock_guard<std::mutex> _l(mLock); int totalCleared = 0; for (const auto& pulledAtom : kAllPullAtomInfo) { totalCleared += pulledAtom.second->ForceClearCache(); @@ -342,6 +324,7 @@ int StatsPullerManager::ForceClearPullerCache() { } int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) { + std::lock_guard<std::mutex> _l(mLock); int totalCleared = 0; for (const auto& pulledAtom : kAllPullAtomInfo) { totalCleared += pulledAtom.second->ClearCacheIfNecessary(timestampNs); @@ -352,8 +335,7 @@ int StatsPullerManager::ClearPullerCacheIfNecessary(int64_t timestampNs) { void StatsPullerManager::RegisterPullAtomCallback(const int uid, const int32_t atomTag, const int64_t coolDownNs, const int64_t timeoutNs, const vector<int32_t>& additiveFields, - const shared_ptr<IPullAtomCallback>& callback, - bool useUid) { + const shared_ptr<IPullAtomCallback>& callback) { std::lock_guard<std::mutex> _l(mLock); VLOG("RegisterPullerCallback: adding puller for tag %d", atomTag); @@ -368,16 +350,15 @@ void StatsPullerManager::RegisterPullAtomCallback(const int uid, const int32_t a sp<StatsCallbackPuller> puller = new StatsCallbackPuller(atomTag, callback, actualCoolDownNs, actualTimeoutNs, additiveFields); - PullerKey key = {.atomTag = atomTag, .uid = useUid ? uid : -1}; + PullerKey key = {.atomTag = atomTag, .uid = uid}; AIBinder_linkToDeath(callback->asBinder().get(), mPullAtomCallbackDeathRecipient.get(), new PullAtomCallbackDeathCookie(this, key, puller)); kAllPullAtomInfo[key] = puller; } -void StatsPullerManager::UnregisterPullAtomCallback(const int uid, const int32_t atomTag, - bool useUids) { +void StatsPullerManager::UnregisterPullAtomCallback(const int uid, const int32_t atomTag) { std::lock_guard<std::mutex> _l(mLock); - PullerKey key = {.atomTag = atomTag, .uid = useUids ? uid : -1}; + PullerKey key = {.atomTag = atomTag, .uid = uid}; if (kAllPullAtomInfo.find(key) != kAllPullAtomInfo.end()) { StatsdStats::getInstance().notePullerCallbackRegistrationChanged(atomTag, /*registered=*/false); diff --git a/cmds/statsd/src/external/StatsPullerManager.h b/cmds/statsd/src/external/StatsPullerManager.h index 194a0f5edba8..489cbdbe5400 100644 --- a/cmds/statsd/src/external/StatsPullerManager.h +++ b/cmds/statsd/src/external/StatsPullerManager.h @@ -102,11 +102,11 @@ public: // If the metric wants to make any change to the data, like timestamps, they // should make a copy as this data may be shared with multiple metrics. virtual bool Pull(int tagId, const ConfigKey& configKey, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool useUids = true); + vector<std::shared_ptr<LogEvent>>* data); // Same as above, but directly specify the allowed uids to pull from. virtual bool Pull(int tagId, const vector<int32_t>& uids, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool useUids = true); + vector<std::shared_ptr<LogEvent>>* data); // Clear pull data cache immediately. int ForceClearPullerCache(); @@ -118,10 +118,9 @@ public: void RegisterPullAtomCallback(const int uid, const int32_t atomTag, const int64_t coolDownNs, const int64_t timeoutNs, const vector<int32_t>& additiveFields, - const shared_ptr<IPullAtomCallback>& callback, - bool useUid = true); + const shared_ptr<IPullAtomCallback>& callback); - void UnregisterPullAtomCallback(const int uid, const int32_t atomTag, bool useUids = true); + void UnregisterPullAtomCallback(const int uid, const int32_t atomTag); std::map<const PullerKey, sp<StatsPuller>> kAllPullAtomInfo; @@ -153,10 +152,10 @@ private: std::map<ConfigKey, wp<PullUidProvider>> mPullUidProviders; bool PullLocked(int tagId, const ConfigKey& configKey, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool useUids = true); + vector<std::shared_ptr<LogEvent>>* data); bool PullLocked(int tagId, const vector<int32_t>& uids, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool useUids); + vector<std::shared_ptr<LogEvent>>* data); // locks for data receiver and StatsCompanionService changes std::mutex mLock; diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp index cd9c4e5b947b..03b178a989eb 100644 --- a/cmds/statsd/src/main.cpp +++ b/cmds/statsd/src/main.cpp @@ -76,7 +76,7 @@ int main(int /*argc*/, char** /*argv*/) { ABinderProcess_startThreadPool(); std::shared_ptr<LogEventQueue> eventQueue = - std::make_shared<LogEventQueue>(2000 /*buffer limit. Buffer is NOT pre-allocated*/); + std::make_shared<LogEventQueue>(4000 /*buffer limit. Buffer is NOT pre-allocated*/); // Create the service gStatsService = SharedRefBase::make<StatsService>(looper, eventQueue); diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index 5987a723a421..9b684f1248c5 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -733,6 +733,11 @@ bool getDoubleOrLong(const LogEvent& event, const Matcher& matcher, Value& ret) return false; } +bool ValueMetricProducer::multipleBucketsSkipped(const int64_t numBucketsForward) { + // Skip buckets if this is a pulled metric or a pushed metric that is diffed. + return numBucketsForward > 1 && (mIsPulled || mUseDiff); +} + void ValueMetricProducer::onMatchedLogEventInternalLocked( const size_t matcherIndex, const MetricDimensionKey& eventKey, const ConditionKey& conditionKey, bool condition, const LogEvent& event, @@ -910,8 +915,9 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked( interval.sampleSize += 1; } - // Only trigger the tracker if all intervals are correct - if (useAnomalyDetection) { + // Only trigger the tracker if all intervals are correct and we have not skipped the bucket due + // to MULTIPLE_BUCKETS_SKIPPED. + if (useAnomalyDetection && !multipleBucketsSkipped(calcBucketsForwardCount(eventTimeNs))) { // TODO: propgate proper values down stream when anomaly support doubles long wholeBucketVal = intervals[0].value.long_value; auto prev = mCurrentFullBucket.find(eventKey); @@ -961,9 +967,7 @@ void ValueMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs, int64_t bucketEndTime = fullBucketEndTimeNs; int64_t numBucketsForward = calcBucketsForwardCount(eventTimeNs); - // Skip buckets if this is a pulled metric or a pushed metric that is diffed. - if (numBucketsForward > 1 && (mIsPulled || mUseDiff)) { - + if (multipleBucketsSkipped(numBucketsForward)) { VLOG("Skipping forward %lld buckets", (long long)numBucketsForward); StatsdStats::getInstance().noteSkippedForwardBuckets(mMetricId); // Something went wrong. Maybe the device was sleeping for a long time. It is better diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h index b359af745c91..e72002e88533 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.h +++ b/cmds/statsd/src/metrics/ValueMetricProducer.h @@ -219,6 +219,8 @@ private: void pullAndMatchEventsLocked(const int64_t timestampNs); + bool multipleBucketsSkipped(const int64_t numBucketsForward); + void accumulateEvents(const std::vector<std::shared_ptr<LogEvent>>& allData, int64_t originalPullTimeNs, int64_t eventElapsedTimeNs); diff --git a/cmds/statsd/src/shell/shell_data.proto b/cmds/statsd/src/shell/shell_data.proto index 236bdbdd31f6..ec41cbc5caff 100644 --- a/cmds/statsd/src/shell/shell_data.proto +++ b/cmds/statsd/src/shell/shell_data.proto @@ -21,7 +21,7 @@ package android.os.statsd; option java_package = "com.android.os.statsd"; option java_outer_classname = "ShellDataProto"; -import "frameworks/base/cmds/statsd/src/atoms.proto"; +import "frameworks/proto_logging/stats/atoms.proto"; // The output of shell subscription, including both pulled and pushed subscriptions. message ShellData { diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index ddd2725c9cb9..bb0796326f01 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -21,7 +21,7 @@ package android.os.statsd; option java_package = "com.android.os"; option java_outer_classname = "StatsLog"; -import "frameworks/base/cmds/statsd/src/atoms.proto"; +import "frameworks/proto_logging/stats/atoms.proto"; message DimensionsValue { optional int32 field = 1; diff --git a/cmds/statsd/tests/LogEntryMatcher_test.cpp b/cmds/statsd/tests/LogEntryMatcher_test.cpp index 26423d464027..6264c075426a 100644 --- a/cmds/statsd/tests/LogEntryMatcher_test.cpp +++ b/cmds/statsd/tests/LogEntryMatcher_test.cpp @@ -13,9 +13,6 @@ // limitations under the License. #include <gtest/gtest.h> -#include <log/log_event_list.h> -#include <log/log_read.h> -#include <log/logprint.h> #include <stdio.h> #include "annotations.h" diff --git a/cmds/statsd/tests/LogEvent_test.cpp b/cmds/statsd/tests/LogEvent_test.cpp index 5c170c07eb7d..bde59f497b19 100644 --- a/cmds/statsd/tests/LogEvent_test.cpp +++ b/cmds/statsd/tests/LogEvent_test.cpp @@ -16,8 +16,8 @@ #include <gtest/gtest.h> -#include "frameworks/base/cmds/statsd/src/atoms.pb.h" -#include "frameworks/base/core/proto/android/stats/launcher/launcher.pb.h" +#include "frameworks/proto_logging/stats/atoms.pb.h" +#include "frameworks/proto_logging/stats/enums/stats/launcher/launcher.pb.h" #include "log/log_event_list.h" #include "stats_event.h" diff --git a/cmds/statsd/tests/e2e/Anomaly_duration_sum_e2e_test.cpp b/cmds/statsd/tests/e2e/Anomaly_duration_sum_e2e_test.cpp index 95e301002a1b..06779aa89c0a 100644 --- a/cmds/statsd/tests/e2e/Anomaly_duration_sum_e2e_test.cpp +++ b/cmds/statsd/tests/e2e/Anomaly_duration_sum_e2e_test.cpp @@ -12,14 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include <android/binder_ibinder.h> +#include <android/binder_interface_utils.h> #include <gtest/gtest.h> -#include "src/anomaly/DurationAnomalyTracker.h" +#include <vector> + #include "src/StatsLogProcessor.h" +#include "src/StatsService.h" +#include "src/anomaly/DurationAnomalyTracker.h" #include "src/stats_log_util.h" #include "tests/statsd_test_util.h" -#include <vector> +using ::ndk::SharedRefBase; namespace android { namespace os { @@ -29,6 +34,9 @@ namespace statsd { namespace { +const int kConfigKey = 789130124; +const int kCallingUid = 0; + StatsdConfig CreateStatsdConfig(int num_buckets, uint64_t threshold_ns, DurationMetric::AggregationType aggregationType, @@ -89,6 +97,13 @@ MetricDimensionKey dimensionKey2( (int32_t)0x02010101), Value((int32_t)222))}), DEFAULT_DIMENSION_KEY); +void sendConfig(shared_ptr<StatsService>& service, const StatsdConfig& config) { + string str; + config.SerializeToString(&str); + std::vector<int8_t> configAsVec(str.begin(), str.end()); + service->addConfiguration(kConfigKey, configAsVec, kCallingUid); +} + } // namespace TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket) { @@ -98,16 +113,18 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket) { const uint64_t alert_id = config.alert(0).id(); const uint32_t refractory_period_sec = config.alert(0).refractory_period_secs(); - int64_t bucketStartTimeNs = 10 * NS_PER_SEC; - int64_t bucketSizeNs = - TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000; + shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr); + sendConfig(service, config); - ConfigKey cfgKey; - auto processor = CreateStatsLogProcessor(bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); + auto processor = service->mProcessor; ASSERT_EQ(processor->mMetricsManagers.size(), 1u); EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); ASSERT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size()); + int64_t bucketStartTimeNs = processor->mTimeBaseNs; + int64_t roundedBucketStartTimeNs = bucketStartTimeNs / NS_PER_SEC * NS_PER_SEC; + int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1e6; + sp<AnomalyTracker> anomalyTracker = processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0]; @@ -158,12 +175,13 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket) { const int64_t alarmFiredTimestampSec0 = anomalyTracker->getAlarmTimestampSec(dimensionKey1); EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + NS_PER_SEC + 109) / NS_PER_SEC + 1, (uint32_t)alarmFiredTimestampSec0); + EXPECT_EQ(alarmFiredTimestampSec0, + processor->getAnomalyAlarmMonitor()->getRegisteredAlarmTimeSec()); // Anomaly alarm fired. - auto alarmSet = processor->getAnomalyAlarmMonitor()->popSoonerThan( - static_cast<uint32_t>(alarmFiredTimestampSec0)); - ASSERT_EQ(1u, alarmSet.size()); - processor->onAnomalyAlarmFired(alarmFiredTimestampSec0 * NS_PER_SEC, alarmSet); + auto alarmTriggerEvent = CreateBatterySaverOnEvent(alarmFiredTimestampSec0 * NS_PER_SEC); + processor->OnLogEvent(alarmTriggerEvent.get(), alarmFiredTimestampSec0 * NS_PER_SEC); + EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(refractory_period_sec + alarmFiredTimestampSec0, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); @@ -179,39 +197,39 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket) { anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // Acquire wakelock wl1. - acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + bucketSizeNs - 5 * NS_PER_SEC - 11, - attributionUids2, attributionTags2, "wl1"); + acquire_event = CreateAcquireWakelockEvent( + roundedBucketStartTimeNs + bucketSizeNs - 5 * NS_PER_SEC - 11, attributionUids2, + attributionTags2, "wl1"); processor->OnLogEvent(acquire_event.get()); const int64_t alarmFiredTimestampSec1 = anomalyTracker->getAlarmTimestampSec(dimensionKey1); EXPECT_EQ((bucketStartTimeNs + bucketSizeNs - 5 * NS_PER_SEC) / NS_PER_SEC, (uint64_t)alarmFiredTimestampSec1); // Release wakelock wl1. - release_event = - CreateReleaseWakelockEvent(bucketStartTimeNs + bucketSizeNs - 4 * NS_PER_SEC - 10, - attributionUids2, attributionTags2, "wl1"); - processor->OnLogEvent(release_event.get()); + int64_t release_event_time = roundedBucketStartTimeNs + bucketSizeNs - 4 * NS_PER_SEC - 10; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids2, + attributionTags2, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); - EXPECT_EQ(refractory_period_sec + - (bucketStartTimeNs + bucketSizeNs - 4 * NS_PER_SEC - 10) / NS_PER_SEC + 1, + EXPECT_EQ(refractory_period_sec + (release_event_time) / NS_PER_SEC + 1, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); - alarmSet = processor->getAnomalyAlarmMonitor()->popSoonerThan( + auto alarmSet = processor->getAnomalyAlarmMonitor()->popSoonerThan( static_cast<uint32_t>(alarmFiredTimestampSec1)); ASSERT_EQ(0u, alarmSet.size()); // Acquire wakelock wl1 near the end of bucket #0. - acquire_event = CreateAcquireWakelockEvent(bucketStartTimeNs + bucketSizeNs - 2, + acquire_event = CreateAcquireWakelockEvent(roundedBucketStartTimeNs + bucketSizeNs - 2, attributionUids1, attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); // Release the event at early bucket #1. - release_event = CreateReleaseWakelockEvent(bucketStartTimeNs + bucketSizeNs + NS_PER_SEC - 1, - attributionUids1, attributionTags1, "wl1"); - processor->OnLogEvent(release_event.get()); + release_event_time = roundedBucketStartTimeNs + bucketSizeNs + NS_PER_SEC - 1; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids1, + attributionTags1, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); // Anomaly detected when stopping the alarm. The refractory period does not change. EXPECT_EQ(refractory_period_sec + (bucketStartTimeNs + bucketSizeNs + NS_PER_SEC) / NS_PER_SEC, @@ -236,17 +254,17 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket) { // Condition turns true. screen_off_event = - CreateScreenStateChangedEvent(bucketStartTimeNs + 2 * bucketSizeNs + NS_PER_SEC, + CreateScreenStateChangedEvent(roundedBucketStartTimeNs + 2 * bucketSizeNs + NS_PER_SEC, android::view::DisplayStateEnum::DISPLAY_STATE_OFF); processor->OnLogEvent(screen_off_event.get()); EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs + NS_PER_SEC + threshold_ns) / NS_PER_SEC, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); // Condition turns to false. - screen_on_event = - CreateScreenStateChangedEvent(bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC + 1, - android::view::DisplayStateEnum::DISPLAY_STATE_ON); - processor->OnLogEvent(screen_on_event.get()); + int64_t condition_false_time = bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC + 1; + screen_on_event = CreateScreenStateChangedEvent( + condition_false_time, android::view::DisplayStateEnum::DISPLAY_STATE_ON); + processor->OnLogEvent(screen_on_event.get(), condition_false_time); // Condition turns to false. Cancelled the alarm. EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); // Detected one anomaly. @@ -262,12 +280,11 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket) { EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 2 + 2 + 1, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); - release_event = - CreateReleaseWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs + 5 * NS_PER_SEC, - attributionUids2, attributionTags2, "wl1"); + release_event_time = roundedBucketStartTimeNs + 2 * bucketSizeNs + 5 * NS_PER_SEC; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids2, + attributionTags2, "wl1"); processor->OnLogEvent(release_event.get()); - EXPECT_EQ(refractory_period_sec + - (bucketStartTimeNs + 2 * bucketSizeNs + 5 * NS_PER_SEC) / NS_PER_SEC, + EXPECT_EQ(refractory_period_sec + (release_event_time) / NS_PER_SEC, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); } @@ -279,16 +296,18 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets) { const uint64_t alert_id = config.alert(0).id(); const uint32_t refractory_period_sec = config.alert(0).refractory_period_secs(); - int64_t bucketStartTimeNs = 10 * NS_PER_SEC; - int64_t bucketSizeNs = - TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000; + shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr); + sendConfig(service, config); - ConfigKey cfgKey; - auto processor = CreateStatsLogProcessor(bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); + auto processor = service->mProcessor; ASSERT_EQ(processor->mMetricsManagers.size(), 1u); EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); ASSERT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size()); + int64_t bucketStartTimeNs = processor->mTimeBaseNs; + int64_t roundedBucketStartTimeNs = bucketStartTimeNs / NS_PER_SEC * NS_PER_SEC; + int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1e6; + sp<AnomalyTracker> anomalyTracker = processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0]; @@ -298,96 +317,97 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets) { // Acquire wakelock "wc1" in bucket #0. auto acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + bucketSizeNs - NS_PER_SEC / 2 - 1, + CreateAcquireWakelockEvent(roundedBucketStartTimeNs + bucketSizeNs - NS_PER_SEC / 2 - 1, attributionUids1, attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 1, + EXPECT_EQ((roundedBucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 1, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // Release wakelock "wc1" in bucket #0. - auto release_event = CreateReleaseWakelockEvent(bucketStartTimeNs + bucketSizeNs - 1, - attributionUids1, attributionTags1, "wl1"); - processor->OnLogEvent(release_event.get()); + int64_t release_event_time = roundedBucketStartTimeNs + bucketSizeNs - 1; + auto release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids1, + attributionTags1, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // Acquire wakelock "wc1" in bucket #1. - acquire_event = CreateAcquireWakelockEvent(bucketStartTimeNs + bucketSizeNs + 1, - attributionUids2, attributionTags2, "wl1"); + acquire_event = + CreateAcquireWakelockEvent(roundedBucketStartTimeNs + bucketSizeNs + NS_PER_SEC + 1, + attributionUids2, attributionTags2, "wl1"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 1, + EXPECT_EQ((bucketStartTimeNs + bucketSizeNs + NS_PER_SEC) / NS_PER_SEC + 1, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); - release_event = CreateReleaseWakelockEvent(bucketStartTimeNs + bucketSizeNs + 100, - attributionUids2, attributionTags2, "wl1"); - processor->OnLogEvent(release_event.get()); + release_event_time = roundedBucketStartTimeNs + bucketSizeNs + NS_PER_SEC + 100; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids2, + attributionTags2, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // Acquire wakelock "wc2" in bucket #2. - acquire_event = CreateAcquireWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs + 1, - attributionUids3, attributionTags3, "wl2"); + acquire_event = + CreateAcquireWakelockEvent(roundedBucketStartTimeNs + 2 * bucketSizeNs + NS_PER_SEC + 1, + attributionUids3, attributionTags3, "wl2"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 2, + EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 3, anomalyTracker->getAlarmTimestampSec(dimensionKey2)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2)); // Release wakelock "wc2" in bucket #2. - release_event = - CreateReleaseWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC, - attributionUids3, attributionTags3, "wl2"); - processor->OnLogEvent(release_event.get()); + release_event_time = roundedBucketStartTimeNs + 2 * bucketSizeNs + 3 * NS_PER_SEC; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids3, + attributionTags3, "wl2"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey2)); - EXPECT_EQ(refractory_period_sec + - (bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC) / NS_PER_SEC, + EXPECT_EQ(refractory_period_sec + (release_event_time) / NS_PER_SEC, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey2)); // Acquire wakelock "wc1" in bucket #2. acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs + 2 * NS_PER_SEC, + CreateAcquireWakelockEvent(roundedBucketStartTimeNs + 2 * bucketSizeNs + 3 * NS_PER_SEC, attributionUids2, attributionTags2, "wl1"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 2 + 1, + EXPECT_EQ((roundedBucketStartTimeNs + 2 * bucketSizeNs) / NS_PER_SEC + 3 + 1, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // Release wakelock "wc1" in bucket #2. - release_event = - CreateReleaseWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs + 2.5 * NS_PER_SEC, - attributionUids2, attributionTags2, "wl1"); - processor->OnLogEvent(release_event.get()); + release_event_time = roundedBucketStartTimeNs + 2 * bucketSizeNs + 3.5 * NS_PER_SEC; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids2, + attributionTags2, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); - EXPECT_EQ(refractory_period_sec + - (int64_t)(bucketStartTimeNs + 2 * bucketSizeNs + 2.5 * NS_PER_SEC) / - NS_PER_SEC + - 1, + EXPECT_EQ(refractory_period_sec + (release_event_time) / NS_PER_SEC + 1, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); - acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + 6 * bucketSizeNs - NS_PER_SEC + 4, - attributionUids3, attributionTags3, "wl2"); + acquire_event = CreateAcquireWakelockEvent(roundedBucketStartTimeNs + 6 * bucketSizeNs + 4, + attributionUids3, attributionTags3, "wl2"); processor->OnLogEvent(acquire_event.get()); - acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + 6 * bucketSizeNs - NS_PER_SEC + 5, - attributionUids1, attributionTags1, "wl1"); + acquire_event = CreateAcquireWakelockEvent(roundedBucketStartTimeNs + 6 * bucketSizeNs + 5, + attributionUids1, attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + 1, + EXPECT_EQ((roundedBucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + 2, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); - EXPECT_EQ((bucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + 1, + EXPECT_EQ((roundedBucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + 2, anomalyTracker->getAlarmTimestampSec(dimensionKey2)); - release_event = CreateReleaseWakelockEvent(bucketStartTimeNs + 6 * bucketSizeNs + 2, - attributionUids3, attributionTags3, "wl2"); - processor->OnLogEvent(release_event.get()); - release_event = CreateReleaseWakelockEvent(bucketStartTimeNs + 6 * bucketSizeNs + 6, - attributionUids1, attributionTags1, "wl1"); - processor->OnLogEvent(release_event.get()); + release_event_time = roundedBucketStartTimeNs + 6 * bucketSizeNs + NS_PER_SEC + 2; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids3, + attributionTags3, "wl2"); + processor->OnLogEvent(release_event.get(), release_event_time); + release_event = CreateReleaseWakelockEvent(release_event_time + 4, attributionUids1, + attributionTags1, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time + 4); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey2)); // The buckets are not messed up across dimensions. Only one dimension has anomaly triggered. - EXPECT_EQ(refractory_period_sec + (int64_t)(bucketStartTimeNs + 6 * bucketSizeNs) / NS_PER_SEC + + EXPECT_EQ(refractory_period_sec + + (int64_t)(roundedBucketStartTimeNs + 6 * bucketSizeNs + NS_PER_SEC) / + NS_PER_SEC + 1, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); } @@ -396,20 +416,22 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period) { const int num_buckets = 2; const uint64_t threshold_ns = 3 * NS_PER_SEC; auto config = CreateStatsdConfig(num_buckets, threshold_ns, DurationMetric::SUM, false); - int64_t bucketStartTimeNs = 10 * NS_PER_SEC; - int64_t bucketSizeNs = - TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000; - const uint64_t alert_id = config.alert(0).id(); + int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1e6; const uint32_t refractory_period_sec = 3 * bucketSizeNs / NS_PER_SEC; config.mutable_alert(0)->set_refractory_period_secs(refractory_period_sec); - ConfigKey cfgKey; - auto processor = CreateStatsLogProcessor(bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); + shared_ptr<StatsService> service = SharedRefBase::make<StatsService>(nullptr, nullptr); + sendConfig(service, config); + + auto processor = service->mProcessor; ASSERT_EQ(processor->mMetricsManagers.size(), 1u); EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); ASSERT_EQ(1u, processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers.size()); + int64_t bucketStartTimeNs = processor->mTimeBaseNs; + int64_t roundedBucketStartTimeNs = bucketStartTimeNs / NS_PER_SEC * NS_PER_SEC; + sp<AnomalyTracker> anomalyTracker = processor->mMetricsManagers.begin()->second->mAllAnomalyTrackers[0]; @@ -418,81 +440,81 @@ TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period) { processor->OnLogEvent(screen_off_event.get()); // Acquire wakelock "wc1" in bucket #0. - auto acquire_event = CreateAcquireWakelockEvent(bucketStartTimeNs + bucketSizeNs - 100, + auto acquire_event = CreateAcquireWakelockEvent(roundedBucketStartTimeNs + bucketSizeNs - 100, attributionUids1, attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 3, + EXPECT_EQ((roundedBucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 3, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // Acquire the wakelock "wc1" again. acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + bucketSizeNs + 2 * NS_PER_SEC + 1, + CreateAcquireWakelockEvent(roundedBucketStartTimeNs + bucketSizeNs + 2 * NS_PER_SEC + 1, attributionUids1, attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); // The alarm does not change. - EXPECT_EQ((bucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 3, + EXPECT_EQ((roundedBucketStartTimeNs + bucketSizeNs) / NS_PER_SEC + 3, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(0u, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // Anomaly alarm fired late. - const int64_t firedAlarmTimestampNs = bucketStartTimeNs + 2 * bucketSizeNs - NS_PER_SEC; - auto alarmSet = processor->getAnomalyAlarmMonitor()->popSoonerThan( - static_cast<uint32_t>(firedAlarmTimestampNs / NS_PER_SEC)); - ASSERT_EQ(1u, alarmSet.size()); - processor->onAnomalyAlarmFired(firedAlarmTimestampNs, alarmSet); + const int64_t firedAlarmTimestampNs = roundedBucketStartTimeNs + 2 * bucketSizeNs - NS_PER_SEC; + auto alarmTriggerEvent = CreateBatterySaverOnEvent(firedAlarmTimestampNs); + processor->OnLogEvent(alarmTriggerEvent.get(), firedAlarmTimestampNs); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); - acquire_event = CreateAcquireWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs - 100, + acquire_event = CreateAcquireWakelockEvent(roundedBucketStartTimeNs + 2 * bucketSizeNs - 100, attributionUids1, attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); - auto release_event = CreateReleaseWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs + 1, - attributionUids1, attributionTags1, "wl1"); - processor->OnLogEvent(release_event.get()); + int64_t release_event_time = bucketStartTimeNs + 2 * bucketSizeNs + 1; + auto release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids1, + attributionTags1, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); // Within the refractory period. No anomaly. EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); // A new wakelock, but still within refractory period. - acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + 2 * bucketSizeNs + 10 * NS_PER_SEC, - attributionUids1, attributionTags1, "wl1"); + acquire_event = CreateAcquireWakelockEvent( + roundedBucketStartTimeNs + 2 * bucketSizeNs + 10 * NS_PER_SEC, attributionUids1, + attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); - release_event = CreateReleaseWakelockEvent(bucketStartTimeNs + 3 * bucketSizeNs - NS_PER_SEC, - attributionUids1, attributionTags1, "wl1"); + release_event = + CreateReleaseWakelockEvent(roundedBucketStartTimeNs + 3 * bucketSizeNs - NS_PER_SEC, + attributionUids1, attributionTags1, "wl1"); // Still in the refractory period. No anomaly. processor->OnLogEvent(release_event.get()); EXPECT_EQ(refractory_period_sec + firedAlarmTimestampNs / NS_PER_SEC, anomalyTracker->getRefractoryPeriodEndsSec(dimensionKey1)); - acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + 5 * bucketSizeNs - 3 * NS_PER_SEC - 5, - attributionUids1, attributionTags1, "wl1"); + acquire_event = CreateAcquireWakelockEvent( + roundedBucketStartTimeNs + 5 * bucketSizeNs - 2 * NS_PER_SEC - 5, attributionUids1, + attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + 5 * bucketSizeNs) / NS_PER_SEC, + EXPECT_EQ((roundedBucketStartTimeNs + 5 * bucketSizeNs) / NS_PER_SEC + 1, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); - release_event = - CreateReleaseWakelockEvent(bucketStartTimeNs + 5 * bucketSizeNs - 3 * NS_PER_SEC - 4, - attributionUids1, attributionTags1, "wl1"); - processor->OnLogEvent(release_event.get()); + release_event_time = roundedBucketStartTimeNs + 5 * bucketSizeNs - 2 * NS_PER_SEC - 4; + release_event = CreateReleaseWakelockEvent(release_event_time, attributionUids1, + attributionTags1, "wl1"); + processor->OnLogEvent(release_event.get(), release_event_time); EXPECT_EQ(0u, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); - acquire_event = - CreateAcquireWakelockEvent(bucketStartTimeNs + 5 * bucketSizeNs - 3 * NS_PER_SEC - 3, - attributionUids1, attributionTags1, "wl1"); + acquire_event = CreateAcquireWakelockEvent( + roundedBucketStartTimeNs + 5 * bucketSizeNs - 2 * NS_PER_SEC - 3, attributionUids1, + attributionTags1, "wl1"); processor->OnLogEvent(acquire_event.get()); - EXPECT_EQ((bucketStartTimeNs + 5 * bucketSizeNs) / NS_PER_SEC, + EXPECT_EQ((roundedBucketStartTimeNs + 5 * bucketSizeNs) / NS_PER_SEC + 1, anomalyTracker->getAlarmTimestampSec(dimensionKey1)); } diff --git a/cmds/statsd/tests/external/StatsPullerManager_test.cpp b/cmds/statsd/tests/external/StatsPullerManager_test.cpp index c76e85ec75e6..0d539f477016 100644 --- a/cmds/statsd/tests/external/StatsPullerManager_test.cpp +++ b/cmds/statsd/tests/external/StatsPullerManager_test.cpp @@ -89,10 +89,10 @@ public: sp<StatsPullerManager> createPullerManagerAndRegister() { sp<StatsPullerManager> pullerManager = new StatsPullerManager(); shared_ptr<FakePullAtomCallback> cb1 = SharedRefBase::make<FakePullAtomCallback>(uid1); - pullerManager->RegisterPullAtomCallback(uid1, pullTagId1, coolDownNs, timeoutNs, {}, cb1, true); + pullerManager->RegisterPullAtomCallback(uid1, pullTagId1, coolDownNs, timeoutNs, {}, cb1); shared_ptr<FakePullAtomCallback> cb2 = SharedRefBase::make<FakePullAtomCallback>(uid2); - pullerManager->RegisterPullAtomCallback(uid2, pullTagId1, coolDownNs, timeoutNs, {}, cb2, true); - pullerManager->RegisterPullAtomCallback(uid1, pullTagId2, coolDownNs, timeoutNs, {}, cb1, true); + pullerManager->RegisterPullAtomCallback(uid2, pullTagId1, coolDownNs, timeoutNs, {}, cb2); + pullerManager->RegisterPullAtomCallback(uid1, pullTagId2, coolDownNs, timeoutNs, {}, cb1); return pullerManager; } } // anonymous namespace @@ -101,14 +101,14 @@ TEST(StatsPullerManagerTest, TestPullInvalidUid) { sp<StatsPullerManager> pullerManager = createPullerManagerAndRegister(); vector<shared_ptr<LogEvent>> data; - EXPECT_FALSE(pullerManager->Pull(pullTagId1, {unregisteredUid}, /*timestamp =*/1, &data, true)); + EXPECT_FALSE(pullerManager->Pull(pullTagId1, {unregisteredUid}, /*timestamp =*/1, &data)); } TEST(StatsPullerManagerTest, TestPullChoosesCorrectUid) { sp<StatsPullerManager> pullerManager = createPullerManagerAndRegister(); vector<shared_ptr<LogEvent>> data; - EXPECT_TRUE(pullerManager->Pull(pullTagId1, {uid1}, /*timestamp =*/1, &data, true)); + EXPECT_TRUE(pullerManager->Pull(pullTagId1, {uid1}, /*timestamp =*/1, &data)); ASSERT_EQ(data.size(), 1); EXPECT_EQ(data[0]->GetTagId(), pullTagId1); ASSERT_EQ(data[0]->getValues().size(), 1); @@ -121,7 +121,7 @@ TEST(StatsPullerManagerTest, TestPullInvalidConfigKey) { pullerManager->RegisterPullUidProvider(configKey, uidProvider); vector<shared_ptr<LogEvent>> data; - EXPECT_FALSE(pullerManager->Pull(pullTagId1, badConfigKey, /*timestamp =*/1, &data, true)); + EXPECT_FALSE(pullerManager->Pull(pullTagId1, badConfigKey, /*timestamp =*/1, &data)); } TEST(StatsPullerManagerTest, TestPullConfigKeyGood) { @@ -130,7 +130,7 @@ TEST(StatsPullerManagerTest, TestPullConfigKeyGood) { pullerManager->RegisterPullUidProvider(configKey, uidProvider); vector<shared_ptr<LogEvent>> data; - EXPECT_TRUE(pullerManager->Pull(pullTagId1, configKey, /*timestamp =*/1, &data, true)); + EXPECT_TRUE(pullerManager->Pull(pullTagId1, configKey, /*timestamp =*/1, &data)); EXPECT_EQ(data[0]->GetTagId(), pullTagId1); ASSERT_EQ(data[0]->getValues().size(), 1); EXPECT_EQ(data[0]->getValues()[0].mValue.int_value, uid2); @@ -142,7 +142,7 @@ TEST(StatsPullerManagerTest, TestPullConfigKeyNoPullerWithUid) { pullerManager->RegisterPullUidProvider(configKey, uidProvider); vector<shared_ptr<LogEvent>> data; - EXPECT_FALSE(pullerManager->Pull(pullTagId2, configKey, /*timestamp =*/1, &data, true)); + EXPECT_FALSE(pullerManager->Pull(pullTagId2, configKey, /*timestamp =*/1, &data)); } } // namespace statsd diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp index 5997bedcdf2d..caea42dfe032 100644 --- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp @@ -137,9 +137,9 @@ TEST(GaugeMetricProducerTest, TestPulledEventsNoCondition) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(makeLogEvent(tagId, eventTimeNs + 10, 3, "some value", 11)); @@ -310,10 +310,10 @@ TEST_P(GaugeMetricProducerTest_PartialBucket, TestPulled) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Return(false)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, partialBucketSplitTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, eventTimeNs, 2)); @@ -388,7 +388,7 @@ TEST(GaugeMetricProducerTest, TestPulledWithAppUpgradeDisabled) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Return(false)); GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, @@ -440,9 +440,9 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, conditionChangeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, conditionChangeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, eventTimeNs + 10, 100)); return true; @@ -527,9 +527,9 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithSlicedCondition) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, sliceConditionChangeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, sliceConditionChangeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, eventTimeNs + 10, 1000, 100)); return true; @@ -566,7 +566,7 @@ TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Return(false)); GaugeMetric metric; @@ -665,16 +665,16 @@ TEST(GaugeMetricProducerTest, TestPullOnTrigger) { atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, eventTimeNs, 4)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 20); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, eventTimeNs, 5)); @@ -737,23 +737,23 @@ TEST(GaugeMetricProducerTest, TestRemoveDimensionInOutput) { atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 3); data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, eventTimeNs, 3, 4)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, eventTimeNs, 4, 5)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 20); data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, eventTimeNs, 4, 6)); @@ -815,10 +815,10 @@ TEST(GaugeMetricProducerTest_BucketDrop, TestBucketDropWhenBucketTooSmall) { atomMatcherId, logEventMatcherIndex, atomMatcher, uidMap)}); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 3, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 3, _)) // Bucket start. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, eventTimeNs, 10)); return true; diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp index 5666501d7d51..98892507e78d 100644 --- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp @@ -294,9 +294,9 @@ TEST(ValueMetricProducerTest, TestFirstBucket) { TEST(ValueMetricProducerTest, TestPulledEventsNoCondition) { ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); return true; @@ -368,19 +368,19 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestPartialBucketCreated) { ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); int64_t partialBucketSplitTimeNs = bucket2StartTimeNs + 2; - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Initialize bucket. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, 1)); return true; })) // Partial bucket. - .WillOnce(Invoke([partialBucketSplitTimeNs]( - int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&, + const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, partialBucketSplitTimeNs); data->clear(); data->push_back( @@ -434,9 +434,9 @@ TEST(ValueMetricProducerTest, TestPulledEventsWithFiltering) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, bucketStartTimeNs, 3, 3)); return true; @@ -505,7 +505,7 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset) { metric.set_use_absolute_value_on_reset(true); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Return(true)); sp<ValueMetricProducer> valueProducer = ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); @@ -565,7 +565,7 @@ TEST(ValueMetricProducerTest, TestPulledEventsTakeAbsoluteValueOnReset) { TEST(ValueMetricProducerTest, TestPulledEventsTakeZeroOnReset) { ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Return(false)); sp<ValueMetricProducer> valueProducer = ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); @@ -621,23 +621,23 @@ TEST(ValueMetricProducerTest, TestEventsWithNonSlicedCondition) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 8); // First condition change. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 100)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 1); // Second condition change. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 130)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket3StartTimeNs + 1); // Third condition change. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs + 1, 180)); @@ -770,11 +770,11 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestPulledValue) { int64_t partialBucketSplitTimeNs = bucket2StartTimeNs + 150; EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Return(true)) - .WillOnce(Invoke([partialBucketSplitTimeNs]( - int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&, + const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, partialBucketSplitTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs, 120)); @@ -830,7 +830,7 @@ TEST(ValueMetricProducerTest, TestPulledWithAppUpgradeDisabled) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillOnce(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Return(true)); ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, @@ -854,16 +854,16 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestPulledValueWhileConditionFalse ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 1); // Condition change to true time. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, 100)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs - 100); // Condition change to false time. data->clear(); @@ -1081,11 +1081,54 @@ TEST(ValueMetricProducerTest, TestAnomalyDetection) { std::ceil(1.0 * event6.GetElapsedTimestampNs() / NS_PER_SEC + refPeriodSec)); } +TEST(ValueMetricProducerTest, TestAnomalyDetectionMultipleBucketsSkipped) { + sp<AlarmMonitor> alarmMonitor; + Alert alert; + alert.set_id(101); + alert.set_metric_id(metricId); + alert.set_trigger_if_sum_gt(100); + alert.set_num_buckets(1); + const int32_t refPeriodSec = 3; + alert.set_refractory_period_secs(refPeriodSec); + + ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) + .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data) { + EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 1); // Condition change to true time. + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, 0)); + return true; + })) + .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data) { + EXPECT_EQ(eventTimeNs, + bucket3StartTimeNs + 100); // Condition changed to false time. + data->clear(); + data->push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs + 100, 120)); + return true; + })); + sp<ValueMetricProducer> valueProducer = + ValueMetricProducerTestHelper::createValueProducerWithCondition(pullerManager, metric, + ConditionState::kFalse); + sp<AnomalyTracker> anomalyTracker = valueProducer->addAnomalyTracker(alert, alarmMonitor); + + valueProducer->onConditionChanged(true, bucketStartTimeNs + 1); + + // multiple buckets should be skipped here. + valueProducer->onConditionChanged(false, bucket3StartTimeNs + 100); + + // No alert is fired when multiple buckets are skipped. + EXPECT_EQ(anomalyTracker->getRefractoryPeriodEndsSec(DEFAULT_METRIC_DIMENSION_KEY), 0U); +} + // Test value metric no condition, the pull on bucket boundary come in time and too late TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) { ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Return(true)); sp<ValueMetricProducer> valueProducer = ValueMetricProducerTestHelper::createValueProducerNoConditions(pullerManager, metric); @@ -1164,10 +1207,10 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // condition becomes true .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 8); // First condition change. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 100)); @@ -1175,7 +1218,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) { })) // condition becomes false .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 1); // Second condition change. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 120)); @@ -1227,10 +1270,10 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // condition becomes true .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 8); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 100)); @@ -1238,7 +1281,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) { })) // condition becomes false .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 1); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 1, 120)); @@ -1246,7 +1289,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) { })) // condition becomes true again .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 25); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 25, 130)); @@ -1677,9 +1720,9 @@ TEST(ValueMetricProducerTest, TestUseZeroDefaultBase) { metric.set_use_zero_default_base(true); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, bucketStartTimeNs, 1, 3)); return true; @@ -1753,9 +1796,9 @@ TEST(ValueMetricProducerTest, TestUseZeroDefaultBaseWithPullFailures) { metric.set_use_zero_default_base(true); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, bucketStartTimeNs, 1, 3)); return true; @@ -1858,9 +1901,9 @@ TEST(ValueMetricProducerTest, TestTrimUnusedDimensionKey) { metric.mutable_dimensions_in_what()->add_child()->set_field(1); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, bucketStartTimeNs, 1, 3)); return true; @@ -1961,9 +2004,9 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullFailAfterConditionChange_EndOfB sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); // Used by onConditionChanged. - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 8, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 8, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 100)); return true; @@ -1995,9 +2038,9 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullFailAfterConditionChange) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 8); // Condition change to true. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 100)); @@ -2034,16 +2077,16 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullFailBeforeConditionChange) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 50)); return false; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 1); // Condition change to false. data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 100)); @@ -2077,9 +2120,9 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullDelayExceeded) { metric.set_max_pull_delay_sec(0); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 1, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 1, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, 120)); return true; @@ -2124,9 +2167,9 @@ TEST(ValueMetricProducerTest, TestBaseSetOnConditionChange) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 1, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 1, _)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, 100)); return true; @@ -2156,12 +2199,12 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenOneConditionFailed ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First onConditionChanged .WillOnce(Return(false)) // Second onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 3); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 130)); @@ -2233,10 +2276,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenGuardRailHit) { metric.set_condition(StringToId("SCREEN_ON")); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 2, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 2, _)) // First onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { for (int i = 0; i < 2000; i++) { data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, i)); } @@ -2290,10 +2333,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenInitialPullFailed) ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 2); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 120)); @@ -2301,7 +2344,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenInitialPullFailed) })) // Second onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 3); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 130)); @@ -2369,10 +2412,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenLastPullFailed) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 2); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 120)); @@ -2380,7 +2423,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenLastPullFailed) { })) // Second onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 3); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 8, 130)); @@ -2442,10 +2485,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenLastPullFailed) { TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onDataPulled) { ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) // Start bucket. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); return true; @@ -2475,17 +2518,17 @@ TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onConditionChanged) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); return true; @@ -2518,24 +2561,24 @@ TEST(ValueMetricProducerTest, TestEmptyDataResetsBase_onBucketBoundary) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 11); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 2)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 12); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 5)); @@ -2582,10 +2625,10 @@ TEST(ValueMetricProducerTest, TestPartialResetOnBucketBoundaries) { metric.set_condition(StringToId("SCREEN_ON")); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 10, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 10, _)) // First onConditionChanged .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); return true; @@ -2625,19 +2668,19 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestFullBucketResetWhenLastBucketI sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); int64_t partialBucketSplitTimeNs = bucketStartTimeNs + bucketSizeNs / 2; - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Initialization. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); return true; })) // notifyAppUpgrade. - .WillOnce(Invoke([partialBucketSplitTimeNs]( - int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&, + const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, partialBucketSplitTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs, 10)); @@ -2681,10 +2724,10 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestFullBucketResetWhenLastBucketI TEST(ValueMetricProducerTest, TestBucketBoundariesOnConditionChange) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Second onConditionChanged. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 10, 5)); @@ -2692,7 +2735,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundariesOnConditionChange) { })) // Third onConditionChanged. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket3StartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket3StartTimeNs + 10, 7)); @@ -2752,10 +2795,10 @@ TEST(ValueMetricProducerTest, TestLateOnDataPulledWithDiff) { ValueMetric metric = ValueMetricProducerTestHelper::createMetric(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) // Initialization. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); return true; @@ -2782,19 +2825,19 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestBucketBoundariesOnPartialBucke int64_t partialBucketSplitTimeNs = bucket2StartTimeNs + 2; sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Initialization. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); return true; })) // notifyAppUpgrade. - .WillOnce(Invoke([partialBucketSplitTimeNs]( - int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + .WillOnce(Invoke([partialBucketSplitTimeNs](int tagId, const ConfigKey&, + const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, partialBucketSplitTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, partialBucketSplitTimeNs, 10)); @@ -2822,10 +2865,10 @@ TEST(ValueMetricProducerTest, TestDataIsNotUpdatedWhenNoConditionChanged) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First on condition changed. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 8); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); @@ -2833,7 +2876,7 @@ TEST(ValueMetricProducerTest, TestDataIsNotUpdatedWhenNoConditionChanged) { })) // Second on condition changed. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); @@ -2867,10 +2910,10 @@ TEST(ValueMetricProducerTest, TestBucketInvalidIfGlobalBaseIsNotSet) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First condition change. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 1)); @@ -2878,7 +2921,7 @@ TEST(ValueMetricProducerTest, TestBucketInvalidIfGlobalBaseIsNotSet) { })) // 2nd condition change. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 8); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 1)); @@ -2886,7 +2929,7 @@ TEST(ValueMetricProducerTest, TestBucketInvalidIfGlobalBaseIsNotSet) { })) // 3rd condition change. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs, 1)); @@ -2931,10 +2974,10 @@ TEST(ValueMetricProducerTest, TestPullNeededFastDump) { EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillRepeatedly(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) // Initial pull. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateThreeValueLogEvent(tagId, bucketStartTimeNs, tagId, 1, 1)); return true; @@ -2969,10 +3012,10 @@ TEST(ValueMetricProducerTest, TestFastDumpWithoutCurrentBucket) { EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillRepeatedly(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) // Initial pull. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateThreeValueLogEvent(tagId, bucketStartTimeNs, tagId, 1, 1)); return true; @@ -3013,17 +3056,17 @@ TEST(ValueMetricProducerTest, TestPullNeededNoTimeConstraints) { EXPECT_CALL(*pullerManager, RegisterReceiver(tagId, kConfigKey, _, _, _)).WillOnce(Return()); EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillRepeatedly(Return()); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Initial pull. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateThreeValueLogEvent(tagId, bucketStartTimeNs, tagId, 1, 1)); return true; })) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back( @@ -3069,10 +3112,10 @@ TEST(ValueMetricProducerTest, TestPulledData_noDiff_withMultipleConditionChanges metric.set_use_diff(false); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // condition becomes true .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 8); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); @@ -3080,7 +3123,7 @@ TEST(ValueMetricProducerTest, TestPulledData_noDiff_withMultipleConditionChanges })) // condition becomes false .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 50); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 20)); @@ -3119,10 +3162,10 @@ TEST(ValueMetricProducerTest, TestPulledData_noDiff_bucketBoundaryTrue) { metric.set_use_diff(false); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 8, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 8, _)) // condition becomes true .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); return true; @@ -3170,10 +3213,10 @@ TEST(ValueMetricProducerTest, TestPulledData_noDiff_withFailure) { metric.set_use_diff(false); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // condition becomes true .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 8); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 30, 10)); @@ -3210,10 +3253,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenDumpReportRequeste ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 20, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 20, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 20, 10)); return true; @@ -3256,10 +3299,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenConditionEventWron ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 50, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 50, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); return true; @@ -3314,10 +3357,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenAccumulateEventWro ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 50); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); @@ -3325,7 +3368,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenAccumulateEventWro })) // Dump report requested. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 100); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket2StartTimeNs + 100, 15)); @@ -3380,10 +3423,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenConditionUnknown) ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 50); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); @@ -3391,7 +3434,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenConditionUnknown) })) // Dump report requested. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10000); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 100, 15)); @@ -3436,10 +3479,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenPullFailed) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 50); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 10)); @@ -3486,10 +3529,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenMultipleBucketsSki ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 10)); @@ -3497,7 +3540,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestInvalidBucketWhenMultipleBucketsSki })) // Dump report requested. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket4StartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucket4StartTimeNs + 1000, 15)); @@ -3560,10 +3603,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestBucketDropWhenBucketTooSmall) { metric.set_min_bucket_size_nanos(10000000000); // 10 seconds sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 10)); @@ -3571,7 +3614,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestBucketDropWhenBucketTooSmall) { })) // Dump report requested. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 9000000); data->clear(); data->push_back( @@ -3651,10 +3694,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestConditionUnknownMultipleBuckets) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 10 * NS_PER_SEC); data->clear(); data->push_back(CreateRepeatedValueLogEvent( @@ -3663,7 +3706,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestConditionUnknownMultipleBuckets) { })) // Dump report requested. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 15 * NS_PER_SEC); data->clear(); data->push_back(CreateRepeatedValueLogEvent( @@ -3740,10 +3783,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestBucketDropWhenForceBucketSplitBefor ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 10)); @@ -3751,7 +3794,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestBucketDropWhenForceBucketSplitBefor })) // App Update. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 1000); data->clear(); data->push_back( @@ -3806,10 +3849,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestMultipleBucketDropEvents) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 10, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs + 10, _)) // Condition change to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 10)); return true; @@ -3857,10 +3900,10 @@ TEST(ValueMetricProducerTest_BucketDrop, TestMaxBucketDropEvents) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithCondition(); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // First condition change event. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); for (int i = 0; i < 2000; i++) { data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 1, i)); @@ -3877,7 +3920,7 @@ TEST(ValueMetricProducerTest_BucketDrop, TestMaxBucketDropEvents) { .WillOnce(Return(false)) .WillOnce(Return(false)) .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 220); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 220, 10)); @@ -3976,10 +4019,10 @@ TEST(ValueMetricProducerTest, TestSlicedState) { // Set up ValueMetricProducer. ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithState("SCREEN_STATE"); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // ValueMetricProducer initialized. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); @@ -3987,7 +4030,7 @@ TEST(ValueMetricProducerTest, TestSlicedState) { })) // Screen state change to ON. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 5); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 5, 5)); @@ -3995,7 +4038,7 @@ TEST(ValueMetricProducerTest, TestSlicedState) { })) // Screen state change to OFF. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 10); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 10, 9)); @@ -4003,7 +4046,7 @@ TEST(ValueMetricProducerTest, TestSlicedState) { })) // Screen state change to ON. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 15); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 15, 21)); @@ -4011,7 +4054,7 @@ TEST(ValueMetricProducerTest, TestSlicedState) { })) // Dump report requested. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 50); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 30)); @@ -4178,10 +4221,10 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithMap) { // Set up ValueMetricProducer. ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithState("SCREEN_STATE_ONOFF"); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // ValueMetricProducer initialized. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs, 3)); @@ -4189,7 +4232,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithMap) { })) // Screen state change to ON. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 5); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 5, 5)); @@ -4203,7 +4246,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithMap) { // Screen state change to OFF. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 15); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 15, 21)); @@ -4211,7 +4254,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithMap) { })) // Dump report requested. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 50); data->clear(); data->push_back(CreateRepeatedValueLogEvent(tagId, bucketStartTimeNs + 50, 30)); @@ -4408,10 +4451,10 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { *fieldsInState = CreateDimensions(UID_PROCESS_STATE_ATOM_ID, {1 /* uid */}); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // ValueMetricProducer initialized. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs); data->clear(); data->push_back(CreateTwoValueLogEvent(tagId, bucketStartTimeNs, 2 /*uid*/, 7)); @@ -4420,7 +4463,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { })) // Uid 1 process state change from kStateUnknown -> Foreground .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 20); data->clear(); data->push_back( @@ -4433,7 +4476,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { })) // Uid 2 process state change from kStateUnknown -> Background .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 40); data->clear(); data->push_back( @@ -4446,7 +4489,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { })) // Uid 1 process state change from Foreground -> Background .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 20); data->clear(); data->push_back( @@ -4459,7 +4502,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { })) // Uid 1 process state change from Background -> Foreground .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 40); data->clear(); data->push_back( @@ -4472,7 +4515,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithPrimaryField_WithDimensions) { })) // Dump report pull. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 50); data->clear(); data->push_back( @@ -4852,10 +4895,10 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithCondition) { ValueMetric metric = ValueMetricProducerTestHelper::createMetricWithConditionAndState( "BATTERY_SAVER_MODE_STATE"); sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); - EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, _, _)) // Condition changed to true. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 20 * NS_PER_SEC); data->clear(); data->push_back( @@ -4864,7 +4907,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithCondition) { })) // Battery saver mode state changed to OFF. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucketStartTimeNs + 30 * NS_PER_SEC); data->clear(); data->push_back( @@ -4873,7 +4916,7 @@ TEST(ValueMetricProducerTest, TestSlicedStateWithCondition) { })) // Condition changed to false. .WillOnce(Invoke([](int tagId, const ConfigKey&, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { EXPECT_EQ(eventTimeNs, bucket2StartTimeNs + 10 * NS_PER_SEC); data->clear(); data->push_back(CreateRepeatedValueLogEvent( diff --git a/cmds/statsd/tests/metrics/metrics_test_helper.h b/cmds/statsd/tests/metrics/metrics_test_helper.h index eeb38a4644fd..39232c194ada 100644 --- a/cmds/statsd/tests/metrics/metrics_test_helper.h +++ b/cmds/statsd/tests/metrics/metrics_test_helper.h @@ -38,11 +38,10 @@ public: int64_t nextPulltimeNs, int64_t intervalNs)); MOCK_METHOD3(UnRegisterReceiver, void(int tagId, const ConfigKey& key, wp<PullDataReceiver> receiver)); - MOCK_METHOD5(Pull, bool(const int pullCode, const ConfigKey& key, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool useUids)); - MOCK_METHOD5(Pull, - bool(const int pullCode, const vector<int32_t>& uids, const int64_t eventTimeNs, - vector<std::shared_ptr<LogEvent>>* data, bool useUids)); + MOCK_METHOD4(Pull, bool(const int pullCode, const ConfigKey& key, const int64_t eventTimeNs, + vector<std::shared_ptr<LogEvent>>* data)); + MOCK_METHOD4(Pull, bool(const int pullCode, const vector<int32_t>& uids, + const int64_t eventTimeNs, vector<std::shared_ptr<LogEvent>>* data)); MOCK_METHOD2(RegisterPullUidProvider, void(const ConfigKey& configKey, wp<PullUidProvider> provider)); MOCK_METHOD2(UnregisterPullUidProvider, diff --git a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp index e384b6ac7c84..1ba8593231b0 100644 --- a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp +++ b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp @@ -20,9 +20,9 @@ #include <vector> -#include "frameworks/base/cmds/statsd/src/atoms.pb.h" #include "frameworks/base/cmds/statsd/src/shell/shell_config.pb.h" #include "frameworks/base/cmds/statsd/src/shell/shell_data.pb.h" +#include "frameworks/proto_logging/stats/atoms.pb.h" #include "stats_event.h" #include "tests/metrics/metrics_test_helper.h" #include "tests/statsd_test_util.h" @@ -190,9 +190,9 @@ TEST(ShellSubscriberTest, testPulledSubscription) { sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); const vector<int32_t> uids = {AID_SYSTEM}; - EXPECT_CALL(*pullerManager, Pull(10016, uids, _, _, _)) + EXPECT_CALL(*pullerManager, Pull(10016, uids, _, _)) .WillRepeatedly(Invoke([](int tagId, const vector<int32_t>&, const int64_t, - vector<std::shared_ptr<LogEvent>>* data, bool) { + vector<std::shared_ptr<LogEvent>>* data) { data->clear(); data->push_back(makeCpuActiveTimeAtom(/*uid=*/kUid1, /*timeMillis=*/kCpuTime1)); data->push_back(makeCpuActiveTimeAtom(/*uid=*/kUid2, /*timeMillis=*/kCpuTime2)); diff --git a/core/java/android/annotation/SystemApi.java b/core/java/android/annotation/SystemApi.java index 4ac00983af13..a468439c8e74 100644 --- a/core/java/android/annotation/SystemApi.java +++ b/core/java/android/annotation/SystemApi.java @@ -23,7 +23,6 @@ import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.ElementType.PACKAGE; import static java.lang.annotation.ElementType.TYPE; -import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -41,7 +40,6 @@ import java.lang.annotation.Target; */ @Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE}) @Retention(RetentionPolicy.RUNTIME) -@Repeatable(SystemApi.Container.class) // TODO(b/146727827): make this non-repeatable public @interface SystemApi { enum Client { /** diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 1059a6f2e868..3c9e5a53ab0e 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -3757,7 +3757,7 @@ public class ActivityManager { * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public @RunningAppProcessInfo.Importance int getPackageImportance(String packageName) { try { @@ -3777,7 +3777,7 @@ public class ActivityManager { * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public @RunningAppProcessInfo.Importance int getUidImportance(int uid) { try { @@ -3794,7 +3794,7 @@ public class ActivityManager { * {@link #addOnUidImportanceListener}. * @hide */ - @SystemApi @TestApi + @SystemApi public interface OnUidImportanceListener { /** * The importance if a given uid has changed. Will be one of the importance @@ -3825,7 +3825,7 @@ public class ActivityManager { * {@link android.Manifest.permission#PACKAGE_USAGE_STATS}. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public void addOnUidImportanceListener(OnUidImportanceListener listener, @RunningAppProcessInfo.Importance int importanceCutpoint) { @@ -3854,7 +3854,7 @@ public class ActivityManager { * @throws IllegalArgumentException If the listener is not registered. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(OnUidImportanceListener listener) { synchronized (this) { @@ -3996,7 +3996,7 @@ public class ActivityManager { * @see #forceStopPackageAsUser(String, int) * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES) public void forceStopPackage(String packageName) { forceStopPackageAsUser(packageName, mContext.getUserId()); @@ -4335,7 +4335,6 @@ public class ActivityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public boolean switchUser(@NonNull UserHandle user) { if (user == null) { @@ -4768,7 +4767,7 @@ public class ActivityManager { * * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[] pids, @NonNull String reason) { try { diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 0a6827cde3d3..fb87a580dccc 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -447,7 +447,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_PERSISTENT = 100; @@ -456,7 +455,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_TOP = 200; @@ -468,7 +466,6 @@ public class AppOpsManager { * @hide * @deprecated */ - @TestApi @SystemApi @Deprecated public static final int UID_STATE_FOREGROUND_SERVICE_LOCATION = 300; @@ -478,7 +475,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_FOREGROUND_SERVICE = 400; @@ -487,7 +483,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_FOREGROUND = 500; @@ -503,7 +498,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_BACKGROUND = 600; @@ -512,7 +506,6 @@ public class AppOpsManager { * state the more important the UID is for the user. * @hide */ - @TestApi @SystemApi public static final int UID_STATE_CACHED = 700; @@ -590,7 +583,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_SELF = 0x1; @@ -601,7 +593,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_TRUSTED_PROXY = 0x2; @@ -612,7 +603,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_UNTRUSTED_PROXY = 0x4; @@ -623,7 +613,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_TRUSTED_PROXIED = 0x8; @@ -634,7 +623,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAG_UNTRUSTED_PROXIED = 0x10; @@ -646,7 +634,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final int OP_FLAGS_ALL = OP_FLAG_SELF @@ -1143,7 +1130,7 @@ public class AppOpsManager { public static final String OPSTR_GET_USAGE_STATS = "android:get_usage_stats"; /** Activate a VPN connection without user intervention. @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ACTIVATE_VPN = "android:activate_vpn"; /** Allows an application to read the user's contacts data. */ @@ -1225,7 +1212,7 @@ public class AppOpsManager { public static final String OPSTR_WRITE_SETTINGS = "android:write_settings"; /** @hide Get device accounts. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts"; public static final String OPSTR_READ_PHONE_NUMBERS @@ -1234,7 +1221,7 @@ public class AppOpsManager { public static final String OPSTR_PICTURE_IN_PICTURE = "android:picture_in_picture"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground"; /** Answer incoming phone calls */ @@ -1244,129 +1231,129 @@ public class AppOpsManager { * Accept call handover * @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ACCEPT_HANDOVER = "android:accept_handover"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_GPS = "android:gps"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_VIBRATE = "android:vibrate"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WIFI_SCAN = "android:wifi_scan"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_POST_NOTIFICATION = "android:post_notification"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_NEIGHBORING_CELLS = "android:neighboring_cells"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_SMS = "android:write_sms"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_ICC_SMS = "android:read_icc_sms"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_ICC_SMS = "android:write_icc_sms"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ACCESS_NOTIFICATIONS = "android:access_notifications"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_PLAY_AUDIO = "android:play_audio"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_CLIPBOARD = "android:read_clipboard"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_CLIPBOARD = "android:write_clipboard"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TAKE_MEDIA_BUTTONS = "android:take_media_buttons"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TAKE_AUDIO_FOCUS = "android:take_audio_focus"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_MASTER_VOLUME = "android:audio_master_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_MEDIA_VOLUME = "android:audio_media_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_ALARM_VOLUME = "android:audio_alarm_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_BLUETOOTH_VOLUME = "android:audio_bluetooth_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WAKE_LOCK = "android:wake_lock"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_MUTE_MICROPHONE = "android:mute_microphone"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TOAST_WINDOW = "android:toast_window"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_PROJECT_MEDIA = "android:project_media"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_WALLPAPER = "android:write_wallpaper"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ASSIST_STRUCTURE = "android:assist_structure"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_ASSIST_SCREENSHOT = "android:assist_screenshot"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_TURN_SCREEN_ON = "android:turn_screen_on"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_AUDIO_ACCESSIBILITY_VOLUME = "android:audio_accessibility_volume"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_MANAGE_IPSEC_TUNNELS = "android:manage_ipsec_tunnels"; /** @hide */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_START_FOREGROUND = "android:start_foreground"; /** @hide */ public static final String OPSTR_BLUETOOTH_SCAN = "android:bluetooth_scan"; @@ -1382,25 +1369,25 @@ public class AppOpsManager { "android:sms_financial_transactions"; /** @hide Read media of audio type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_MEDIA_AUDIO = "android:read_media_audio"; /** @hide Write media of audio type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_MEDIA_AUDIO = "android:write_media_audio"; /** @hide Read media of video type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_MEDIA_VIDEO = "android:read_media_video"; /** @hide Write media of video type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_MEDIA_VIDEO = "android:write_media_video"; /** @hide Read media of image type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_READ_MEDIA_IMAGES = "android:read_media_images"; /** @hide Write media of image type. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_WRITE_MEDIA_IMAGES = "android:write_media_images"; /** @hide Has a legacy (non-isolated) view of storage. */ - @SystemApi @TestApi + @SystemApi public static final String OPSTR_LEGACY_STORAGE = "android:legacy_storage"; /** @hide Read location metadata from media */ public static final String OPSTR_ACCESS_MEDIA_LOCATION = "android:access_media_location"; @@ -1414,7 +1401,6 @@ public class AppOpsManager { public static final String OPSTR_QUERY_ALL_PACKAGES = "android:query_all_packages"; /** @hide Access all external storage */ @SystemApi - @TestApi public static final String OPSTR_MANAGE_EXTERNAL_STORAGE = "android:manage_external_storage"; @@ -2593,7 +2579,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static int opToDefaultMode(@NonNull String appOp) { return opToDefaultMode(strOpToOp(appOp)); @@ -2683,7 +2668,6 @@ public class AppOpsManager { * Class holding all of the operation information associated with an app. * @hide */ - @TestApi @SystemApi public static final class PackageOps implements Parcelable { private final String mPackageName; @@ -2762,7 +2746,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi // @DataClass(genHiddenConstructor = true, genHiddenCopyConstructor = true) // genHiddenCopyConstructor does not work for @hide @SystemApi classes @@ -3130,7 +3113,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi @Immutable // @DataClass(genHiddenConstructor = true) codegen verifier is broken @@ -3704,7 +3686,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @Immutable @SystemApi // @DataClass(genHiddenConstructor = true) codegen verifier is broken @@ -4382,7 +4363,6 @@ public class AppOpsManager { * @hide */ @Immutable - @TestApi @SystemApi public static final class HistoricalOpsRequest { private final int mUid; @@ -4413,7 +4393,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class Builder { private int mUid = Process.INVALID_UID; @@ -4551,7 +4530,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalOps implements Parcelable { private long mBeginTimeMillis; @@ -4988,7 +4966,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalUidOps implements Parcelable { private final int mUid; @@ -5242,7 +5219,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalPackageOps implements Parcelable { private final @NonNull String mPackageName; @@ -5573,7 +5549,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi /* codegen verifier cannot deal with nested class parameters @DataClass(genHiddenConstructor = true, @@ -5884,7 +5859,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi public static final class HistoricalOp implements Parcelable { private final int mOp; @@ -6521,7 +6495,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public @NonNull List<AppOpsManager.PackageOps> getOpsForPackage(int uid, @@ -6556,7 +6529,6 @@ public class AppOpsManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public void getHistoricalOps(@NonNull HistoricalOpsRequest request, @@ -6665,7 +6637,6 @@ public class AppOpsManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES) public void setUidMode(@NonNull String appOp, int uid, @Mode int mode) { try { @@ -6719,7 +6690,6 @@ public class AppOpsManager { * be changed. * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_APP_OPS_MODES) public void setMode(@NonNull String op, int uid, @Nullable String packageName, @@ -8661,7 +8631,6 @@ public class AppOpsManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.GET_APP_OPS_STATS) public @Nullable RuntimeAppOpAccessMessage collectRuntimeAppOpAccessMessage() { try { @@ -8676,7 +8645,6 @@ public class AppOpsManager { * @hide */ @SystemApi - @TestApi public static String[] getOpStrs() { return Arrays.copyOf(sOpToString, sOpToString.length); } diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java index cf2f7690bc2c..6ce32997ad14 100644 --- a/core/java/android/app/NotificationChannel.java +++ b/core/java/android/app/NotificationChannel.java @@ -134,7 +134,6 @@ public final class NotificationChannel implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int USER_LOCKED_SOUND = 0x00000020; /** @@ -391,7 +390,6 @@ public final class NotificationChannel implements Parcelable { * @hide */ @SystemApi - @TestApi public void setBlockable(boolean blockable) { mBlockableSystem = blockable; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index eef9c022fda8..c662635d9acf 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -1337,7 +1337,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi public boolean isNotificationAssistantAccessGranted(@NonNull ComponentName assistant) { INotificationManager service = getService(); try { @@ -1373,7 +1372,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi public @NonNull @Adjustment.Keys List<String> getAllowedAssistantAdjustments() { INotificationManager service = getService(); try { @@ -1506,7 +1504,6 @@ public class NotificationManager { * @hide */ @SystemApi - @TestApi public void setNotificationAssistantAccessGranted(@Nullable ComponentName assistant, boolean granted) { INotificationManager service = getService(); @@ -1529,7 +1526,6 @@ public class NotificationManager { /** @hide */ @SystemApi - @TestApi public @Nullable ComponentName getAllowedNotificationAssistant() { INotificationManager service = getService(); try { diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index 4cba6ea74955..747789901b9d 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -20,7 +20,6 @@ import static android.app.ActivityThread.DEBUG_CONFIGURATION; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; @@ -1043,7 +1042,6 @@ public class ResourcesManager { } } - @TestApi public final boolean applyConfigurationToResources(@NonNull Configuration config, @Nullable CompatibilityInfo compat) { synchronized(this) { diff --git a/core/java/android/app/RuntimeAppOpAccessMessage.java b/core/java/android/app/RuntimeAppOpAccessMessage.java index a19f815c4298..db3ba4a8cc3f 100644 --- a/core/java/android/app/RuntimeAppOpAccessMessage.java +++ b/core/java/android/app/RuntimeAppOpAccessMessage.java @@ -20,7 +20,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import com.android.internal.util.DataClass; * @hide */ @Immutable -@TestApi @SystemApi /*@DataClass(genConstructor = false) @DataClass.Suppress("getOpCode")*/ diff --git a/core/java/android/app/StatusBarManager.java b/core/java/android/app/StatusBarManager.java index 1329fa45bb50..1a07cc6735f6 100644 --- a/core/java/android/app/StatusBarManager.java +++ b/core/java/android/app/StatusBarManager.java @@ -374,7 +374,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setDisabledForSetup(boolean disabled) { try { @@ -422,7 +421,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.STATUS_BAR) @NonNull public DisableInfo getDisableInfo() { @@ -455,7 +453,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public static final class DisableInfo { private boolean mStatusBarExpansion; @@ -488,7 +485,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isStatusBarExpansionDisabled() { return mStatusBarExpansion; } @@ -504,7 +500,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isNavigateToHomeDisabled() { return mNavigateHome; } @@ -520,7 +515,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isNotificationPeekingDisabled() { return mNotificationPeeking; } @@ -536,7 +530,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isRecentsDisabled() { return mRecents; } @@ -552,7 +545,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean isSearchDisabled() { return mSearch; } @@ -610,7 +602,6 @@ public class StatusBarManager { * @hide */ @SystemApi - @TestApi public boolean areAllComponentsEnabled() { return !mStatusBarExpansion && !mNavigateHome && !mNotificationPeeking && !mRecents && !mSearch && !mSystemIcons && !mClock && !mNotificationIcons; diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java index 7c6eff143724..558e22256648 100644 --- a/core/java/android/app/UiModeManager.java +++ b/core/java/android/app/UiModeManager.java @@ -314,7 +314,6 @@ public class UiModeManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ENTER_CAR_MODE_PRIORITIZED) public void enableCarMode(@IntRange(from = 0) int priority, @EnableCarMode int flags) { if (mService != null) { diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index c5d343d168ca..b1c005c761aa 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -1765,7 +1765,6 @@ public class WallpaperManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.SET_WALLPAPER_COMPONENT) public boolean setWallpaperComponent(ComponentName name) { diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 322cac81d58b..bb837d8b4cc0 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1465,7 +1465,7 @@ public class DevicePolicyManager { * @see #createAdminSupportIntent(String) * @hide */ - @TestApi @SystemApi + @SystemApi public static final String EXTRA_RESTRICTION = "android.app.extra.RESTRICTION"; /** @@ -2688,13 +2688,11 @@ public class DevicePolicyManager { * </ul> */ @SystemApi - @TestApi public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_ALLOWED"; /** @hide See {@link #ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_ALLOWED} */ @SystemApi - @TestApi public static final String ACCOUNT_FEATURE_DEVICE_OR_PROFILE_OWNER_DISALLOWED = "android.account.DEVICE_OR_PROFILE_OWNER_DISALLOWED"; @@ -6682,7 +6680,6 @@ public class DevicePolicyManager { * @hide */ @SystemApi - @TestApi @SuppressLint("Doclava125") public boolean isDeviceManaged() { try { @@ -10395,7 +10392,6 @@ public class DevicePolicyManager { * @hide */ @SystemApi - @TestApi @SuppressLint("Doclava125") public @Nullable CharSequence getDeviceOwnerOrganizationName() { try { diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java index 22d8c87e9268..3e6d299168d9 100644 --- a/core/java/android/app/assist/AssistStructure.java +++ b/core/java/android/app/assist/AssistStructure.java @@ -3,7 +3,6 @@ package android.app.assist; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Activity; import android.content.ComponentName; import android.content.Context; @@ -36,8 +35,6 @@ import android.view.WindowManagerGlobal; import android.view.autofill.AutofillId; import android.view.autofill.AutofillValue; -import com.android.internal.util.Preconditions; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -724,7 +721,6 @@ public class AssistStructure implements Parcelable { // COntent Capture. /** @hide */ @SystemApi - @TestApi public ViewNode() { } @@ -2236,7 +2232,7 @@ public class AssistStructure implements Parcelable { ensureData(); } Log.i(TAG, "Task id: " + mTaskId); - Log.i(TAG, "Activity: " + (mActivityComponent != null + Log.i(TAG, "Activity: " + (mActivityComponent != null ? mActivityComponent.flattenToShortString() : null)); Log.i(TAG, "Sanitize on write: " + mSanitizeOnWrite); diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 3bc043ee0912..e199cbe2d875 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -20,7 +20,6 @@ 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; import android.content.ComponentName; import android.content.Context; @@ -848,7 +847,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) public Intent getConfigurationIntent(String transportName) { checkServiceBinder(); @@ -870,7 +868,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) public String getDestinationString(String transportName) { checkServiceBinder(); @@ -892,7 +889,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) public Intent getDataManagementIntent(String transportName) { checkServiceBinder(); @@ -918,7 +914,6 @@ public class BackupManager { */ @Deprecated @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) @Nullable public String getDataManagementLabel(@NonNull String transportName) { @@ -935,7 +930,6 @@ public class BackupManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.BACKUP) @Nullable public CharSequence getDataManagementIntentLabel(@NonNull String transportName) { diff --git a/core/java/android/app/prediction/AppPredictionContext.java b/core/java/android/app/prediction/AppPredictionContext.java index d14238bb2672..99fa869cee93 100644 --- a/core/java/android/app/prediction/AppPredictionContext.java +++ b/core/java/android/app/prediction/AppPredictionContext.java @@ -19,7 +19,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.os.Bundle; import android.os.Parcel; @@ -32,7 +31,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class AppPredictionContext implements Parcelable { private final int mPredictedTargetCount; @@ -129,7 +127,6 @@ public final class AppPredictionContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { @NonNull @@ -147,7 +144,6 @@ public final class AppPredictionContext implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull Context context) { mPackageName = context.getPackageName(); } diff --git a/core/java/android/app/prediction/AppPredictionManager.java b/core/java/android/app/prediction/AppPredictionManager.java index ca22721622b7..5da7aa97ea0f 100644 --- a/core/java/android/app/prediction/AppPredictionManager.java +++ b/core/java/android/app/prediction/AppPredictionManager.java @@ -17,7 +17,6 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import java.util.Objects; @@ -28,7 +27,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AppPredictionManager { private final Context mContext; diff --git a/core/java/android/app/prediction/AppPredictionSessionId.java b/core/java/android/app/prediction/AppPredictionSessionId.java index 876bafdfb7d1..6277a7de258f 100644 --- a/core/java/android/app/prediction/AppPredictionSessionId.java +++ b/core/java/android/app/prediction/AppPredictionSessionId.java @@ -18,7 +18,6 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AppPredictionSessionId implements Parcelable { private final String mId; diff --git a/core/java/android/app/prediction/AppPredictor.java b/core/java/android/app/prediction/AppPredictor.java index 7f436401dbf4..4517c6deb5b4 100644 --- a/core/java/android/app/prediction/AppPredictor.java +++ b/core/java/android/app/prediction/AppPredictor.java @@ -70,7 +70,6 @@ import java.util.function.Consumer; * @hide */ @SystemApi -@TestApi public final class AppPredictor { private static final String TAG = AppPredictor.class.getSimpleName(); diff --git a/core/java/android/app/prediction/AppTarget.java b/core/java/android/app/prediction/AppTarget.java index 14e32b8397a8..fef9e7020097 100644 --- a/core/java/android/app/prediction/AppTarget.java +++ b/core/java/android/app/prediction/AppTarget.java @@ -19,7 +19,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.ShortcutInfo; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AppTarget implements Parcelable { private final AppTargetId mId; @@ -190,7 +188,6 @@ public final class AppTarget implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { @NonNull @@ -221,7 +218,6 @@ public final class AppTarget implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull AppTargetId id, @NonNull String packageName, @NonNull UserHandle user) { mId = Objects.requireNonNull(id); @@ -235,7 +231,6 @@ public final class AppTarget implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull AppTargetId id, @NonNull ShortcutInfo info) { mId = Objects.requireNonNull(id); mShortcutInfo = Objects.requireNonNull(info); diff --git a/core/java/android/app/prediction/AppTargetEvent.java b/core/java/android/app/prediction/AppTargetEvent.java index f519145c4aa8..963e750e4fd1 100644 --- a/core/java/android/app/prediction/AppTargetEvent.java +++ b/core/java/android/app/prediction/AppTargetEvent.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class AppTargetEvent implements Parcelable { /** @@ -141,7 +139,6 @@ public final class AppTargetEvent implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { private AppTarget mTarget; private String mLocation; diff --git a/core/java/android/app/prediction/AppTargetId.java b/core/java/android/app/prediction/AppTargetId.java index 052fdc11ef21..048e12c5c48e 100644 --- a/core/java/android/app/prediction/AppTargetId.java +++ b/core/java/android/app/prediction/AppTargetId.java @@ -18,7 +18,6 @@ package android.app.prediction; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -28,7 +27,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class AppTargetId implements Parcelable { @NonNull @@ -40,7 +38,6 @@ public final class AppTargetId implements Parcelable { * @hide */ @SystemApi - @TestApi public AppTargetId(@NonNull String id) { mId = id; } diff --git a/core/java/android/app/role/OnRoleHoldersChangedListener.java b/core/java/android/app/role/OnRoleHoldersChangedListener.java index d6f76794da20..5958debc86dd 100644 --- a/core/java/android/app/role/OnRoleHoldersChangedListener.java +++ b/core/java/android/app/role/OnRoleHoldersChangedListener.java @@ -18,7 +18,6 @@ package android.app.role; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.UserHandle; /** @@ -27,7 +26,6 @@ import android.os.UserHandle; * @hide */ @SystemApi -@TestApi public interface OnRoleHoldersChangedListener { /** diff --git a/core/java/android/app/role/RoleManager.java b/core/java/android/app/role/RoleManager.java index 253c73796caf..fccf5abaa986 100644 --- a/core/java/android/app/role/RoleManager.java +++ b/core/java/android/app/role/RoleManager.java @@ -24,7 +24,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.annotation.UserIdInt; import android.content.Context; import android.content.Intent; @@ -144,7 +143,6 @@ public final class RoleManager { * @hide */ @SystemApi - @TestApi public static final int MANAGE_HOLDERS_FLAG_DONT_KILL_APP = 1; /** @@ -255,7 +253,6 @@ public final class RoleManager { @NonNull @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public List<String> getRoleHolders(@NonNull String roleName) { return getRoleHoldersAsUser(roleName, Process.myUserHandle()); } @@ -281,7 +278,6 @@ public final class RoleManager { @NonNull @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public List<String> getRoleHoldersAsUser(@NonNull String roleName, @NonNull UserHandle user) { Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); Objects.requireNonNull(user, "user cannot be null"); @@ -315,7 +311,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public void addRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName, @ManageHoldersFlags int flags, @NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { @@ -354,7 +349,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public void removeRoleHolderAsUser(@NonNull String roleName, @NonNull String packageName, @ManageHoldersFlags int flags, @NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { @@ -392,7 +386,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.MANAGE_ROLE_HOLDERS) @SystemApi - @TestApi public void clearRoleHoldersAsUser(@NonNull String roleName, @ManageHoldersFlags int flags, @NonNull UserHandle user, @CallbackExecutor @NonNull Executor executor, @NonNull Consumer<Boolean> callback) { @@ -439,7 +432,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS) @SystemApi - @TestApi public void addOnRoleHoldersChangedListenerAsUser(@CallbackExecutor @NonNull Executor executor, @NonNull OnRoleHoldersChangedListener listener, @NonNull UserHandle user) { Objects.requireNonNull(executor, "executor cannot be null"); @@ -485,7 +477,6 @@ public final class RoleManager { */ @RequiresPermission(Manifest.permission.OBSERVE_ROLE_HOLDERS) @SystemApi - @TestApi public void removeOnRoleHoldersChangedListenerAsUser( @NonNull OnRoleHoldersChangedListener listener, @NonNull UserHandle user) { Objects.requireNonNull(listener, "listener cannot be null"); @@ -527,7 +518,6 @@ public final class RoleManager { */ @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public void setRoleNamesFromController(@NonNull List<String> roleNames) { Objects.requireNonNull(roleNames, "roleNames cannot be null"); try { @@ -558,7 +548,6 @@ public final class RoleManager { */ @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public boolean addRoleHolderFromController(@NonNull String roleName, @NonNull String packageName) { Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); @@ -591,7 +580,6 @@ public final class RoleManager { */ @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public boolean removeRoleHolderFromController(@NonNull String roleName, @NonNull String packageName) { Preconditions.checkStringNotEmpty(roleName, "roleName cannot be null or empty"); @@ -614,7 +602,6 @@ public final class RoleManager { @NonNull @RequiresPermission(PERMISSION_MANAGE_ROLES_FROM_CONTROLLER) @SystemApi - @TestApi public List<String> getHeldRolesFromController(@NonNull String packageName) { Preconditions.checkStringNotEmpty(packageName, "packageName cannot be null or empty"); try { diff --git a/core/java/android/bluetooth/BluetoothHeadsetClient.java b/core/java/android/bluetooth/BluetoothHeadsetClient.java index 85e0e08b19c8..28363250ebda 100644 --- a/core/java/android/bluetooth/BluetoothHeadsetClient.java +++ b/core/java/android/bluetooth/BluetoothHeadsetClient.java @@ -19,7 +19,6 @@ package android.bluetooth; import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; -import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Binder; @@ -587,7 +586,6 @@ public final class BluetoothHeadsetClient implements BluetoothProfile { * @return true if connectionPolicy is set, false on error * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull BluetoothDevice device, @ConnectionPolicy int connectionPolicy) { @@ -637,7 +635,6 @@ public final class BluetoothHeadsetClient implements BluetoothProfile { * @return connection policy of the device * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH) public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) { if (VDBG) log("getConnectionPolicy(" + device + ")"); diff --git a/core/java/android/bluetooth/BluetoothMapClient.java b/core/java/android/bluetooth/BluetoothMapClient.java index 19240dc0bbc7..4f5c4feb3684 100644 --- a/core/java/android/bluetooth/BluetoothMapClient.java +++ b/core/java/android/bluetooth/BluetoothMapClient.java @@ -19,7 +19,6 @@ package android.bluetooth; import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; -import android.annotation.SystemApi; import android.app.PendingIntent; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -276,7 +275,6 @@ public final class BluetoothMapClient implements BluetoothProfile { * @return true if connectionPolicy is set, false on error * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull BluetoothDevice device, @ConnectionPolicy int connectionPolicy) { @@ -325,7 +323,6 @@ public final class BluetoothMapClient implements BluetoothProfile { * @return connection policy of the device * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED) public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) { if (VDBG) Log.d(TAG, "getConnectionPolicy(" + device + ")"); diff --git a/core/java/android/bluetooth/BluetoothPbapClient.java b/core/java/android/bluetooth/BluetoothPbapClient.java index d3452ffb4586..f356da18fc73 100644 --- a/core/java/android/bluetooth/BluetoothPbapClient.java +++ b/core/java/android/bluetooth/BluetoothPbapClient.java @@ -19,7 +19,6 @@ package android.bluetooth; import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; -import android.annotation.SystemApi; import android.content.Context; import android.os.Binder; import android.os.IBinder; @@ -276,7 +275,6 @@ public final class BluetoothPbapClient implements BluetoothProfile { * @return true if connectionPolicy is set, false on error * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(@NonNull BluetoothDevice device, @ConnectionPolicy int connectionPolicy) { @@ -329,7 +327,6 @@ public final class BluetoothPbapClient implements BluetoothProfile { * @return connection policy of the device * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED) public @ConnectionPolicy int getConnectionPolicy(@NonNull BluetoothDevice device) { if (VDBG) { diff --git a/core/java/android/bluetooth/BluetoothSap.java b/core/java/android/bluetooth/BluetoothSap.java index 6e0348158f48..48e8c1ada255 100644 --- a/core/java/android/bluetooth/BluetoothSap.java +++ b/core/java/android/bluetooth/BluetoothSap.java @@ -18,7 +18,6 @@ package android.bluetooth; import android.Manifest; import android.annotation.RequiresPermission; -import android.annotation.SystemApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.os.Binder; @@ -328,7 +327,6 @@ public final class BluetoothSap implements BluetoothProfile { * @return true if connectionPolicy is set, false on error * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean setConnectionPolicy(BluetoothDevice device, @ConnectionPolicy int connectionPolicy) { @@ -377,7 +375,6 @@ public final class BluetoothSap implements BluetoothProfile { * @return connection policy of the device * @hide */ - @SystemApi @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED) public @ConnectionPolicy int getConnectionPolicy(BluetoothDevice device) { if (VDBG) log("getConnectionPolicy(" + device + ")"); diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java index 591a714bfb93..7059494d93bd 100644 --- a/core/java/android/companion/CompanionDeviceManager.java +++ b/core/java/android/companion/CompanionDeviceManager.java @@ -21,7 +21,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.Activity; import android.app.Application; import android.app.PendingIntent; @@ -285,7 +284,6 @@ public final class CompanionDeviceManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) public boolean isDeviceAssociatedForWifiConnection( @NonNull String packageName, diff --git a/core/java/android/content/ApexEnvironment.java b/core/java/android/content/ApexEnvironment.java index 9f15a425d92b..b4cc3c2bb156 100644 --- a/core/java/android/content/ApexEnvironment.java +++ b/core/java/android/content/ApexEnvironment.java @@ -18,7 +18,6 @@ package android.content; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Environment; import android.os.UserHandle; @@ -31,7 +30,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public class ApexEnvironment { private static final String APEX_DATA = "apexdata"; diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index d0f5ec467458..5af7861e1a20 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -21,7 +21,6 @@ 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; import android.content.res.AssetFileDescriptor; import android.database.CrossProcessCursorWrapper; @@ -123,7 +122,6 @@ public class ContentProviderClient implements ContentInterface, AutoCloseable { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.REMOVE_TASKS) public void setDetectNotResponding(@DurationMillisLong long timeoutMillis) { synchronized (ContentProviderClient.class) { diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index c409613589b0..018bcbd6f8f7 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -4094,7 +4094,6 @@ public abstract class ContentResolver implements ContentInterface { * @hide */ @SystemApi - @TestApi // We can't accept an already-opened FD here, since these methods are // rewriting actual filesystem paths @SuppressLint("StreamFiles") @@ -4114,7 +4113,6 @@ public abstract class ContentResolver implements ContentInterface { * @hide */ @SystemApi - @TestApi // We can't accept an already-opened FD here, since these methods are // rewriting actual filesystem paths @SuppressLint("StreamFiles") diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 8472144a92cf..1f8e820cdfde 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1838,7 +1838,6 @@ public abstract class Context { */ @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS) @SystemApi - @TestApi public void startActivityAsUser(@RequiresPermission @NonNull Intent intent, @NonNull UserHandle user) { throw new RuntimeException("Not implemented. Must override in a subclass."); @@ -3953,7 +3952,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi @SuppressLint("ServiceName") public static final String STATUS_BAR_SERVICE = "statusbar"; @@ -4165,7 +4163,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi public static final String ETHERNET_SERVICE = "ethernet"; /** @@ -4469,7 +4466,6 @@ public abstract class Context { * @see #getSystemService(String) * @hide */ - @TestApi @SystemApi public static final String PERMISSION_SERVICE = "permission"; @@ -4500,7 +4496,7 @@ public abstract class Context { * @see #getSystemService(String) * @hide */ - @SystemApi @TestApi + @SystemApi public static final String ROLLBACK_SERVICE = "rollback"; /** @@ -4974,7 +4970,7 @@ public abstract class Context { * @see android.os.BugreportManager * @hide */ - @SystemApi @TestApi + @SystemApi public static final String BUGREPORT_SERVICE = "bugreport"; /** @@ -5118,7 +5114,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi public static final String APP_INTEGRITY_SERVICE = "app_integrity"; /** @@ -5664,7 +5659,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi @NonNull public Context createPackageContextAsUser( @NonNull String packageName, @CreatePackageOptions int flags, @NonNull UserHandle user) @@ -5683,7 +5677,6 @@ public abstract class Context { * @hide */ @SystemApi - @TestApi @NonNull public Context createContextAsUser(@NonNull UserHandle user, @CreatePackageOptions int flags) { if (Build.IS_ENG) { diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index ededd0d2ea30..b457c2a963c9 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -28,7 +28,6 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressLint; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.AppGlobals; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; @@ -1747,7 +1746,6 @@ public class Intent implements Parcelable, Cloneable { * @hide */ @SystemApi - @TestApi public static final String EXTRA_ORIGINATING_UID = "android.intent.extra.ORIGINATING_UID"; @@ -1978,7 +1976,6 @@ public class Intent implements Parcelable, Cloneable { @RequiresPermission(android.Manifest.permission.MANAGE_ROLE_HOLDERS) @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) @SystemApi - @TestApi public static final String ACTION_MANAGE_DEFAULT_APP = "android.intent.action.MANAGE_DEFAULT_APP"; @@ -1993,7 +1990,6 @@ public class Intent implements Parcelable, Cloneable { * @hide */ @SystemApi - @TestApi public static final String EXTRA_ROLE_NAME = "android.intent.extra.ROLE_NAME"; /** @@ -2538,7 +2534,7 @@ public class Intent implements Parcelable, Cloneable { * * @hide */ - @SystemApi @TestApi + @SystemApi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_ROLLBACK_COMMITTED = "android.intent.action.ROLLBACK_COMMITTED"; diff --git a/core/java/android/content/integrity/AppIntegrityManager.java b/core/java/android/content/integrity/AppIntegrityManager.java index 2869abb53b37..0353b7898311 100644 --- a/core/java/android/content/integrity/AppIntegrityManager.java +++ b/core/java/android/content/integrity/AppIntegrityManager.java @@ -36,7 +36,6 @@ import java.util.List; * * @hide */ -@TestApi @SystemApi @SystemService(Context.APP_INTEGRITY_SERVICE) public class AppIntegrityManager { diff --git a/core/java/android/content/integrity/IntegrityFormula.java b/core/java/android/content/integrity/IntegrityFormula.java index fc177721240c..d965ef5c71a8 100644 --- a/core/java/android/content/integrity/IntegrityFormula.java +++ b/core/java/android/content/integrity/IntegrityFormula.java @@ -19,7 +19,6 @@ package android.content.integrity; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.integrity.AtomicFormula.BooleanAtomicFormula; import android.content.integrity.AtomicFormula.LongAtomicFormula; import android.content.integrity.AtomicFormula.StringAtomicFormula; @@ -38,7 +37,6 @@ import java.util.Arrays; * @hide */ @SystemApi -@TestApi @VisibleForTesting public abstract class IntegrityFormula { diff --git a/core/java/android/content/integrity/Rule.java b/core/java/android/content/integrity/Rule.java index d29e6df5ec39..c421c4076d16 100644 --- a/core/java/android/content/integrity/Rule.java +++ b/core/java/android/content/integrity/Rule.java @@ -21,7 +21,6 @@ import static com.android.internal.util.Preconditions.checkArgument; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -38,7 +37,6 @@ import java.util.Objects; * * @hide */ -@TestApi @SystemApi @VisibleForTesting public final class Rule implements Parcelable { diff --git a/core/java/android/content/integrity/RuleSet.java b/core/java/android/content/integrity/RuleSet.java index e121ff8bbcaa..b423b54a7d92 100644 --- a/core/java/android/content/integrity/RuleSet.java +++ b/core/java/android/content/integrity/RuleSet.java @@ -18,7 +18,6 @@ package android.content.integrity; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.util.ArrayList; import java.util.Collections; @@ -30,7 +29,6 @@ import java.util.Objects; * * @hide */ -@TestApi @SystemApi public class RuleSet { private final String mVersion; diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java index 2bdca7d87a78..fd3d48f2fd0e 100644 --- a/core/java/android/content/om/OverlayManager.java +++ b/core/java/android/content/om/OverlayManager.java @@ -21,7 +21,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.compat.Compatibility; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; @@ -241,7 +240,6 @@ public class OverlayManager { * * @hide */ - @TestApi @RequiresPermission(anyOf = { "android.permission.INTERACT_ACROSS_USERS", }) diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index fc4ccd072e75..bc706b24a636 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -1692,7 +1692,6 @@ public class PackageInstaller { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS) public void setGrantedRuntimePermissions(String[] permissions) { @@ -1764,7 +1763,7 @@ public class PackageInstaller { * @see SessionParams#setEnableRollback(boolean, int) * @hide */ - @SystemApi @TestApi + @SystemApi public void setEnableRollback(boolean enable) { if (enable) { installFlags |= PackageManager.INSTALL_ENABLE_ROLLBACK; @@ -1788,7 +1787,7 @@ public class PackageInstaller { * @param dataPolicy the rollback data policy for this session * @hide */ - @SystemApi @TestApi + @SystemApi public void setEnableRollback(boolean enable, @PackageManager.RollbackDataPolicy int dataPolicy) { if (enable) { @@ -1811,7 +1810,7 @@ public class PackageInstaller { } /** {@hide} */ - @SystemApi @TestApi + @SystemApi public void setRequestDowngrade(boolean requestDowngrade) { if (requestDowngrade) { installFlags |= PackageManager.INSTALL_REQUEST_DOWNGRADE; @@ -1934,7 +1933,7 @@ public class PackageInstaller { * * {@hide} */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.INSTALL_PACKAGES) public void setStaged() { this.isStaged = true; @@ -1945,7 +1944,7 @@ public class PackageInstaller { * * {@hide} */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.INSTALL_PACKAGES) public void setInstallAsApex() { installFlags |= PackageManager.INSTALL_APEX; @@ -2431,7 +2430,6 @@ public class PackageInstaller { * * @hide */ - @TestApi @SystemApi public @NonNull Set<String> getWhitelistedRestrictedPermissions() { if ((installFlags & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS) != 0) { @@ -2455,7 +2453,6 @@ public class PackageInstaller { * * @hide */ - @TestApi @SystemApi public int getAutoRevokePermissionsMode() { return autoRevokePermissionsMode; @@ -2576,7 +2573,7 @@ public class PackageInstaller { * * @hide */ - @SystemApi @TestApi + @SystemApi @PackageManager.RollbackDataPolicy public int getRollbackDataPolicy() { return rollbackDataPolicy; diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 05548c71eb80..ed7766351053 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -123,7 +123,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public interface OnPermissionsChangedListener { /** @@ -482,7 +481,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int MATCH_FACTORY_ONLY = 0x00200000; /** @@ -614,7 +612,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int MODULE_APEX_NAME = 0x00000001; /** @hide */ @@ -3317,7 +3314,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_USER_SET = 1 << 0; /** @@ -3328,7 +3324,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_USER_FIXED = 1 << 1; /** @@ -3339,7 +3334,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_POLICY_FIXED = 1 << 2; /** @@ -3356,7 +3350,6 @@ public abstract class PackageManager { */ @Deprecated @SystemApi - @TestApi public static final int FLAG_PERMISSION_REVOKE_ON_UPGRADE = 1 << 3; /** @@ -3366,7 +3359,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_SYSTEM_FIXED = 1 << 4; /** @@ -3387,7 +3379,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 1 << 6; /** @@ -3425,7 +3416,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_RESTRICTION_INSTALLER_EXEMPT = 1 << 11; @@ -3437,7 +3427,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_RESTRICTION_SYSTEM_EXEMPT = 1 << 12; @@ -3450,7 +3439,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT = 1 << 13; @@ -3463,7 +3451,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi public static final int FLAG_PERMISSION_APPLY_RESTRICTION = 1 << 14; @@ -3473,7 +3460,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_GRANTED_BY_ROLE = 1 << 15; /** @@ -3485,7 +3471,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_REVOKED_COMPAT = FLAG_PERMISSION_REVOKE_ON_UPGRADE; /** @@ -3495,7 +3480,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi public static final int FLAG_PERMISSION_ONE_TIME = 1 << 16; /** @@ -4001,7 +3985,7 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi + @SystemApi public abstract boolean arePermissionsIndividuallyControlled(); /** @@ -4243,7 +4227,6 @@ public abstract class PackageManager { * @hide */ @NonNull - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract List<PackageInfo> getInstalledPackagesAsUser(@PackageInfoFlags int flags, @@ -4404,7 +4387,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) public abstract void grantRuntimePermission(@NonNull String packageName, @@ -4431,7 +4413,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public abstract void revokeRuntimePermission(@NonNull String packageName, @@ -4459,7 +4440,6 @@ public abstract class PackageManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermission(@NonNull String packageName, @@ -4478,7 +4458,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = { android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, @@ -4501,7 +4480,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = { android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS @@ -6297,7 +6275,6 @@ public abstract class PackageManager { * @hide */ @Nullable - @TestApi @SystemApi @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS_FULL) public abstract String getDefaultBrowserPackageNameAsUser(@UserIdInt int userId); @@ -6940,7 +6917,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) public abstract void addOnPermissionsChangeListener( @NonNull OnPermissionsChangedListener listener); @@ -6953,7 +6929,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) public abstract void removeOnPermissionsChangeListener( @NonNull OnPermissionsChangedListener listener); @@ -7924,7 +7899,6 @@ public abstract class PackageManager { * @hide */ @SystemApi - @TestApi @Nullable public String getIncidentReportApproverPackageName() { throw new UnsupportedOperationException( diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 70e4e6cbf622..43632f5ccbe8 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -46,7 +46,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringRes; -import android.annotation.TestApi; import android.apex.ApexInfo; import android.app.ActivityTaskManager; import android.app.ActivityThread; @@ -2545,7 +2544,6 @@ public class PackageParser { * not compatible with this platform * @hide Exposed for unit testing only. */ - @TestApi public static int computeTargetSdkVersion(@IntRange(from = 0) int targetVers, @Nullable String targetCode, @NonNull String[] platformSdkCodenames, @NonNull String[] outError) { @@ -2610,7 +2608,6 @@ public class PackageParser { * compatible with this platform * @hide Exposed for unit testing only. */ - @TestApi public static int computeMinSdkVersion(@IntRange(from = 1) int minVers, @Nullable String minCode, @IntRange(from = 1) int platformSdkVersion, @NonNull String[] platformSdkCodenames, @NonNull String[] outError) { @@ -4732,7 +4729,6 @@ public class PackageParser { * AndroidManifest.xml. * @hide Exposed for unit testing only. */ - @TestApi public static int getActivityConfigChanges(int configChanges, int recreateOnConfigChanges) { return configChanges | ((~recreateOnConfigChanges) & RECREATE_ON_CONFIG_CHANGES_MASK); } diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index 5f6befdcbaef..1903f07ad5ab 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -160,7 +160,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_OEM = 0x4000; /** @@ -181,7 +180,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 0x10000; /** @@ -192,7 +190,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_WELLBEING = 0x20000; /** @@ -202,7 +199,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_DOCUMENTER = 0x40000; /** @@ -212,7 +208,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_CONFIGURATOR = 0x80000; /** @@ -223,7 +218,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_INCIDENT_REPORT_APPROVER = 0x100000; /** @@ -234,7 +228,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_APP_PREDICTOR = 0x200000; /** @@ -245,7 +238,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_COMPANION = 0x800000; /** @@ -256,7 +248,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int PROTECTION_FLAG_RETAIL_DEMO = 0x1000000; /** @hide */ @@ -340,7 +331,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * value of {@link android.R.attr#permissionFlags}. * @hide */ - @TestApi @SystemApi public static final int FLAG_REMOVED = 1<<1; @@ -428,7 +418,6 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public final @Nullable String backgroundPermission; /** diff --git a/core/java/android/content/rollback/PackageRollbackInfo.java b/core/java/android/content/rollback/PackageRollbackInfo.java index b273cd67479c..278eedb94852 100644 --- a/core/java/android/content/rollback/PackageRollbackInfo.java +++ b/core/java/android/content/rollback/PackageRollbackInfo.java @@ -18,7 +18,6 @@ package android.content.rollback; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; import android.os.Parcel; @@ -33,7 +32,7 @@ import java.util.ArrayList; * * @hide */ -@SystemApi @TestApi +@SystemApi public final class PackageRollbackInfo implements Parcelable { private final VersionedPackage mVersionRolledBackFrom; diff --git a/core/java/android/content/rollback/RollbackInfo.java b/core/java/android/content/rollback/RollbackInfo.java index c09cfd54866c..a363718a8b1d 100644 --- a/core/java/android/content/rollback/RollbackInfo.java +++ b/core/java/android/content/rollback/RollbackInfo.java @@ -18,7 +18,6 @@ package android.content.rollback; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.VersionedPackage; import android.os.Parcel; import android.os.Parcelable; @@ -31,7 +30,7 @@ import java.util.List; * * @hide */ -@SystemApi @TestApi +@SystemApi public final class RollbackInfo implements Parcelable { /** diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java index 7ebeb212b64a..3636222f558c 100644 --- a/core/java/android/content/rollback/RollbackManager.java +++ b/core/java/android/content/rollback/RollbackManager.java @@ -24,7 +24,6 @@ import android.annotation.SystemService; import android.annotation.TestApi; import android.content.Context; import android.content.IntentSender; -import android.content.pm.PackageInstaller; import android.content.pm.ParceledListSlice; import android.content.pm.VersionedPackage; import android.os.RemoteException; @@ -43,7 +42,7 @@ import java.util.List; * @see PackageInstaller.SessionParams#setEnableRollback(boolean) * @hide */ -@SystemApi @TestApi +@SystemApi @SystemService(Context.ROLLBACK_SERVICE) public final class RollbackManager { private final String mCallerPackageName; diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index 7dbb570eb666..37e12809467d 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.hardware.camera2.params.InputConfiguration; import android.hardware.camera2.params.OutputConfiguration; import android.hardware.camera2.params.SessionConfiguration; @@ -358,7 +357,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi public static final int SESSION_OPERATION_MODE_NORMAL = 0; // ICameraDeviceUser.NORMAL_MODE; @@ -369,7 +367,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi public static final int SESSION_OPERATION_MODE_CONSTRAINED_HIGH_SPEED = 1; // ICameraDeviceUser.CONSTRAINED_HIGH_SPEED_MODE; @@ -380,7 +377,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi public static final int SESSION_OPERATION_MODE_VENDOR_START = 0x8000; // ICameraDeviceUser.VENDOR_MODE_START; @@ -423,7 +419,6 @@ public abstract class CameraDevice implements AutoCloseable { * @hide */ @SystemApi - @TestApi @Deprecated public abstract void createCustomCaptureSession( InputConfiguration inputConfig, diff --git a/core/java/android/hardware/display/AmbientBrightnessDayStats.java b/core/java/android/hardware/display/AmbientBrightnessDayStats.java index 26fd2654239f..8aff911ea42c 100644 --- a/core/java/android/hardware/display/AmbientBrightnessDayStats.java +++ b/core/java/android/hardware/display/AmbientBrightnessDayStats.java @@ -19,7 +19,6 @@ package android.hardware.display; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class AmbientBrightnessDayStats implements Parcelable { /** The localdate for which brightness stats are being tracked */ diff --git a/core/java/android/hardware/display/BrightnessChangeEvent.java b/core/java/android/hardware/display/BrightnessChangeEvent.java index a6a44bea816b..e2d836c59099 100644 --- a/core/java/android/hardware/display/BrightnessChangeEvent.java +++ b/core/java/android/hardware/display/BrightnessChangeEvent.java @@ -19,7 +19,6 @@ package android.hardware.display; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class BrightnessChangeEvent implements Parcelable { /** Brightness in nits */ public final float brightness; diff --git a/core/java/android/hardware/display/BrightnessConfiguration.java b/core/java/android/hardware/display/BrightnessConfiguration.java index 6412a0ce7219..d9c1063cd39d 100644 --- a/core/java/android/hardware/display/BrightnessConfiguration.java +++ b/core/java/android/hardware/display/BrightnessConfiguration.java @@ -20,7 +20,6 @@ import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.ApplicationInfo; import android.os.Parcel; import android.os.Parcelable; @@ -44,7 +43,6 @@ import java.util.Objects; /** @hide */ @SystemApi -@TestApi public final class BrightnessConfiguration implements Parcelable { private static final String TAG_BRIGHTNESS_CURVE = "brightness-curve"; private static final String TAG_BRIGHTNESS_POINT = "brightness-point"; diff --git a/core/java/android/hardware/display/BrightnessCorrection.java b/core/java/android/hardware/display/BrightnessCorrection.java index 22df778a1368..78cc769aa7b9 100644 --- a/core/java/android/hardware/display/BrightnessCorrection.java +++ b/core/java/android/hardware/display/BrightnessCorrection.java @@ -20,7 +20,6 @@ import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.MathUtils; @@ -44,7 +43,6 @@ import java.io.IOException; * @hide */ @SystemApi -@TestApi public final class BrightnessCorrection implements Parcelable { private static final int SCALE_AND_TRANSLATE_LOG = 1; diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index c1ba2094d3cf..a2400fd3e22a 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -691,7 +691,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi public Point getStableDisplaySize() { return mGlobal.getStableDisplaySize(); } @@ -701,7 +700,6 @@ public final class DisplayManager { * @hide until we make it a system api. */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.BRIGHTNESS_SLIDER_USAGE) public List<BrightnessChangeEvent> getBrightnessEvents() { return mGlobal.getBrightnessEvents(mContext.getOpPackageName()); @@ -713,7 +711,6 @@ public final class DisplayManager { * @hide until we make it a system api */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.ACCESS_AMBIENT_LIGHT_STATS) public List<AmbientBrightnessDayStats> getAmbientBrightnessStats() { return mGlobal.getAmbientBrightnessStats(); @@ -725,7 +722,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public void setBrightnessConfiguration(BrightnessConfiguration c) { setBrightnessConfigurationForUser(c, mContext.getUserId(), mContext.getPackageName()); @@ -750,7 +746,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) public BrightnessConfiguration getBrightnessConfiguration() { return getBrightnessConfigurationForUser(mContext.getUserId()); @@ -776,7 +771,6 @@ public final class DisplayManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.CONFIGURE_DISPLAY_BRIGHTNESS) @Nullable public BrightnessConfiguration getDefaultBrightnessConfiguration() { diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java index 1ce9b9c71c0e..4c96c54debc0 100644 --- a/core/java/android/hardware/hdmi/HdmiControlManager.java +++ b/core/java/android/hardware/hdmi/HdmiControlManager.java @@ -29,7 +29,6 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; @@ -58,7 +57,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.HDMI_CONTROL_SERVICE) @RequiresFeature(PackageManager.FEATURE_HDMI_CEC) public final class HdmiControlManager { diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java index 52c3628f358b..e97e120109bf 100644 --- a/core/java/android/hardware/hdmi/HdmiPortInfo.java +++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java @@ -18,7 +18,6 @@ package android.hardware.hdmi; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class HdmiPortInfo implements Parcelable { /** HDMI port type: Input */ public static final int PORT_INPUT = 0; diff --git a/core/java/android/hardware/hdmi/HdmiSwitchClient.java b/core/java/android/hardware/hdmi/HdmiSwitchClient.java index 913edfd0ebf4..04ec095b3238 100644 --- a/core/java/android/hardware/hdmi/HdmiSwitchClient.java +++ b/core/java/android/hardware/hdmi/HdmiSwitchClient.java @@ -18,7 +18,6 @@ package android.hardware.hdmi; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.hardware.hdmi.HdmiControlManager.ControlCallbackResult; import android.os.Binder; import android.os.RemoteException; @@ -39,7 +38,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public class HdmiSwitchClient extends HdmiClient { private static final String TAG = "HdmiSwitchClient"; diff --git a/core/java/android/hardware/lights/Light.java b/core/java/android/hardware/lights/Light.java index e90b57cdc7b4..0400d3b62b33 100644 --- a/core/java/android/hardware/lights/Light.java +++ b/core/java/android/hardware/lights/Light.java @@ -18,7 +18,6 @@ package android.hardware.lights; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -28,7 +27,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class Light implements Parcelable { private final int mId; private final int mOrdinal; diff --git a/core/java/android/hardware/lights/LightState.java b/core/java/android/hardware/lights/LightState.java index e55aa702f15c..cd39e6df91a9 100644 --- a/core/java/android/hardware/lights/LightState.java +++ b/core/java/android/hardware/lights/LightState.java @@ -19,7 +19,6 @@ package android.hardware.lights; import android.annotation.ColorInt; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class LightState implements Parcelable { private final int mColor; diff --git a/core/java/android/hardware/lights/LightsManager.java b/core/java/android/hardware/lights/LightsManager.java index 8cd231224472..33e5fcaf2abb 100644 --- a/core/java/android/hardware/lights/LightsManager.java +++ b/core/java/android/hardware/lights/LightsManager.java @@ -45,7 +45,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi @SystemService(Context.LIGHTS_SERVICE) public final class LightsManager { private static final String TAG = "LightsManager"; diff --git a/core/java/android/hardware/lights/LightsRequest.java b/core/java/android/hardware/lights/LightsRequest.java index 5c4fc6707e96..a318992c35ee 100644 --- a/core/java/android/hardware/lights/LightsRequest.java +++ b/core/java/android/hardware/lights/LightsRequest.java @@ -18,7 +18,6 @@ package android.hardware.lights; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.util.SparseArray; import com.android.internal.util.Preconditions; @@ -29,7 +28,6 @@ import com.android.internal.util.Preconditions; * @hide */ @SystemApi -@TestApi public final class LightsRequest { /** Visible to {@link LightsManager.Session}. */ diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index 80f35a0a2e32..1afadd40ede3 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -59,7 +59,6 @@ import java.util.UUID; * * @hide */ -@TestApi @SystemApi public class SoundTrigger { private static final String TAG = "SoundTrigger"; diff --git a/core/java/android/metrics/LogMaker.java b/core/java/android/metrics/LogMaker.java index 5496e17206d9..19848ee6d415 100644 --- a/core/java/android/metrics/LogMaker.java +++ b/core/java/android/metrics/LogMaker.java @@ -16,7 +16,6 @@ package android.metrics; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ComponentName; import android.util.Log; import android.util.SparseArray; @@ -32,7 +31,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; * @hide */ @SystemApi -@TestApi public class LogMaker { private static final String TAG = "LogBuilder"; diff --git a/core/java/android/metrics/MetricsReader.java b/core/java/android/metrics/MetricsReader.java index 27f9a5dbf51c..5f356ca00d88 100644 --- a/core/java/android/metrics/MetricsReader.java +++ b/core/java/android/metrics/MetricsReader.java @@ -16,7 +16,6 @@ package android.metrics; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.util.EventLog; import com.android.internal.annotations.VisibleForTesting; @@ -36,7 +35,6 @@ import java.util.concurrent.TimeUnit; * @hide */ @SystemApi -@TestApi public class MetricsReader { private Queue<LogMaker> mPendingQueue = new LinkedList<>(); private Queue<LogMaker> mSeenQueue = new LinkedList<>(); diff --git a/core/java/android/net/CaptivePortal.java b/core/java/android/net/CaptivePortal.java index 8afeb3033cdb..c2586fa0c825 100644 --- a/core/java/android/net/CaptivePortal.java +++ b/core/java/android/net/CaptivePortal.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; @@ -42,7 +41,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_RETURN_DISMISSED = 0; /** * Response code from the captive portal application, indicating that the user did not login and @@ -52,7 +50,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_RETURN_UNWANTED = 1; /** * Response code from the captive portal application, indicating that the user does not wish to @@ -62,7 +59,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_RETURN_WANTED_AS_IS = 2; /** Event offset of request codes from captive portal application. */ private static final int APP_REQUEST_BASE = 100; @@ -74,7 +70,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int APP_REQUEST_REEVALUATION_REQUIRED = APP_REQUEST_BASE + 0; private final IBinder mBinder; @@ -154,7 +149,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public void useNetwork() { try { ICaptivePortal.Stub.asInterface(mBinder).appResponse(APP_RETURN_WANTED_AS_IS); @@ -167,7 +161,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void reevaluateNetwork() { try { @@ -183,7 +176,6 @@ public class CaptivePortal implements Parcelable { * @hide */ @SystemApi - @TestApi public void logEvent(@EventId int eventId, @NonNull String packageName) { try { ICaptivePortal.Stub.asInterface(mBinder).logEvent(eventId, packageName); diff --git a/core/java/android/net/CaptivePortalData.java b/core/java/android/net/CaptivePortalData.java index 1357803a6cb8..c443c7500f1d 100644 --- a/core/java/android/net/CaptivePortalData.java +++ b/core/java/android/net/CaptivePortalData.java @@ -19,7 +19,6 @@ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class CaptivePortalData implements Parcelable { private final long mRefreshTimeMillis; @Nullable diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index a29f8782601e..7bede46b11bc 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -269,7 +269,6 @@ public class ConnectivityManager { * {@hide} */ @SystemApi - @TestApi public static final String EXTRA_CAPTIVE_PORTAL_PROBE_SPEC = "android.net.extra.CAPTIVE_PORTAL_PROBE_SPEC"; @@ -278,7 +277,6 @@ public class ConnectivityManager { * {@hide} */ @SystemApi - @TestApi public static final String EXTRA_CAPTIVE_PORTAL_USER_AGENT = "android.net.extra.CAPTIVE_PORTAL_USER_AGENT"; @@ -4361,7 +4359,6 @@ public class ConnectivityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(@NonNull Network network, @NonNull Bundle appExtras) { try { diff --git a/core/java/android/net/EthernetManager.java b/core/java/android/net/EthernetManager.java index d975017f9c8e..5860e20ad3b4 100644 --- a/core/java/android/net/EthernetManager.java +++ b/core/java/android/net/EthernetManager.java @@ -37,7 +37,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.ETHERNET_SERVICE) public class EthernetManager { private static final String TAG = "EthernetManager"; diff --git a/core/java/android/net/IpPrefix.java b/core/java/android/net/IpPrefix.java index 8cfe6df678c7..e7c801475c4d 100644 --- a/core/java/android/net/IpPrefix.java +++ b/core/java/android/net/IpPrefix.java @@ -19,7 +19,6 @@ package android.net; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.Pair; @@ -88,7 +87,6 @@ public final class IpPrefix implements Parcelable { * @hide */ @SystemApi - @TestApi public IpPrefix(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength) { // We don't reuse the (byte[], int) constructor because it calls clone() on the byte array, // which is unnecessary because getAddress() already returns a clone. @@ -107,7 +105,6 @@ public final class IpPrefix implements Parcelable { * @hide */ @SystemApi - @TestApi public IpPrefix(@NonNull String prefix) { // We don't reuse the (InetAddress, int) constructor because "error: call to this must be // first statement in constructor". We could factor out setting the member variables to an diff --git a/core/java/android/net/LinkAddress.java b/core/java/android/net/LinkAddress.java index a9d7f17017c4..44d25a1ab0af 100644 --- a/core/java/android/net/LinkAddress.java +++ b/core/java/android/net/LinkAddress.java @@ -30,7 +30,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Parcel; @@ -158,7 +157,6 @@ public class LinkAddress implements Parcelable { * @return true if the address is IPv6. * @hide */ - @TestApi @SystemApi public boolean isIpv6() { return address instanceof Inet6Address; @@ -180,7 +178,6 @@ public class LinkAddress implements Parcelable { * @return true if the address is IPv4 or is a mapped IPv4 address. * @hide */ - @TestApi @SystemApi public boolean isIpv4() { return address instanceof Inet4Address; @@ -243,7 +240,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength, int flags, int scope) { init(address, prefixLength, flags, scope, LIFETIME_UNKNOWN, LIFETIME_UNKNOWN); @@ -275,7 +271,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength, int flags, int scope, long deprecationTime, long expirationTime) { init(address, prefixLength, flags, scope, deprecationTime, expirationTime); @@ -289,7 +284,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull InetAddress address, @IntRange(from = 0, to = 128) int prefixLength) { this(address, prefixLength, 0, 0); @@ -314,7 +308,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull String address) { this(address, 0, 0); this.scope = scopeForUnicastAddress(this.address); @@ -329,7 +322,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkAddress(@NonNull String address, int flags, int scope) { // This may throw an IllegalArgumentException; catching it is the caller's responsibility. // TODO: consider rejecting mapped IPv4 addresses such as "::ffff:192.0.2.5/24". @@ -389,7 +381,6 @@ public class LinkAddress implements Parcelable { * otherwise. * @hide */ - @TestApi @SystemApi public boolean isSameAddressAs(@Nullable LinkAddress other) { if (other == null) { @@ -469,7 +460,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public long getDeprecationTime() { return deprecationTime; } @@ -485,7 +475,6 @@ public class LinkAddress implements Parcelable { * @hide */ @SystemApi - @TestApi public long getExpirationTime() { return expirationTime; } @@ -496,7 +485,6 @@ public class LinkAddress implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean isGlobalPreferred() { /** diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index 651494d1c99c..616ccbe50213 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -19,10 +19,8 @@ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.util.LinkPropertiesUtils; -import android.net.util.LinkPropertiesUtils.CompareResult; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; @@ -162,7 +160,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkProperties(@Nullable LinkProperties source) { this(source, false /* parcelSensitiveFields */); } @@ -178,7 +175,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public LinkProperties(@Nullable LinkProperties source, boolean parcelSensitiveFields) { mParcelSensitiveFields = parcelSensitiveFields; if (source == null) return; @@ -293,7 +289,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public boolean addLinkAddress(@NonNull LinkAddress address) { if (address == null) { return false; @@ -322,7 +317,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public boolean removeLinkAddress(@NonNull LinkAddress toRemove) { int i = findLinkAddressIndex(toRemove); if (i >= 0) { @@ -376,7 +370,6 @@ public final class LinkProperties implements Parcelable { * @return true if the DNS server was added, false if it was already present. * @hide */ - @TestApi @SystemApi public boolean addDnsServer(@NonNull InetAddress dnsServer) { if (dnsServer != null && !mDnses.contains(dnsServer)) { @@ -393,7 +386,6 @@ public final class LinkProperties implements Parcelable { * @return true if the DNS server was removed, false if it did not exist. * @hide */ - @TestApi @SystemApi public boolean removeDnsServer(@NonNull InetAddress dnsServer) { return mDnses.remove(dnsServer); @@ -428,7 +420,6 @@ public final class LinkProperties implements Parcelable { * @param usePrivateDns The private DNS state. * @hide */ - @TestApi @SystemApi public void setUsePrivateDns(boolean usePrivateDns) { mUsePrivateDns = usePrivateDns; @@ -455,7 +446,6 @@ public final class LinkProperties implements Parcelable { * @param privateDnsServerName The private DNS server name. * @hide */ - @TestApi @SystemApi public void setPrivateDnsServerName(@Nullable String privateDnsServerName) { mPrivateDnsServerName = privateDnsServerName; @@ -534,7 +524,6 @@ public final class LinkProperties implements Parcelable { * object. * @hide */ - @TestApi @SystemApi public void setValidatedPrivateDnsServers(@NonNull Collection<InetAddress> dnsServers) { mValidatedPrivateDnses.clear(); @@ -551,7 +540,6 @@ public final class LinkProperties implements Parcelable { * DNS servers on this link. * @hide */ - @TestApi @SystemApi public @NonNull List<InetAddress> getValidatedPrivateDnsServers() { return Collections.unmodifiableList(mValidatedPrivateDnses); @@ -592,7 +580,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public void setPcscfServers(@NonNull Collection<InetAddress> pcscfServers) { mPcscfs.clear(); for (InetAddress pcscfServer: pcscfServers) { @@ -608,7 +595,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public @NonNull List<InetAddress> getPcscfServers() { return Collections.unmodifiableList(mPcscfs); } @@ -662,7 +648,6 @@ public final class LinkProperties implements Parcelable { * * @hide */ - @TestApi @SystemApi public void setTcpBufferSizes(@Nullable String tcpBufferSizes) { mTcpBufferSizes = tcpBufferSizes; @@ -675,7 +660,6 @@ public final class LinkProperties implements Parcelable { * * @hide */ - @TestApi @SystemApi public @Nullable String getTcpBufferSizes() { return mTcpBufferSizes; @@ -744,7 +728,6 @@ public final class LinkProperties implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean removeRoute(@NonNull RouteInfo route) { return Objects.equals(mIfaceName, route.getInterface()) && mRoutes.remove(route); @@ -1021,7 +1004,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv4 address, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean hasIpv4Address() { for (LinkAddress address : mLinkAddresses) { @@ -1062,7 +1044,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is a global preferred IPv6 address, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean hasGlobalIpv6Address() { for (LinkAddress address : mLinkAddresses) { @@ -1149,7 +1130,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if there is an IPv6 default route, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean hasIpv6DefaultRoute() { for (RouteInfo r : mRoutes) { @@ -1265,7 +1245,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if the link is provisioned, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isIpv4Provisioned() { return (hasIpv4Address() @@ -1280,7 +1259,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if the link is provisioned, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isIpv6Provisioned() { return (hasGlobalIpv6Address() @@ -1308,7 +1286,6 @@ public final class LinkProperties implements Parcelable { * @return {@code true} if the link is provisioned, {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isProvisioned() { return (isIpv4Provisioned() || isIpv6Provisioned()); @@ -1321,7 +1298,6 @@ public final class LinkProperties implements Parcelable { * {@code false} otherwise. * @hide */ - @TestApi @SystemApi public boolean isReachable(@NonNull InetAddress ip) { final List<RouteInfo> allRoutes = getAllRoutes(); @@ -1578,7 +1554,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public void setCaptivePortalApiUrl(@Nullable Uri url) { mCaptivePortalApiUrl = url; } @@ -1593,7 +1568,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi @Nullable public Uri getCaptivePortalApiUrl() { return mCaptivePortalApiUrl; @@ -1604,7 +1578,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi public void setCaptivePortalData(@Nullable CaptivePortalData data) { mCaptivePortalData = data; } @@ -1618,7 +1591,6 @@ public final class LinkProperties implements Parcelable { * @hide */ @SystemApi - @TestApi @Nullable public CaptivePortalData getCaptivePortalData() { return mCaptivePortalData; @@ -1669,78 +1641,6 @@ public final class LinkProperties implements Parcelable { } /** - * Compares the DNS addresses in this LinkProperties with another - * LinkProperties, examining only DNS addresses on the base link. - * - * @param target a LinkProperties with the new list of dns addresses - * @return the differences between the DNS addresses. - * @hide - */ - public @NonNull CompareResult<InetAddress> compareDnses(@Nullable LinkProperties target) { - /* - * Duplicate the InetAddresses into removed, we will be removing - * dns address which are common between mDnses and target - * leaving the addresses that are different. And dns address which - * are in target but not in mDnses are placed in the - * addedAddresses. - */ - return new CompareResult<>(mDnses, target != null ? target.getDnsServers() : null); - } - - /** - * Compares the validated private DNS addresses in this LinkProperties with another - * LinkProperties. - * - * @param target a LinkProperties with the new list of validated private dns addresses - * @return the differences between the DNS addresses. - * @hide - */ - public @NonNull CompareResult<InetAddress> compareValidatedPrivateDnses( - @Nullable LinkProperties target) { - return new CompareResult<>(mValidatedPrivateDnses, - target != null ? target.getValidatedPrivateDnsServers() : null); - } - - /** - * Compares all routes in this LinkProperties with another LinkProperties, - * examining both the the base link and all stacked links. - * - * @param target a LinkProperties with the new list of routes - * @return the differences between the routes. - * @hide - */ - public @NonNull CompareResult<RouteInfo> compareAllRoutes(@Nullable LinkProperties target) { - /* - * Duplicate the RouteInfos into removed, we will be removing - * routes which are common between mRoutes and target - * leaving the routes that are different. And route address which - * are in target but not in mRoutes are placed in added. - */ - return new CompareResult<>(getAllRoutes(), target != null ? target.getAllRoutes() : null); - } - - /** - * Compares all interface names in this LinkProperties with another - * LinkProperties, examining both the the base link and all stacked links. - * - * @param target a LinkProperties with the new list of interface names - * @return the differences between the interface names. - * @hide - */ - public @NonNull CompareResult<String> compareAllInterfaceNames( - @Nullable LinkProperties target) { - /* - * Duplicate the interface names into removed, we will be removing - * interface names which are common between this and target - * leaving the interface names that are different. And interface names which - * are in target but not in this are placed in added. - */ - return new CompareResult<>(getAllInterfaceNames(), - target != null ? target.getAllInterfaceNames() : null); - } - - - /** * Generate hashcode based on significant fields * * Equal objects must produce the same hash code, while unequal objects diff --git a/core/java/android/net/MatchAllNetworkSpecifier.java b/core/java/android/net/MatchAllNetworkSpecifier.java index 68a39355198b..70c4a7235b9d 100644 --- a/core/java/android/net/MatchAllNetworkSpecifier.java +++ b/core/java/android/net/MatchAllNetworkSpecifier.java @@ -43,7 +43,8 @@ public final class MatchAllNetworkSpecifier extends NetworkSpecifier implements } /** @hide */ - public boolean satisfiedBy(NetworkSpecifier other) { + @Override + public boolean canBeSatisfiedBy(NetworkSpecifier other) { /* * The method is called by a NetworkRequest to see if it is satisfied by a proposed * network (e.g. as offered by a network factory). Since MatchAllNetweorkSpecifier must diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index f807a4968d72..7bee05c9cd0a 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -18,7 +18,6 @@ package android.net; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -126,7 +125,6 @@ public class Network implements Parcelable { * @hide */ @SystemApi - @TestApi public Network(@NonNull Network that) { this(that.netId, that.mPrivateDnsBypass); } @@ -163,7 +161,6 @@ public class Network implements Parcelable { * * @hide */ - @TestApi @SystemApi public @NonNull Network getPrivateDnsBypassingCopy() { return new Network(netId, true); @@ -174,7 +171,6 @@ public class Network implements Parcelable { * * @hide */ - @TestApi @SystemApi public int getNetId() { return netId; diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 004f84422b44..be33f4edb5d1 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -850,7 +850,6 @@ public final class NetworkCapabilities implements Parcelable { * @return an array of transport type values for this instance. * @hide */ - @TestApi @SystemApi @NonNull public @Transport int[] getTransportTypes() { return BitUtils.unpackBits(mTransportTypes); @@ -1025,7 +1024,6 @@ public final class NetworkCapabilities implements Parcelable { */ @NonNull @SystemApi - @TestApi public int[] getAdministratorUids() { return Arrays.copyOf(mAdministratorUids, mAdministratorUids.length); } @@ -1506,7 +1504,6 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable String getSsid() { return mSSID; } @@ -1590,7 +1587,6 @@ public final class NetworkCapabilities implements Parcelable { * * @hide */ - @TestApi @SystemApi public boolean satisfiedByNetworkCapabilities(@Nullable NetworkCapabilities nc) { return satisfiedByNetworkCapabilities(nc, false); @@ -2136,7 +2132,6 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ @SystemApi - @TestApi public static final class Builder { private final NetworkCapabilities mCaps; diff --git a/core/java/android/net/NetworkStack.java b/core/java/android/net/NetworkStack.java index 86f3dfd412f6..79f9e6ef2a97 100644 --- a/core/java/android/net/NetworkStack.java +++ b/core/java/android/net/NetworkStack.java @@ -33,7 +33,6 @@ import java.util.Arrays; * @hide */ @SystemApi -@TestApi public class NetworkStack { /** * Permission granted only to the NetworkStack APK, defined in NetworkStackStub with signature @@ -41,7 +40,6 @@ public class NetworkStack { * @hide */ @SystemApi - @TestApi public static final String PERMISSION_MAINLINE_NETWORK_STACK = "android.permission.MAINLINE_NETWORK_STACK"; @@ -54,7 +52,6 @@ public class NetworkStack { */ @Nullable @SystemApi - @TestApi public static IBinder getService() { final IBinder mockService = sMockService; if (mockService != null) return mockService; diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java index 98760761736d..62aebb01805c 100644 --- a/core/java/android/net/RouteInfo.java +++ b/core/java/android/net/RouteInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.util.NetUtils; import android.os.Build; @@ -87,17 +86,14 @@ public final class RouteInfo implements Parcelable { /** Unicast route. @hide */ @SystemApi - @TestApi public static final int RTN_UNICAST = 1; /** Unreachable route. @hide */ @SystemApi - @TestApi public static final int RTN_UNREACHABLE = 7; /** Throw route. @hide */ @SystemApi - @TestApi public static final int RTN_THROW = 9; /** @@ -135,7 +131,6 @@ public final class RouteInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public RouteInfo(@Nullable IpPrefix destination, @Nullable InetAddress gateway, @Nullable String iface, @RouteType int type) { this(destination, gateway, iface, type, 0); @@ -397,7 +392,6 @@ public final class RouteInfo implements Parcelable { * * @hide */ - @TestApi @SystemApi @RouteType public int getType() { diff --git a/core/java/android/net/StaticIpConfiguration.java b/core/java/android/net/StaticIpConfiguration.java index a973455baa04..f56d656f07ed 100644 --- a/core/java/android/net/StaticIpConfiguration.java +++ b/core/java/android/net/StaticIpConfiguration.java @@ -19,7 +19,6 @@ package android.net; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -52,7 +51,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class StaticIpConfiguration implements Parcelable { /** @hide */ @UnsupportedAppUsage diff --git a/core/java/android/net/apf/ApfCapabilities.java b/core/java/android/net/apf/ApfCapabilities.java index b1de74e817bc..c4eba15ff7a9 100644 --- a/core/java/android/net/apf/ApfCapabilities.java +++ b/core/java/android/net/apf/ApfCapabilities.java @@ -19,7 +19,6 @@ package android.net.apf; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.res.Resources; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ import com.android.internal.R; * @hide */ @SystemApi -@TestApi public final class ApfCapabilities implements Parcelable { /** * Version of APF instruction set supported for packet filtering. 0 indicates no support for diff --git a/core/java/android/net/metrics/ApfProgramEvent.java b/core/java/android/net/metrics/ApfProgramEvent.java index f93907a37f3f..c50bae90488b 100644 --- a/core/java/android/net/metrics/ApfProgramEvent.java +++ b/core/java/android/net/metrics/ApfProgramEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -40,7 +39,6 @@ import java.util.List; * the APF program in place with a new APF program. * {@hide} */ -@TestApi @SystemApi public final class ApfProgramEvent implements IpConnectivityLog.Event { diff --git a/core/java/android/net/metrics/ApfStats.java b/core/java/android/net/metrics/ApfStats.java index b221cb97b28f..2a601b273ef4 100644 --- a/core/java/android/net/metrics/ApfStats.java +++ b/core/java/android/net/metrics/ApfStats.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import android.os.Parcelable; * {@hide} */ @SystemApi -@TestApi public final class ApfStats implements IpConnectivityLog.Event { /** @@ -126,7 +124,6 @@ public final class ApfStats implements IpConnectivityLog.Event { * @hide */ @SystemApi - @TestApi public static final class Builder { private long mDurationMs; private int mReceivedRas; diff --git a/core/java/android/net/metrics/DhcpClientEvent.java b/core/java/android/net/metrics/DhcpClientEvent.java index 8fc1ef80bba9..e0a93dd1c18f 100644 --- a/core/java/android/net/metrics/DhcpClientEvent.java +++ b/core/java/android/net/metrics/DhcpClientEvent.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import android.text.TextUtils; * {@hide} */ @SystemApi -@TestApi public final class DhcpClientEvent implements IpConnectivityLog.Event { // Names for recording DhcpClient pseudo-state transitions. diff --git a/core/java/android/net/metrics/DhcpErrorEvent.java b/core/java/android/net/metrics/DhcpErrorEvent.java index 32efb5adafcd..de3129d5e94d 100644 --- a/core/java/android/net/metrics/DhcpErrorEvent.java +++ b/core/java/android/net/metrics/DhcpErrorEvent.java @@ -18,7 +18,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -30,7 +29,6 @@ import com.android.internal.util.MessageUtils; * {@hide} */ @SystemApi -@TestApi public final class DhcpErrorEvent implements IpConnectivityLog.Event { public static final int L2_ERROR = 1; public static final int L3_ERROR = 2; diff --git a/core/java/android/net/metrics/IpConnectivityLog.java b/core/java/android/net/metrics/IpConnectivityLog.java index 680c01573f98..a008d855025a 100644 --- a/core/java/android/net/metrics/IpConnectivityLog.java +++ b/core/java/android/net/metrics/IpConnectivityLog.java @@ -18,7 +18,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.ConnectivityMetricsEvent; import android.net.IIpConnectivityMetrics; import android.net.Network; @@ -35,7 +34,6 @@ import com.android.internal.util.BitUtils; * {@hide} */ @SystemApi -@TestApi public class IpConnectivityLog { private static final String TAG = IpConnectivityLog.class.getSimpleName(); private static final boolean DBG = false; @@ -52,7 +50,6 @@ public class IpConnectivityLog { /** @hide */ @SystemApi - @TestApi public IpConnectivityLog() { } diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java index f14abb895cb4..4f7f3263117b 100644 --- a/core/java/android/net/metrics/IpManagerEvent.java +++ b/core/java/android/net/metrics/IpManagerEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -36,7 +35,6 @@ import java.lang.annotation.RetentionPolicy; * {@hide} */ @SystemApi -@TestApi public final class IpManagerEvent implements IpConnectivityLog.Event { public static final int PROVISIONING_OK = 1; diff --git a/core/java/android/net/metrics/IpReachabilityEvent.java b/core/java/android/net/metrics/IpReachabilityEvent.java index 79e01d7116b6..d5003badd614 100644 --- a/core/java/android/net/metrics/IpReachabilityEvent.java +++ b/core/java/android/net/metrics/IpReachabilityEvent.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -32,7 +31,6 @@ import com.android.internal.util.MessageUtils; * {@hide} */ @SystemApi -@TestApi public final class IpReachabilityEvent implements IpConnectivityLog.Event { // Event types. diff --git a/core/java/android/net/metrics/NetworkEvent.java b/core/java/android/net/metrics/NetworkEvent.java index fe603cf9305c..8c28f7a7d643 100644 --- a/core/java/android/net/metrics/NetworkEvent.java +++ b/core/java/android/net/metrics/NetworkEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -34,7 +33,6 @@ import java.lang.annotation.RetentionPolicy; * {@hide} */ @SystemApi -@TestApi public final class NetworkEvent implements IpConnectivityLog.Event { public static final int NETWORK_CONNECTED = 1; diff --git a/core/java/android/net/metrics/RaEvent.java b/core/java/android/net/metrics/RaEvent.java index 661f648fc74e..b54874f5a573 100644 --- a/core/java/android/net/metrics/RaEvent.java +++ b/core/java/android/net/metrics/RaEvent.java @@ -19,7 +19,6 @@ package android.net.metrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -28,7 +27,6 @@ import android.os.Parcelable; * {@hide} */ @SystemApi -@TestApi public final class RaEvent implements IpConnectivityLog.Event { private static final long NO_LIFETIME = -1L; diff --git a/core/java/android/net/metrics/ValidationProbeEvent.java b/core/java/android/net/metrics/ValidationProbeEvent.java index 8fab64ae6c4e..7f4e4a73677e 100644 --- a/core/java/android/net/metrics/ValidationProbeEvent.java +++ b/core/java/android/net/metrics/ValidationProbeEvent.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.SparseArray; @@ -35,7 +34,6 @@ import java.lang.annotation.RetentionPolicy; * {@hide} */ @SystemApi -@TestApi public final class ValidationProbeEvent implements IpConnectivityLog.Event { public static final int PROBE_DNS = 0; diff --git a/core/java/android/net/util/SocketUtils.java b/core/java/android/net/util/SocketUtils.java index 696708408c22..e64060f1b220 100644 --- a/core/java/android/net/util/SocketUtils.java +++ b/core/java/android/net/util/SocketUtils.java @@ -22,7 +22,6 @@ import static android.system.OsConstants.SO_BINDTODEVICE; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.NetworkUtils; import android.system.ErrnoException; import android.system.NetlinkSocketAddress; @@ -40,7 +39,6 @@ import java.net.SocketAddress; * @hide */ @SystemApi -@TestApi public final class SocketUtils { /** * Create a raw datagram socket that is bound to an interface. diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 12ec0a0c21d5..9a16d3fee600 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -20,7 +20,6 @@ import android.Manifest.permission; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Intent; @@ -392,7 +391,6 @@ public class BatteryManager { */ @RequiresPermission(permission.POWER_SAVER) @SystemApi - @TestApi public boolean setChargingStateUpdateDelayMillis(int delayMillis) { try { return mBatteryStats.setChargingStateUpdateDelayMillis(delayMillis); diff --git a/core/java/android/os/BugreportManager.java b/core/java/android/os/BugreportManager.java index 9e996d15fa84..fe4d7296503f 100644 --- a/core/java/android/os/BugreportManager.java +++ b/core/java/android/os/BugreportManager.java @@ -24,13 +24,13 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.os.Handler; import android.util.Log; import android.widget.Toast; + import com.android.internal.R; import com.android.internal.util.Preconditions; @@ -48,7 +48,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.BUGREPORT_SERVICE) public final class BugreportManager { diff --git a/core/java/android/os/BugreportParams.java b/core/java/android/os/BugreportParams.java index c834781346f6..279ccae7c94f 100644 --- a/core/java/android/os/BugreportParams.java +++ b/core/java/android/os/BugreportParams.java @@ -18,7 +18,6 @@ package android.os; import android.annotation.IntDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -29,7 +28,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class BugreportParams { private final int mMode; diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 9e13f05129a2..11665fbefdad 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -235,7 +235,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getOemDirectory() { return DIR_OEM_ROOT; } @@ -247,7 +246,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getOdmDirectory() { return DIR_ODM_ROOT; } @@ -258,7 +256,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getVendorDirectory() { return DIR_VENDOR_ROOT; } @@ -270,7 +267,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getProductDirectory() { return DIR_PRODUCT_ROOT; } @@ -297,7 +293,6 @@ public class Environment { * @hide */ @SystemApi - @TestApi public static @NonNull File getSystemExtDirectory() { return DIR_SYSTEM_EXT_ROOT; } diff --git a/core/java/android/os/HidlMemory.java b/core/java/android/os/HidlMemory.java index 02d1e0ce9109..26fc6f0ae4ce 100644 --- a/core/java/android/os/HidlMemory.java +++ b/core/java/android/os/HidlMemory.java @@ -20,7 +20,6 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.io.Closeable; import java.io.IOException; @@ -41,7 +40,6 @@ import java.io.IOException; * @hide */ @SystemApi -@TestApi public class HidlMemory implements Closeable { private final @NonNull String mName; private final long mSize; diff --git a/core/java/android/os/HwBinder.java b/core/java/android/os/HwBinder.java index 7c42c36e7747..3236816e8f40 100644 --- a/core/java/android/os/HwBinder.java +++ b/core/java/android/os/HwBinder.java @@ -17,7 +17,6 @@ package android.os; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import libcore.util.NativeAllocationRegistry; @@ -26,7 +25,6 @@ import java.util.NoSuchElementException; /** @hide */ @SystemApi -@TestApi public abstract class HwBinder implements IHwBinder { private static final String TAG = "HwBinder"; diff --git a/core/java/android/os/HwBlob.java b/core/java/android/os/HwBlob.java index 154227b2a786..a43fbdbde4d2 100644 --- a/core/java/android/os/HwBlob.java +++ b/core/java/android/os/HwBlob.java @@ -19,7 +19,6 @@ package android.os; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import libcore.util.NativeAllocationRegistry; @@ -30,7 +29,6 @@ import libcore.util.NativeAllocationRegistry; * @hide */ @SystemApi -@TestApi public class HwBlob { private static final String TAG = "HwBlob"; diff --git a/core/java/android/os/HwParcel.java b/core/java/android/os/HwParcel.java index 228548ad7802..9fd37d4548ac 100644 --- a/core/java/android/os/HwParcel.java +++ b/core/java/android/os/HwParcel.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import dalvik.annotation.optimization.FastNative; @@ -34,7 +33,6 @@ import java.util.Arrays; /** @hide */ @SystemApi -@TestApi public class HwParcel { private static final String TAG = "HwParcel"; diff --git a/core/java/android/os/IHwBinder.java b/core/java/android/os/IHwBinder.java index 46fa6ef3b783..249eb3aa3456 100644 --- a/core/java/android/os/IHwBinder.java +++ b/core/java/android/os/IHwBinder.java @@ -17,11 +17,9 @@ package android.os; import android.annotation.SystemApi; -import android.annotation.TestApi; /** @hide */ @SystemApi -@TestApi public interface IHwBinder { /** * Process a hwbinder transaction. diff --git a/core/java/android/os/IHwInterface.java b/core/java/android/os/IHwInterface.java index 0a5a71550b06..f21f6e30a041 100644 --- a/core/java/android/os/IHwInterface.java +++ b/core/java/android/os/IHwInterface.java @@ -17,11 +17,9 @@ package android.os; import android.annotation.SystemApi; -import android.annotation.TestApi; /** @hide */ @SystemApi -@TestApi public interface IHwInterface { /** * @return the binder object that corresponds to this interface. diff --git a/core/java/android/os/IncidentManager.java b/core/java/android/os/IncidentManager.java index 565d31a26dbc..a543a2d6a983 100644 --- a/core/java/android/os/IncidentManager.java +++ b/core/java/android/os/IncidentManager.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import android.net.Uri; import android.util.Slog; @@ -45,7 +44,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi @SystemService(Context.INCIDENT_SERVICE) public class IncidentManager { private static final String TAG = "IncidentManager"; @@ -159,7 +157,6 @@ public class IncidentManager { * @hide */ @SystemApi - @TestApi public static class PendingReport { /** * Encoded data. @@ -277,7 +274,6 @@ public class IncidentManager { * @hide */ @SystemApi - @TestApi public static class IncidentReport implements Parcelable, Closeable { private final long mTimestampNs; private final int mPrivacyPolicy; diff --git a/core/java/android/os/IncidentReportArgs.java b/core/java/android/os/IncidentReportArgs.java index 7e858e1dc390..73e4914ce6ae 100644 --- a/core/java/android/os/IncidentReportArgs.java +++ b/core/java/android/os/IncidentReportArgs.java @@ -18,7 +18,6 @@ package android.os; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.util.IntArray; @@ -30,7 +29,6 @@ import java.util.ArrayList; * {@hide} */ @SystemApi -@TestApi public final class IncidentReportArgs implements Parcelable { private final IntArray mSections = new IntArray(); diff --git a/core/java/android/os/NativeHandle.java b/core/java/android/os/NativeHandle.java index 8d341b603eb4..a26873a87552 100644 --- a/core/java/android/os/NativeHandle.java +++ b/core/java/android/os/NativeHandle.java @@ -20,7 +20,6 @@ import static android.system.OsConstants.F_DUPFD_CLOEXEC; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.system.ErrnoException; import android.system.Os; @@ -33,7 +32,6 @@ import java.io.FileDescriptor; * @hide */ @SystemApi -@TestApi public final class NativeHandle implements Closeable { // whether this object owns mFds private boolean mOwn = false; diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index be2de0edda2d..1af78a1ac3d0 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -27,7 +27,6 @@ import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -1565,7 +1564,6 @@ public final class PowerManager { * @see #isPowerSaveMode() */ @SystemApi - @TestApi @RequiresPermission(anyOf = { android.Manifest.permission.DEVICE_POWER, android.Manifest.permission.POWER_SAVER @@ -1610,7 +1608,6 @@ public final class PowerManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(permission.POWER_SAVER) public boolean setDynamicPowerSaveHint(boolean powerSaveHint, int disableThreshold) { try { @@ -1670,7 +1667,6 @@ public final class PowerManager { * @hide */ @SystemApi - @TestApi public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; /** @@ -1683,7 +1679,6 @@ public final class PowerManager { * @hide */ @SystemApi - @TestApi public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; /** @hide */ @@ -1708,7 +1703,6 @@ public final class PowerManager { */ @AutoPowerSaveModeTriggers @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.POWER_SAVER) public int getPowerSaveModeTrigger() { try { diff --git a/core/java/android/os/RemoteCallback.java b/core/java/android/os/RemoteCallback.java index 373060f4ff4b..49f84adf2c21 100644 --- a/core/java/android/os/RemoteCallback.java +++ b/core/java/android/os/RemoteCallback.java @@ -19,14 +19,12 @@ package android.os; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; /** * @hide */ @SystemApi -@TestApi public final class RemoteCallback implements Parcelable { public interface OnResultListener { diff --git a/core/java/android/os/SystemConfigManager.java b/core/java/android/os/SystemConfigManager.java index 12a1ffaf69c1..3f0632be90d1 100644 --- a/core/java/android/os/SystemConfigManager.java +++ b/core/java/android/os/SystemConfigManager.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.content.Context; import android.util.ArraySet; import android.util.Log; @@ -40,7 +39,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi @SystemService(Context.SYSTEM_CONFIG_SERVICE) public class SystemConfigManager { private static final String TAG = SystemConfigManager.class.getSimpleName(); diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java index c5e5cc40d54e..a16452705efc 100644 --- a/core/java/android/os/SystemProperties.java +++ b/core/java/android/os/SystemProperties.java @@ -19,7 +19,6 @@ package android.os; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.util.Log; import android.util.MutableInt; @@ -52,7 +51,6 @@ import java.util.HashMap; * {@hide} */ @SystemApi -@TestApi public class SystemProperties { private static final String TAG = "SystemProperties"; private static final boolean TRACK_KEY_ACCESS = false; @@ -146,7 +144,6 @@ public class SystemProperties { */ @NonNull @SystemApi - @TestApi public static String get(@NonNull String key) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get(key); @@ -163,7 +160,6 @@ public class SystemProperties { */ @NonNull @SystemApi - @TestApi public static String get(@NonNull String key, @Nullable String def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get(key, def); @@ -179,7 +175,6 @@ public class SystemProperties { * @hide */ @SystemApi - @TestApi public static int getInt(@NonNull String key, int def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get_int(key, def); @@ -195,7 +190,6 @@ public class SystemProperties { * @hide */ @SystemApi - @TestApi public static long getLong(@NonNull String key, long def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get_long(key, def); @@ -216,7 +210,6 @@ public class SystemProperties { * @hide */ @SystemApi - @TestApi public static boolean getBoolean(@NonNull String key, boolean def) { if (TRACK_KEY_ACCESS) onKeyAccess(key); return native_get_boolean(key, def); diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index b92fb47d1112..5357cf373a84 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -44,7 +44,6 @@ public final class UserHandle implements Parcelable { /** @hide A user handle to indicate all users on the device */ @SystemApi - @TestApi public static final @NonNull UserHandle ALL = new UserHandle(USER_ALL); /** @hide A user id to indicate the currently active user */ @@ -53,7 +52,6 @@ public final class UserHandle implements Parcelable { /** @hide A user handle to indicate the current user of the device */ @SystemApi - @TestApi public static final @NonNull UserHandle CURRENT = new UserHandle(USER_CURRENT); /** @hide A user id to indicate that we would like to send to the current @@ -104,7 +102,6 @@ public final class UserHandle implements Parcelable { /** @hide A user handle to indicate the "system" user of the device */ @SystemApi - @TestApi public static final @NonNull UserHandle SYSTEM = new UserHandle(USER_SYSTEM); /** @@ -257,7 +254,6 @@ public final class UserHandle implements Parcelable { } /** @hide */ - @TestApi @SystemApi public static UserHandle of(@UserIdInt int userId) { if (userId == USER_SYSTEM) { @@ -302,7 +298,6 @@ public final class UserHandle implements Parcelable { * Returns the app id (or base uid) for a given uid, stripping out the user id from it. * @hide */ - @TestApi @SystemApi public static @AppIdInt int getAppId(int uid) { return uid % PER_USER_RANGE; @@ -460,7 +455,6 @@ public final class UserHandle implements Parcelable { * @hide */ @SystemApi - @TestApi public static @UserIdInt int myUserId() { return getUserId(Process.myUid()); } @@ -499,7 +493,6 @@ public final class UserHandle implements Parcelable { * @hide */ @SystemApi - @TestApi public @UserIdInt int getIdentifier() { return mHandle; } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 2465b0e41876..6bd05e3e7745 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -43,7 +43,6 @@ import android.content.IntentFilter; import android.content.IntentSender; import android.content.pm.UserInfo; import android.content.pm.UserInfo.UserInfoFlag; -import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -1408,8 +1407,7 @@ public class UserManager { * * @hide */ - @SystemApi - @TestApi // To allow seeing it from CTS. + @SystemApi // To allow seeing it from CTS. public static final String ACTION_USER_RESTRICTIONS_CHANGED = "android.os.action.USER_RESTRICTIONS_CHANGED"; diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java index 86d009e8607e..097b67259c4b 100644 --- a/core/java/android/os/Vibrator.java +++ b/core/java/android/os/Vibrator.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.ActivityThread; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -453,7 +452,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public boolean isVibrating() { return false; @@ -467,7 +465,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi public interface OnVibratorStateChangedListener { /** * Called when the vibrator state has changed. @@ -486,7 +483,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener(@NonNull OnVibratorStateChangedListener listener) { } @@ -500,7 +496,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void addVibratorStateListener( @NonNull @CallbackExecutor Executor executor, @@ -515,7 +510,6 @@ public abstract class Vibrator { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.ACCESS_VIBRATOR_STATE) public void removeVibratorStateListener(@NonNull OnVibratorStateChangedListener listener) { } diff --git a/core/java/android/os/WorkSource.java b/core/java/android/os/WorkSource.java index 6adba63f42ce..b7382b902e1c 100644 --- a/core/java/android/os/WorkSource.java +++ b/core/java/android/os/WorkSource.java @@ -98,7 +98,6 @@ public class WorkSource implements Parcelable { * @param uid the uid performing the work * @hide */ - @TestApi @SystemApi public WorkSource(int uid) { mNum = 1; @@ -152,7 +151,6 @@ public class WorkSource implements Parcelable { * Returns the number of uids in this work source. * @hide */ - @TestApi @SystemApi public int size() { return mNum; @@ -173,7 +171,6 @@ public class WorkSource implements Parcelable { * If {@code index} < 0 or {@code index} >= {@link #size() N}, then the behavior is undefined. * @hide */ - @TestApi @SystemApi public int getUid(int index) { return mUids[index]; @@ -209,7 +206,6 @@ public class WorkSource implements Parcelable { * If {@code index} < 0 or {@code index} >= {@link #size() N}, then the behavior is undefined. * @hide */ - @TestApi @SystemApi @Nullable public String getPackageName(int index) { @@ -455,7 +451,6 @@ public class WorkSource implements Parcelable { * @hide */ @SystemApi - @TestApi @NonNull public WorkSource withoutNames() { final WorkSource copy = new WorkSource(this); @@ -582,7 +577,6 @@ public class WorkSource implements Parcelable { * @hide for internal use only. */ @SystemApi - @TestApi public boolean isEmpty() { return mNum == 0 && (mChains == null || mChains.isEmpty()); } diff --git a/core/java/android/os/image/DynamicSystemClient.java b/core/java/android/os/image/DynamicSystemClient.java index 50d8d8079ed5..58268e2fc914 100644 --- a/core/java/android/os/image/DynamicSystemClient.java +++ b/core/java/android/os/image/DynamicSystemClient.java @@ -22,7 +22,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -68,7 +67,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public class DynamicSystemClient { /** @hide */ @IntDef(prefix = { "STATUS_" }, value = { @@ -286,7 +284,6 @@ public class DynamicSystemClient { * @hide */ @SystemApi - @TestApi public DynamicSystemClient(@NonNull Context context) { mContext = context; mConnection = new DynSystemServiceConnection(); @@ -322,7 +319,6 @@ public class DynamicSystemClient { */ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) @SystemApi - @TestApi public void bind() { if (!featureFlagEnabled()) { Slog.w(TAG, FeatureFlagUtils.DYNAMIC_SYSTEM + " not enabled; bind() aborted."); @@ -345,7 +341,6 @@ public class DynamicSystemClient { */ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) @SystemApi - @TestApi public void unbind() { if (!mBound) { return; @@ -381,7 +376,6 @@ public class DynamicSystemClient { */ @RequiresPermission(android.Manifest.permission.INSTALL_DYNAMIC_SYSTEM) @SystemApi - @TestApi public void start(@NonNull Uri systemUrl, @BytesLong long systemSize) { start(systemUrl, systemSize, 0 /* Use the default userdata size */); } diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 0abf8ae352af..00848b923395 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -43,7 +43,6 @@ import android.annotation.SdkConstant; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.annotation.WorkerThread; import android.app.Activity; import android.app.ActivityThread; @@ -1707,7 +1706,6 @@ public class StorageManager { * @hide */ @SystemApi - @TestApi public static boolean hasIsolatedStorage() { // Prefer to use snapshot for current boot when available return SystemProperties.getBoolean(PROP_ISOLATED_STORAGE_SNAPSHOT, diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index dea932dd6178..e6a55f6c32ec 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -77,7 +77,6 @@ import java.util.function.Consumer; * * @hide */ -@TestApi @SystemApi @SystemService(Context.PERMISSION_CONTROLLER_SERVICE) public final class PermissionControllerManager { diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index bf3d46fa4a44..b827ce5a49a7 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -24,7 +24,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.ActivityManager; import android.app.ActivityThread; import android.app.IActivityManager; @@ -56,7 +55,6 @@ import java.util.function.Consumer; * * @hide */ -@TestApi @SystemApi @SystemService(Context.PERMISSION_SERVICE) public final class PermissionManager { @@ -114,7 +112,6 @@ public final class PermissionManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(anyOf = { Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, @@ -135,7 +132,6 @@ public final class PermissionManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(anyOf = { Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, diff --git a/core/java/android/permission/RuntimePermissionPresentationInfo.java b/core/java/android/permission/RuntimePermissionPresentationInfo.java index d696feabfc30..4fce14cef3f0 100644 --- a/core/java/android/permission/RuntimePermissionPresentationInfo.java +++ b/core/java/android/permission/RuntimePermissionPresentationInfo.java @@ -18,7 +18,6 @@ package android.permission; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import com.android.internal.util.Preconditions; * * @hide */ -@TestApi @SystemApi public final class RuntimePermissionPresentationInfo implements Parcelable { private static final int FLAG_GRANTED = 1 << 0; diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java index e86aa62d00bc..2840960c6cab 100644 --- a/core/java/android/provider/DeviceConfig.java +++ b/core/java/android/provider/DeviceConfig.java @@ -55,7 +55,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public final class DeviceConfig { /** * The content:// style URL for the config table. @@ -107,7 +106,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_AUTOFILL = "autofill"; /** @@ -133,7 +131,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_CONTENT_CAPTURE = "content_capture"; /** @@ -217,7 +214,7 @@ public final class DeviceConfig { * * @hide */ - @SystemApi @TestApi + @SystemApi public static final String NAMESPACE_ROLLBACK = "rollback"; /** @@ -225,7 +222,7 @@ public final class DeviceConfig { * * @hide */ - @SystemApi @TestApi + @SystemApi public static final String NAMESPACE_ROLLBACK_BOOT = "rollback_boot"; /** @@ -370,7 +367,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_PRIVACY = "privacy"; /** @@ -379,7 +375,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_BIOMETRICS = "biometrics"; /** @@ -388,7 +383,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static final String NAMESPACE_PERMISSIONS = "permissions"; /** @@ -434,7 +428,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getProperty(@NonNull String namespace, @NonNull String name) { // Fetch all properties for the namespace at once and cache them in the local process, so we @@ -463,7 +456,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @NonNull @RequiresPermission(READ_DEVICE_CONFIG) public static Properties getProperties(@NonNull String namespace, @NonNull String ... names) { @@ -483,7 +475,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static String getString(@NonNull String namespace, @NonNull String name, @Nullable String defaultValue) { @@ -502,7 +493,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static boolean getBoolean(@NonNull String namespace, @NonNull String name, boolean defaultValue) { @@ -521,7 +511,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static int getInt(@NonNull String namespace, @NonNull String name, int defaultValue) { String value = getProperty(namespace, name); @@ -547,7 +536,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static long getLong(@NonNull String namespace, @NonNull String name, long defaultValue) { String value = getProperty(namespace, name); @@ -573,7 +561,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static float getFloat(@NonNull String namespace, @NonNull String name, float defaultValue) { @@ -609,7 +596,6 @@ public final class DeviceConfig { * @see #resetToDefaults(int, String). */ @SystemApi - @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static boolean setProperty(@NonNull String namespace, @NonNull String name, @Nullable String value, boolean makeDefault) { @@ -633,7 +619,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static boolean setProperties(@NonNull Properties properties) throws BadConfigException { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); @@ -653,7 +638,6 @@ public final class DeviceConfig { * @see #setProperty(String, String, String, boolean) */ @SystemApi - @TestApi @RequiresPermission(WRITE_DEVICE_CONFIG) public static void resetToDefaults(@ResetMode int resetMode, @Nullable String namespace) { ContentResolver contentResolver = ActivityThread.currentApplication().getContentResolver(); @@ -675,7 +659,6 @@ public final class DeviceConfig { * @see #removeOnPropertiesChangedListener(OnPropertiesChangedListener) */ @SystemApi - @TestApi @RequiresPermission(READ_DEVICE_CONFIG) public static void addOnPropertiesChangedListener( @NonNull String namespace, @@ -710,7 +693,6 @@ public final class DeviceConfig { * @see #addOnPropertiesChangedListener(String, Executor, OnPropertiesChangedListener) */ @SystemApi - @TestApi public static void removeOnPropertiesChangedListener( @NonNull OnPropertiesChangedListener onPropertiesChangedListener) { Preconditions.checkNotNull(onPropertiesChangedListener); @@ -845,7 +827,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public interface OnPropertiesChangedListener { /** * Called when one or more properties have changed, providing a Properties object with all @@ -866,7 +847,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static class BadConfigException extends Exception {} /** @@ -875,7 +855,6 @@ public final class DeviceConfig { * @hide */ @SystemApi - @TestApi public static class Properties { private final String mNamespace; private final HashMap<String, String> mMap; diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 75840a54e090..6c9b7d84e351 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -22,7 +22,6 @@ import static com.android.internal.util.Preconditions.checkCollectionNotEmpty; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ContentProvider; import android.content.ContentResolver; @@ -1303,7 +1302,6 @@ public final class DocumentsContract { * {@hide} */ @SystemApi - @TestApi public static @NonNull Uri setManageMode(@NonNull Uri uri) { Preconditions.checkNotNull(uri, "uri can not be null"); return uri.buildUpon().appendQueryParameter(PARAM_MANAGE, "true").build(); @@ -1315,7 +1313,6 @@ public final class DocumentsContract { * {@hide} */ @SystemApi - @TestApi public static boolean isManageMode(@NonNull Uri uri) { Preconditions.checkNotNull(uri, "uri can not be null"); return uri.getBooleanQueryParameter(PARAM_MANAGE, false); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 64d9c9dcc6e0..1857bdcadcf9 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -225,7 +225,6 @@ public final class Settings { */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) @SystemApi - @TestApi public static final String ACTION_TETHER_PROVISIONING_UI = "android.settings.TETHER_PROVISIONING_UI"; @@ -1034,7 +1033,6 @@ public final class Settings { * * @hide */ - @TestApi @SystemApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_MANAGE_APP_OVERLAY_PERMISSION = @@ -1998,7 +1996,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_ENTERPRISE_PRIVACY_SETTINGS = "android.settings.ENTERPRISE_PRIVACY_SETTINGS"; @@ -2081,7 +2078,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_REQUEST_ENABLE_CONTENT_CAPTURE = "android.settings.REQUEST_ENABLE_CONTENT_CAPTURE"; @@ -5553,7 +5549,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) public static void resetToDefaults(@NonNull ContentResolver resolver, @Nullable String tag) { @@ -6024,7 +6019,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_FEATURE_FIELD_CLASSIFICATION = "autofill_field_classification"; @@ -6058,7 +6052,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_USER_DATA_SIZE = "autofill_user_data_max_user_data_size"; @@ -6069,7 +6062,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_FIELD_CLASSIFICATION_IDS_SIZE = "autofill_user_data_max_field_classification_size"; @@ -6080,7 +6072,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_CATEGORY_COUNT = "autofill_user_data_max_category_count"; @@ -6090,7 +6081,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MAX_VALUE_LENGTH = "autofill_user_data_max_value_length"; @@ -6100,7 +6090,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_USER_DATA_MIN_VALUE_LENGTH = "autofill_user_data_min_value_length"; @@ -6150,7 +6139,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String USER_SETUP_COMPLETE = "user_setup_complete"; /** @@ -6515,7 +6503,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCK_SCREEN_ALLOW_PRIVATE_NOTIFICATIONS = "lock_screen_allow_private_notifications"; @@ -7755,7 +7742,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String DOZE_ALWAYS_ON = "doze_always_on"; /** @@ -8150,7 +8136,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCK_SCREEN_SHOW_NOTIFICATIONS = "lock_screen_show_notifications"; @@ -8823,7 +8808,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCATION_ACCESS_CHECK_INTERVAL_MILLIS = "location_access_check_interval_millis"; @@ -8832,7 +8816,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String LOCATION_ACCESS_CHECK_DELAY_MILLIS = "location_access_check_delay_millis"; @@ -10163,7 +10146,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String TETHER_OFFLOAD_DISABLED = "tether_offload_disabled"; /** @@ -13241,7 +13223,6 @@ public final class Settings { * @hide */ @SystemApi - @TestApi public static final String AUTOFILL_COMPAT_MODE_ALLOWED_PACKAGES = "autofill_compat_mode_allowed_packages"; diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java index a2489b9b68d9..daf0bcc9a553 100644 --- a/core/java/android/provider/Telephony.java +++ b/core/java/android/provider/Telephony.java @@ -4036,7 +4036,6 @@ public final class Telephony { * @hide */ @SystemApi - @TestApi public static final class CellBroadcasts implements BaseColumns { /** diff --git a/core/java/android/service/appprediction/AppPredictionService.java b/core/java/android/service/appprediction/AppPredictionService.java index be20570ef62d..2d8aee567010 100644 --- a/core/java/android/service/appprediction/AppPredictionService.java +++ b/core/java/android/service/appprediction/AppPredictionService.java @@ -22,7 +22,6 @@ import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.app.prediction.AppPredictionContext; import android.app.prediction.AppPredictionSessionId; @@ -52,7 +51,6 @@ import java.util.function.Consumer; * @hide */ @SystemApi -@TestApi public abstract class AppPredictionService extends Service { private static final String TAG = "AppPredictionService"; diff --git a/core/java/android/service/autofill/AutofillFieldClassificationService.java b/core/java/android/service/autofill/AutofillFieldClassificationService.java index 28842a7fa1d7..9d9b881ebdfc 100644 --- a/core/java/android/service/autofill/AutofillFieldClassificationService.java +++ b/core/java/android/service/autofill/AutofillFieldClassificationService.java @@ -20,7 +20,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.Bundle; @@ -53,7 +52,6 @@ import java.util.Map; * {@hide} */ @SystemApi -@TestApi public abstract class AutofillFieldClassificationService extends Service { private static final String TAG = "AutofillFieldClassificationService"; @@ -121,7 +119,6 @@ public abstract class AutofillFieldClassificationService extends Service { /** @hide */ @SystemApi - @TestApi public AutofillFieldClassificationService() { } diff --git a/core/java/android/service/autofill/Dataset.java b/core/java/android/service/autofill/Dataset.java index 2d99c413cc89..18d79927388b 100644 --- a/core/java/android/service/autofill/Dataset.java +++ b/core/java/android/service/autofill/Dataset.java @@ -21,7 +21,6 @@ import static android.view.autofill.Helper.sDebug; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.IntentSender; import android.os.Parcel; import android.os.Parcelable; @@ -249,7 +248,6 @@ public final class Dataset implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder(@NonNull InlinePresentation inlinePresentation) { Preconditions.checkNotNull(inlinePresentation, "inlinePresentation must be non-null"); mInlinePresentation = inlinePresentation; @@ -604,7 +602,6 @@ public final class Dataset implements Parcelable { * @hide */ @SystemApi - @TestApi public @NonNull Builder setFieldInlinePresentation(@NonNull AutofillId id, @Nullable AutofillValue value, @Nullable Pattern filter, @NonNull InlinePresentation inlinePresentation) { diff --git a/core/java/android/service/autofill/InlineSuggestionRenderService.java b/core/java/android/service/autofill/InlineSuggestionRenderService.java index 839caff5c3d4..cdcd65910974 100644 --- a/core/java/android/service/autofill/InlineSuggestionRenderService.java +++ b/core/java/android/service/autofill/InlineSuggestionRenderService.java @@ -20,7 +20,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.content.IntentSender; @@ -51,7 +50,6 @@ import java.lang.ref.WeakReference; * {@hide} */ @SystemApi -@TestApi public abstract class InlineSuggestionRenderService extends Service { private static final String TAG = "InlineSuggestionRenderService"; diff --git a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java index 95cc64ae8aab..6d09f0952068 100644 --- a/core/java/android/service/autofill/augmented/AugmentedAutofillService.java +++ b/core/java/android/service/autofill/augmented/AugmentedAutofillService.java @@ -25,7 +25,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.Intent; @@ -70,7 +69,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public abstract class AugmentedAutofillService extends Service { private static final String TAG = AugmentedAutofillService.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/FillCallback.java b/core/java/android/service/autofill/augmented/FillCallback.java index fc3baf1c9836..9fc7f34ec0ef 100644 --- a/core/java/android/service/autofill/augmented/FillCallback.java +++ b/core/java/android/service/autofill/augmented/FillCallback.java @@ -20,7 +20,6 @@ import static android.service.autofill.augmented.AugmentedAutofillService.sDebug import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.service.autofill.Dataset; import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy; @@ -34,7 +33,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public final class FillCallback { private static final String TAG = FillCallback.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/FillController.java b/core/java/android/service/autofill/augmented/FillController.java index 7d552d62fa72..7cd674e847fd 100644 --- a/core/java/android/service/autofill/augmented/FillController.java +++ b/core/java/android/service/autofill/augmented/FillController.java @@ -19,7 +19,6 @@ import static android.service.autofill.augmented.AugmentedAutofillService.sDebug import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy; import android.util.Log; @@ -37,7 +36,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public final class FillController { private static final String TAG = FillController.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/FillResponse.java b/core/java/android/service/autofill/augmented/FillResponse.java index f72eb782c407..53484cf200c4 100644 --- a/core/java/android/service/autofill/augmented/FillResponse.java +++ b/core/java/android/service/autofill/augmented/FillResponse.java @@ -18,7 +18,6 @@ package android.service.autofill.augmented; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.service.autofill.Dataset; @@ -33,7 +32,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi @DataClass( genBuilder = true, genHiddenGetters = true) diff --git a/core/java/android/service/autofill/augmented/FillWindow.java b/core/java/android/service/autofill/augmented/FillWindow.java index 8e866466e8df..d4f7e114c291 100644 --- a/core/java/android/service/autofill/augmented/FillWindow.java +++ b/core/java/android/service/autofill/augmented/FillWindow.java @@ -23,7 +23,6 @@ import static com.android.internal.util.function.pooled.PooledLambda.obtainMessa import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.graphics.Rect; import android.os.Handler; import android.os.Looper; @@ -64,7 +63,6 @@ import java.lang.ref.WeakReference; * @hide */ @SystemApi -@TestApi public final class FillWindow implements AutoCloseable { private static final String TAG = FillWindow.class.getSimpleName(); diff --git a/core/java/android/service/autofill/augmented/PresentationParams.java b/core/java/android/service/autofill/augmented/PresentationParams.java index 8b3a001f58e6..fe78d2218266 100644 --- a/core/java/android/service/autofill/augmented/PresentationParams.java +++ b/core/java/android/service/autofill/augmented/PresentationParams.java @@ -18,7 +18,6 @@ package android.service.autofill.augmented; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.graphics.Rect; import android.service.autofill.augmented.AugmentedAutofillService.AutofillProxy; import android.view.View; @@ -36,7 +35,6 @@ import java.io.PrintWriter; * @hide */ @SystemApi -@TestApi public abstract class PresentationParams { // /** @hide */ @@ -61,7 +59,6 @@ public abstract class PresentationParams { * @hide */ @SystemApi - @TestApi public abstract static class Area { /** @hide */ diff --git a/core/java/android/service/contentcapture/ActivityEvent.java b/core/java/android/service/contentcapture/ActivityEvent.java index b741cff9328e..1188a3f1021e 100644 --- a/core/java/android/service/contentcapture/ActivityEvent.java +++ b/core/java/android/service/contentcapture/ActivityEvent.java @@ -19,7 +19,6 @@ package android.service.contentcapture; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.usage.UsageEvents.Event; import android.content.ComponentName; import android.os.Parcel; @@ -34,7 +33,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ActivityEvent implements Parcelable { /** diff --git a/core/java/android/service/contentcapture/ContentCaptureService.java b/core/java/android/service/contentcapture/ContentCaptureService.java index b1f147be6735..94e1c8ed9534 100644 --- a/core/java/android/service/contentcapture/ContentCaptureService.java +++ b/core/java/android/service/contentcapture/ContentCaptureService.java @@ -26,7 +26,6 @@ import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.ContentCaptureOptions; @@ -74,7 +73,6 @@ import java.util.function.Consumer; * @hide */ @SystemApi -@TestApi public abstract class ContentCaptureService extends Service { private static final String TAG = ContentCaptureService.class.getSimpleName(); @@ -344,7 +342,6 @@ public abstract class ContentCaptureService extends Service { * @hide */ @SystemApi - @TestApi public void onDataShareRequest(@NonNull DataShareRequest request, @NonNull DataShareCallback callback) { if (sVerbose) Log.v(TAG, "onDataShareRequest()"); diff --git a/core/java/android/service/contentcapture/DataShareCallback.java b/core/java/android/service/contentcapture/DataShareCallback.java index 5df8a4b174bf..e3c7bb3cd24f 100644 --- a/core/java/android/service/contentcapture/DataShareCallback.java +++ b/core/java/android/service/contentcapture/DataShareCallback.java @@ -19,7 +19,6 @@ package android.service.contentcapture; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import java.util.concurrent.Executor; @@ -33,7 +32,6 @@ import java.util.concurrent.Executor; * @hide **/ @SystemApi -@TestApi public interface DataShareCallback { /** Accept the data share. diff --git a/core/java/android/service/contentcapture/DataShareReadAdapter.java b/core/java/android/service/contentcapture/DataShareReadAdapter.java index 8cd9eea1e6e0..4526aba6933b 100644 --- a/core/java/android/service/contentcapture/DataShareReadAdapter.java +++ b/core/java/android/service/contentcapture/DataShareReadAdapter.java @@ -18,7 +18,6 @@ package android.service.contentcapture; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.ParcelFileDescriptor; import android.view.contentcapture.ContentCaptureManager.DataShareError; @@ -29,7 +28,6 @@ import android.view.contentcapture.ContentCaptureManager.DataShareError; * @hide **/ @SystemApi -@TestApi public interface DataShareReadAdapter { /** diff --git a/core/java/android/service/contentcapture/SnapshotData.java b/core/java/android/service/contentcapture/SnapshotData.java index 5b3930ab6336..bf469b4b3ad8 100644 --- a/core/java/android/service/contentcapture/SnapshotData.java +++ b/core/java/android/service/contentcapture/SnapshotData.java @@ -19,7 +19,6 @@ package android.service.contentcapture; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.assist.AssistContent; import android.app.assist.AssistStructure; import android.os.Bundle; @@ -32,7 +31,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class SnapshotData implements Parcelable { private final @NonNull Bundle mAssistData; diff --git a/core/java/android/service/notification/Adjustment.java b/core/java/android/service/notification/Adjustment.java index 8464c6df4425..4b25c8832068 100644 --- a/core/java/android/service/notification/Adjustment.java +++ b/core/java/android/service/notification/Adjustment.java @@ -19,7 +19,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Notification; import android.os.Bundle; import android.os.Parcel; @@ -42,7 +41,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class Adjustment implements Parcelable { private final String mPackage; private final String mKey; @@ -148,7 +146,6 @@ public final class Adjustment implements Parcelable { * @hide */ @SystemApi - @TestApi public Adjustment(String pkg, String key, Bundle signals, CharSequence explanation, int user) { mPackage = pkg; mKey = key; @@ -232,7 +229,6 @@ public final class Adjustment implements Parcelable { /** @hide */ @SystemApi - @TestApi public int getUser() { return mUser; } diff --git a/core/java/android/service/notification/NotificationAssistantService.java b/core/java/android/service/notification/NotificationAssistantService.java index 975e75ccaeeb..632014936425 100644 --- a/core/java/android/service/notification/NotificationAssistantService.java +++ b/core/java/android/service/notification/NotificationAssistantService.java @@ -23,7 +23,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -66,7 +65,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public abstract class NotificationAssistantService extends NotificationListenerService { private static final String TAG = "NotificationAssistants"; diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index c52b02bb6a3c..536c9c00df87 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -22,7 +22,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.ActivityManager; import android.app.INotificationManager; import android.app.Notification; @@ -451,7 +450,6 @@ public abstract class NotificationListenerService extends Service { * * @hide */ - @TestApi @SystemApi public void onNotificationRemoved(@NonNull StatusBarNotification sbn, @NonNull RankingMap rankingMap, @NonNull NotificationStats stats, int reason) { diff --git a/core/java/android/service/notification/NotificationStats.java b/core/java/android/service/notification/NotificationStats.java index 8be114ca321e..b369483b7232 100644 --- a/core/java/android/service/notification/NotificationStats.java +++ b/core/java/android/service/notification/NotificationStats.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.RemoteInput; import android.os.Parcel; import android.os.Parcelable; @@ -31,7 +30,6 @@ import java.lang.annotation.RetentionPolicy; * Information about how the user has interacted with a given notification. * @hide */ -@TestApi @SystemApi public final class NotificationStats implements Parcelable { diff --git a/core/java/android/service/notification/SnoozeCriterion.java b/core/java/android/service/notification/SnoozeCriterion.java index eb624c9d85f4..d3da07a6fb80 100644 --- a/core/java/android/service/notification/SnoozeCriterion.java +++ b/core/java/android/service/notification/SnoozeCriterion.java @@ -17,7 +17,6 @@ package android.service.notification; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -27,7 +26,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class SnoozeCriterion implements Parcelable { private final String mId; private final CharSequence mExplanation; diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java index 93faa5872a69..1fb18fab3775 100644 --- a/core/java/android/service/textclassifier/TextClassifierService.java +++ b/core/java/android/service/textclassifier/TextClassifierService.java @@ -22,7 +22,6 @@ import android.annotation.MainThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -88,7 +87,6 @@ import java.util.concurrent.Executors; * @hide */ @SystemApi -@TestApi public abstract class TextClassifierService extends Service { private static final String LOG_TAG = "TextClassifierService"; diff --git a/core/java/android/service/watchdog/ExplicitHealthCheckService.java b/core/java/android/service/watchdog/ExplicitHealthCheckService.java index b1647fe0fcf9..49e00d6f6328 100644 --- a/core/java/android/service/watchdog/ExplicitHealthCheckService.java +++ b/core/java/android/service/watchdog/ExplicitHealthCheckService.java @@ -66,7 +66,6 @@ import java.util.concurrent.TimeUnit; * </pre> * @hide */ -@TestApi @SystemApi public abstract class ExplicitHealthCheckService extends Service { @@ -195,7 +194,6 @@ public abstract class ExplicitHealthCheckService extends Service { * * @hide */ - @TestApi @SystemApi public static final class PackageConfig implements Parcelable { private static final long DEFAULT_HEALTH_CHECK_TIMEOUT_MILLIS = TimeUnit.HOURS.toMillis(1); diff --git a/core/java/android/telephony/CellBroadcastIntents.java b/core/java/android/telephony/CellBroadcastIntents.java index e07f69a98a85..c3ca2866c71c 100644 --- a/core/java/android/telephony/CellBroadcastIntents.java +++ b/core/java/android/telephony/CellBroadcastIntents.java @@ -45,7 +45,8 @@ public class CellBroadcastIntents { private static final String EXTRA_MESSAGE = "message"; /** - * Broadcast intent action for notifying area information has been updated. The information + * Broadcast intent action for notifying area information has been updated. broadcast is also + * sent when the user turns off area info alerts. The information * can be retrieved by {@link CellBroadcastService#getCellBroadcastAreaInfo(int)}. The * associated SIM slot index of updated area information can be retrieved through the extra * {@link SubscriptionManager#EXTRA_SLOT_INDEX}. diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index 4adcd6948f85..04e078052fc3 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -20,7 +20,6 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.ChangeId; import android.compat.annotation.UnsupportedAppUsage; import android.os.Binder; @@ -437,7 +436,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_CALL = 0x10000000; @@ -450,7 +448,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int LISTEN_OUTGOING_EMERGENCY_SMS = 0x20000000; @@ -952,7 +949,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi public void onOutgoingEmergencyCall(@NonNull EmergencyNumber placedEmergencyNumber) { // default implementation empty } @@ -964,7 +960,6 @@ public class PhoneStateListener { * @hide */ @SystemApi - @TestApi public void onOutgoingEmergencySms(@NonNull EmergencyNumber sentEmergencyNumber) { // default implementation empty } diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index 0854452e6886..8ab120f78835 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -18,7 +18,6 @@ package android.telephony; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; -import android.annotation.TestApi; import android.compat.Compatibility; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; @@ -283,7 +282,6 @@ public class TelephonyRegistryManager { * @param incomingNumber incoming phone number. * @hide */ - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyCallStateChangedForAllSubscriptions(@CallState int state, @Nullable String incomingNumber) { diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index 37425431182e..c0f92fd7843e 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -1234,7 +1234,6 @@ public final class AccessibilityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut() { performAccessibilityShortcut(null); @@ -1279,7 +1278,6 @@ public final class AccessibilityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void registerSystemAction(@NonNull RemoteAction action, int actionId) { final IAccessibilityManager service; @@ -1307,7 +1305,6 @@ public final class AccessibilityManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void unregisterSystemAction(int actionId) { final IAccessibilityManager service; diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index fbfeda6f0bcc..f7493522994c 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -2048,7 +2048,6 @@ public final class AutofillManager { * @hide */ @SystemApi - @TestApi public void setAugmentedAutofillWhitelist(@Nullable Set<String> packages, @Nullable Set<ComponentName> activities) { if (!hasAutofillFeature()) { diff --git a/core/java/android/view/contentcapture/ContentCaptureContext.java b/core/java/android/view/contentcapture/ContentCaptureContext.java index b84cb88ccd84..9bf3626fe868 100644 --- a/core/java/android/view/contentcapture/ContentCaptureContext.java +++ b/core/java/android/view/contentcapture/ContentCaptureContext.java @@ -21,7 +21,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.TaskInfo; import android.content.ComponentName; import android.content.Context; @@ -58,7 +57,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int FLAG_DISABLED_BY_APP = 0x1; /** @@ -69,7 +67,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int FLAG_DISABLED_BY_FLAG_SECURE = 0x2; /** @@ -79,7 +76,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public static final int FLAG_RECONNECTED = 0x4; /** @hide */ @@ -173,7 +169,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public int getTaskId() { return mTaskId; } @@ -184,7 +179,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable ComponentName getActivityComponent() { return mComponentName; } @@ -197,7 +191,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable ContentCaptureSessionId getParentSessionId() { return mParentSessionId == NO_SESSION_ID ? null : new ContentCaptureSessionId(mParentSessionId); @@ -215,7 +208,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public int getDisplayId() { return mDisplayId; } @@ -229,7 +221,6 @@ public final class ContentCaptureContext implements Parcelable { * @hide */ @SystemApi - @TestApi public @ContextCreationFlags int getFlags() { return mFlags; } diff --git a/core/java/android/view/contentcapture/ContentCaptureEvent.java b/core/java/android/view/contentcapture/ContentCaptureEvent.java index f49b1beee8ad..2b12230510bf 100644 --- a/core/java/android/view/contentcapture/ContentCaptureEvent.java +++ b/core/java/android/view/contentcapture/ContentCaptureEvent.java @@ -22,7 +22,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.graphics.Insets; import android.os.Parcel; import android.os.Parcelable; @@ -39,7 +38,6 @@ import java.util.List; /** @hide */ @SystemApi -@TestApi public final class ContentCaptureEvent implements Parcelable { private static final String TAG = ContentCaptureEvent.class.getSimpleName(); diff --git a/core/java/android/view/contentcapture/ContentCaptureManager.java b/core/java/android/view/contentcapture/ContentCaptureManager.java index 484b1c10423c..585bb1a3a82d 100644 --- a/core/java/android/view/contentcapture/ContentCaptureManager.java +++ b/core/java/android/view/contentcapture/ContentCaptureManager.java @@ -644,7 +644,6 @@ public final class ContentCaptureManager { * @hide */ @SystemApi - @TestApi public boolean isContentCaptureFeatureEnabled() { final SyncResultReceiver resultReceiver = syncRun( (r) -> mService.isContentCaptureFeatureEnabled(r)); diff --git a/core/java/android/view/contentcapture/ViewNode.java b/core/java/android/view/contentcapture/ViewNode.java index e035c620d1fd..e731d4b76fb9 100644 --- a/core/java/android/view/contentcapture/ViewNode.java +++ b/core/java/android/view/contentcapture/ViewNode.java @@ -42,7 +42,6 @@ import com.android.internal.util.Preconditions; // instead /** @hide */ @SystemApi -@TestApi public final class ViewNode extends AssistStructure.ViewNode { private static final String TAG = ViewNode.class.getSimpleName(); diff --git a/core/proto/Android.bp b/core/proto/Android.bp deleted file mode 100644 index 3b891d6b4947..000000000000 --- a/core/proto/Android.bp +++ /dev/null @@ -1,30 +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. - -// C++ library for Bluetooth platform wide protobuf definitions -cc_library_static { - name: "libbt-platform-protos-lite", - host_supported: true, - proto: { - export_proto_headers: true, - type: "lite", - }, - srcs: [ - "android/bluetooth/a2dp/enums.proto", - "android/bluetooth/enums.proto", - "android/bluetooth/hci/enums.proto", - "android/bluetooth/hfp/enums.proto", - "android/bluetooth/smp/enums.proto", - ], -} diff --git a/core/proto/android/app/enums.proto b/core/proto/android/app/enums.proto deleted file mode 100644 index bd5cb62f7fde..000000000000 --- a/core/proto/android/app/enums.proto +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (C) 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. - */ - -syntax = "proto2"; - -package android.app; - -option java_outer_classname = "AppProtoEnums"; -option java_multiple_files = true; - -// ActivityManagerInternal.java's APP_TRANSITION reasons. -enum AppTransitionReasonEnum { - APP_TRANSITION_REASON_UNKNOWN = 0; - // The transition was started because we drew the splash screen. - APP_TRANSITION_SPLASH_SCREEN = 1; - // The transition was started because we all app windows were drawn. - APP_TRANSITION_WINDOWS_DRAWN = 2; - // The transition was started because of a timeout. - APP_TRANSITION_TIMEOUT = 3; - // The transition was started because of a we drew a task snapshot. - APP_TRANSITION_SNAPSHOT = 4; - // The transition was started because it was a recents animation and we only needed to wait on - // the wallpaper. - APP_TRANSITION_RECENTS_ANIM = 5; -} - -// ActivityManager.java PROCESS_STATEs -// Next tag: 1021 -enum ProcessStateEnum { - // Unlike the ActivityManager PROCESS_STATE values, the ordering and numerical values - // here are completely fixed and arbitrary. Order is irrelevant. - // No attempt need be made to keep them in sync. - // The values here must not be modified. Any new process states can be appended to the end. - - // Process state that is unknown to this proto file (i.e. is not mapped - // by ActivityManager.processStateAmToProto()). Can only happen if there's a bug in the mapping. - PROCESS_STATE_UNKNOWN_TO_PROTO = 998; - // Not a real process state. - PROCESS_STATE_UNKNOWN = 999; - // Process is a persistent system process. - PROCESS_STATE_PERSISTENT = 1000; - // Process is a persistent system process and is doing UI. - PROCESS_STATE_PERSISTENT_UI = 1001; - // Process is hosting the current top activities. Note that this covers - // all activities that are visible to the user. - PROCESS_STATE_TOP = 1002; - // Process is bound to a TOP app. - PROCESS_STATE_BOUND_TOP = 1020; - // Process is hosting a foreground service. - PROCESS_STATE_FOREGROUND_SERVICE = 1003; - // Process is hosting a service bound by the system or another foreground app. - PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 1004; - // Process is important to the user, and something they are aware of. - PROCESS_STATE_IMPORTANT_FOREGROUND = 1005; - // Process is important to the user, but not something they are aware of. - PROCESS_STATE_IMPORTANT_BACKGROUND = 1006; - // Process is in the background transient so we will try to keep running. - PROCESS_STATE_TRANSIENT_BACKGROUND = 1007; - // Process is in the background running a backup/restore operation. - PROCESS_STATE_BACKUP = 1008; - // Process is in the background running a service. Unlike oom_adj, this - // level is used for both the normal running in background state and the - // executing operations state. - PROCESS_STATE_SERVICE = 1009; - // Process is in the background running a receiver. Note that from the - // perspective of oom_adj, receivers run at a higher foreground level, but - // for our prioritization here that is not necessary and putting them - // below services means many fewer changes in some process states as they - // receive broadcasts. - PROCESS_STATE_RECEIVER = 1010; - // Same as PROCESS_STATE_TOP but while device is sleeping. - PROCESS_STATE_TOP_SLEEPING = 1011; - // Process is in the background, but it can't restore its state so we want - // to try to avoid killing it. - PROCESS_STATE_HEAVY_WEIGHT = 1012; - // Process is in the background but hosts the home activity. - PROCESS_STATE_HOME = 1013; - // Process is in the background but hosts the last shown activity. - PROCESS_STATE_LAST_ACTIVITY = 1014; - // Process is being cached for later use and contains activities. - PROCESS_STATE_CACHED_ACTIVITY = 1015; - // Process is being cached for later use and is a client of another cached - // process that contains activities. - PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 1016; - // Process is being cached for later use and has an activity that corresponds - // to an existing recent task. - PROCESS_STATE_CACHED_RECENT = 1017; - // Process is being cached for later use and is empty. - PROCESS_STATE_CACHED_EMPTY = 1018; - // Process does not exist. - PROCESS_STATE_NONEXISTENT = 1019; -} - -// AppOpsManager.java - operation ids for logging -enum AppOpEnum { - APP_OP_NONE = -1; - APP_OP_COARSE_LOCATION = 0; - APP_OP_FINE_LOCATION = 1; - APP_OP_GPS = 2; - APP_OP_VIBRATE = 3; - APP_OP_READ_CONTACTS = 4; - APP_OP_WRITE_CONTACTS = 5; - APP_OP_READ_CALL_LOG = 6; - APP_OP_WRITE_CALL_LOG = 7; - APP_OP_READ_CALENDAR = 8; - APP_OP_WRITE_CALENDAR = 9; - APP_OP_WIFI_SCAN = 10; - APP_OP_POST_NOTIFICATION = 11; - APP_OP_NEIGHBORING_CELLS = 12; - APP_OP_CALL_PHONE = 13; - APP_OP_READ_SMS = 14; - APP_OP_WRITE_SMS = 15; - APP_OP_RECEIVE_SMS = 16; - APP_OP_RECEIVE_EMERGENCY_SMS = 17; - APP_OP_RECEIVE_MMS = 18; - APP_OP_RECEIVE_WAP_PUSH = 19; - APP_OP_SEND_SMS = 20; - APP_OP_READ_ICC_SMS = 21; - APP_OP_WRITE_ICC_SMS = 22; - APP_OP_WRITE_SETTINGS = 23; - APP_OP_SYSTEM_ALERT_WINDOW = 24; - APP_OP_ACCESS_NOTIFICATIONS = 25; - APP_OP_CAMERA = 26; - APP_OP_RECORD_AUDIO = 27; - APP_OP_PLAY_AUDIO = 28; - APP_OP_READ_CLIPBOARD = 29; - APP_OP_WRITE_CLIPBOARD = 30; - APP_OP_TAKE_MEDIA_BUTTONS = 31; - APP_OP_TAKE_AUDIO_FOCUS = 32; - APP_OP_AUDIO_MASTER_VOLUME = 33; - APP_OP_AUDIO_VOICE_VOLUME = 34; - APP_OP_AUDIO_RING_VOLUME = 35; - APP_OP_AUDIO_MEDIA_VOLUME = 36; - APP_OP_AUDIO_ALARM_VOLUME = 37; - APP_OP_AUDIO_NOTIFICATION_VOLUME = 38; - APP_OP_AUDIO_BLUETOOTH_VOLUME = 39; - APP_OP_WAKE_LOCK = 40; - APP_OP_MONITOR_LOCATION = 41; - APP_OP_MONITOR_HIGH_POWER_LOCATION = 42; - APP_OP_GET_USAGE_STATS = 43; - APP_OP_MUTE_MICROPHONE = 44; - APP_OP_TOAST_WINDOW = 45; - APP_OP_PROJECT_MEDIA = 46; - APP_OP_ACTIVATE_VPN = 47; - APP_OP_WRITE_WALLPAPER = 48; - APP_OP_ASSIST_STRUCTURE = 49; - APP_OP_ASSIST_SCREENSHOT = 50; - APP_OP_READ_PHONE_STATE = 51; - APP_OP_ADD_VOICEMAIL = 52; - APP_OP_USE_SIP = 53; - APP_OP_PROCESS_OUTGOING_CALLS = 54; - APP_OP_USE_FINGERPRINT = 55; - APP_OP_BODY_SENSORS = 56; - APP_OP_READ_CELL_BROADCASTS = 57; - APP_OP_MOCK_LOCATION = 58; - APP_OP_READ_EXTERNAL_STORAGE = 59; - APP_OP_WRITE_EXTERNAL_STORAGE = 60; - APP_OP_TURN_SCREEN_ON = 61; - APP_OP_GET_ACCOUNTS = 62; - APP_OP_RUN_IN_BACKGROUND = 63; - APP_OP_AUDIO_ACCESSIBILITY_VOLUME = 64; - APP_OP_READ_PHONE_NUMBERS = 65; - APP_OP_REQUEST_INSTALL_PACKAGES = 66; - APP_OP_PICTURE_IN_PICTURE = 67; - APP_OP_INSTANT_APP_START_FOREGROUND = 68; - APP_OP_ANSWER_PHONE_CALLS = 69; - APP_OP_RUN_ANY_IN_BACKGROUND = 70; - APP_OP_CHANGE_WIFI_STATE = 71; - APP_OP_REQUEST_DELETE_PACKAGES = 72; - APP_OP_BIND_ACCESSIBILITY_SERVICE = 73; - APP_OP_ACCEPT_HANDOVER = 74; - APP_OP_MANAGE_IPSEC_TUNNELS = 75; - APP_OP_START_FOREGROUND = 76; - APP_OP_BLUETOOTH_SCAN = 77; - APP_OP_USE_BIOMETRIC = 78; - APP_OP_ACTIVITY_RECOGNITION = 79; - APP_OP_SMS_FINANCIAL_TRANSACTIONS = 80; - APP_OP_READ_MEDIA_AUDIO = 81; - APP_OP_WRITE_MEDIA_AUDIO = 82; - APP_OP_READ_MEDIA_VIDEO = 83; - APP_OP_WRITE_MEDIA_VIDEO = 84; - APP_OP_READ_MEDIA_IMAGES = 85; - APP_OP_WRITE_MEDIA_IMAGES = 86; - APP_OP_LEGACY_STORAGE = 87; - APP_OP_ACCESS_ACCESSIBILITY = 88; - APP_OP_READ_DEVICE_IDENTIFIERS = 89; - APP_OP_ACCESS_MEDIA_LOCATION = 90; - APP_OP_QUERY_ALL_PACKAGES = 91; - APP_OP_MANAGE_EXTERNAL_STORAGE = 92; - APP_OP_INTERACT_ACROSS_PROFILES = 93; - APP_OP_ACTIVATE_PLATFORM_VPN = 94; - APP_OP_LOADER_USAGE_STATS = 95; - APP_OP_DEPRECATED_1 = 96 [deprecated = true]; - APP_OP_AUTO_REVOKE_PERMISSIONS_IF_UNUSED = 97; - APP_OP_AUTO_REVOKE_MANAGED_BY_INSTALLER = 98; - APP_OP_NO_ISOLATED_STORAGE = 99; -} diff --git a/core/proto/android/app/job/enums.proto b/core/proto/android/app/job/enums.proto deleted file mode 100644 index 41863bbbfbf1..000000000000 --- a/core/proto/android/app/job/enums.proto +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 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. - */ - -syntax = "proto2"; - -package android.app.job; - -// This file is for JobScheduler enums inside the app directory. If you're -// adding enums for system-server-side code, use the file in -// frameworks/base/core/proto/android/server/job. -option java_outer_classname = "JobProtoEnums"; -option java_multiple_files = true; - -// Reasons a job is stopped. -// Primarily used in android.app.job.JobParameters.java. -enum StopReasonEnum { - STOP_REASON_UNKNOWN = -1; - STOP_REASON_CANCELLED = 0; - STOP_REASON_CONSTRAINTS_NOT_SATISFIED = 1; - STOP_REASON_PREEMPT = 2; - STOP_REASON_TIMEOUT = 3; - STOP_REASON_DEVICE_IDLE = 4; - STOP_REASON_DEVICE_THERMAL = 5; - STOP_REASON_RESTRICTED_BUCKET = 6; -} diff --git a/core/proto/android/app/media_output_enum.proto b/core/proto/android/app/media_output_enum.proto deleted file mode 100644 index 0d42fb77025a..000000000000 --- a/core/proto/android/app/media_output_enum.proto +++ /dev/null @@ -1,65 +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. - */ - -syntax = "proto2"; - -package android.app.settings.mediaoutput; -option java_multiple_files = true; - -/** - * The medium type specified in an output switching operation. - */ -enum MediumType { - UNKNOWN_TYPE = 0; - BUILTIN_SPEAKER = 1; - WIRED_3POINT5_MM_AUDIO = 100; - WIRED_3POINT5_MM_HEADSET = 101; - WIRED_3POINT5_MM_HEADPHONES = 102; - USB_C_AUDIO = 200; - USB_C_DEVICE = 201; - USB_C_HEADSET = 202; - USB_C_ACCESSORY = 203; - USB_C_DOCK = 204; - USB_C_HDMI = 205; - BLUETOOTH = 300; - BLUETOOTH_HEARING_AID = 301; - BLUETOOTH_A2DP = 302; - REMOTE_SINGLE = 400; - REMOTE_TV = 401; - REMOTE_SPEAKER = 402; - REMOTE_GROUP = 500; - REMOTE_DYNAMIC_GROUP = 501; -}; - -/** - * The result of an output switching operation. - */ -enum SwitchResult { - ERROR = 0; - OK = 1; -}; - -/** - * The sub result of an output switching operation. - */ -enum SubResult { - UNKNOWN_ERROR = 0; - NO_ERROR = 1; - REJECTED = 2; - NETWORK_ERROR = 3; - ROUTE_NOT_AVAILABLE = 4; - INVALID_COMMAND = 5; -} diff --git a/core/proto/android/app/settings_enums.proto b/core/proto/android/app/settings_enums.proto deleted file mode 100644 index 69b32c264d3d..000000000000 --- a/core/proto/android/app/settings_enums.proto +++ /dev/null @@ -1,2686 +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. - */ - -syntax = "proto2"; - -package android.app.settings; -option java_multiple_files = true; - -/** - * The action performed in this event - */ -enum Action { - ACTION_UNKNOWN = 0; - PAGE_VISIBLE = 1; - PAGE_HIDE = 2; - - // ACTION: Settings > Wi-Fi > [Long press network] > Connect to network - // SUBTYPE: true if connecting to a saved network, false if not - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_WIFI_CONNECT = 135; - - // ACTION: Settings > Wi-Fi > [Long press network] > Forget network - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_WIFI_FORGET = 137; - - // ACTION: Settings > Wi-Fi > Toggle off - // SUBTYPE: true if connected to network before toggle, false if not - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_WIFI_OFF = 138; - - // ACTION: Settings > Wi-Fi > Toggle on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_WIFI_ON = 139; - - // ACTION: Settings > Bluetooth > Overflow > Rename this device - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_BLUETOOTH_RENAME = 161; - - // ACTION: Settings > Bluetooth > Overflow > Show received files - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_BLUETOOTH_FILES = 162; - - // ACTION: DND Settings > Priority only allows > Reminder toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ZEN_ALLOW_REMINDERS = 167; - - // ACTION: DND Settings > Priority only allows > Event toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ZEN_ALLOW_EVENTS = 168; - - // ACTION: DND Settings > Priority only allows > Messages - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ZEN_ALLOW_MESSAGES = 169; - - // ACTION: DND Settings > Priority only allows > Calls - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ZEN_ALLOW_CALLS = 170; - - // ACTION: DND Settings > Priority only allows > Repeat callers toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ZEN_ALLOW_REPEAT_CALLS = 171; - - // ACTION: DND Settings > Automatic rules > [Rule] > Delete rule > Delete - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ZEN_DELETE_RULE_OK = 175; - - // ACTION: Settings > More > Airplane mode toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_AIRPLANE_TOGGLE = 177; - - // ACTION: Settings > Data usage > Cellular data toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_CELL_DATA_TOGGLE = 178; - - // ACTION: Settings > Display > When device is rotated - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ROTATION_LOCK = 203; - - // OPEN: Settings > Search > Perform search - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_SEARCH_RESULTS = 226; - - // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Delete - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_FINGERPRINT_DELETE = 253; - - // ACTION: Settings > Security > Nexus Imprint > [Fingerprint] > Rename - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_FINGERPRINT_RENAME = 254; - - // ACTION: Settings -> Developer Options -> Take bug report -> Interactive report - // CATEGORY: SETTINGS - // OS: N - // Interactive bug report initiated from Settings. - ACTION_BUGREPORT_FROM_SETTINGS_INTERACTIVE = 294; - - // ACTION: Settings -> Developer Options -> Take bug report -> Full report - // CATEGORY: SETTINGS - // OS: N - // Interactive bug report initiated from Settings. - ACTION_BUGREPORT_FROM_SETTINGS_FULL = 295; - - // click on collapsed conditional or clicks expand button - ACTION_SETTINGS_CONDITION_EXPAND = 373; - - // click main area of expanded conditional - ACTION_SETTINGS_CONDITION_CLICK = 375; - - // click a direct button on expanded conditional - ACTION_SETTINGS_CONDITION_BUTTON = 376; - - // Action: user enable / disabled data saver using Settings - // OPEN: Settings -> Data Usage -> Data saver -> On/off toggle - // VALUE: 1 for enabled, 0 for disabled - // CATEGORY: SETTINGS - // OS: N - ACTION_DATA_SAVER_MODE = 394; - - // User whitelisted an app for Data Saver mode; action pass package name of app - // Action: user enable / disabled data saver using Settings - // OPEN: Settings -> Data Usage -> Data saver -> Unrestricted data access > APP toggle turned on - // or - // Settings -> Apps -> APP -> Data usage -> Unrestricted data usage toggle turned on - // VALUE: package name of APP - // CATEGORY: SETTINGS - // OS: N - ACTION_DATA_SAVER_WHITELIST = 395; - - // User blacklisted an app for Data Saver mode; action pass package name of app - // OPEN: Settings -> Apps -> APP -> Data usage -> Background data toggle turned off - // VALUE: package name of APP - // CATEGORY: SETTINGS - // OS: N - ACTION_DATA_SAVER_BLACKLIST = 396; - - // ACTION: Settings -> Storage -> Manage storage -> Click Storage Manager - // SUBTYPE: false is off, true is on - ACTION_TOGGLE_STORAGE_MANAGER = 489; - - // OPEN: Settings > Display -> Ambient Display - // CATEGORY: SETTINGS - ACTION_AMBIENT_DISPLAY = 495; - - // ACTION: Allow Battery optimization for an app - APP_SPECIAL_PERMISSION_BATTERY_ALLOW = 764; - - // ACTION: Deny Battery optimization for an app - APP_SPECIAL_PERMISSION_BATTERY_DENY = 765; - - // ACTION: Enable Device Admin app - APP_SPECIAL_PERMISSION_ADMIN_ALLOW = 766; - - // ACTION: Disable Device Admin app - APP_SPECIAL_PERMISSION_ADMIN_DENY = 767; - - // ACTION: Allow "Do Not Disturb access" for an app - APP_SPECIAL_PERMISSION_DND_ALLOW = 768; - - // ACTION: Deny "Do Not Disturb access" for an app - APP_SPECIAL_PERMISSION_DND_DENY = 769; - - // ACTION: Allow "Draw over other apps" for an app - APP_SPECIAL_PERMISSION_APPDRAW_ALLOW = 770; - - // ACTION: Deny "Display over other apps" for an app - APP_SPECIAL_PERMISSION_APPDRAW_DENY = 771; - - // ACTION: Allow "VR helper services" for an app - APP_SPECIAL_PERMISSION_VRHELPER_ALLOW = 772; - - // ACTION: Deny "VR helper services" for an app - APP_SPECIAL_PERMISSION_VRHELPER_DENY = 773; - - // ACTION: Allow "Modify system settings" for an app - APP_SPECIAL_PERMISSION_SETTINGS_CHANGE_ALLOW = 774; - - // ACTION: Deny "Modify system settings" for an app - APP_SPECIAL_PERMISSION_SETTINGS_CHANGE_DENY = 775; - - // ACTION: Allow "Notification access" for an app - APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW = 776; - - // ACTION: Deny "Notification access" for an app - APP_SPECIAL_PERMISSION_NOTIVIEW_DENY = 777; - - // ACTION: "Premium SMS access" for an app - "ask user" option - APP_SPECIAL_PERMISSION_PREMIUM_SMS_ASK = 778; - - // ACTION: "Premium SMS access" for an app - "never allow" option - APP_SPECIAL_PERMISSION_PREMIUM_SMS_DENY = 779; - - // ACTION: "Premium SMS access" for an app - "always allow" option - APP_SPECIAL_PERMISSION_PREMIUM_SMS_ALWAYS_ALLOW = 780; - - // ACTION: Allow "Unrestricted data access" for an app - APP_SPECIAL_PERMISSION_UNL_DATA_ALLOW = 781; - - // ACTION: Deny "Unrestricted data access" for an app - APP_SPECIAL_PERMISSION_UNL_DATA_DENY = 782; - - // ACTION: Allow "Usage access" for an app - APP_SPECIAL_PERMISSION_USAGE_VIEW_ALLOW = 783; - - // ACTION: Deny "Usage access" for an app - APP_SPECIAL_PERMISSION_USAGE_VIEW_DENY = 784; - - // ACTION: "Force stop" action on an app - ACTION_APP_FORCE_STOP = 807; - - // ACTION: Allow "Enable picture-in-picture" for an app - APP_PICTURE_IN_PICTURE_ALLOW = 813; - - // ACTION: Create a Settings shortcut item. - ACTION_SETTINGS_CREATE_SHORTCUT = 829; - - // ACTION: A tile in Settings information architecture is clicked - ACTION_SETTINGS_TILE_CLICK = 830; - - // ACTION: Settings advanced button is expanded - ACTION_SETTINGS_ADVANCED_BUTTON_EXPAND = 834; - - // ACTION: Deny "Enable picture-in-picture" for an app - APP_PICTURE_IN_PICTURE_DENY = 814; - - // ACTION: Settings -> Display -> Theme - ACTION_THEME = 816; - - // ACTION: Settings > About device > Build number - ACTION_SETTINGS_BUILD_NUMBER_PREF = 847; - - // ACTION: Settings > Battery > Menu > Optimization - ACTION_SETTINGS_MENU_BATTERY_OPTIMIZATION = 851; - - // ACTION: Settings > Battery > Menu > Apps Toggle - ACTION_SETTINGS_MENU_BATTERY_APPS_TOGGLE = 852; - - // ACTION: Settings > Any preference is changed - ACTION_SETTINGS_PREFERENCE_CHANGE = 853; - - // ACTION: Settings > Connected devices > Bluetooth -> Available devices - ACTION_SETTINGS_BLUETOOTH_PAIR = 866; - - // ACTION: Settings > Connected devices > Bluetooth -> Paired devices - ACTION_SETTINGS_BLUETOOTH_CONNECT = 867; - - // ACTION: Settings > Connected devices > Bluetooth -> Connected device - ACTION_SETTINGS_BLUETOOTH_DISCONNECT = 868; - - // ACTION: Settings > Connected devices > Bluetooth -> Error dialog - ACTION_SETTINGS_BLUETOOTH_CONNECT_ERROR = 869; - - // ACTION: Settings > Connected devices > Bluetooth master switch Toggle - ACTION_SETTINGS_MASTER_SWITCH_BLUETOOTH_TOGGLE = 870; - - // ACTION: Settings > App detail > Uninstall - ACTION_SETTINGS_UNINSTALL_APP = 872; - - // ACTION: Settings > App detail > Uninstall Device admin app - ACTION_SETTINGS_UNINSTALL_DEVICE_ADMIN = 873; - - // ACTION: Settings > App detail > Disable app - ACTION_SETTINGS_DISABLE_APP = 874; - - // ACTION: Settings > App detail > Enable app - ACTION_SETTINGS_ENABLE_APP = 875; - - // ACTION: Settings > App detail > Clear data - ACTION_SETTINGS_CLEAR_APP_DATA = 876; - - // ACTION: Settings > App detail > Clear cache - ACTION_SETTINGS_CLEAR_APP_CACHE = 877; - - // ACTION: Logs pressing the "Clear app" button in the app info settings page for an instant - // app. - // VALUE: The package name of the app - ACTION_SETTINGS_CLEAR_INSTANT_APP = 923; - - // OPEN: Assist Gesture training intro in Settings - // CATEGORY: SETTINGS - // OS: O DR - SETTINGS_ASSIST_GESTURE_TRAINING_INTRO = 991; - - // OPEN: Assist Gesture training enrolling in Settings - // CATEGORY: SETTINGS - // OS: O DR - SETTINGS_ASSIST_GESTURE_TRAINING_ENROLLING = 992; - - // OPEN: Assist Gesture training finished in Settings - // CATEGORY: SETTINGS - // OS: O DR - SETTINGS_ASSIST_GESTURE_TRAINING_FINISHED = 993; - - // ACTION: Update default app from Settings - ACTION_SETTINGS_UPDATE_DEFAULT_APP = 1000; - - // ACTION: Settings > Wi-Fi > [Long press network] > Sign in to network - // CATEGORY: SETTINGS - // OS: O DR - ACTION_WIFI_SIGNIN = 1008; - - // ACTION: Settings > Notification Settings > Open application notification - // CATEGORY: SETTINGS - // OS: O DR - ACTION_OPEN_APP_NOTIFICATION_SETTING = 1016; - - // ACTION: Settings > App Info > Open app settings - // CATEGORY: SETTINGS - // OS: O DR - ACTION_OPEN_APP_SETTING = 1017; - - // ACTION: Collect PSD Signals - // CATEGORY: SETTINGS - // OS: O DR - ACTION_PSD_LOADER = 1019; - - // OPEN: Settings > Trampoline Intent > Settings page - // CATEGORY: SETTINGS - // OS: O DR - TRAMPOLINE_SETTINGS_EVENT = 1033; - - // ACTION: Logged when user tries to pair a Bluetooth device without name from Settings app - // CATEGORY: SETTINGS - // OS: O MR - ACTION_SETTINGS_BLUETOOTH_PAIR_DEVICES_WITHOUT_NAMES = 1096; - - // ACTION: Settings > Network & Internet > Mobile network > Network - // CATEGORY: SETTINGS - ACTION_MOBILE_NETWORK_MANUAL_SELECT_NETWORK = 1210; - - // ACTION: DND Settings > Priority only allows > Alarms toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_ALLOW_ALARMS = 1226; - - // ACTION: DND Settings > Priority only allows > Media toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_ALLOW_MEDIA = 1227; - - // ACTION: A private dns mode been selected by user - // CATEGORY: SETTINGS - // OS: P - ACTION_PRIVATE_DNS_MODE = 1249; - - // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Select rule ("Event") > Rule name > OK - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_MODE_RULE_NAME_CHANGE_OK = 1267; - - // OPEN: Settings > Sound > Do Not Disturb > TURN ON NOW/TURN OFF NOW - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_TOGGLE_DND_BUTTON = 1268; - - // ACTION: DND Settings > What to block > full screen intents - // SUBTYPE: false is allowed, true is blocked - // CATEGORY: SETTINGS - // OS: 6.0 - ACTION_ZEN_BLOCK_FULL_SCREEN_INTENTS = 1332; - - // ACTION: DND Settings > What to block - // SUBTYPE: false is allowed, true is blocked - // OS: P - ACTION_ZEN_BLOCK_LIGHT = 1333; - - // ACTION: DND Settings > What to block - // SUBTYPE: false is allowed, true is blocked - // OS: P - ACTION_ZEN_BLOCK_PEEK = 1334; - - // ACTION: DND Settings > What to block - // SUBTYPE: false is allowed, true is blocked - // OS: P - ACTION_ZEN_BLOCK_STATUS = 1335; - - // ACTION: DND Settings > What to block - // SUBTYPE: false is allowed, true is blocked - // OS: P - ACTION_ZEN_BLOCK_BADGE = 1336; - - // ACTION: DND Settings > What to block - // SUBTYPE: false is allowed, true is blocked - // OS: P - ACTION_ZEN_BLOCK_AMBIENT = 1337; - - // ACTION: DND Settings > What to block - // SUBTYPE: false is allowed, true is blocked - // OS: P - ACTION_ZEN_BLOCK_NOTIFICATION_LIST = 1338; - - // ACTION: DND Settings > Priority only allows > System toggle - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_ALLOW_SYSTEM = 1340; - - // ACTION: Settings > Battery settings > Battery tip > App restriction tip - // OS: P - ACTION_APP_RESTRICTION_TIP = 1347; - - // ACTION: Settings > Battery settings > Battery tip > High usage tip - // OS: P - ACTION_HIGH_USAGE_TIP = 1348; - - // ACTION: Settings > Battery settings > Battery tip > Summary tip - // OS: P - ACTION_SUMMARY_TIP = 1349; - - // ACTION: Settings > Battery settings > Battery tip > Smart battery tip - // OS: P - ACTION_SMART_BATTERY_TIP = 1350; - - // ACTION: Settings > Battery settings > Battery tip > Early warning tip - // OS: P - ACTION_EARLY_WARNING_TIP = 1351; - - // ACTION: Settings > Battery settings > Battery tip > Low battery tip - // OS: P - ACTION_LOW_BATTERY_TIP = 1352; - - // ACTION: Settings > Battery settings > Battery tip > App restriction list shown - // OS: P - ACTION_APP_RESTRICTION_TIP_LIST = 1353; - - // ACTION: Settings > Battery settings > Battery tip > High usage list shown - // OS: P - ACTION_HIGH_USAGE_TIP_LIST = 1354; - - // ACTION: Settings > Battery settings > Battery tip > Open app restriction page - // CATEGORY: SETTINGS - // OS: P - ACTION_TIP_OPEN_APP_RESTRICTION_PAGE = 1361; - - // ACTION: Settings > Battery settings > Battery tip > Restrict app - // CATEGORY: SETTINGS - // OS: P - ACTION_TIP_RESTRICT_APP = 1362; - - // ACTION: Settings > Battery settings > Battery tip > Unrestrict app - // CATEGORY: SETTINGS - // OS: P - ACTION_TIP_UNRESTRICT_APP = 1363; - - // ACTION: Settings > Battery settings > Battery tip > Open smart battery page - // CATEGORY: SETTINGS - // OS: P - ACTION_TIP_OPEN_SMART_BATTERY = 1364; - - // ACTION: Settings > Battery settings > Battery tip > Turn on battery saver - // CATEGORY: SETTINGS - // OS: P - ACTION_TIP_TURN_ON_BATTERY_SAVER = 1365; - - // ACTION: Settings > Anomaly receiver > Anomaly received - // CATEGORY: SETTINGS - // OS: P - ACTION_ANOMALY_TRIGGERED = 1367; - - // ACTION: A Settings Slice is requested - // CATEGORY: SETTINGS - // OS: P - ACTION_SETTINGS_SLICE_REQUESTED = 1371; - - // ACTION: A Settings Slice is updated with new value - // CATEGORY: SETTINGS - // OS: P - ACTION_SETTINGS_SLICE_CHANGED = 1372; - - // OPEN: DND onboarding activity > Ok button - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_ONBOARDING_OK = 1378; - - // OPEN: DND onboarding activity > Settings link - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_ONBOARDING_SETTINGS = 1379; - - // ACTION: Settings > Anomaly receiver > Anomaly ignored, don't show up in battery settings - // CATEGORY: SETTINGS - // OS: P - ACTION_ANOMALY_IGNORED = 1387; - - // ACTION: Settings > Battery settings > Battery tip > Open battery saver page - // CATEGORY: SETTINGS - // OS: P - ACTION_TIP_OPEN_BATTERY_SAVER_PAGE = 1388; - - // ACTION: DND Settings > What to block - // OS: P - ACTION_ZEN_SOUND_ONLY = 1396; - - // ACTION: DND Settings > Notifications - // OS: P - ACTION_ZEN_SOUND_AND_VIS_EFFECTS = 1397; - - // ACTION: DND Settings > Notifications - // OS: P - ACTION_ZEN_SHOW_CUSTOM = 1398; - - // ACTION: DND Settings > Notifications - // OS: P - ACTION_ZEN_CUSTOM = 1399; - - // OPEN: DND onboarding activity > don't update button - // CATEGORY: SETTINGS - // OS: P - ACTION_ZEN_ONBOARDING_KEEP_CURRENT_SETTINGS = 1406; - - // ACTION: Storage initialization wizard initialization choice of external/portable - // CATEGORY: SETTINGS - // OS: P - ACTION_STORAGE_INIT_EXTERNAL = 1407; - - // ACTION: Storage initialization wizard initialization choice of internal/adoptable - // CATEGORY: SETTINGS - // OS: P - ACTION_STORAGE_INIT_INTERNAL = 1408; - - // ACTION: Storage initialization wizard benchmark fast choice of continue - // CATEGORY: SETTINGS - // OS: P - ACTION_STORAGE_BENCHMARK_FAST_CONTINUE = 1409; - - // ACTION: Storage initialization wizard benchmark slow choice of continue - // CATEGORY: SETTINGS - // OS: P - ACTION_STORAGE_BENCHMARK_SLOW_CONTINUE = 1410; - - // ACTION: Storage initialization wizard benchmark slow choice of abort - // CATEGORY: SETTINGS - // OS: P - ACTION_STORAGE_BENCHMARK_SLOW_ABORT = 1411; - - // ACTION: Storage initialization wizard migration choice of now - // CATEGORY: SETTINGS - // OS: P - ACTION_STORAGE_MIGRATE_NOW = 1412; - - // ACTION: Storage initialization wizard migration choice of later - // CATEGORY: SETTINGS - // OS: P - ACTION_STORAGE_MIGRATE_LATER = 1413; - - // OPEN: Settings > Sound > Switch a2dp devices dialog - // CATEGORY: SETTINGS - // OS: P - DIALOG_SWITCH_A2DP_DEVICES = 1415; - - - // OPEN: Settings > Sound > Switch hfp devices dialog - // CATEGORY: SETTINGS - // OS: P - DIALOG_SWITCH_HFP_DEVICES = 1416; - - // OPEN: QS Sensor Privacy Mode tile shown - // ACTION: QS Sensor Privacy Mode tile tapped - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: QUICK_SETTINGS - // OS: Q - QS_SENSOR_PRIVACY = 1598; - - // ACTION: Tap & Pay -> Default Application Setting -> Use Forground - ACTION_NFC_PAYMENT_FOREGROUND_SETTING = 1622; - - // ACTION: Tap & Pay -> Default Application Setting -> Use Default - ACTION_NFC_PAYMENT_ALWAYS_SETTING = 1623; - - // ACTION: Settings > Search Bar > Avatar - // CATEGORY: SETTINGS - // OS: Q - CLICK_ACCOUNT_AVATAR = 1643; - - // ACTION: Set new password (action intent android.app.action.SET_NEW_PASSWORD) - // CATEGORY: SETTINGS - // OS: Q - ACTION_SET_NEW_PASSWORD = 1645; - - // ACTION: Set new password (action intent android.app.action.SET_NEW_PARENT_PROFILE_PASSWORD) - // CATEGORY: SETTINGS - // OS: Q - ACTION_SET_NEW_PARENT_PROFILE_PASSWORD = 1646; - - // ACTION: An interaction with a Slice or other component in the Panel. - // CATEGORY: SETTINGS - // OS: Q - ACTION_PANEL_INTERACTION = 1658; - - // ACTION: Show Contextual homepage. Log total loading latency. - ACTION_CONTEXTUAL_HOME_SHOW = 1662; - - // ACTION: Contextual card displays - ACTION_CONTEXTUAL_CARD_SHOW = 1663; - - // ACTION: Contextual cards are eligible to be shown, but don't rank high - ACTION_CONTEXTUAL_CARD_NOT_SHOW = 1664; - - // ACTION: Settings > long press a card, and click dismiss - // Contextual card is dismissed - ACTION_CONTEXTUAL_CARD_DISMISS = 1665; - - // ACTION: Settings > click a card - // Contextual card is clicked - ACTION_CONTEXTUAL_CARD_CLICK = 1666; - - // Mapping: go/at-mapping - ACTION_ATSG = 1674; - - ACTION_ATPG = 1675; - - ACTION_ATCLPB = 1676; - - ACTION_ATCGIB = 1677; - - ACTION_ATCPAB = 1678; - - ACTION_ATCSAUC = 1679; - - ACTION_ATCSCUC = 1680; - - ACTION_ATCHNUC = 1681; - - // ACTION: Individual contextual card loading time - ACTION_CONTEXTUAL_CARD_LOAD = 1684; - - //ACTION: Contextual card loading timeout - ACTION_CONTEXTUAL_CARD_LOAD_TIMEOUT = 1685; - - //ACTION: Log result for each card's eligibility check - ACTION_CONTEXTUAL_CARD_ELIGIBILITY = 1686; - - // ACTION: Display white balance setting enabled or disabled. - // CATEGORY: SETTINGS - // OS: Q - ACTION_DISPLAY_WHITE_BALANCE_SETTING_CHANGED = 1703; - - // ACTION: Share a Wi-Fi network by generating a QR code - ACTION_SETTINGS_SHARE_WIFI_QR_CODE = 1710; - - // ACTION: Connect to a Wi-Fi network by scanning a QR code - ACTION_SETTINGS_ENROLL_WIFI_QR_CODE = 1711; - - // ACTION: Share Wi-Fi hotspot by generating a QR code - ACTION_SETTINGS_SHARE_WIFI_HOTSPOT_QR_CODE = 1712; - - // ACTION: Settings > Initialize Search bar > Verify Slice > Invalid data - ACTION_VERIFY_SLICE_ERROR_INVALID_DATA = 1725; - - // ACTION: Settings > Initialize Search bar > Verify Slice > Parsing error - ACTION_VERIFY_SLICE_PARSING_ERROR = 1726; - - // ACTION: Settings > Initialize Search bar > Verify Slice > Other exception - ACTION_VERIFY_SLICE_OTHER_EXCEPTION = 1727; - - // Custom tag to evaluate the consuming time of the Controller.updateState. - // CATEGORY: SETTINGS - // OS: R - ACTION_CONTROLLER_UPDATE_STATE = 1728; - - // Custom tag to evaluate the consuming time from onAttach to - // DashboardFragment.updatePreferenceStates. - // CATEGORY: SETTINGS - // OS: R - ACTION_DASHBOARD_VISIBLE_TIME = 1729; - - // ACTION: Allow "Access all files" for an app - APP_SPECIAL_PERMISSION_MANAGE_EXT_STRG_ALLOW = 1730; - - // ACTION: Deny "Access all files" for an app - APP_SPECIAL_PERMISSION_MANAGE_EXT_STRG_DENY = 1731; - - // ACTION: Battery feature usage - ACTION_BATTERY_OPTION_FEATURE_USAGE = 1732; - - // ACTION: Battery feature runtime event - ACTION_BATTERY_OPTION_RUNTIME_EVENT = 1733; - - // ACTION: Settings > Developer Options > Toggle on Wireless debugging - // CATEGORY: SETTINGS - // OS: R - ACTION_ADB_WIRELESS_ON = 1734; - - // ACTION: Settings > Developer Options > Toggle off Wireless debugging - // CATEGORY: SETTINGS - // OS: R - ACTION_ADB_WIRELESS_OFF = 1735; - - // ACTION: Change Wi-Fi hotspot name - // CATEGORY: SETTINGS - // OS: R - ACTION_SETTINGS_CHANGE_WIFI_HOTSPOT_NAME = 1736; - - // ACTION: Change Wi-Fi hotspot password - // CATEGORY: SETTINGS - // OS: R - ACTION_SETTINGS_CHANGE_WIFI_HOTSPOT_PASSWORD = 1737; - - // ACTION: Settings > Security > Toggle on Confirm Sim deletion - // CATEGORY: SETTINGS - // OS: R - ACTION_CONFIRM_SIM_DELETION_ON = 1738; - - // ACTION: Settings > Security > Toggle off Confirm Sim deletion - // CATEGORY: SETTINGS - // OS: R - ACTION_CONFIRM_SIM_DELETION_OFF = 1739; -} - -/** - * Id for Settings pages. Each page must have its own unique Id. - */ -enum PageId { - // Unknown page. Should not be used in production code. - PAGE_UNKNOWN = 0; - - // OPEN: Settings > Accessibility - // CATEGORY: SETTINGS - // OS: 6.0 - ACCESSIBILITY = 2; - - // OPEN: Settings > Accessibility > Captions preference - // CATEGORY: SETTINGS - // OS: 6.0 - ACCESSIBILITY_CAPTION_PROPERTIES = 3; - - // OPEN: Settings > Accessibility > [Service] - // CATEGORY: SETTINGS - // OS: 6.0 - ACCESSIBILITY_SERVICE = 4; - - // OPEN: Settings > Accessibility > Color correction - // CATEGORY: SETTINGS - // OS: 6.0 - ACCESSIBILITY_TOGGLE_DALTONIZER = 5; - - // OPEN: Settings > Accessibility > Accessibility shortcut - // CATEGORY: SETTINGS - // OS: 6.0 - ACCESSIBILITY_TOGGLE_GLOBAL_GESTURE = 6; - - // OPEN: Settings > Accessibility > Magnification gestures (Renamed in O) - // OPEN: Settings > Accessibility > Magnification > Magnify with triple-tap - // OPEN: Settings > Accessibility > Magnification > Magnify with button - // CATEGORY: SETTINGS - // OS: 6.0 - ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION = 7; - - // OPEN: Settings > Accounts - // CATEGORY: SETTINGS - // OS: 6.0 - ACCOUNT = 8; - - // OPEN: Settings > Accounts > [Single Account Sync Settings] - // CATEGORY: SETTINGS - // OS: 6.0 - ACCOUNTS_ACCOUNT_SYNC = 9; - - // OPEN: Settings > Accounts > Add an account - // CATEGORY: SETTINGS - // OS: 6.0 - ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY = 10; - - // OPEN: Settings > Cellular network settings > APNs - // CATEGORY: SETTINGS - // OS: 6.0 - APN = 12; - - // OPEN: Settings > More > Cellular network settings > APNs > [Edit APN] - // CATEGORY: SETTINGS - // OS: 6.0 - APN_EDITOR = 13; - - // OPEN: Settings > Apps > Configure apps > App links > [App] - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_APP_LAUNCH = 17; - - // OPEN: Settings > Internal storage > Apps storage > [App] - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_APP_STORAGE = 19; - - // OPEN: Settings > Apps > [App info] - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_INSTALLED_APP_DETAILS = 20; - - // OPEN: Settings > Memory > App usage > [App Memory usage] - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_PROCESS_STATS_DETAIL = 21; - - // OPEN: Settings > Memory > App usage - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_PROCESS_STATS_UI = 23; - - // OPEN: Choose Bluetooth device (ex: when sharing) - // CATEGORY: SETTINGS - // OS: 6.0 - BLUETOOTH_DEVICE_PICKER = 25; - - // OPEN: Settings > Security > Choose screen lock - // CATEGORY: SETTINGS - // OS: 6.0 - CHOOSE_LOCK_GENERIC = 27; - - // OPEN: Settings > Security > Choose screen lock > Choose your password - // CATEGORY: SETTINGS - // OS: 6.0 - CHOOSE_LOCK_PASSWORD = 28; - - // OPEN: Settings > Security > Choose screen lock > Choose your pattern - // CATEGORY: SETTINGS - // OS: 6.0 - CHOOSE_LOCK_PATTERN = 29; - - // OPEN: Settings > Security > Choose screen lock > Confirm your password - // CATEGORY: SETTINGS - // OS: 6.0 - CONFIRM_LOCK_PASSWORD = 30; - - // OPEN: Settings > Security > Choose screen lock > Confirm your pattern - // CATEGORY: SETTINGS - // OS: 6.0 - CONFIRM_LOCK_PATTERN = 31; - - // OPEN: Settings > Security > Encrypt phone - // CATEGORY: SETTINGS - // OS: 6.0 - CRYPT_KEEPER = 32; - - // OPEN: Settings > Security > Encrypt phone > Confirm - // CATEGORY: SETTINGS - // OS: 6.0 - CRYPT_KEEPER_CONFIRM = 33; - - // OPEN: Settings (Root page) - // CATEGORY: SETTINGS - // OS: 6.0 - DASHBOARD_SUMMARY = 35; - - // OPEN: Settings > Data usage - // CATEGORY: SETTINGS - // OS: 6.0 - DATA_USAGE_SUMMARY = 37; - - // OPEN: Settings > Date & time - // CATEGORY: SETTINGS - // OS: 6.0 - DATE_TIME = 38; - - // OPEN: Settings > Developer options - // CATEGORY: SETTINGS - // OS: 6.0 - DEVELOPMENT = 39; - - // OPEN: Settings > About phone - // CATEGORY: SETTINGS - // OS: 6.0 - DEVICEINFO = 40; - - // OPEN: Settings > Internal storage - // CATEGORY: SETTINGS - // OS: 6.0 - DEVICEINFO_STORAGE = 42; - - // OPEN: Settings > Display - // CATEGORY: SETTINGS - // OS: 6.0 - DISPLAY = 46; - - // OPEN: Settings > Display > Daydream - // CATEGORY: SETTINGS - // OS: 6.0 - DREAM = 47; - - // OPEN: Settings > Security > Screen lock > Secure start-up - // CATEGORY: SETTINGS - // OS: 6.0 - ENCRYPTION = 48; - - // OPEN: Settings > Security > Nexus Imprint - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT = 49; - - // OPEN: Settings > Battery > History details - // CATEGORY: SETTINGS - // OS: 6.0 - FUELGAUGE_BATTERY_HISTORY_DETAIL = 51; - - // OPEN: Settings > Battery > Battery saver - // CATEGORY: SETTINGS - // OS: 6.0 - FUELGAUGE_BATTERY_SAVER = 52; - - // OPEN: Settings > Battery > [App Use details] - // CATEGORY: SETTINGS - // OS: 6.0 - FUELGAUGE_POWER_USAGE_DETAIL = 53; - - // OPEN: Settings > Security > SIM card lock settings - // CATEGORY: SETTINGS - // OS: 6.0 - ICC_LOCK = 56; - - // OPEN: Settings > Language & input > Physical keyboard - // CATEGORY: SETTINGS - // OS: 6.0 - INPUTMETHOD_KEYBOARD = 58; - - // OPEN: Settings > Language & input > Spell checker - // CATEGORY: SETTINGS - // OS: 6.0 - INPUTMETHOD_SPELL_CHECKERS = 59; - - // OBSOLETE - INPUTMETHOD_SUBTYPE_ENABLER = 60; - - // OPEN: Settings > Language & input > Personal dictionary - // CATEGORY: SETTINGS - // OS: 6.0 - INPUTMETHOD_USER_DICTIONARY = 61; - - // OPEN: Settings > Language & input > Add word - // CATEGORY: SETTINGS - // OS: 6.0 - INPUTMETHOD_USER_DICTIONARY_ADD_WORD = 62; - - // OPEN: Settings > Location - // CATEGORY: SETTINGS - // OS: 6.0 - LOCATION = 63; - - // OPEN: Settings > Apps - // CATEGORY: SETTINGS - // OS: 6.0 - MANAGE_APPLICATIONS = 65; - - // OPEN: Settings > Backup & reset > Factory data reset - // CATEGORY: SETTINGS - // OS: 6.0 - MASTER_CLEAR = 66; - - // OPEN: Settings > Backup & reset > Factory data reset > Confirm - // CATEGORY: SETTINGS - // OS: 6.0 - MASTER_CLEAR_CONFIRM = 67; - - // OPEN: Settings > More > Android Beam - // CATEGORY: SETTINGS - // OS: 6.0 - NFC_BEAM = 69; - - // OPEN: Settings > Tap & pay - // CATEGORY: SETTINGS - // OS: 6.0 - NFC_PAYMENT = 70; - - // OPEN: Settings > Sound & notification > App notifications > [App] - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_APP_NOTIFICATION = 72; - - // OBSOLETE - NOTIFICATION_REDACTION = 74; - - // OPEN: Settings Widget > Notification log - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_STATION = 75; - - // OPEN: Settings > Sound & notification > Do not disturb - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_ZEN_MODE = 76; - - - // OPEN: Print job notification > Print job settings - // CATEGORY: SETTINGS - // OS: 6.0 - PRINT_JOB_SETTINGS = 78; - - // OPEN: Settings > Printing > [Print Service] - // CATEGORY: SETTINGS - // OS: 6.0 - PRINT_SERVICE_SETTINGS = 79; - - // OPEN: Settings > Printing - // CATEGORY: SETTINGS - // OS: 6.0 - PRINT_SETTINGS = 80; - - // OPEN: Settings > Backup & reset - // CATEGORY: SETTINGS - // OS: 6.0 - PRIVACY = 81; - - //OBSOLETE - PROXY_SELECTOR = 82; - - // OPEN: Settings > Backup & reset > Network settings reset - // CATEGORY: SETTINGS - // OS: 6.0 - RESET_NETWORK = 83; - - // OPEN: Settings > Backup & reset > Network settings reset > Confirm - // CATEGORY: SETTINGS - // OS: 6.0 - RESET_NETWORK_CONFIRM = 84; - - // OPEN: Settings > Developer Options > Running Services - // CATEGORY: SETTINGS - // OS: 6.0 - RUNNING_SERVICE_DETAILS = 85; - - // OPEN: Settings > Security > Screen pinning - // CATEGORY: SETTINGS - // OS: 6.0 - SCREEN_PINNING = 86; - - // OPEN: Settings > Security - // CATEGORY: SETTINGS - // OS: 6.0 - SECURITY = 87; - - // OPEN: Settings > SIM cards - // CATEGORY: SETTINGS - // OS: 6.0 - SIM = 88; - - // OBSOLETE - TESTING = 89; - - // OPEN: Settings > More > Tethering & portable hotspot - // CATEGORY: SETTINGS - // OS: 6.0 - TETHER = 90; - - // OPEN: Settings > Security > Trust agents - // CATEGORY: SETTINGS - // OS: 6.0 - TRUST_AGENT = 91; - - // OPEN: Settings > Security > Trusted credentials - // CATEGORY: SETTINGS - // OS: 6.0 - TRUSTED_CREDENTIALS = 92; - - // OPEN: Settings > Language & input > TTS output > [Engine] > Settings - // CATEGORY: SETTINGS - // OS: 6.0 - TTS_ENGINE_SETTINGS = 93; - - // OPEN: Settings > Language & input > Text-to-speech output - // CATEGORY: SETTINGS - // OS: 6.0 - TTS_TEXT_TO_SPEECH = 94; - - // OPEN: Settings > Security > Apps with usage access - // CATEGORY: SETTINGS - // OS: 6.0 - USAGE_ACCESS = 95; - - // OPEN: Settings > Users - // CATEGORY: SETTINGS - // OS: 6.0 - USER = 96; - - // OPEN: Settings > Users > [Restricted profile app & content access] - // CATEGORY: SETTINGS - // OS: 6.0 - USERS_APP_RESTRICTIONS = 97; - - // OPEN: Settings > Users > [User settings] - // CATEGORY: SETTINGS - // OS: 6.0 - USER_DETAILS = 98; - - // OPEN: Settings > More > VPN - // CATEGORY: SETTINGS - // OS: 6.0 - VPN = 100; - - // OPEN: Settings > Display > Choose wallpaper from - // CATEGORY: SETTINGS - // OS: 6.0 - WALLPAPER_TYPE = 101; - - // OPEN: Settings > Display > Cast - // CATEGORY: SETTINGS - // OS: 6.0 - WFD_WIFI_DISPLAY = 102; - - // OPEN: Settings > Wi-Fi - // CATEGORY: SETTINGS - // OS: 6.0 - WIFI = 103; - - // OPEN: Settings > More > Wi-Fi Calling - // CATEGORY: SETTINGS - // OS: 6.0 - WIFI_CALLING = 105; - - // OPEN: Settings > Wi-Fi > Saved networks - // CATEGORY: SETTINGS - // OS: 6.0 - WIFI_SAVED_ACCESS_POINTS = 106; - - // OPEN: Settings > Wi-Fi > Advanced Wi-Fi > Wi-Fi Direct - // CATEGORY: SETTINGS - // OS: 6.0 - WIFI_P2P = 109; - - // OPEN: Settings > Apps > Configure apps > App permissions - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_ADVANCED = 130; - - // OPEN: Settings > Location > Scanning - // CATEGORY: SETTINGS - // OS: 6.0 - LOCATION_SCANNING = 131; - - // OPEN: Settings > Sound & notification > App notifications - // CATEGORY: SETTINGS - // OS: 6.0 - MANAGE_APPLICATIONS_NOTIFICATIONS = 133; - - // OPEN: Settings > Sound & notification > DND > Priority only allows - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_ZEN_MODE_PRIORITY = 141; - - // OPEN: Settings > Sound & notification > DND > Automatic rules - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_ZEN_MODE_AUTOMATION = 142; - - // OPEN: Settings > Sound & notification > DND > [Time based rule] - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_ZEN_MODE_SCHEDULE_RULE = 144; - - // OPEN: Settings > Apps > Configure apps > App links - // CATEGORY: SETTINGS - // OS: 6.0 - MANAGE_DOMAIN_URLS = 143; - - // OPEN: Settings > Sound & notification > DND > [Event rule] - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_ZEN_MODE_EVENT_RULE = 146; - - // OPEN: Settings > Sound & notification > Notification access - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_ACCESS = 179; - - // OPEN: Settings > Sound & notification > Do Not Disturb access - // CATEGORY: SETTINGS - // OS: 6.0 - NOTIFICATION_ZEN_MODE_ACCESS = 180; - - // OPEN: Settings > Internal storage > Apps storage - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_STORAGE_APPS = 182; - - // OPEN: Settings > Security > Usage access - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_USAGE_ACCESS_DETAIL = 183; - - // OPEN: Settings > Battery > Battery optimization - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_HIGH_POWER_APPS = 184; - - // OPEN: Settings > Apps > Configure > Default apps > Assist & voice input - // CATEGORY: SETTINGS - // OS: 6.0 - APPLICATIONS_MANAGE_ASSIST = 201; - - // OPEN: Settings > Memory - // CATEGORY: SETTINGS - // OS: 6.0 - PROCESS_STATS_SUMMARY = 202; - - // OPEN: Settings > Apps > Configure Apps > Display over other apps - // CATEGORY: SETTINGS - // OS: 6.0 - SYSTEM_ALERT_WINDOW_APPS = 221; - - // OPEN: Settings > About phone > Legal information - // CATEGORY: SETTINGS - // OS: 6.0 - ABOUT_LEGAL_SETTINGS = 225; - - - // OPEN: Settings > Developer options > Inactive apps - // CATEGORY: SETTINGS - // OS: 6.0 - FUELGAUGE_INACTIVE_APPS = 238; - - // OPEN: Settings > Security > Nexus Imprint > Add Fingerprint - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_ENROLLING = 240; - // OPEN: Fingerprint Enroll > Find Sensor - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_FIND_SENSOR = 241; - - // OPEN: Fingerprint Enroll > Fingerprint Enrolled! - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_ENROLL_FINISH = 242; - - // OPEN: Fingerprint Enroll introduction - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_ENROLL_INTRO = 243; - - // OPEN: Fingerprint Enroll > Let's Start! - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_ENROLL_SIDECAR = 245; - - // OPEN: Fingerprint Enroll SUW > Let's Start! - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_ENROLLING_SETUP = 246; - - // OPEN: Fingerprint Enroll SUW > Find Sensor - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_FIND_SENSOR_SETUP = 247; - - // OPEN: Fingerprint Enroll SUW > Fingerprint Enrolled! - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_ENROLL_FINISH_SETUP = 248; - - // OPEN: Fingerprint Enroll SUW introduction - // CATEGORY: SETTINGS - // OS: 6.0 - FINGERPRINT_ENROLL_INTRO_SETUP = 249; - - // OPEN: Settings > Developer Options > Background Check - // CATEGORY: SETTINGS - // OS: N - BACKGROUND_CHECK_SUMMARY = 258; - - // OPEN: Settings > Notifications > [App] > Channel Notifications - // CATEGORY: SETTINGS - // OS: N - NOTIFICATION_TOPIC_NOTIFICATION = 265; - - // OPEN: Settings > Security > User credentials - // CATEGORY: Settings - // OS: N - USER_CREDENTIALS = 285; - - // Logs that the user has edited the enabled VR listeners. - // CATEGORY: SETTINGS - // OS: N - VR_MANAGE_LISTENERS = 334; - - // Settings -> Accessibility -> Click after pointer stops moving - // CATEGORY: SETTINGS - // OS: N - ACCESSIBILITY_TOGGLE_AUTOCLICK = 335; - - // Settings -> Sound - // CATEGORY: SETTINGS - // OS: N - SOUND = 336; - - // Settings -> Notifications -> Gear - // CATEGORY: SETTINGS - // OS: N - CONFIGURE_NOTIFICATION = 337; - - // Settings -> Wi-Fi -> Gear - // CATEGORY: SETTINGS - // OS: N - CONFIGURE_WIFI = 338; - - // Settings -> Display -> Display size - // OS: N - DISPLAY_SCREEN_ZOOM = 339; - - // Settings -> Display -> Font size - // CATEGORY: SETTINGS - // OS: N - ACCESSIBILITY_FONT_SIZE = 340; - - // Settings -> Data usage -> Cellular/Wi-Fi data usage - // CATEGORY: SETTINGS - // OS: N - DATA_USAGE_LIST = 341; - - // Settings -> Data usage -> Billing cycle or DATA_USAGE_LIST -> Gear - // CATEGORY: SETTINGS - // OS: N - BILLING_CYCLE = 342; - - // DATA_USAGE_LIST -> Any item or App info -> Data usage - // CATEGORY: SETTINGS - // OS: N - APP_DATA_USAGE = 343; - - // Settings -> Language & input -> Language - // CATEGORY: SETTINGS - // OS: N - USER_LOCALE_LIST = 344; - - // Settings -> Language & input -> Virtual keyboard - // CATEGORY: SETTINGS - // OS: N - VIRTUAL_KEYBOARDS = 345; - - // Settings -> Language & input -> Physical keyboard - // CATEGORY: SETTINGS - // OS: N - PHYSICAL_KEYBOARDS = 346; - - // Settings -> Language & input -> Virtual keyboard -> Add a virtual keyboard - // CATEGORY: SETTINGS - // OS: N - ENABLE_VIRTUAL_KEYBOARDS = 347; - - // Settings -> Data usage -> Data Saver - // CATEGORY: SETTINGS - // OS: N - DATA_SAVER_SUMMARY = 348; - - // Settings -> Data usage -> Data Saver -> Unrestricted data access - // CATEGORY: SETTINGS - // OS: N - DATA_USAGE_UNRESTRICTED_ACCESS = 349; - - // Settings -> Apps -> Gear -> Special access - SPECIAL_ACCESS = 351; - - // OPEN: SUW Welcome Screen -> Vision Settings - // CATEGORY: SETTINGS - // OS: N - SUW_ACCESSIBILITY = 367; - - // OPEN: SUW Welcome Screen -> Vision Settings -> Magnification gestures (Renamed in O) - // OPEN: SUW Welcome Screen -> Vision Settings -> Magnification -> Magnify with triple-tap - // OPEN: SUW Welcome Screen -> Vision Settings -> Magnification -> Magnify with button - // ACTION: New magnification gesture configuration is chosen - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: N - SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION = 368; - - // OPEN: SUW Welcome Screen -> Vision Settings -> Font size - // ACTION: New font size is chosen - // SUBTYPE: 0 is small, 1 is default, 2 is large, 3 is largest - // CATEGORY: SETTINGS - // OS: N - SUW_ACCESSIBILITY_FONT_SIZE = 369; - - // OPEN: SUW Welcome Screen -> Vision Settings -> Display size - // ACTION: New display size is chosen - // SUBTYPE: 0 is small, 1 is default, 2 is large, 3 is larger, 4 is largest - // CATEGORY: SETTINGS - // OS: N - SUW_ACCESSIBILITY_DISPLAY_SIZE = 370; - - // OPEN: SUW Welcome Screen -> Vision Settings -> TalkBack - // ACTION: New screen reader configuration is chosen - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: N - SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER = 371; - - // Airplane mode on - SETTINGS_CONDITION_AIRPLANE_MODE = 377; - // AKA Data saver on - SETTINGS_CONDITION_BACKGROUND_DATA = 378; - // Battery saver on - SETTINGS_CONDITION_BATTERY_SAVER = 379; - // Cellular data off - SETTINGS_CONDITION_CELLULAR_DATA = 380; - // Do not disturb on - SETTINGS_CONDITION_DND = 381; - // Hotspot on - SETTINGS_CONDITION_HOTSPOT = 382; - // Work profile off - SETTINGS_CONDITION_WORK_MODE = 383; - - // Settings > Apps > Gear > Special Access > Premium SMS access - PREMIUM_SMS_ACCESS = 388; - - // OPEN: Settings > Accounts > Work profile settings - // CATEGORY: SETTINGS - ACCOUNTS_WORK_PROFILE_SETTINGS = 401; - - // Settings -> Dev options -> Convert to file encryption - CONVERT_FBE = 402; - - // Settings -> Dev options -> Convert to file encryption -> WIPE AND CONVERT... - CONVERT_FBE_CONFIRM = 403; - - // Settings -> Dev options -> Running services - RUNNING_SERVICES = 404; - - // The dialog shown by 3P intent to change current webview implementation. - WEBVIEW_IMPLEMENTATION = 405; - - // OPEN: Settings > Internal storage > Storage manager - // CATEGORY: SETTINGS - STORAGE_MANAGER_SETTINGS = 458; - - // OPEN: Settings -> Gestures - // CATEGORY: SETTINGS - SETTINGS_GESTURES = 459; - - // OPEN: Settings > Display > Night Light - // CATEGORY: SETTINGS - NIGHT_DISPLAY_SETTINGS = 488; - - // Night Light on - SETTINGS_CONDITION_NIGHT_DISPLAY = 492; - - // OPEN: Settings > Language & input > Personal dictionary (single locale) - USER_DICTIONARY_SETTINGS = 514; - - // OPEN: Settings > Date & time > Select time zone - ZONE_PICKER = 515; - - // OPEN: Settings > Security > Device administrators - DEVICE_ADMIN_SETTINGS = 516; - - // OPEN: Settings > Security > Factory Reset Protection dialog - DIALOG_FRP = 528; - - // OPEN: Settings > Custom list preference with confirmation message - DIALOG_CUSTOM_LIST_CONFIRMATION = 529; - - // OPEN: Settings > APN Editor > Error dialog - DIALOG_APN_EDITOR_ERROR = 530; - - // OPEN: Settings > Users > Edit owner info dialog - DIALOG_OWNER_INFO_SETTINGS = 531; - - // OPEN: Settings > Security > Use one lock dialog - DIALOG_UNIFICATION_CONFIRMATION = 532; - - // OPEN: Settings > Security > User Credential - DIALOG_USER_CREDENTIAL = 533; - - // OPEN: Settings > Accounts > Remove account - DIALOG_REMOVE_USER = 534; - - // OPEN: Settings > Accounts > Confirm auto sync dialog - DIALOG_CONFIRM_AUTO_SYNC_CHANGE = 535; - - // OPEN: Settings > Apps > Dialog for running service details - DIALOG_RUNNIGN_SERVICE = 536; - - // OPEN: Settings > Bluetooth > Rename this device - DIALOG_BLUETOOTH_RENAME = 538; - - // OPEN: Settings > Battery optimization > details for app - DIALOG_HIGH_POWER_DETAILS = 540; - - // OPEN: Settings > Keyboard > Show keyboard layout dialog - DIALOG_KEYBOARD_LAYOUT = 541; - - // OPEN: Settings > WIFI Scan permission dialog - DIALOG_WIFI_SCAN_MODE = 543; - - // OPEN: Settings > Wireless > VPN > Config dialog - DIALOG_LEGACY_VPN_CONFIG = 545; - - // OPEN: Settings > Wireless > VPN > Config dialog for app - DIALOG_VPN_APP_CONFIG = 546; - - // OPEN: Settings > Wireless > VPN > Cannot connect dialog - DIALOG_VPN_CANNOT_CONNECT = 547; - - // OPEN: Settings > Wireless > VPN > Replace existing VPN dialog - DIALOG_VPN_REPLACE_EXISTING = 548; - - // OPEN: Settings > Billing cycle > Edit billing cycle dates dialog - DIALOG_BILLING_CYCLE = 549; - - // OPEN: Settings > Billing cycle > Edit data limit/warning dialog - DIALOG_BILLING_BYTE_LIMIT = 550; - - // OPEN: Settings > Billing cycle > turn on data limit dialog - DIALOG_BILLING_CONFIRM_LIMIT = 551; - - // OPEN: Settings > Service > Turn off notification access dialog - DIALOG_DISABLE_NOTIFICATION_ACCESS = 552; - - // OPEN: Settings > Sound > Use personal sound for work profile dialog - DIALOG_UNIFY_SOUND_SETTINGS = 553; - - // OPEN: Settings > Zen mode > Dialog warning about the zen access privileges being granted. - DIALOG_ZEN_ACCESS_GRANT = 554; - - // OPEN: Settings > Zen mode > Dialog warning about the zen access privileges being revoked. - DIALOG_ZEN_ACCESS_REVOKE = 555; - - // OPEN: Settings > Zen mode > Dialog that picks time for zen mode. - DIALOG_ZEN_TIMEPICKER = 556; - - // OPEN: Settings > Apps > Dialog that informs user to allow service access for app. - DIALOG_SERVICE_ACCESS_WARNING = 557; - - // OPEN: Settings > Apps > Dialog for app actions (such as force stop/clear data) - DIALOG_APP_INFO_ACTION = 558; - - // OPEN: Settings > Storage > Dialog for forgetting a storage device - DIALOG_VOLUME_FORGET = 559; - - // OPEN: Settings > Storage > Dialog for initializing a volume - DIALOG_VOLUME_INIT = 561; - - // OPEN: Settings > Storage > Dialog for unmounting a volume - DIALOG_VOLUME_UNMOUNT = 562; - - // OPEN: Settings > Storage > Dialog for renaming a volume - DIALOG_VOLUME_RENAME = 563; - - // OPEN: Settings > Storage > Dialog for clear cache - DIALOG_STORAGE_CLEAR_CACHE = 564; - - // OPEN: Settings > Storage > Dialog for system info - DIALOG_STORAGE_SYSTEM_INFO = 565; - - // OPEN: Settings > Storage > Dialog for other info - DIALOG_STORAGE_OTHER_INFO = 566; - - // OPEN: Settings > Storage > Dialog for user info - DIALOG_STORAGE_USER_INFO = 567; - // OPEN: Settings > Add fingerprint > Dialog when user touches fingerprint icon. - DIALOG_FINGERPRINT_ICON_TOUCH = 568; - - // OPEN: Settings > Add fingerprint > Error dialog - DIALOG_FINGERPINT_ERROR = 569; - - // OPEN: Settings > Fingerprint > Rename or delete dialog - DIALOG_FINGERPINT_EDIT = 570; - - // OPEN: Settings > Fingerprint > Dialog for deleting last fingerprint - DIALOG_FINGERPINT_DELETE_LAST = 571; - - // OPEN: SUW > Fingerprint > Dialog to confirm skip fingerprint setup entirely. - DIALOG_FINGERPRINT_SKIP_SETUP = 573; - - // OPEN: Settings > Proxy Selector error dialog - DIALOG_PROXY_SELECTOR_ERROR = 574; - - // OPEN: Settings > Wifi > P2P Settings > Disconnect dialog - DIALOG_WIFI_P2P_DISCONNECT = 575; - - // OPEN: Settings > Wifi > P2P Settings > Cancel connection dialog - DIALOG_WIFI_P2P_CANCEL_CONNECT = 576; - - // OPEN: Settings > Wifi > P2P Settings > Rename dialog - DIALOG_WIFI_P2P_RENAME = 577; - - // OPEN: Settings > Wifi > P2P Settings > Forget group dialog - DIALOG_WIFI_P2P_DELETE_GROUP = 578; - - // OPEN: Settings > APN > Restore default dialog - DIALOG_APN_RESTORE_DEFAULT = 579; - - // OPEN: Settings > Encryption interstitial accessibility warning dialog - DIALOG_ENCRYPTION_INTERSTITIAL_ACCESSIBILITY = 581; - - // OPEN: Settings > Acessibility > Enable accessiblity service dialog - DIALOG_ACCESSIBILITY_SERVICE_ENABLE = 583; - - // OPEN: Settings > Acessibility > Disable accessiblity service dialog - DIALOG_ACCESSIBILITY_SERVICE_DISABLE = 584; - - // OPEN: Settings > Account > Remove account dialog - DIALOG_ACCOUNT_SYNC_REMOVE = 585; - - // OPEN: Settings > Account > Remove account failed dialog - DIALOG_ACCOUNT_SYNC_FAILED_REMOVAL = 586; - - // OPEN: Settings > Account > Cannot do onetime sync dialog - DIALOG_ACCOUNT_SYNC_CANNOT_ONETIME_SYNC = 587; - - // OPEN: Settings > Display > Night light > Set start time dialog - DIALOG_NIGHT_DISPLAY_SET_START_TIME = 588; - - // OPEN: Settings > Display > Night light > Set end time dialog - DIALOG_NIGHT_DISPLAY_SET_END_TIME = 589; - - - - // OPEN: Settings > User > Edit info dialog - DIALOG_USER_EDIT = 590; - - // OPEN: Settings > User > Confirm remove dialog - DIALOG_USER_REMOVE = 591; - - // OPEN: Settings > User > Enable calling dialog - DIALOG_USER_ENABLE_CALLING = 592; - - // OPEN: Settings > User > Enable calling and sms dialog - DIALOG_USER_ENABLE_CALLING_AND_SMS = 593; - - // OPEN: Settings > User > Cannot manage device message dialog - DIALOG_USER_CANNOT_MANAGE = 594; - - // OPEN: Settings > User > Add user dialog - DIALOG_USER_ADD = 595; - - // OPEN: Settings > User > Setup user dialog - DIALOG_USER_SETUP = 596; - - // OPEN: Settings > User > Setup profile dialog - DIALOG_USER_SETUP_PROFILE = 597; - - // OPEN: Settings > User > Choose user type dialog - DIALOG_USER_CHOOSE_TYPE = 598; - - // OPEN: Settings > User > Need lockscreen dialog - DIALOG_USER_NEED_LOCKSCREEN = 599; - - // OPEN: Settings > User > Confirm exit guest mode dialog - DIALOG_USER_CONFIRM_EXIT_GUEST = 600; - - // OPEN: Settings > User > Edit user profile dialog - DIALOG_USER_EDIT_PROFILE = 601; - - - // OPEN: Settings > Wifi > Saved AP > Edit dialog - DIALOG_WIFI_SAVED_AP_EDIT = 602; - - // OPEN: Settings > Wifi > Edit AP dialog - DIALOG_WIFI_AP_EDIT = 603; - - // OPEN: Settings > Wifi > Write config to NFC dialog - DIALOG_WIFI_WRITE_NFC = 606; - - // OPEN: Settings > Date > Date picker dialog - DIALOG_DATE_PICKER = 607; - - // OPEN: Settings > Date > Time picker dialog - DIALOG_TIME_PICKER = 608; - - // OPEN: Settings > Wireless > Manage wireless plan dialog - DIALOG_MANAGE_MOBILE_PLAN = 609; - - // OPEN Settings > Bluetooth > Attempt to connect to device that shows dialog - BLUETOOTH_DIALOG_FRAGMENT = 613; - - // OPEN: Settings > Security - // CATEGORY: SETTINGS - // OS: O - ENTERPRISE_PRIVACY_SETTINGS = 628; - - // OPEN: Settings > System - SETTINGS_SYSTEM_CATEGORY = 744; - - // OPEN: Settings > Storage - SETTINGS_STORAGE_CATEGORY = 745; - - // OPEN: Settings > Network & Internet - SETTINGS_NETWORK_CATEGORY = 746; - - // OPEN: Settings > Connected Device - SETTINGS_CONNECTED_DEVICE_CATEGORY = 747; - - // OPEN: Settings > App & Notification - SETTINGS_APP_NOTIF_CATEGORY = 748; - - // OPEN: Settings > System > Language & Region - SETTINGS_LANGUAGE_CATEGORY = 750; - - // OPEN: Settings > System > Input & Gesture > Swipe to notification gesture - SETTINGS_GESTURE_SWIPE_TO_NOTIFICATION = 751; - - // OPEN: Settings > System > Input & Gesture > Double tap power button gesture - SETTINGS_GESTURE_DOUBLE_TAP_POWER = 752; - - // OPEN: Settings > System > Input & Gesture > Pick up gesture - SETTINGS_GESTURE_PICKUP = 753; - - // OPEN: Settings > System > Input & Gesture > Double tap screen gesture - SETTINGS_GESTURE_DOUBLE_TAP_SCREEN = 754; - - // OPEN: Settings > System > Input & Gesture > Double twist gesture - SETTINGS_GESTURE_DOUBLE_TWIST = 755; - - // OPEN: Settings > Apps > Default Apps > Default browser - DEFAULT_BROWSER_PICKER = 785; - // OPEN: Settings > Apps > Default Apps > Default emergency app - DEFAULT_EMERGENCY_APP_PICKER = 786; - - // OPEN: Settings > Apps > Default Apps > Default home - DEFAULT_HOME_PICKER = 787; - - // OPEN: Settings > Apps > Default Apps > Default phone - DEFAULT_PHONE_PICKER = 788; - - // OPEN: Settings > Apps > Default Apps > Default sms - DEFAULT_SMS_PICKER = 789; - - // OPEN: Settings > Apps > Notification > Notification Assistant - DEFAULT_NOTIFICATION_ASSISTANT = 790; - - - // OPEN: Settings > Apps > Default Apps > Warning dialog to confirm selection - DEFAULT_APP_PICKER_CONFIRMATION_DIALOG = 791; - - // OPEN: Settings > Apps > Default Apps > Default autofill app - DEFAULT_AUTOFILL_PICKER = 792; - - // OPEN: Settings > Apps > Gear > Special Access > Install other apps - // CATEGORY: SETTINGS - // OS: 8.0 - MANAGE_EXTERNAL_SOURCES = 808; - - // Logs that the user has edited the picture-in-picture settings. - // CATEGORY: SETTINGS - SETTINGS_MANAGE_PICTURE_IN_PICTURE = 812; - - // OPEN: SUW Welcome Screen -> Vision Settings -> Select to Speak - // ACTION: Select to Speak configuration is chosen - // SUBTYPE: 0 is off, 1 is on - // CATEGORY: SETTINGS - // OS: N - SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK = 817; - - // OPEN: Settings > System > Backup - // CATEGORY: SETTINGS - // OS: O - BACKUP_SETTINGS = 818; - - // OPEN: Settings > Storage > Games - // CATEGORY: SETTINGS - // OS: O - APPLICATIONS_STORAGE_GAMES = 838; - - // OPEN: Settings > Storage > Audio and Music - // CATEGORY: SETTINGS - // OS: O - APPLICATIONS_STORAGE_MUSIC = 839; - - // ACTION: Settings > Storage > Free Up Space to launch Deletion Helper - // CATEGORY: SETTINGS - // OS: O - STORAGE_FREE_UP_SPACE_NOW = 840; - - // ACTION: Settings > Storage > Files to open the File Manager - // CATEGORY: SETTINGS - // OS: O - STORAGE_FILES = 841; - - // OPEN: Settings > Apps > Default Apps > Assist > Default assist - DEFAULT_ASSIST_PICKER = 843; - - // OPEN: Settings > Apps > Default Apps > Assist > Default voice input - DEFAULT_VOICE_INPUT_PICKER = 844; - - // OPEN: Settings > Storage > [Profile] - SETTINGS_STORAGE_PROFILE = 845; - - // OPEN: Settings > Security & screen lock -> Encryption & crendentials - // CATEGORY: SETTINGS - // OS: O - ENCRYPTION_AND_CREDENTIAL = 846; - - // OPEN: Settings > Wi-Fi > Network Details (click on Access Point) - // CATEGORY: SETTINGS - // OS: O - WIFI_NETWORK_DETAILS = 849; - - // OPEN: Settings > Wi-Fi > Wifi Preferences -> Advanced -> Network Scorer - // CATEGORY: SETTINGS - // OS: O - SETTINGS_NETWORK_SCORER = 861; - - // OPEN: Settings > About device > Model > Hardware info dialog - DIALOG_SETTINGS_HARDWARE_INFO = 862; - - // OPEN: Settings > Security & screen lock -> Lock screen preferences - // CATEGORY: SETTINGS - SETTINGS_LOCK_SCREEN_PREFERENCES = 882; - - - // OPEN: Settings -> Display -> When in VR Mode - VR_DISPLAY_PREFERENCE = 921; - - // OPEN: Settings > Accessibility > Magnification - // CATEGORY: SETTINGS - // OS: O - ACCESSIBILITY_SCREEN_MAGNIFICATION_SETTINGS = 922; - - // OPEN: Settings -> System -> Reset options - RESET_DASHBOARD = 924; - - // OPEN: Settings > Security > Nexus Imprint > [Fingerprint] > Delete - // CATEGORY: SETTINGS - // OS: O - FINGERPRINT_REMOVE_SIDECAR = 934; - - // OPEN: Settings > Storage > Movies & TV - // CATEGORY: SETTINGS - // OS: O - APPLICATIONS_STORAGE_MOVIES = 935; - - // OPEN: Settings > Security > Managed Device Info > Apps installed - // CATEGORY: SETTINGS - // OS: O - ENTERPRISE_PRIVACY_INSTALLED_APPS = 938; - - // OPEN: Settings > Security > Managed Device Info > nnn permissions - // CATEGORY: SETTINGS - // OS: O - ENTERPRISE_PRIVACY_PERMISSIONS = 939; - - - // OPEN: Settings > Security > Managed Device Info > Default apps - // CATEGORY: SETTINGS - // OS: O - ENTERPRISE_PRIVACY_DEFAULT_APPS = 940; - - // OPEN: Choose screen lock dialog in Settings - // CATEGORY: SETTINGS - // OS: O DR - SETTINGS_CHOOSE_LOCK_DIALOG = 990; - - // OPEN: Settings > System > Languages & input > Assist gesture - // CATEGORY: SETTINGS - // OS: O DR - SETTINGS_ASSIST_GESTURE = 996; - - // OPEN: Settings > Connected Devices > Bluetooth > (click on details link for a paired device) - BLUETOOTH_DEVICE_DETAILS = 1009; - - // OPEN: Settings > credential pages - prompt for key guard configuration confirmation - CONFIGURE_KEYGUARD_DIALOG = 1010; - - // OPEN: Settings > Network > Tether > Wi-Fi hotspot - WIFI_TETHER_SETTINGS = 1014; - - // OPEN: Settings->Connected Devices->Bluetooth->(click on details link for a paired device) - // -> Edit name button. - // CATEGORY: SETTINGS - // OS: O DR - DIALOG_BLUETOOTH_PAIRED_DEVICE_RENAME = 1015; - - // OPEN: Settings > Connected devices > Bluetooth > Pair new device - // CATEGORY: SETTINGS - // OS: O DR - BLUETOOTH_PAIRING = 1018; - - // OPEN: Settings->Connected Devices->Bluetooth->(click on details link for a paired device) - // -> Forget button. - // CATEGORY: SETTINGS - // OS: O DR - DIALOG_BLUETOOTH_PAIRED_DEVICE_FORGET = 1031; - - // OPEN: Settings > Storage > Photos & Videos - // CATEGORY: SETTINGS - // OS: O MR - APPLICATIONS_STORAGE_PHOTOS = 1092; - - // OPEN: Settings > Display > Colors - // CATEGORY: SETTINGS - // OS: O MR - COLOR_MODE_SETTINGS = 1143; - - // OPEN: Settings > Developer Options > Experiment dashboard - // CATEGORY: SETTINGS - SETTINGS_FEATURE_FLAGS_DASHBOARD = 1217; - - // OPEN: Settings > Notifications > [App] > Topic Notifications - // CATEGORY: SETTINGS - // OS: P - NOTIFICATION_CHANNEL_GROUP = 1218; - - // OPEN: Settings > Developer options > Enable > Info dialog - // CATEGORY: SETTINGS - // OS: P - DIALOG_ENABLE_DEVELOPMENT_OPTIONS = 1219; - - // OPEN: Settings > Developer options > OEM unlocking > Info dialog - // CATEGORY: SETTINGS - // OS: P - DIALOG_ENABLE_OEM_UNLOCKING = 1220; - - // OPEN: Settings > Developer options > USB debugging > Info dialog - // CATEGORY: SETTINGS - // OS: P - DIALOG_ENABLE_ADB = 1222; - - // OPEN: Settings > Security > Nexus Imprint > [Fingerprint] - // CATEGORY: SETTINGS - // OS: P - FINGERPRINT_AUTHENTICATE_SIDECAR = 1221; - - // OPEN: Settings > Developer options > Revoke USB debugging authorizations > Info dialog - // CATEGORY: SETTINGS - // OS: P - DIALOG_CLEAR_ADB_KEYS = 1223; - - // Open: Settings > Developer options > Quick setting tile config - // CATEGORY: SETTINGS - // OS: P - DEVELOPMENT_QS_TILE_CONFIG = 1224; - - // OPEN: Settings > Developer options > Store logger data persistently on device > Info dialog - // CATEGORY: SETTINGS - // OS: P - DIALOG_LOG_PERSIST = 1225; - - // OPEN: Settings > Network & Internet > Mobile network > Wi-Fi calling - // CATEGORY: SETTINGS - // OS: P - WIFI_CALLING_FOR_SUB = 1230; - - // Open: Settings > Dev options > Oem unlock > lock it > warning dialog. - // OS: P - DIALOG_OEM_LOCK_INFO = 1238; - - // Open: Settings > System > About phone > IMEI - // CATEGORY: SETTINGS - // OS: P - DIALOG_IMEI_INFO = 1240; - - // OPEN: Settings > System > About Phone > Sim status - // CATEGORY: SETTINGS - // OS: P - DIALOG_SIM_STATUS = 1246; - - // OPEN: Settings > System > About Phone > Android Version - // CATEGORY: SETTINGS - // OS: P - DIALOG_FIRMWARE_VERSION = 1247; - - // OPEN: Settings > Battery(version 2) - // CATEGORY: SETTINGS - // OS: P - FUELGAUGE_POWER_USAGE_SUMMARY_V2 = 1263; - - // OPEN: Settings > Connected devices > Connection preferences - // CATEGORY: SETTINGS - // OS: P - CONNECTION_DEVICE_ADVANCED = 1264; - - // OPEN: Settings > Security > Screen lock gear icon - // CATEGORY: SETTINGS - // OS: P - SCREEN_LOCK_SETTINGS = 1265; - - // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Delete rule (trash can icon) - // CATEGORY: SETTINGS - // OS: P - NOTIFICATION_ZEN_MODE_DELETE_RULE_DIALOG = 1266; - - // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Add rule > Event/Time - // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Select rule ("Event") > Rule name - // CATEGORY: SETTINGS - // OS: P - NOTIFICATION_ZEN_MODE_RULE_NAME_DIALOG = 1269; - - // OPEN: Settings > Sound > Do Not Disturb > Turn on automatically > Add rule - // CATEGORY: SETTINGS - // OS: P - NOTIFICATION_ZEN_MODE_RULE_SELECTION_DIALOG = 1270; - - // OPEN: Settings > Battery > Smart Battery - // CATEGORY: SETTINGS - // OS: P - FUELGAUGE_SMART_BATTERY = 1281; - - // OPEN: Settings > Battery > Smart Battery > Restricted apps - // CATEGORY: SETTINGS - // OS: P - FUELGAUGE_RESTRICTED_APP_DETAILS = 1285; - - // OPEN: Settings > Sound & notification > Do Not Disturb > Turn on now - // CATEGORY: SETTINGS - // OS: P - NOTIFICATION_ZEN_MODE_ENABLE_DIALOG = 1286; - - // OPEN: Settings->Connected Devices->USB->(click on details link) - // CATEGORY: SETTINGS - // OS: P - USB_DEVICE_DETAILS = 1291; - - // OPEN: Settings > Accessibility > Vibration - // CATEGORY: SETTINGS - // OS: P - ACCESSIBILITY_VIBRATION = 1292; - - // OPEN: Settings > Accessibility > Vibration > Notification vibration - // CATEGORY: SETTINGS - // OS: P - ACCESSIBILITY_VIBRATION_NOTIFICATION = 1293; - - // OPEN: Settings > Accessibility > Vibration > Touch vibration - // CATEGORY: SETTINGS - // OS: P - ACCESSIBILITY_VIBRATION_TOUCH = 1294; - - // OPEN: Settings->Developer Options->Default USB - // CATEGORY: SETTINGS - // OS: P - USB_DEFAULT = 1312; - - // OPEN: Settings > Battery > Battery tip > Battery tip Dialog - // CATEGORY: SETTINGS - // OS: P - FUELGAUGE_BATTERY_TIP_DIALOG = 1323; - - // OPEN: DND Settings > What to block - // OS: P - ZEN_WHAT_TO_BLOCK = 1339; - - // OPEN: Settings > Sounds > Do Not Disturb > Duration - // CATEGORY: SETTINGS - // OS: P - NOTIFICATION_ZEN_MODE_DURATION_DIALOG = 1341; - - // OPEN: Settings > Date & time > Select time zone -> Region - // CATEGORY: SETTINGS - // OS: P - SETTINGS_ZONE_PICKER_REGION = 1355; - - // OPEN: Settings > Date & time > Select time zone -> Time Zone - // CATEGORY: SETTINGS - // OS: P - SETTINGS_ZONE_PICKER_TIME_ZONE = 1356; - // OPEN: Settings > Date & time > Select time zone -> Select UTC Offset - // CATEGORY: SETTINGS - // OS: P - SETTINGS_ZONE_PICKER_FIXED_OFFSET = 1357; - - // OPEN: Settings > Gestures > Prevent Ringing - // OS: P - SETTINGS_PREVENT_RINGING = 1360; - - // Settings > Condition > Device muted - // CATEGORY: SETTINGS - // OS: P - SETTINGS_CONDITION_DEVICE_MUTED = 1368; - - // Settings > Condition > Device vibrate - // CATEGORY: SETTINGS - // OS: P - SETTINGS_CONDITION_DEVICE_VIBRATE = 1369; - - // OPEN: Settings > Connected devices > previously connected devices - // CATEGORY: SETTINGS - // OS: P - PREVIOUSLY_CONNECTED_DEVICES = 1370; - - // OPEN: Settings > Network & Internet > Wi-Fi > Wi-Fi Preferences > Turn on Wi-Fi automatically - // note: Wifi Scanning must be off for this dialog to show - // CATEGORY: SETTINGS - // OS: P - WIFI_SCANNING_NEEDED_DIALOG = 1373; - - // OPEN: Settings > System > Gestures > System navigation - // CATEGORY: SETTINGS - // OS: P - SETTINGS_GESTURE_SWIPE_UP = 1374; - - // OPEN: Settings > Storage > Dialog to format a storage volume - // CATEGORY: SETTINGS - // OS: P - DIALOG_VOLUME_FORMAT = 1375; - - // OPEN: DND onboarding activity - // CATEGORY: SETTINGS - // OS: P - SETTINGS_ZEN_ONBOARDING = 1380; - - // OPEN: Settings > Display > Auto brightness - // CATEGORY: SETTINGS - // OS: P - SETTINGS_AUTO_BRIGHTNESS = 1381; - - // OPEN: Settings > Connected Devices > Bluetooth - // CATEGORY: SETTINGS - // OS: P - BLUETOOTH_FRAGMENT = 1390; - - // Screen: DND Settings > Notifications - // OS: P - SETTINGS_ZEN_NOTIFICATIONS = 1400; - - // An event category for slices. - // OPEN: Slice became visible. - // CLOSE: Slice became invisible. - // ACTION: Slice was tapped. - SLICE = 1401; - - // OPEN: Settings -> Developer Options -> Disable Bluetooth A2DP hardware - // offload - // CATEGORY: SETTINGS - // OS: P - DIALOG_BLUETOOTH_DISABLE_A2DP_HW_OFFLOAD = 1441; - - // OPEN: Settings homepage - SETTINGS_HOMEPAGE = 1502; - - // OPEN: Settings > Create shortcut(widget) - // CATEGORY: SETTINGS - // OS: Q - SETTINGS_CREATE_SHORTCUT = 1503; - - // OPEN: Face Enroll introduction - // CATEGORY: SETTINGS - // OS: Q - FACE_ENROLL_INTRO = 1506; - - // OPEN: Face Enroll introduction - // CATEGORY: SETTINGS - // OS: Q - FACE_ENROLL_ENROLLING = 1507; - - // OPEN: Face Enroll introduction - // CATEGORY: SETTINGS - // OS: Q - FACE_ENROLL_FINISHED = 1508; - - // OPEN: Face Enroll sidecar - // CATEGORY: SETTINGS - // OS: Q - FACE_ENROLL_SIDECAR = 1509; - - // OPEN: Settings > Add face > Error dialog - // OS: Q - DIALOG_FACE_ERROR = 1510; - - // OPEN: Settings > Security > Face - // CATEGORY: SETTINGS - // OS: Q - FACE = 1511; - - // OPEN: Settings > Acessibility > HearingAid pairing instructions dialog - // CATEGORY: SETTINGS - // OS: Q - DIALOG_ACCESSIBILITY_HEARINGAID = 1512; - - // OPEN: Settings > Add face - // OS: Q - FACE_ENROLL_PREVIEW = 1554; - - // OPEN: Settings > Network & Internet > Wi-Fi > Add network - // CATEGORY: SETTINGS - // OS: Q - SETTINGS_WIFI_ADD_NETWORK = 1556; - - // OPEN: Settings > System > Input & Gesture > Reach up gesture - // OS: Q - SETTINGS_GESTURE_WAKE_LOCK_SCREEN = 1557; - - // OPEN: Settings > System > Input & Gesture > Wake screen - SETTINGS_GESTURE_WAKE_SCREEN = 1570; - - // OPEN: Settings > Network & internet > Mobile network - MOBILE_NETWORK = 1571; - - // OPEN: Settings > Network & internet > Mobile network > Choose network - MOBILE_NETWORK_SELECT = 1581; - - // OPEN: Settings > Network & internet > Mobile network > Mobile Data > Dialog - MOBILE_DATA_DIALOG = 1582; - - // OPEN: Settings > Network & internet > Mobile network > Data roaming > Dialog - MOBILE_ROAMING_DIALOG = 1583; - - // Settings > Display > Lock screen display > On lock screen - LOCK_SCREEN_NOTIFICATION_CONTENT = 1584; - - // ConfirmDeviceCredentials > BiometricPrompt - BIOMETRIC_FRAGMENT = 1585; - - // OPEN: Biometric Enrollment (android.settings.BIOMETRIC_ENROLL action intent) - BIOMETRIC_ENROLL_ACTIVITY = 1586; - - // OPEN: Settings > Privacy - TOP_LEVEL_PRIVACY = 1587; - - // OPEN: Settings > Sound & notification > Do Not Disturb > See all exceptions > - // Allow apps to override - // CATEGORY: SETTINGS - // OS: Q - NOTIFICATION_ZEN_MODE_OVERRIDING_APPS = 1588; - - - // OPEN: Settings > Sound & notification > Do Not Disturb > See all exceptions > - // Allow apps to override > Choose app - // CATEGORY: SETTINGS - // OS: Q - NOTIFICATION_ZEN_MODE_OVERRIDING_APP = 1589; - - // OPEN: Settings > Developer options > Disable > Info dialog - DIALOG_DISABLE_DEVELOPMENT_OPTIONS = 1591; - - // OPEN: WifiDppConfiguratorActivity (android.settings.WIFI_DPP_CONFIGURATOR_XXX action intents) - SETTINGS_WIFI_DPP_CONFIGURATOR = 1595; - - // OPEN: WifiDppEnrolleeActivity (android.settings.WIFI_DPP_ENROLLEE_XXX action intents) - SETTINGS_WIFI_DPP_ENROLLEE = 1596; - - // OPEN: Settings > Apps & Notifications -> Special app access -> Financial Apps Sms Access - SETTINGS_FINANCIAL_APPS_SMS_ACCESS = 1597; - - - - // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule) - // > Do Not Disturb behavior - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_RULE_SETTINGS = 1604; - - // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule) - // > Do Not Disturb behavior > Custom - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_RULE_SOUND_SETTINGS = 1605; - - // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule) - // > Do Not Disturb behavior > Use default Do Not Disturb behavior - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_RULE_DEFAULT_SETTINGS = 1606; - - // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule) - // > Do Not Disturb behavior > Use default Do Not Disturb behavior - // > Notification restriction - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_RULE_NOTIFICATION_RESTRICTIONS = 1608; - - // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule) - // > Do Not Disturb behavior > Use default Do Not Disturb behavior - // > Notification restriction > Custom - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_RULE_VIS_EFFECTS = 1609; - - // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule) - // > Do Not Disturb behavior > Use default Do Not Disturb behavior - // > Notification restriction > Custom > Allow messages - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_RULE_MESSAGES = 1610; - - // OPEN: Settings > Sound > Do Not Disturb > Schedules > (Click on system rule) - // > Do Not Disturb behavior > Use default Do Not Disturb behavior - // > Notification restriction > Custom > Allow calls - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_RULE_CALLS = 1611; - - // OPEN: Settings > Sound > Do Not Disturb > Click footer link if custom settings applied - // CATEGORY: SETTINGS - // OS: Q - ZEN_CUSTOM_SETTINGS_DIALOG = 1612; - - // OPEN: Settings > Developer Options > Game Driver Preferences - // CATEGORY: SETTINGS - // OS: Q - SETTINGS_GAME_DRIVER_DASHBOARD = 1613; - - // OPEN: Settings > Accessibility > Vibration > Ring vibration - // CATEGORY: SETTINGS - // OS: Q - ACCESSIBILITY_VIBRATION_RING = 1620; - - // OPEN: Settings > System > Input & Gesture > Skip songs - SETTINGS_GESTURE_SKIP = 1624; - - // OPEN: Settings > System > Input & Gesture > Silence alerts - SETTINGS_GESTURE_SILENCE = 1625; - - // OPEN: Settings > System > Input & Gesture > Tap to check - SETTINGS_GESTURE_TAP_SCREEN = 1626; - - // OPEN: Settings > Network & internet > Click Mobile network to land on a page with a list of - // SIM/eSIM subscriptions. - MOBILE_NETWORK_LIST = 1627; - - // OPEN: Settings > Display > Adaptive sleep - // OS: Q - SETTINGS_ADAPTIVE_SLEEP = 1628; - - // OPEN: Settings > System > Aware - SETTINGS_AWARE = 1632; - - // OPEN: Settings > System > Aware > Disable > Dialog - DIALOG_AWARE_DISABLE = 1633; - - // OPEN: Settings > Settings > Network & internet > Click Mobile network to land on page with - // details for a SIM/eSIM mobile network > Click edit icon to bring up a rename dialog. - // OS: Q - MOBILE_NETWORK_RENAME_DIALOG = 1642; - - // OPEN: Set new password (android.app.action.SET_NEW_PASSWORD action intent) - // CATEGORY: SETTINGS - // OS: Q - SET_NEW_PASSWORD_ACTIVITY = 1644; - - // Panel for Internet Connectivity - PANEL_INTERNET_CONNECTIVITY = 1654; - - // Panel for Volume - PANEL_VOLUME = 1655; - - // Panel for NFC - PANEL_NFC = 1656; - - // Panel for Media Output - PANEL_MEDIA_OUTPUT = 1657; - - // Mapping: go/at-mapping - PAGE_ATSSI = 1667; - - PAGE_ATSII = 1668; - - PAGE_ATUS = 1669; - - PAGE_ATSSP = 1670; - - PAGE_ATSAP = 1671; - - PAGE_ATSCP = 1672; - - PAGE_ATHNP = 1673; - - // OPEN: Accessibility detail settings (android.settings.ACCESSIBILITY_DETAILS_SETTINGS intent) - ACCESSIBILITY_DETAILS_SETTINGS = 1682; - - // Open: Settings will show the conditional when Grayscale mode is on - SETTINGS_CONDITION_GRAYSCALE_MODE = 1683; - - // Panel for Wifi - PANEL_WIFI = 1687; - - // Open: Settings > Special App Access > Do not disturb control for app - ZEN_ACCESS_DETAIL = 1692; - - // OPEN: Settings > Face > Remove face - // OS: Q - DIALOG_FACE_REMOVE = 1693; - - // Settings > Display > Theme - DARK_UI_SETTINGS = 1698; - - // Settings > global bubble settings - BUBBLE_SETTINGS = 1699; - - // Settings > app > bubble settings - APP_BUBBLE_SETTINGS = 1700; - - // OPEN: Settings > System > Aware > Info dialog - DIALOG_AWARE_STATUS = 1701; - - // Open: Settings > app > bubble settings > confirmation dialog - DIALOG_APP_BUBBLE_SETTINGS = 1702; - - // OPEN: Settings > Pick SIM dialog - DIALOG_SIM_LIST = 1707; - - // OPEN: Settings > Pick SIM (that supports calling) dialog - DIALOG_CALL_SIM_LIST = 1708; - - // OPEN: Settings > Pick preferred SIM dialog - DIALOG_PREFERRED_SIM_PICKER = 1709; - - // OPEN: Settings > Network & internet > Mobile network > Delete sim - DIALOG_DELETE_SIM_CONFIRMATION = 1713; - - // OPEN: Settings > Network & internet > Mobile network > Delete sim > (answer yes to - // confirmation) - DIALOG_DELETE_SIM_PROGRESS = 1714; - - // Settings > Apps and notifications > Notifications > Gentle notifications - GENTLE_NOTIFICATIONS_SCREEN = 1715; - - // OPEN: Settings > System > Gestures > Global Actions Panel - // CATEGORY: SETTINGS - // OS: Q - GLOBAL_ACTIONS_PANEL_SETTINGS = 1728; - - // OPEN: Settings > Display > Dark Theme - // CATEGORY: SETTINGS - // OS: Q - // Note: Only shows up on first time toggle - DIALOG_DARK_UI_INFO = 1740; - - // OPEN: Settings > About phone > Legal information > Google Play system update licenses - // CATEGORY: SETTINGS - // OS: Q - MODULE_LICENSES_DASHBOARD = 1746; - - // OPEN: Settings > System > Gestures > System navigation > Info icon - // CATEGORY: SETTINGS - // OS: Q - // Note: Info icon is visible only when gesture navigation is not available and disabled - SETTINGS_GESTURE_NAV_NOT_AVAILABLE_DLG = 1747; - - // OPEN: Settings > System > Gestures > System navigation > Gear icon - // CATEGORY: SETTINGS - // OS: Q - // Note: Gear icon is shown next to gesture navigation preference and opens sensitivity dialog - SETTINGS_GESTURE_NAV_BACK_SENSITIVITY_DLG = 1748; - - // OPEN: Settings > System > Aware > Aware Display - // CATEGORY: SETTINGS - // OS: Q - SETTINGS_AWARE_DISPLAY = 1750; - - // OPEN: Settings > System > Input & Gesture > tap gesture - // CATEGORY: SETTINGS - // OS: Q - SETTINGS_GESTURE_TAP = 1751; - // ---- End Q Constants, all Q constants go above this line ---- - // OPEN: Settings > Network & Internet > Wi-Fi > Click new network - // CATEGORY: SETTINGS - // OS: R - SETTINGS_WIFI_CONFIGURE_NETWORK = 1800; - - // OPEN: Settings > Accessibility > Magnification - // CATEGORY: SETTINGS - // OS: R - // Note: Shows up only when Magnify with shortcut is enabled - // and under accessibility button mode. - DIALOG_TOGGLE_SCREEN_MAGNIFICATION_ACCESSIBILITY_BUTTON = 1801; - - // OPEN: Settings > Accessibility > Magnification - // CATEGORY: SETTINGS - // OS: R - // Note: Shows up only when Magnify with shortcut is enabled. - // and under gesture navigation mode. - DIALOG_TOGGLE_SCREEN_MAGNIFICATION_GESTURE_NAVIGATION = 1802; - - // OPEN: Settings > Security & screen lock -> Encryption & credentials > Install a certificate - // CATEGORY: SETTINGS - // OS: R - INSTALL_CERTIFICATE_FROM_STORAGE = 1803; - - // OPEN: Settings > Apps and notifications > Special app access > notification access > - // an app - // CATEGORY: SETTINGS - // OS: R - NOTIFICATION_ACCESS_DETAIL = 1804; - - // OPEN: Settings > Developer Options > Platform Compat - // CATEGORY: SETTINGS - // OS: R - SETTINGS_PLATFORM_COMPAT_DASHBOARD = 1805; - - // OPEN: Settings > Location -> Work profile tab - // CATEGORY: SETTINGS - // OS: R - LOCATION_WORK = 1806; - - // OPEN: Settings > Account -> Work profile tab - // CATEGORY: SETTINGS - // OS: R - ACCOUNT_WORK = 1807; - - // OPEN: Settings > Developer Options > Bug report handler - // CATEGORY: SETTINGS - // OS: R - SETTINGS_BUGREPORT_HANDLER = 1808; - - // Panel for adding Wi-Fi networks - // CATEGORY: SETTINGS - // OS: R - PANEL_ADD_WIFI_NETWORKS = 1809; - - // OPEN: Settings > Accessibility > Enable the feature or shortcut > Show tutorial dialog - // CATEGORY: SETTINGS - // OS: R - DIALOG_ACCESSIBILITY_TUTORIAL = 1810; - - // OPEN: Settings > Accessibility > Edit shortcut dialog - // CATEGORY: SETTINGS - // OS: R - DIALOG_ACCESSIBILITY_SERVICE_EDIT_SHORTCUT = 1812; - - // OPEN: Settings > Accessibility > Magnification > Edit shortcut dialog - // CATEGORY: SETTINGS - // OS: R - DIALOG_MAGNIFICATION_EDIT_SHORTCUT = 1813; - - // OPEN: Settings > Accessibility > Color correction > Edit shortcut dialog - // CATEGORY: SETTINGS - // OS: R - DIALOG_DALTONIZER_EDIT_SHORTCUT = 1814; - - // OPEN: Settings > Accessibility > Magnification > Settings - // CATEGORY: SETTINGS - // OS: R - ACCESSIBILITY_MAGNIFICATION_SETTINGS = 1815; - - // OPEN: Settings > Accessibility > Magnification > Settings > Magnification area dialog - // CATEGORY: SETTINGS - // OS: R - DIALOG_MAGNIFICATION_CAPABILITY = 1816; - - // OPEN: Settings > Accessibility > Color inversion - // CATEGORY: SETTINGS - // OS: R - ACCESSIBILITY_COLOR_INVERSION_SETTINGS = 1817; - - // OPEN: Settings > Accessibility > Color inversion > Edit shortcut dialog - // CATEGORY: SETTINGS - // OS: R - DIALOG_COLOR_INVERSION_EDIT_SHORTCUT = 1818; - - // OPEN: Settings > Accessibility > Captions preference > Captions appearance - // CATEGORY: SETTINGS - // OS: R - ACCESSIBILITY_CAPTION_APPEARANCE = 1819; - - // OPEN: Settings > Accessibility > Captions preference > More options - // CATEGORY: SETTINGS - // OS: R - ACCESSIBILITY_CAPTION_MORE_OPTIONS = 1820; - - // OPEN: Settings > Battery > Battery share - // CATEGORY: SETTINGS - // OS: R - FUELGAUGE_BATTERY_SHARE = 1821; - - // OPEN: Settings -> Apps & Notifications -> Special App Access - // CATEGORY: SETTINGS - // OS: R - MANAGE_EXTERNAL_STORAGE = 1822; - - // Open: Settings > DND > People - // OS: R - DND_PEOPLE = 1823; - - // OPEN: Settings > Apps and notifications > App info > one of any app > Open by default - // > Open supported links - // CATEGORY: SETTINGS - // OS: R - OPEN_SUPPORTED_LINKS = 1824; - - // OPEN: Settings > Display > Dark theme > Set start time dialog - DIALOG_DARK_THEME_SET_START_TIME = 1825; - - // OPEN: Settings > Display > Dark theme > Set end time dialog - DIALOG_DARK_THEME_SET_END_TIME = 1826; - - // OPEN: Settings -> Sound -> Vibrate for calls - // CATEGORY: SETTINGS - // OS: R - VIBRATE_FOR_CALLS = 1827; - - // OPEN: Settings > Connected devices > Connection preferences > NFC - // CATEGORY: SETTINGS - // OS: R - CONNECTION_DEVICE_ADVANCED_NFC = 1828; - - // OPEN: Settings -> Apps & Notifications -> Special App Access - INTERACT_ACROSS_PROFILES = 1829; - - // OPEN: Settings > Notifications > (app or conversations) > conversation - NOTIFICATION_CONVERSATION_SETTINGS = 1830; - - // OPEN: Settings > Developer Options > Wireless debugging - // CATEGORY: SETTINGS - // OS: R - SETTINGS_ADB_WIRELESS = 1831; - - // OPEN: Settings > Developer Options > Wireless debugging - // > Pair device with pairing code > Pairing code dialog - // CATEGORY: SETTINGS - // OS: R - ADB_WIRELESS_DEVICE_PAIRING_DIALOG = 1832; - - // OPEN: Settings > Developer Options > Wireless debugging - // > Pair device with QR code > Scan QR code > Pairing device dialog - // CATEGORY: SETTINGS - // OS: R - ADB_WIRELESS_DEVICE_QR_PAIRING_DIALOG = 1833; - - // OPEN: Settings > apps & notifications > notifications > conversations - // CATEGORY: SETTINGS - // OS: R - NOTIFICATION_CONVERSATION_LIST_SETTINGS = 1834; - - // Panel for Media Output Group operation - // CATEGORY: SETTINGS - // OS: R - PANEL_MEDIA_OUTPUT_GROUP = 1835; - - // OPEN: Settings > Developer Options > Wireless debugging - // > Click on paired device - // CATEGORY: SETTINGS - // OS: R - ADB_WIRELESS_DEVICE_DETAILS = 1836; - - // Open: Settings > Sound > Do Not Disturb > People > Conversations - // OS: R - DND_CONVERSATIONS = 1837; - - // Open: Settings > Sound > Do Not Disturb > People > Calls - // OS: R - DND_CALLS = 1838; - - // Open: Settings > Sound > Do Not Disturb > People > Messages - // OS: R - DND_MESSAGES = 1839; - - // Open: Settings > Sound > Do Not Disturb > Apps > <Choose App> - // OS: R - DND_APPS_BYPASSING = 1840; - - // OPEN: Settings > Battery > Advanced battery option - // CATEGORY: SETTINGS - // OS: R - FUELGAUGE_ADVANCED_BATTERY_OPTION = 1842; - - // OPEN: Settings > System > Gestures > Power menu - // CATEGORY: SETTINGS - // OS: R - POWER_MENU_SETTINGS = 1843; - - // OPEN: Settings > System > Gestures > Power menu > Device controls - // CATEGORY: SETTINGS - // OS: R - DEVICE_CONTROLS_SETTINGS = 1844; - - // OPEN: Settings > Sound > Media - // CATEGORY: SETTINGS - // OS: R - MEDIA_CONTROLS_SETTINGS = 1845; -} diff --git a/core/proto/android/app/tvsettings_enums.proto b/core/proto/android/app/tvsettings_enums.proto deleted file mode 100644 index 31c5dd6b730a..000000000000 --- a/core/proto/android/app/tvsettings_enums.proto +++ /dev/null @@ -1,941 +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. - */ - -syntax = "proto2"; - -package android.app.tvsettings; -option java_multiple_files = true; -option java_outer_classname = "TvSettingsEnums"; - -/** The performed action types */ -enum Action { - - /** - * Denotes an unknown action. It is a filler that should generally be - * avoided. - */ - ACTION_UNKNOWN = 0; - - /** - * Denotes that a TvSettings page is being focused. (Previewing a page in - * two panel settings should NOT be considered as focusing on the page.) - */ - PAGE_FOCUSED = 1; - - /** - * Denotes that an entry (typically a leaf node of settings tree) is - * selected by a user. - */ - ENTRY_SELECTED = 2; - - /** Denotes that a toggle is clicked by a user. */ - TOGGLE_INTERACTED = 3; - - /** - * Denotes that a TvSettings page is being focused in the forward direction - * into the settings tree. - */ - PAGE_FOCUSED_FORWARD = 4; - - /** - * Denotes that a TvSettings page is being focused in the backward direction - * up the settings tree. - */ - PAGE_FOCUSED_BACKWARD = 5; - - /** Denotes that a toggle is turned on by a user. */ - TOGGLED_ON = 6; - - /** Denotes that a toggle is turned off by a user. */ - TOGGLED_OFF = 7; - -} - -/** - * Ids for TvSettings focusable pages or actionable entries - * - * For details of the scheme, please refer to the "Definition of item_id" and - * "Evolve of item_id" sections in go/atv-settings-ww-logging-design. - */ -enum ItemId { - - option allow_alias = true; - - // Filler that should be avoided - UNKNOWN = 0x00000000; - - // TvSettings - TV_SETTINGS_ROOT = 0x00000001; - - // TvSettings unknown/default classic page - PAGE_CLASSIC_DEFAULT = 0x00000002; - - // TvSettings unknown/default slice page - PAGE_SLICE_DEFAULT = 0x00000003; - - // TvSettings unknown/default entry - ENTRY_DEFAULT = 0x00000004; - - // TvSettings > Suggested settings entry - SUGGESTED_SETTINGS = 0x00000010; - - // TvSettings > Quick Settings - QUICK_SETTINGS = 0x00000011; - - // VERSION 1: Starting with Q - // These are ordered in depth-first search manner. - - // TvSettings > Network & Internet - NETWORK = 0x11000000; - - // TvSettings > Network & Internet > Wi-Fi (toggle) - NETWORK_WIFI_ON_OFF = 0x11100000; - - // TvSettings > Network & Internet > - // [A connected network entry in available networks list] - NETWORK_AP_INFO = 0x11200000; - - // TvSettings > Network & Internet > - // [A connected network entry in available networks list] > Proxy settings - NETWORK_AP_INFO_PROXY_SETTINGS = 0x11210000; - - // TvSettings > Network & Internet > - // [A connected network entry in available networks list] > IP settings - NETWORK_AP_INFO_IP_SETTINGS = 0x11220000; - - // TvSettings > Network & Internet > - // [A connected network entry in available networks list] > Forget network - NETWORK_AP_INFO_FORGET_NETWORK = 0x11230000; - - // TvSettings > Network & Internet > - // [A not connected network entry in available networks list] - NETWORK_NOT_CONNECTED_AP = 0x11300000; - - // TvSettings > Network & Internet > See all - NETWORK_SEE_ALL = 0x11400000; - - // TvSettings > Network & Internet > See fewer - NETWORK_SEE_FEWER = 0x11500000; - - // TvSettings > Network & Internet > Add new network - NETWORK_ADD_NEW_NETWORK = 0x11600000; - - // TvSettings > Network & Internet > Scanning always available (toggle) - NETWORK_ALWAYS_SCANNING_NETWORKS = 0x11700000; - - // TvSettings > Network & Internet > Proxy settings (in Ethernet category) - NETWORK_ETHERNET_PROXY_SETTINGS = 0x11800000; - - // TvSettings > Network & Internet > IP settings (in Ethernet category) - NETWORK_ETHERNET_IP_SETTINGS = 0x11900000; - - // TvSettings > Account & Sign In (Slice) - ACCOUNT_SLICE = 0x12000000; - - // TvSettings > Account & Sign In (Slice) > [A regular account] - ACCOUNT_SLICE_REG_ACCOUNT = 0x12100000; - - // TvSettings > Account & Sign In (Slice) > [A regular account] > - // Google Assistant - ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT = 0x12130000; - - // TvSettings > Account & Sign In (Slice) > [A regular account] > - // Google Assistant > SafeSearch filter (toggle) - ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT_SAFE_SEARCH = 0x12131000; - - // TvSettings > Account & Sign In (Slice) > [A regular account] > - // Google Assistant > Block offensive words (toggle) - ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT_BLOCK_OFFENSIVE = 0x12132000; - - // TvSettings > Account & Sign In (Slice) > [A regular account] > - // Google Assistant > Searchable apps - ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT_SEARCHABLE_APPS = 0x12133000; - - // TvSettings > Account & Sign In (Slice) > [A regular account] > - // Google Assistant > Personal results (toggle) - ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT_PERSONAL_RESULTS = 0x12134000; - - // Reserving [0x12140000, 0x12190000] for possible future settings - - // TvSettings > Account & Sign In (Slice) > [A regular account] > Remove - ACCOUNT_SLICE_REG_ACCOUNT_REMOVE = 0x121A0000; - - // Reserving [0x12200000, 0x12900000] for possible future settings - - // TvSettings > Account & Sign In (Slice) > Add account... - ACCOUNT_SLICE_ADD_ACCOUNT = 0x12A00000; - - // TvSettings > Account & Sign In (Classic) - ACCOUNT_CLASSIC = 0x13000000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] - ACCOUNT_CLASSIC_REG_ACCOUNT = 0x13100000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] > Sync now - ACCOUNT_CLASSIC_REG_ACCOUNT_SYNC_NOW = 0x13110000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] > - // Remove account - ACCOUNT_CLASSIC_REG_ACCOUNT_REMOVE_ACCOUNT = 0x13120000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] > - // [Choose synced apps] Calendar (toggle) - ACCOUNT_CLASSIC_REG_ACCOUNT_SYNC_CALENDAR = 0x13130000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] > - // [Choose synced apps] Contacts (toggle) - ACCOUNT_CLASSIC_REG_ACCOUNT_SYNC_CONTACTS = 0x13140000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] > - // [Choose synced apps] Google Play Movies & TV (toggle) - ACCOUNT_CLASSIC_REG_ACCOUNT_SYNC_GPMT = 0x13150000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] > - // [Choose synced apps] Google Play Music (toggle) - ACCOUNT_CLASSIC_REG_ACCOUNT_SYNC_GPM = 0x13160000; - - // TvSettings > Account & Sign In (Classic) > [A regular account] > - // [Choose synced apps] People details (toggle) - ACCOUNT_CLASSIC_REG_ACCOUNT_SYNC_PEOPLE = 0x13170000; - - // Reserving [0x13200000, 0x13900000] for possible future settings - - // TvSettings > Account & Sign In (Classic) > Add account - ACCOUNT_CLASSIC_ADD_ACCOUNT = 0x13A00000; - - // TvSettings > Display & Sound - DISPLAY_SOUND = 0x15000000; - - // TvSettings > Display & Sound > Advanced display settings - DISPLAY_SOUND_ADVANCED_DISPLAY = 0x15100000; - - // TvSettings > Display & Sound > Advanced display settings > - // Allow game mode (toggle) - DISPLAY_SOUND_ADVANCED_DISPLAY_GAME_MODE = 0x15110000; - - // TvSettings > Display & Sound > System sounds (toggle) - DISPLAY_SOUND_SYSTEM_SOUNDS = 0x15200000; - - // TvSettings > Display & Sound > Advanced sound settings - DISPLAY_SOUND_ADVANCED_SOUNDS = 0x15300000; - - // TvSettings > Display & Sound > Advanced sound settings > Select formats - DISPLAY_SOUND_ADVANCED_SOUNDS_SELECT_FORMATS = 0x15310000; - - // TvSettings > Display & Sound > Advanced sound settings > Select formats > - // Auto... - DISPLAY_SOUND_ADVANCED_SOUNDS_SELECT_FORMATS_AUTO = 0x15311000; - - // TvSettings > Display & Sound > Advanced sound settings > Select formats > - // None... - DISPLAY_SOUND_ADVANCED_SOUNDS_SELECT_FORMATS_NONE = 0x15312000; - - // TvSettings > Display & Sound > Advanced sound settings > Select formats > - // Manual... - DISPLAY_SOUND_ADVANCED_SOUNDS_SELECT_FORMATS_MANUAL = 0x15313000; - - // TvSettings > Display & Sound > Advanced sound settings > - // Dolby AC-4 (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_DAC4 = 0x15320000; - - // TvSettings > Display & Sound > Advanced sound settings > - // Dolby Atmos in Dolby Digital Plus (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_DADDP = 0x15330000; - - // TvSettings > Display & Sound > Advanced sound settings > - // Dolby Digital (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_DD = 0x15340000; - - // TvSettings > Display & Sound > Advanced sound settings > - // Dolby Digital Plus (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_DDP = 0x15350000; - - // TvSettings > Display & Sound > Advanced sound settings > DTS (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_DTS = 0x15360000; - - // TvSettings > Display & Sound > Advanced sound settings > DTS-HD (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_DTSHD = 0x15370000; - - // TvSettings > Display & Sound > Advanced sound settings > AAC (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_AAC = 0x15380000; - - // TvSettings > Display & Sound > Advanced sound settings > - // Dolby TrueHD (toggle) - DISPLAY_SOUND_ADVANCED_SOUNDS_DTHD = 0x15390000; - - // TvSettings > Apps - APPS = 0x16000000; - - // TvSettings > Apps > See all apps - APPS_ALL_APPS = 0x16100000; - - // TvSettings > Apps > See all apps > [An app entry] - APPS_ALL_APPS_APP_ENTRY = 0x16110000; - - // TvSettings > Apps > See all apps > [An app entry] > Open - APPS_ALL_APPS_APP_ENTRY_OPEN = 0x16111000; - - // TvSettings > Apps > See all apps > [An app entry] > Force stop - APPS_ALL_APPS_APP_ENTRY_FORCE_STOP = 0x16112000; - - // TvSettings > Apps > See all apps > [An app entry] > Uninstall - APPS_ALL_APPS_APP_ENTRY_UNINSTALL = 0x16113000; - - // TvSettings > Apps > See all apps > [An app entry] > Uninstall updates - APPS_ALL_APPS_APP_ENTRY_UNINSTALL_UPDATES = 0x16114000; - - // TvSettings > Apps > See all apps > [An app entry] > Disable - APPS_ALL_APPS_APP_ENTRY_DISABLE = 0x16115000; - - // TvSettings > Apps > See all apps > [An app entry] > Clear data - APPS_ALL_APPS_APP_ENTRY_CLEAR_DATA = 0x16116000; - - // TvSettings > Apps > See all apps > [An app entry] > Clear cache - APPS_ALL_APPS_APP_ENTRY_CLEAR_CACHE = 0x16117000; - - // TvSettings > Apps > See all apps > [An app entry] > Clear defaults - APPS_ALL_APPS_APP_ENTRY_CLEAR_DEFAULTS = 0x16118000; - - // TvSettings > Apps > See all apps > [An app entry] > - // Notifications (toggle) - APPS_ALL_APPS_APP_ENTRY_NOTIFICATIONS = 0x16119000; - - // TvSettings > Apps > See all apps > [An app entry] > Permissions - APPS_ALL_APPS_APP_ENTRY_PERMISSIONS = 0x1611A000; - - // TvSettings > Apps > See all apps > [An app entry] > Enable - APPS_ALL_APPS_APP_ENTRY_ENABLE = 0x1611B000; - - // TvSettings > Apps > See all apps > [An app entry] > Open source licenses - APPS_ALL_APPS_APP_ENTRY_LICENSES = 0x1611C000; - - // TvSettings > Apps > See all apps > Show system apps - APPS_ALL_APPS_SHOW_SYSTEM_APPS = 0x16120000; - - // TvSettings > Apps > App permissions - APPS_APP_PERMISSIONS = 0x16200000; - - // TvSettings > Apps > App permission > Body sensors - APPS_APP_PERMISSIONS_BODY_SENSORS = 0x16210000; - - // TvSettings > Apps > App permission > Calendar - APPS_APP_PERMISSIONS_CALENDAR = 0x16220000; - - // TvSettings > Apps > App permission > Call logs - APPS_APP_PERMISSIONS_CALL_LOGS = 0x16230000; - - // TvSettings > Apps > App permission > Camera - APPS_APP_PERMISSIONS_CAMERA = 0x16240000; - - // TvSettings > Apps > App permission > Contacts - APPS_APP_PERMISSIONS_CONTACTS = 0x16250000; - - // TvSettings > Apps > App permission > Location - APPS_APP_PERMISSIONS_LOCATION = 0x16260000; - - // TvSettings > Apps > App permission > Microphone - APPS_APP_PERMISSIONS_MICROPHONE = 0x16270000; - - // TvSettings > Apps > App permission > Phone - APPS_APP_PERMISSIONS_PHONE = 0x16280000; - - // TvSettings > Apps > App permission > Physical activity - APPS_APP_PERMISSIONS_PHYSICAL_ACTIVITY = 0x16290000; - - // TvSettings > Apps > App permission > SMS - APPS_APP_PERMISSIONS_SMS = 0x162A0000; - - // TvSettings > Apps > App permission > Storage - APPS_APP_PERMISSIONS_STORAGE = 0x162B0000; - - // TvSettings > Apps > App permission > Additional permissions - APPS_APP_PERMISSIONS_ADDITIONAL = 0x162C0000; - - // TvSettings > Apps > App permission > Additional permissions > - // real all TV listings - APPS_APP_PERMISSIONS_ADDITIONAL_READ_TV_LISTINGS = 0x162C1000; - - // TvSettings > Apps > App permission > Additional permissions > - // real instant messages - APPS_APP_PERMISSIONS_ADDITIONAL_READ_INSTANT_MESSAGES = 0x162C2000; - - // TvSettings > Apps > App permission > Additional permissions > - // write instant messages - APPS_APP_PERMISSIONS_ADDITIONAL_WRITE_INSTANT_MESSAGES = 0x162C3000; - - // TvSettings > Apps > Special app access - APPS_SPECIAL_APP_ACCESS = 0x16300000; - - // TvSettings > Apps > Special app access > Energy optimization - APPS_SPECIAL_APP_ACCESS_ENERGY_OPTIMIZATION = 0x16310000; - - // TvSettings > Apps > Special app access > Usage access - APPS_SPECIAL_APP_ACCESS_USAGE_ACCESS = 0x16320000; - - // TvSettings > Apps > Special app access > Notification access - APPS_SPECIAL_APP_ACCESS_NOTIFICATION_ACCESS = 0x16330000; - - // TvSettings > Apps > Special app access > Display over other apps - APPS_SPECIAL_APP_ACCESS_DISPLAY_OVER_OTHERS = 0x16340000; - - // TvSettings > Apps > Special app access > Modify system settings - APPS_SPECIAL_APP_ACCESS_MODIFY_SYSTEM_SETTINGS = 0x16350000; - - // TvSettings > Apps > Special app access > Picture-in-picture - APPS_SPECIAL_APP_ACCESS_PICTURE_IN_PICTURE = 0x16360000; - - // TvSettings > Apps > Security & restrictions - APPS_SECURITY_RESTRICTIONS = 0x16400000; - - // TvSettings > Apps > Security & restrictions > Unknown sources - APPS_SECURITY_RESTRICTIONS_UNKNOWN_SOURCES = 0x16410000; - - // TvSettings > Apps > Security & restrictions > Verify apps (toggle) - APPS_SECURITY_RESTRICTIONS_VERIFY_APPS = 0x16420000; - - // TvSettings > Apps > Security & restrictions > Create restricted profile - APPS_SECURITY_RESTRICTIONS_CREATE_PROFILE = 0x16430000; - - // TvSettings > Apps > Security & restrictions > Enter restricted profile - APPS_SECURITY_RESTRICTIONS_ENTER_PROFILE = 0x16440000; - - // TvSettings > Apps > Security & restrictions > - // Allowed apps (Restricted Profile) - APPS_SECURITY_RESTRICTIONS_PROFILE_ALLOWED_APPS = 0x16450000; - - // TvSettings > Apps > Security & restrictions > - // Change pin (Restricted Profile) - APPS_SECURITY_RESTRICTIONS_PROFILE_CHANGE_PIN = 0x16460000; - - // TvSettings > Apps > Security & restrictions > - // Delete restricted profile - APPS_SECURITY_RESTRICTIONS_DELETE_PROFILE = 0x16470000; - - // TvSettings > Apps > Security & restrictions > - // Exit restricted profile - APPS_SECURITY_RESTRICTIONS_EXIT_PROFILE = 0x16480000; - - // TvSettings > System (same as TvSettings > Device Preferences) - SYSTEM = 0x17000000; - - // TvSettings > System > About - SYSTEM_ABOUT = 0x17100000; - - // TvSettings > System > System update - SYSTEM_ABOUT_SYSTEM_UPDATE = 0x17110000; - - // TvSettings > System > Device name - SYSTEM_ABOUT_DEVICE_NAME = 0x17120000; - - // TvSettings > System > Factory reset - SYSTEM_ABOUT_FACTORY_RESET = 0x17130000; - - // TvSettings > System > Status - SYSTEM_ABOUT_STATUS = 0x17140000; - - // TvSettings > System > Legal information - SYSTEM_ABOUT_LEGAL_INFO = 0x17150000; - - // TvSettings > System > Legal information > Open source licenses - SYSTEM_ABOUT_LEGAL_INFO_OPEN_SOURCE = 0x17151000; - - // TvSettings > System > Legal information > Google legal - SYSTEM_ABOUT_LEGAL_INFO_GOOGLE_LEGAL = 0x17152000; - - // TvSettings > System > Legal information > System WebView licenses - SYSTEM_ABOUT_LEGAL_INFO_SYSTEM_WEBVIEW = 0x17153000; - - // TvSettings > System > Build - SYSTEM_ABOUT_BUILD = 0x17160000; - - // TvSettings > System > Date & time - SYSTEM_DATE_TIME = 0x17200000; - - // TvSettings > System > Date & time > Automatic data & time - SYSTEM_DATE_TIME_AUTOMATIC = 0x17210000; - - // TvSettings > System > Date & time > Automatic data & time > - // Use network-provided time - SYSTEM_DATE_TIME_AUTOMATIC_USE_NETWORK_TIME = 0x17211000; - - // TvSettings > System > Date & time > Automatic data & time > Off - SYSTEM_DATE_TIME_AUTOMATIC_OFF = 0x17212000; - - // TvSettings > System > Date & time > Set date - SYSTEM_DATE_TIME_SET_DATE = 0x17220000; - - // TvSettings > System > Date & time > Set time - SYSTEM_DATE_TIME_SET_TIME = 0x17230000; - - // TvSettings > System > Date & time > Set time zone - SYSTEM_DATE_TIME_SET_TIME_ZONE = 0x17240000; - - // TvSettings > System > Date & time > Set time zone > [A time zone button] - SYSTEM_DATE_TIME_SET_TIME_ZONE_BUTTON = 0x17241000; - - // TvSettings > System > Date & time > Use 24-hour format (toggle) - SYSTEM_DATE_TIME_USE_24_HOUR_FORMAT = 0x17250000; - - // TvSettings > System > Language - SYSTEM_LANGUAGE = 0x17300000; - - // TvSettings > System > Language > [A language button] - SYSTEM_LANGUAGE_BUTTON = 0x17310000; - - // TvSettings > System > Keyboard - SYSTEM_KEYBOARD = 0x17400000; - - // TvSettings > System > Keyboard > Current keyboard - SYSTEM_KEYBOARD_CURRENT_KEYBOARD = 0x17410000; - - // TvSettings > System > Keyboard > Gboard Settings - SYSTEM_KEYBOARD_GBOARD_SETTINGS = 0x17420000; - - // TvSettings > System > Keyboard > Gboard Settings > Languages - SYSTEM_KEYBOARD_GBOARD_SETTINGS_LANGUAGES = 0x17421000; - - // TvSettings > System > Keyboard > Gboard Settings > Terms of services - SYSTEM_KEYBOARD_GBOARD_SETTINGS_TOS = 0x17422000; - - // TvSettings > System > Keyboard > Gboard Settings > Privacy policy - SYSTEM_KEYBOARD_GBOARD_SETTINGS_PRIVACY_POLICY = 0x17423000; - - // TvSettings > System > Keyboard > Gboard Settings > Open source licenses - SYSTEM_KEYBOARD_GBOARD_SETTINGS_OPEN_SOURCE = 0x17424000; - - // TvSettings > System > Keyboard > Gboard Settings > - // Share usage statistics (toggle) - SYSTEM_KEYBOARD_GBOARD_SETTINGS_SHARE_USAGE_STATS = 0x17425000; - - // TvSettings > System > Keyboard > Manage keyboards - SYSTEM_KEYBOARD_MANAGE_KEYBOARDS = 0x17430000; - - // TvSettings > System > Storage - SYSTEM_STORAGE = 0x17500000; - - // TvSettings > System > Internal shared storage - SYSTEM_STORAGE_INTERNAL_STORAGE = 0x17510000; - - // TvSettings > System > Internal shared storage > Apps - SYSTEM_STORAGE_INTERNAL_STORAGE_APPS = 0x17511000; - - // TvSettings > System > Internal shared storage > - // Cached data (brings up "Clear cached data?" dialog upon click) - SYSTEM_STORAGE_INTERNAL_STORAGE_CACHED = 0x17512000; - - // TvSettings > System > Energy saver - SYSTEM_ENERGYSAVER = 0x17700000; - - // TvSettings > System > Energy saver > Turn off display after - SYSTEM_ENERGYSAVER_START_DELAY = 0x17710000; - - // TvSettings > System > Energy saver > Turn off display after > 15 minutes - SYSTEM_ENERGYSAVER_START_DELAY_15M = 0x17711000; - - // TvSettings > System > Energy saver > Turn off display after > 30 minutes - SYSTEM_ENERGYSAVER_START_DELAY_30M = 0x17712000; - - // TvSettings > System > Energy saver > Turn off display after > 1 hour - SYSTEM_ENERGYSAVER_START_DELAY_1H = 0x17713000; - - // TvSettings > System > Energy saver > Turn off display after > 3 hours - SYSTEM_ENERGYSAVER_START_DELAY_3H = 0x17714000; - - // TvSettings > System > Energy saver > Turn off display after > 6 hours - SYSTEM_ENERGYSAVER_START_DELAY_6H = 0x17715000; - - // TvSettings > System > Energy saver > Turn off display after > 12 hours - SYSTEM_ENERGYSAVER_START_DELAY_12H = 0x17716000; - - // TvSettings > System > Energy saver > Turn off display after > Never - SYSTEM_ENERGYSAVER_START_DELAY_NEVER = 0x17717000; - - // TvSettings > System > Accessibility - SYSTEM_A11Y = 0x17800000; - - // TvSettings > System > Accessibility > Captions - SYSTEM_A11Y_CAPTIONS = 0x17810000; - - // TvSettings > System > Accessibility > Captions > Display (toggle) - SYSTEM_A11Y_CAPTIONS_DISPLAY_ON_OFF = 0x17811000; - - // TvSettings > System > Accessibility > Captions > Language - SYSTEM_A11Y_CAPTIONS_LANGUAGE = 0x17812000; - - // TvSettings > System > Accessibility > Captions > Language > [A language] - SYSTEM_A11Y_CAPTIONS_LANGUAGE_BUTTON = 0x17812100; - - // TvSettings > System > Accessibility > Captions > Text size - SYSTEM_A11Y_CAPTIONS_TEXT_SIZE = 0x17813000; - - // TvSettings > System > Accessibility > Captions > Text size > Very small - SYSTEM_A11Y_CAPTIONS_TEXT_SIZE_VERY_SMALL = 0x17813100; - - // TvSettings > System > Accessibility > Captions > Text size > Small - SYSTEM_A11Y_CAPTIONS_TEXT_SIZE_SMALL = 0x17813200; - - // TvSettings > System > Accessibility > Captions > Text size > Normal - SYSTEM_A11Y_CAPTIONS_TEXT_SIZE_NORMAL = 0x17813300; - - // TvSettings > System > Accessibility > Captions > Text size > Large - SYSTEM_A11Y_CAPTIONS_TEXT_SIZE_LARGE = 0x17813400; - - // TvSettings > System > Accessibility > Captions > Text size > Very large - SYSTEM_A11Y_CAPTIONS_TEXT_SIZE_VERY_LARGE = 0x17813500; - - // TvSettings > System > Accessibility > Captions > - // White on black (radio button) - SYSTEM_A11Y_CAPTIONS_WHITE_ON_BLACK = 0x17814000; - - // TvSettings > System > Accessibility > Captions > - // Black on white (radio button) - SYSTEM_A11Y_CAPTIONS_BLACK_ON_WHITE = 0x17815000; - - // TvSettings > System > Accessibility > Captions > - // Yellow on black (radio button) - SYSTEM_A11Y_CAPTIONS_YELLOW_ON_BLACK = 0x17816000; - - // TvSettings > System > Accessibility > Captions > - // Yellow on blue (radio button) - SYSTEM_A11Y_CAPTIONS_YELLOW_ON_BLUE = 0x17817000; - - // TvSettings > System > Accessibility > Captions > Custom - SYSTEM_A11Y_CAPTIONS_CUSTOM = 0x17818000; - - // TvSettings > System > Accessibility > Captions > Custom > Font family - SYSTEM_A11Y_CAPTIONS_CUSTOM_FONT = 0x17818100; - - // TvSettings > System > Accessibility > Captions > Custom > Text color - SYSTEM_A11Y_CAPTIONS_CUSTOM_TEXT_COLOR = 0x17818200; - - // TvSettings > System > Accessibility > Captions > Custom > Text opacity - SYSTEM_A11Y_CAPTIONS_CUSTOM_TEXT_OPACITY = 0x17818300; - - // TvSettings > System > Accessibility > Captions > Custom > Edge type - SYSTEM_A11Y_CAPTIONS_CUSTOM_EDGE_TYPE = 0x17818400; - - // TvSettings > System > Accessibility > Captions > Custom > Edge color - SYSTEM_A11Y_CAPTIONS_CUSTOM_EDGE_COLOR = 0x17818500; - - // TvSettings > System > Accessibility > Captions > Custom > - // Show background (toggle) - SYSTEM_A11Y_CAPTIONS_SHOW_BACKGROUND = 0x17818600; - - // TvSettings > System > Accessibility > Captions > Custom > - // Background color - SYSTEM_A11Y_CAPTIONS_BACKGROUND_COLOR = 0x17818700; - - // TvSettings > System > Accessibility > Captions > Custom > - // Background opacity - SYSTEM_A11Y_CAPTIONS_BACKGROUND_OPACITY = 0x17818800; - - // TvSettings > System > Accessibility > Captions > Custom > - // Show window (toggle) - SYSTEM_A11Y_CAPTIONS_SHOW_WINDOW = 0x17818900; - - // TvSettings > System > Accessibility > Captions > Custom > Window color - SYSTEM_A11Y_CAPTIONS_WINDOW_COLOR = 0x17818A00; - - // TvSettings > System > Accessibility > Captions > Custom > Window opacity - SYSTEM_A11Y_CAPTIONS_WINDOW_OPACITY = 0x17818B00; - - // TvSettings > System > Accessibility > High contrast text (toggle) - SYSTEM_A11Y_HIGH_CONTRAST_TEXT = 0x17820000; - - // TvSettings > System > Accessibility > Text to speech - SYSTEM_A11Y_TTS = 0x17830000; - - // TvSettings > System > Accessibility > Text to speech > [Select an engine] - SYSTEM_A11Y_TTS_ENGINE_SELECT = 0x17831000; - - // TvSettings > System > Accessibility > Text to speech > - // Engine configuration - SYSTEM_A11Y_TTS_ENGINE_CONFIG = 0x17832000; - - // TvSettings > System > Accessibility > Text to speech > - // Engine configuration > Language - SYSTEM_A11Y_TTS_ENGINE_CONFIG_LANGUAGE = 0x17832100; - - // TvSettings > System > Accessibility > Text to speech > - // Engine configuration > Language > Button - SYSTEM_A11Y_TTS_ENGINE_CONFIG_LANGUAGE_CHOOSE_LANGUAGE = 0x17832110; - - // TvSettings > System > Accessibility > Text to speech > - // Engine configuration > Settings for Google Text-to-speech Engine - SYSTEM_A11Y_TTS_ENGINE_CONFIG_SETTINGS_GTTS_ENGINE = 0x17832200; - - // TvSettings > System > Accessibility > Text to speech > - // Engine configuration > Install voice data - SYSTEM_A11Y_TTS_ENGINE_CONFIG_INSTALL_VOICE_DATA = 0x17832300; - - // TvSettings > System > Accessibility > Text to speech > Speech rate - SYSTEM_A11Y_TTS_SPEECH_RATE = 0x17833000; - - // TvSettings > System > Accessibility > Text to speech > - // Listen to an example - SYSTEM_A11Y_TTS_LISTEN_EXAMPLE = 0x17834000; - - // TvSettings > System > Accessibility > Accessibility shortcut - SYSTEM_A11Y_SHORTCUT = 0x17840000; - - // TvSettings > System > Accessibility > Accessibility shortcut > - // Enable (toggle) - SYSTEM_A11Y_SHORTCUT_ON_OFF = 0x17841000; - - // TvSettings > System > Accessibility > Accessibility shortcut > - // Shortcut services - SYSTEM_A11Y_SHORTCUT_SERVICE = 0x17842000; - - // TvSettings > System > Accessibility > TalkBack - SYSTEM_A11Y_TALKBACK = 0x17850000; - - // TvSettings > System > Accessibility > TalkBack > Enable (toggle) - SYSTEM_A11Y_TALKBACK_ON_OFF = 0x17851000; - - // TvSettings > System > Accessibility > TalkBack > Configuration - SYSTEM_A11Y_TALKBACK_CONFIG = 0x17852000; - - // TvSettings > System > Accessibility > Accessibility Menu - SYSTEM_A11Y_A11Y_MENU = 0x17860000; - - // TvSettings > System > Accessibility > Accessibility Menu > - // Enable (toggle) - SYSTEM_A11Y_A11Y_MENU_ON_OFF = 0x17861000; - - // TvSettings > System > Accessibility > Accessibility Menu > Configuration - SYSTEM_A11Y_A11Y_MENU_CONFIG = 0x17862000; - - // TvSettings > System > Accessibility > Select to Speak - SYSTEM_A11Y_STS = 0x17870000; - - // TvSettings > System > Accessibility > Select to Speak > Enable (toggle) - SYSTEM_A11Y_STS_ON_OFF = 0x17871000; - - // TvSettings > System > Accessibility > Select to Speak > Configuration - SYSTEM_A11Y_STS_CONFIG = 0x17872000; - - // TvSettings > System > Accessibility > Switch Access - SYSTEM_A11Y_SWITCH_ACCESS = 0x17880000; - - // TvSettings > System > Accessibility > Switch Access > Enable (Toggle) - SYSTEM_A11Y_SWITCH_ACCESS_ON_OFF = 0x17881000; - - // TvSettings > System > Accessibility > Switch Access > Configuration - SYSTEM_A11Y_SWITCH_ACCESS_CONFIG = 0x17882000; - - // TvSettings > System > Reboot - SYSTEM_REBOOT = 0x17900000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) - PREFERENCES_HOME_SCREEN = 0x17A00000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS = 0x17A10000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels > Play Next - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS_PN = 0x17A11000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels > Play Next > On (toggle) - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS_PN_ON_OFF = 0x17A11100; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels > Play Next > Google Play Movies & TV (toggle) - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS_PN_GPMT = 0x17A11200; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels > Play Next > Google Play Music (toggle) - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS_PN_GPM = 0x17A11300; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels > Play Next > Promotional channels (toggle) - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS_PN_PROMOTIONAL = 0x17A11400; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels > Home screen channels - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS_HOME_SCREEN = 0x17A12000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Customize channels > Promotional channels - PREFERENCES_HOME_SCREEN_CUSTOMIZE_CHANNELS_PROMOTIONAL = 0x17A13000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Enable video previews (toggle) - PREFERENCES_HOME_SCREEN_VIDEO_PREVIEWS = 0x17A20000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Enable audio previews (toggle) - PREFERENCES_HOME_SCREEN_AUDIO_PREVIEWS = 0x17A30000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Reorder apps - PREFERENCES_HOME_SCREEN_REORDER_APPS = 0x17A40000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Reorder games - PREFERENCES_HOME_SCREEN_REORDER_GAMES = 0x17A50000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Android TV Home open source licenses - PREFERENCES_HOME_SCREEN_ATVH_OPEN_SOURCE = 0x17A60000; - - // TvSettings > Device Preferences > Home screen (in classic TvSettings) > - // Android TV Core Services open source licenses - PREFERENCES_HOME_SCREEN_ATVCS_OPEN_SOURCE = 0x17A70000; - - // TvSettings > Device Preferences > Google Assistant - PREFERENCES_ASSISTANT = 0x17B00000; - - // TvSettings > Device Preferences > Google Assistant > Accounts - PREFERENCES_ASSISTANT_ACCOUNTS = 0x17B10000; - - // TvSettings > Device Preferences > Google Assistant > Accept permissions - PREFERENCES_ASSISTANT_ACCEPT_PERMISSIONS = 0x17B20000; - - // TvSettings > Device Preferences > Google Assistant > View permissions - PREFERENCES_ASSISTANT_VIEW_PERMISSIONS = 0x17B30000; - - // TvSettings > Device Preferences > Google Assistant > Searchable apps - // (aliasing ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT_SEARCHABLE_APPS) - PREFERENCES_ASSISTANT_SEARCHABLE_APPS = 0x12133000; - - // TvSettings > Device Preferences > Google Assistant > SafeSearch filter - // (aliasing ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT_SAFE_SEARCH) - PREFERENCES_ASSISTANT_SAFESEARCH_FILTER = 0x12131000; - - // TvSettings > Device Preferences > Google Assistant > - // Block offensive words - // (aliasing ACCOUNT_SLICE_REG_ACCOUNT_ASSISTANT_BLOCK_OFFENSIVE) - PREFERENCES_ASSISTANT_BLOCK_OFFENSIVE = 0x12132000; - - // TvSettings > Device Preferences > Google Assistant > Open source licenses - PREFERENCES_ASSISTANT_OPEN_SOURCE = 0x17B40000; - - // TvSettings > Device Preferences > Chromecast Android Shell - PREFERENCES_CHROMECAST_SHELL = 0x17C00000; - - // TvSettings > Device Preferences > Chromecast Android Shell > - // Open source licenses - PREFERENCES_CHROMECAST_SHELL_OPEN_SOURCE = 0x17C10000; - - // TvSettings > Device Preferences > Screen saver - PREFERENCES_SCREENSAVER = 0x17D00000; - - // TvSettings > Device Preferences > Screen saver > Screen saver (chooser) - PREFERENCES_SCREENSAVER_CHOOSER = 0x17D10000; - - // TvSettings > Device Preferences > Screen saver > Screen saver (chooser) > - // Turn screen off - PREFERENCES_SCREENSAVER_CHOOSER_SCREEN_OFF = 0x17D11000; - - // TvSettings > Device Preferences > Screen saver > Screen saver (chooser) > - // Backdrop - PREFERENCES_SCREENSAVER_CHOOSER_BACKDROP = 0x17D12000; - - // TvSettings > Device Preferences > Screen saver > Screen saver (chooser) > - // Colors - PREFERENCES_SCREENSAVER_CHOOSER_COLORS = 0x17D13000; - - // TvSettings > Device Preferences > Screen saver > When to start - PREFERENCES_SCREENSAVER_START_DELAY = 0x17D20000; - - // TvSettings > Device Preferences > Screen saver > When to start > - // 5 minutes - PREFERENCES_SCREENSAVER_START_DELAY_5M = 0x17D21000; - - // TvSettings > Device Preferences > Screen saver > When to start > - // 15 minutes - PREFERENCES_SCREENSAVER_START_DELAY_15M = 0x17D22000; - - // TvSettings > Device Preferences > Screen saver > When to start > - // 30 minutes - PREFERENCES_SCREENSAVER_START_DELAY_30M = 0x17D23000; - - // TvSettings > Device Preferences > Screen saver > When to start > - // 1 hour - PREFERENCES_SCREENSAVER_START_DELAY_1H = 0x17D24000; - - // TvSettings > Device Preferences > Screen saver > When to start > - // 2 hours - PREFERENCES_SCREENSAVER_START_DELAY_2H = 0x17D25000; - - // TvSettings > Device Preferences > Screen saver > Start now - PREFERENCES_SCREENSAVER_START_NOW = 0x17D30000; - - // TvSettings > Connected Devices (Slice) - CONNECTED_SLICE = 0x18000000; - - // TvSettings > Connected Devices (Slice) > Connect remote or headphones - CONNECTED_SLICE_CONNECT_NEW_DEVICES = 0x18100000; - - // TvSettings > Connected Devices (Slice) > [A connected device] - CONNECTED_SLICE_DEVICE_ENTRY = 0x18200000; - - // TvSettings > Connected Devices (Slice) > [A connected device] > - // Remote update - CONNECTED_SLICE_DEVICE_ENTRY_UPDATE = 0x18210000; - - // TvSettings > Connected Devices (Slice) > [A connected device] > Rename - CONNECTED_SLICE_DEVICE_ENTRY_RENAME = 0x18220000; - - // TvSettings > Connected Devices (Slice) > [A connected device] > Forget - CONNECTED_SLICE_DEVICE_ENTRY_FORGET = 0x18230000; - - // TvSettings > Connected Devices (Slice) > HDMI-CEC - CONNECTED_SLICE_HDMICEC = 0x18300000; - - // TvSettings > Connected Devices (Slice) > HDMI-CEC > Enable (toggle) - CONNECTED_SLICE_HDMICEC_ON_OFF = 0x18310000; - - // TvSettings > Connected Devices (aliasing CONNECTED_SLICE) - CONNECTED_CLASSIC = 0x18000000; - - // TvSettings > Connected Devices > Connect remote - // (aliasing CONNECTED_SLICE_CONNECT_NEW_DEVICES) - CONNECTED_CLASSIC_CONNECT_REMOTE = 0x18100000; - - // TvSettings > Connected Devices > [A connected device] - // (aliasing CONNECTED_SLICE_DEVICE_ENTRY) - CONNECTED_CLASSIC_DEVICE_ENTRY = 0x18200000; - - // TvSettings > Connected Devices > [A connected device] > Update - // (aliasing CONNECTED_SLICE_DEVICE_ENTRY_UPDATE) - CONNECTED_CLASSIC_DEVICE_ENTRY_UPDATE = 0x18210000; - - // TvSettings > Connected Devices > [A connected device] > Rename - // (aliasing CONNECTED_SLICE_DEVICE_ENTRY_RENAME) - CONNECTED_CLASSIC_DEVICE_ENTRY_RENAME = 0x18220000; - - // TvSettings > Connected Devices > [A connected device] > Forget - // (aliasing CONNECTED_SLICE_DEVICE_ENTRY_FORGET) - CONNECTED_CLASSIC_DEVICE_ENTRY_FORGET = 0x18230000; - - // TvSettings > Connected Devices > HDMI-CEC - // (aliasing CONNECTED_SLICE_HDMICEC) - CONNECTED_CLASSIC_HDMICEC = 0x18300000; - - // TvSettings > Connected Devices > HDMI-CEC > Enable (toggle) - // (aliasing CONNECTED_SLICE_HDMICEC_ON_OFF) - CONNECTED_CLASSIC_HDMICEC_ON_OFF = 0x18310000; - - // TvSettings > Help & Feedback - FEEDBACK = 0x19000000; - - // TvSettings > Help & Feedback > Send feedback - FEEDBACK_SEND = 0x19100000; -} diff --git a/core/proto/android/bluetooth/a2dp/enums.proto b/core/proto/android/bluetooth/a2dp/enums.proto deleted file mode 100644 index 5a025bdd6c10..000000000000 --- a/core/proto/android/bluetooth/a2dp/enums.proto +++ /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. - */ - -syntax = "proto2"; -package android.bluetooth.a2dp; - -option java_outer_classname = "BluetoothA2dpProtoEnums"; -option java_multiple_files = true; - -// A2dp playback state enum, defined from: -// frameworks/base/core/java/android/bluetooth/BluetoothA2dp.java -enum PlaybackStateEnum { - PLAYBACK_STATE_UNKNOWN = 0; - PLAYBACK_STATE_PLAYING = 10; - PLAYBACK_STATE_NOT_PLAYING = 11; -} - -enum AudioCodingModeEnum { - AUDIO_CODING_MODE_UNKNOWN = 0; - AUDIO_CODING_MODE_HARDWARE = 1; - AUDIO_CODING_MODE_SOFTWARE = 2; -} diff --git a/core/proto/android/bluetooth/enums.proto b/core/proto/android/bluetooth/enums.proto deleted file mode 100644 index 22f249820b11..000000000000 --- a/core/proto/android/bluetooth/enums.proto +++ /dev/null @@ -1,141 +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. - */ - -syntax = "proto2"; -package android.bluetooth; - -option java_outer_classname = "BluetoothProtoEnums"; -option java_multiple_files = true; - -// Bluetooth connection states. -enum ConnectionStateEnum { - CONNECTION_STATE_DISCONNECTED = 0; - CONNECTION_STATE_CONNECTING = 1; - CONNECTION_STATE_CONNECTED = 2; - CONNECTION_STATE_DISCONNECTING = 3; -} - -// Bluetooth Adapter Enable and Disable Reasons -enum EnableDisableReasonEnum { - ENABLE_DISABLE_REASON_UNSPECIFIED = 0; - ENABLE_DISABLE_REASON_APPLICATION_REQUEST = 1; - ENABLE_DISABLE_REASON_AIRPLANE_MODE = 2; - ENABLE_DISABLE_REASON_DISALLOWED = 3; - ENABLE_DISABLE_REASON_RESTARTED = 4; - ENABLE_DISABLE_REASON_START_ERROR = 5; - ENABLE_DISABLE_REASON_SYSTEM_BOOT = 6; - ENABLE_DISABLE_REASON_CRASH = 7; - ENABLE_DISABLE_REASON_USER_SWITCH = 8; - ENABLE_DISABLE_REASON_RESTORE_USER_SETTING = 9; - ENABLE_DISABLE_REASON_FACTORY_RESET = 10; -} - -enum DirectionEnum { - DIRECTION_UNKNOWN = 0; - DIRECTION_OUTGOING = 1; - DIRECTION_INCOMING = 2; -} - -// First item is the default value, other values follow Bluetooth spec definition -enum LinkTypeEnum { - // Link type is at most 1 byte (0xFF), thus 0xFFF must not be a valid value - LINK_TYPE_UNKNOWN = 0xFFF; - LINK_TYPE_SCO = 0x00; - LINK_TYPE_ACL = 0x01; - LINK_TYPE_ESCO = 0x02; -} - -enum DeviceInfoSrcEnum { - DEVICE_INFO_SRC_UNKNOWN = 0; - // Within Android Bluetooth stack - DEVICE_INFO_INTERNAL = 1; - // Outside Android Bluetooth stack - DEVICE_INFO_EXTERNAL = 2; -} - -enum DeviceTypeEnum { - DEVICE_TYPE_UNKNOWN = 0; - DEVICE_TYPE_CLASSIC = 1; - DEVICE_TYPE_LE = 2; - DEVICE_TYPE_DUAL = 3; -} - -// Defined in frameworks/base/core/java/android/bluetooth/BluetoothDevice.java -enum TransportTypeEnum { - TRANSPORT_TYPE_AUTO = 0; - TRANSPORT_TYPE_BREDR = 1; - TRANSPORT_TYPE_LE = 2; -} - -// Bond state enum -// Defined in frameworks/base/core/java/android/bluetooth/BluetoothDevice.java -enum BondStateEnum { - BOND_STATE_UNKNOWN = 0; - BOND_STATE_NONE = 10; - BOND_STATE_BONDING = 11; - BOND_STATE_BONDED = 12; -} - -// Sub states within the bonding general state -enum BondSubStateEnum { - BOND_SUB_STATE_UNKNOWN = 0; - BOND_SUB_STATE_LOCAL_OOB_DATA_PROVIDED = 1; - BOND_SUB_STATE_LOCAL_PIN_REQUESTED = 2; - BOND_SUB_STATE_LOCAL_PIN_REPLIED = 3; - BOND_SUB_STATE_LOCAL_SSP_REQUESTED = 4; - BOND_SUB_STATE_LOCAL_SSP_REPLIED = 5; -} - -enum UnbondReasonEnum { - UNBOND_REASON_UNKNOWN = 0; - UNBOND_REASON_AUTH_FAILED = 1; - UNBOND_REASON_AUTH_REJECTED = 2; - UNBOND_REASON_AUTH_CANCELED = 3; - UNBOND_REASON_REMOTE_DEVICE_DOWN = 4; - UNBOND_REASON_DISCOVERY_IN_PROGRESS = 5; - UNBOND_REASON_AUTH_TIMEOUT = 6; - UNBOND_REASON_REPEATED_ATTEMPTS = 7; - UNBOND_REASON_REMOTE_AUTH_CANCELED = 8; - UNBOND_REASON_REMOVED = 9; -} - -enum SocketTypeEnum { - SOCKET_TYPE_UNKNOWN = 0; - SOCKET_TYPE_RFCOMM = 1; - SOCKET_TYPE_SCO = 2; - SOCKET_TYPE_L2CAP_BREDR = 3; - SOCKET_TYPE_L2CAP_LE = 4; -} - -enum SocketConnectionstateEnum { - SOCKET_CONNECTION_STATE_UNKNOWN = 0; - // Socket acts as a server waiting for connection - SOCKET_CONNECTION_STATE_LISTENING = 1; - // Socket acts as a client trying to connect - SOCKET_CONNECTION_STATE_CONNECTING = 2; - // Socket is connected - SOCKET_CONNECTION_STATE_CONNECTED = 3; - // Socket tries to disconnect from remote - SOCKET_CONNECTION_STATE_DISCONNECTING = 4; - // This socket is closed - SOCKET_CONNECTION_STATE_DISCONNECTED = 5; -} - -enum SocketRoleEnum { - SOCKET_ROLE_UNKNOWN = 0; - SOCKET_ROLE_LISTEN = 1; - SOCKET_ROLE_CONNECTION = 2; -} diff --git a/core/proto/android/bluetooth/hci/enums.proto b/core/proto/android/bluetooth/hci/enums.proto deleted file mode 100644 index ef894e548351..000000000000 --- a/core/proto/android/bluetooth/hci/enums.proto +++ /dev/null @@ -1,559 +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. - */ - -syntax = "proto2"; -package android.bluetooth.hci; - -option java_outer_classname = "BluetoothHciProtoEnums"; -option java_multiple_files = true; - -// HCI command opcodes (OCF+OGF) from Bluetooth 5.0 specification Vol 2, Part E, Section 7 -// Original definition: system/bt/stack/include/hcidefs.h -enum CommandEnum { - // Opcode is at most 2 bytes (0xFFFF), thus 0xFFFFF must not be a valid value - CMD_UNKNOWN = 0xFFFFF; - // Link control commands 0x0400 - CMD_INQUIRY = 0x0401; - CMD_INQUIRY_CANCEL = 0x0402; - CMD_PERIODIC_INQUIRY_MODE = 0x0403; - CMD_EXIT_PERIODIC_INQUIRY_MODE = 0x0404; - CMD_CREATE_CONNECTION = 0x0405; - CMD_DISCONNECT = 0x0406; - CMD_ADD_SCO_CONNECTION = 0x0407; // Deprecated since Bluetooth 1.2 - CMD_CREATE_CONNECTION_CANCEL = 0x0408; - CMD_ACCEPT_CONNECTION_REQUEST = 0x0409; - CMD_REJECT_CONNECTION_REQUEST = 0x040A; - CMD_LINK_KEY_REQUEST_REPLY = 0x040B; - CMD_LINK_KEY_REQUEST_NEG_REPLY = 0x040C; - CMD_PIN_CODE_REQUEST_REPLY = 0x040D; - CMD_PIN_CODE_REQUEST_NEG_REPLY = 0x040E; - CMD_CHANGE_CONN_PACKET_TYPE = 0x040F; - CMD_AUTHENTICATION_REQUESTED = 0x0411; - CMD_SET_CONN_ENCRYPTION = 0x0413; - CMD_CHANGE_CONN_LINK_KEY = 0x0415; - CMD_MASTER_LINK_KEY = 0x0417; - CMD_RMT_NAME_REQUEST = 0x0419; - CMD_RMT_NAME_REQUEST_CANCEL = 0x041A; - CMD_READ_RMT_FEATURES = 0x041B; - CMD_READ_RMT_EXT_FEATURES = 0x041C; - CMD_READ_RMT_VERSION_INFO = 0x041D; - CMD_READ_RMT_CLOCK_OFFSET = 0x041F; - CMD_READ_LMP_HANDLE = 0x0420; - CMD_SETUP_ESCO_CONNECTION = 0x0428; - CMD_ACCEPT_ESCO_CONNECTION = 0x0429; - CMD_REJECT_ESCO_CONNECTION = 0x042A; - CMD_IO_CAPABILITY_REQUEST_REPLY = 0x042B; - CMD_USER_CONF_REQUEST_REPLY = 0x042C; - CMD_USER_CONF_VALUE_NEG_REPLY = 0x042D; - CMD_USER_PASSKEY_REQ_REPLY = 0x042E; - CMD_USER_PASSKEY_REQ_NEG_REPLY = 0x042F; - CMD_REM_OOB_DATA_REQ_REPLY = 0x0430; - CMD_REM_OOB_DATA_REQ_NEG_REPLY = 0x0433; - CMD_IO_CAP_REQ_NEG_REPLY = 0x0434; - // BEGIN: AMP commands (not used in system/bt) - CMD_CREATE_PHYSICAL_LINK = 0x0435; - CMD_ACCEPT_PHYSICAL_LINK = 0x0436; - CMD_DISCONNECT_PHYSICAL_LINK = 0x0437; - CMD_CREATE_LOGICAL_LINK = 0x0438; - CMD_ACCEPT_LOGICAL_LINK = 0x0439; - CMD_DISCONNECT_LOGICAL_LINK = 0x043A; - CMD_LOGICAL_LINK_CANCEL = 0x043B; - CMD_FLOW_SPEC_MODIFY = 0x043C; - // END: AMP commands - CMD_ENH_SETUP_ESCO_CONNECTION = 0x043D; - CMD_ENH_ACCEPT_ESCO_CONNECTION = 0x043E; - CMD_TRUNCATED_PAGE = 0x043F; - CMD_TRUNCATED_PAGE_CANCEL = 0x0440; - CMD_SET_CLB = 0x0441; - CMD_RECEIVE_CLB = 0x0442; - CMD_START_SYNC_TRAIN = 0x0443; - CMD_RECEIVE_SYNC_TRAIN = 0x0444; - CMD_REM_OOB_EXTENDED_DATA_REQ_REPLY = 0x0445; // Not currently used in system/bt - // Link policy commands 0x0800 - CMD_HOLD_MODE = 0x0801; - CMD_SNIFF_MODE = 0x0803; - CMD_EXIT_SNIFF_MODE = 0x0804; - CMD_PARK_MODE = 0x0805; - CMD_EXIT_PARK_MODE = 0x0806; - CMD_QOS_SETUP = 0x0807; - CMD_ROLE_DISCOVERY = 0x0809; - CMD_SWITCH_ROLE = 0x080B; - CMD_READ_POLICY_SETTINGS = 0x080C; - CMD_WRITE_POLICY_SETTINGS = 0x080D; - CMD_READ_DEF_POLICY_SETTINGS = 0x080E; - CMD_WRITE_DEF_POLICY_SETTINGS = 0x080F; - CMD_FLOW_SPECIFICATION = 0x0810; - CMD_SNIFF_SUB_RATE = 0x0811; - // Host controller baseband commands 0x0C00 - CMD_SET_EVENT_MASK = 0x0C01; - CMD_RESET = 0x0C03; - CMD_SET_EVENT_FILTER = 0x0C05; - CMD_FLUSH = 0x0C08; - CMD_READ_PIN_TYPE = 0x0C09; - CMD_WRITE_PIN_TYPE = 0x0C0A; - CMD_CREATE_NEW_UNIT_KEY = 0x0C0B; - CMD_GET_MWS_TRANS_LAYER_CFG = 0x0C0C; // Deprecated (not used in spec) - CMD_READ_STORED_LINK_KEY = 0x0C0D; - CMD_WRITE_STORED_LINK_KEY = 0x0C11; - CMD_DELETE_STORED_LINK_KEY = 0x0C12; - CMD_CHANGE_LOCAL_NAME = 0x0C13; - CMD_READ_LOCAL_NAME = 0x0C14; - CMD_READ_CONN_ACCEPT_TOUT = 0x0C15; - CMD_WRITE_CONN_ACCEPT_TOUT = 0x0C16; - CMD_READ_PAGE_TOUT = 0x0C17; - CMD_WRITE_PAGE_TOUT = 0x0C18; - CMD_READ_SCAN_ENABLE = 0x0C19; - CMD_WRITE_SCAN_ENABLE = 0x0C1A; - CMD_READ_PAGESCAN_CFG = 0x0C1B; - CMD_WRITE_PAGESCAN_CFG = 0x0C1C; - CMD_READ_INQUIRYSCAN_CFG = 0x0C1D; - CMD_WRITE_INQUIRYSCAN_CFG = 0x0C1E; - CMD_READ_AUTHENTICATION_ENABLE = 0x0C1F; - CMD_WRITE_AUTHENTICATION_ENABLE = 0x0C20; - CMD_READ_ENCRYPTION_MODE = 0x0C21; // Deprecated - CMD_WRITE_ENCRYPTION_MODE = 0x0C22; // Deprecated - CMD_READ_CLASS_OF_DEVICE = 0x0C23; - CMD_WRITE_CLASS_OF_DEVICE = 0x0C24; - CMD_READ_VOICE_SETTINGS = 0x0C25; - CMD_WRITE_VOICE_SETTINGS = 0x0C26; - CMD_READ_AUTOMATIC_FLUSH_TIMEOUT = 0x0C27; - CMD_WRITE_AUTOMATIC_FLUSH_TIMEOUT = 0x0C28; - CMD_READ_NUM_BCAST_REXMITS = 0x0C29; - CMD_WRITE_NUM_BCAST_REXMITS = 0x0C2A; - CMD_READ_HOLD_MODE_ACTIVITY = 0x0C2B; - CMD_WRITE_HOLD_MODE_ACTIVITY = 0x0C2C; - CMD_READ_TRANSMIT_POWER_LEVEL = 0x0C2D; - CMD_READ_SCO_FLOW_CTRL_ENABLE = 0x0C2E; - CMD_WRITE_SCO_FLOW_CTRL_ENABLE = 0x0C2F; - CMD_SET_HC_TO_HOST_FLOW_CTRL = 0x0C31; - CMD_HOST_BUFFER_SIZE = 0x0C33; - CMD_HOST_NUM_PACKETS_DONE = 0x0C35; - CMD_READ_LINK_SUPER_TOUT = 0x0C36; - CMD_WRITE_LINK_SUPER_TOUT = 0x0C37; - CMD_READ_NUM_SUPPORTED_IAC = 0x0C38; - CMD_READ_CURRENT_IAC_LAP = 0x0C39; - CMD_WRITE_CURRENT_IAC_LAP = 0x0C3A; - CMD_READ_PAGESCAN_PERIOD_MODE = 0x0C3B; // Deprecated - CMD_WRITE_PAGESCAN_PERIOD_MODE = 0x0C3C; // Deprecated - CMD_READ_PAGESCAN_MODE = 0x0C3D; // Deprecated - CMD_WRITE_PAGESCAN_MODE = 0x0C3E; // Deprecated - CMD_SET_AFH_CHANNELS = 0x0C3F; - CMD_READ_INQSCAN_TYPE = 0x0C42; - CMD_WRITE_INQSCAN_TYPE = 0x0C43; - CMD_READ_INQUIRY_MODE = 0x0C44; - CMD_WRITE_INQUIRY_MODE = 0x0C45; - CMD_READ_PAGESCAN_TYPE = 0x0C46; - CMD_WRITE_PAGESCAN_TYPE = 0x0C47; - CMD_READ_AFH_ASSESSMENT_MODE = 0x0C48; - CMD_WRITE_AFH_ASSESSMENT_MODE = 0x0C49; - CMD_READ_EXT_INQ_RESPONSE = 0x0C51; - CMD_WRITE_EXT_INQ_RESPONSE = 0x0C52; - CMD_REFRESH_ENCRYPTION_KEY = 0x0C53; - CMD_READ_SIMPLE_PAIRING_MODE = 0x0C55; - CMD_WRITE_SIMPLE_PAIRING_MODE = 0x0C56; - CMD_READ_LOCAL_OOB_DATA = 0x0C57; - CMD_READ_INQ_TX_POWER_LEVEL = 0x0C58; - CMD_WRITE_INQ_TX_POWER_LEVEL = 0x0C59; - CMD_READ_ERRONEOUS_DATA_RPT = 0x0C5A; - CMD_WRITE_ERRONEOUS_DATA_RPT = 0x0C5B; - CMD_ENHANCED_FLUSH = 0x0C5F; - CMD_SEND_KEYPRESS_NOTIF = 0x0C60; - CMD_READ_LOGICAL_LINK_ACCEPT_TIMEOUT = 0x0C61; - CMD_WRITE_LOGICAL_LINK_ACCEPT_TIMEOUT = 0x0C62; - CMD_SET_EVENT_MASK_PAGE_2 = 0x0C63; - CMD_READ_LOCATION_DATA = 0x0C64; - CMD_WRITE_LOCATION_DATA = 0x0C65; - CMD_READ_FLOW_CONTROL_MODE = 0x0C66; - CMD_WRITE_FLOW_CONTROL_MODE = 0x0C67; - CMD_READ_ENHANCED_TX_PWR_LEVEL = 0x0C68; // Not currently used in system/bt - CMD_READ_BE_FLUSH_TOUT = 0x0C69; - CMD_WRITE_BE_FLUSH_TOUT = 0x0C6A; - CMD_SHORT_RANGE_MODE = 0x0C6B; - CMD_READ_BLE_HOST_SUPPORT = 0x0C6C; - CMD_WRITE_BLE_HOST_SUPPORT = 0x0C6D; - CMD_SET_MWS_CHANNEL_PARAMETERS = 0x0C6E; - CMD_SET_EXTERNAL_FRAME_CONFIGURATION = 0x0C6F; - CMD_SET_MWS_SIGNALING = 0x0C70; - CMD_SET_MWS_TRANSPORT_LAYER = 0x0C71; - CMD_SET_MWS_SCAN_FREQUENCY_TABLE = 0x0C72; - CMD_SET_MWS_PATTERN_CONFIGURATION = 0x0C73; - CMD_SET_RESERVED_LT_ADDR = 0x0C74; - CMD_DELETE_RESERVED_LT_ADDR = 0x0C75; - CMD_WRITE_CLB_DATA = 0x0C76; - CMD_READ_SYNC_TRAIN_PARAM = 0x0C77; - CMD_WRITE_SYNC_TRAIN_PARAM = 0x0C78; - CMD_READ_SECURE_CONNS_SUPPORT = 0x0C79; - CMD_WRITE_SECURE_CONNS_SUPPORT = 0x0C7A; - CMD_READ_AUTHED_PAYLOAD_TIMEOUT = 0x0C7B; // Not currently used in system/bt - CMD_WRITE_AUTHED_PAYLOAD_TIMEOUT = 0x0C7C; // Not currently used in system/bt - CMD_READ_LOCAL_OOB_EXTENDED_DATA = 0x0C7D; // Not currently used in system/bt - CMD_READ_EXTENDED_PAGE_TIMEOUT = 0x0C7E; // Not currently used in system/bt - CMD_WRITE_EXTENDED_PAGE_TIMEOUT = 0x0C7F; // Not currently used in system/bt - CMD_READ_EXTENDED_INQUIRY_LENGTH = 0x0C80; // Not currently used in system/bt - CMD_WRITE_EXTENDED_INQUIRY_LENGTH = 0x0C81; // Not currently used in system/bt - // Informational parameter commands 0x1000 - CMD_READ_LOCAL_VERSION_INFO = 0x1001; - CMD_READ_LOCAL_SUPPORTED_CMDS = 0x1002; - CMD_READ_LOCAL_FEATURES = 0x1003; - CMD_READ_LOCAL_EXT_FEATURES = 0x1004; - CMD_READ_BUFFER_SIZE = 0x1005; - CMD_READ_COUNTRY_CODE = 0x1007; // Deprecated - CMD_READ_BD_ADDR = 0x1009; - CMD_READ_DATA_BLOCK_SIZE = 0x100A; - CMD_READ_LOCAL_SUPPORTED_CODECS = 0x100B; - // Status parameter commands 0x1400 - CMD_READ_FAILED_CONTACT_COUNTER = 0x1401; - CMD_RESET_FAILED_CONTACT_COUNTER = 0x1402; - CMD_GET_LINK_QUALITY = 0x1403; - CMD_READ_RSSI = 0x1405; - CMD_READ_AFH_CH_MAP = 0x1406; - CMD_READ_CLOCK = 0x1407; - CMD_READ_ENCR_KEY_SIZE = 0x1408; - CMD_READ_LOCAL_AMP_INFO = 0x1409; - CMD_READ_LOCAL_AMP_ASSOC = 0x140A; - CMD_WRITE_REMOTE_AMP_ASSOC = 0x140B; - CMD_GET_MWS_TRANSPORT_CFG = 0x140C; // Not currently used in system/bt - CMD_SET_TRIGGERED_CLK_CAPTURE = 0x140D; // Not currently used in system/bt - // Testing commands 0x1800 - CMD_READ_LOOPBACK_MODE = 0x1801; - CMD_WRITE_LOOPBACK_MODE = 0x1802; - CMD_ENABLE_DEV_UNDER_TEST_MODE = 0x1803; - CMD_WRITE_SIMP_PAIR_DEBUG_MODE = 0x1804; - CMD_ENABLE_AMP_RCVR_REPORTS = 0x1807; - CMD_AMP_TEST_END = 0x1808; - CMD_AMP_TEST = 0x1809; - CMD_WRITE_SECURE_CONN_TEST_MODE = 0x180A; // Not currently used in system/bt - // BLE commands 0x2000 - CMD_BLE_SET_EVENT_MASK = 0x2001; - CMD_BLE_READ_BUFFER_SIZE = 0x2002; - CMD_BLE_READ_LOCAL_SPT_FEAT = 0x2003; - CMD_BLE_WRITE_LOCAL_SPT_FEAT = 0x2004; - CMD_BLE_WRITE_RANDOM_ADDR = 0x2005; - CMD_BLE_WRITE_ADV_PARAMS = 0x2006; - CMD_BLE_READ_ADV_CHNL_TX_POWER = 0x2007; - CMD_BLE_WRITE_ADV_DATA = 0x2008; - CMD_BLE_WRITE_SCAN_RSP_DATA = 0x2009; - CMD_BLE_WRITE_ADV_ENABLE = 0x200A; - CMD_BLE_WRITE_SCAN_PARAMS = 0x200B; - CMD_BLE_WRITE_SCAN_ENABLE = 0x200C; - CMD_BLE_CREATE_LL_CONN = 0x200D; - CMD_BLE_CREATE_CONN_CANCEL = 0x200E; - CMD_BLE_READ_WHITE_LIST_SIZE = 0x200F; - CMD_BLE_CLEAR_WHITE_LIST = 0x2010; - CMD_BLE_ADD_WHITE_LIST = 0x2011; - CMD_BLE_REMOVE_WHITE_LIST = 0x2012; - CMD_BLE_UPD_LL_CONN_PARAMS = 0x2013; - CMD_BLE_SET_HOST_CHNL_CLASS = 0x2014; - CMD_BLE_READ_CHNL_MAP = 0x2015; - CMD_BLE_READ_REMOTE_FEAT = 0x2016; - CMD_BLE_ENCRYPT = 0x2017; - CMD_BLE_RAND = 0x2018; - CMD_BLE_START_ENC = 0x2019; - CMD_BLE_LTK_REQ_REPLY = 0x201A; - CMD_BLE_LTK_REQ_NEG_REPLY = 0x201B; - CMD_BLE_READ_SUPPORTED_STATES = 0x201C; - CMD_BLE_RECEIVER_TEST = 0x201D; - CMD_BLE_TRANSMITTER_TEST = 0x201E; - CMD_BLE_TEST_END = 0x201F; - CMD_BLE_RC_PARAM_REQ_REPLY = 0x2020; - CMD_BLE_RC_PARAM_REQ_NEG_REPLY = 0x2021; - CMD_BLE_SET_DATA_LENGTH = 0x2022; - CMD_BLE_READ_DEFAULT_DATA_LENGTH = 0x2023; - CMD_BLE_WRITE_DEFAULT_DATA_LENGTH = 0x2024; - CMD_BLE_GENERATE_DHKEY = 0x2026; // Not currently used in system/bt - CMD_BLE_ADD_DEV_RESOLVING_LIST = 0x2027; - CMD_BLE_RM_DEV_RESOLVING_LIST = 0x2028; - CMD_BLE_CLEAR_RESOLVING_LIST = 0x2029; - CMD_BLE_READ_RESOLVING_LIST_SIZE = 0x202A; - CMD_BLE_READ_RESOLVABLE_ADDR_PEER = 0x202B; - CMD_BLE_READ_RESOLVABLE_ADDR_LOCAL = 0x202C; - CMD_BLE_SET_ADDR_RESOLUTION_ENABLE = 0x202D; - CMD_BLE_SET_RAND_PRIV_ADDR_TIMOUT = 0x202E; - CMD_BLE_READ_MAXIMUM_DATA_LENGTH = 0x202F; - CMD_BLE_READ_PHY = 0x2030; - CMD_BLE_SET_DEFAULT_PHY = 0x2031; - CMD_BLE_SET_PHY = 0x2032; - CMD_BLE_ENH_RECEIVER_TEST = 0x2033; - CMD_BLE_ENH_TRANSMITTER_TEST = 0x2034; - CMD_BLE_SET_EXT_ADVERTISING_RANDOM_ADDRESS = 0x2035; - CMD_BLE_SET_EXT_ADVERTISING_PARAM = 0x2036; - CMD_BLE_SET_EXT_ADVERTISING_DATA = 0x2037; - CMD_BLE_SET_EXT_ADVERTISING_SCAN_RESP = 0x2038; - CMD_BLE_SET_EXT_ADVERTISING_ENABLE = 0x2039; - CMD_BLE_READ_MAXIMUM_ADVERTISING_DATA_LENGTH = 0x203A; - CMD_BLE_READ_NUMBER_OF_SUPPORTED_ADVERTISING_SETS = 0x203B; - CMD_BLE_REMOVE_ADVERTISING_SET = 0x203C; - CMD_BLE_CLEAR_ADVERTISING_SETS = 0x203D; - CMD_BLE_SET_PERIODIC_ADVERTISING_PARAM = 0x203E; - CMD_BLE_SET_PERIODIC_ADVERTISING_DATA = 0x203F; - CMD_BLE_SET_PERIODIC_ADVERTISING_ENABLE = 0x2040; - CMD_BLE_SET_EXTENDED_SCAN_PARAMETERS = 0x2041; - CMD_BLE_SET_EXTENDED_SCAN_ENABLE = 0x2042; - CMD_BLE_EXTENDED_CREATE_CONNECTION = 0x2043; - CMD_BLE_PERIODIC_ADVERTISING_CREATE_SYNC = 0x2044; - CMD_BLE_PERIODIC_ADVERTISING_CREATE_SYNC_CANCEL = 0x2045; - CMD_BLE_PERIODIC_ADVERTISING_TERMINATE_SYNC = 0x2046; - CMD_BLE_ADD_DEVICE_TO_PERIODIC_ADVERTISING_LIST = 0x2047; - CMD_BLE_RM_DEVICE_FROM_PERIODIC_ADVERTISING_LIST = 0x2048; - CMD_BLE_CLEAR_PERIODIC_ADVERTISING_LIST = 0x2049; - CMD_BLE_READ_PERIODIC_ADVERTISING_LIST_SIZE = 0x204A; - CMD_BLE_READ_TRANSMIT_POWER = 0x204B; - CMD_BLE_READ_RF_COMPENS_POWER = 0x204C; - CMD_BLE_WRITE_RF_COMPENS_POWER = 0x204D; - CMD_BLE_SET_PRIVACY_MODE = 0x204E; - // Vendor specific commands 0xFC00 and above - // Android vendor specific commands defined in - // https://source.android.com/devices/bluetooth/hci_requirements#vendor-specific-capabilities - CMD_BLE_VENDOR_CAP = 0xFD53; - CMD_BLE_MULTI_ADV = 0xFD54; - CMD_BLE_BATCH_SCAN = 0xFD56; - CMD_BLE_ADV_FILTER = 0xFD57; - CMD_BLE_TRACK_ADV = 0xFD58; - CMD_BLE_ENERGY_INFO = 0xFD59; - CMD_BLE_EXTENDED_SCAN_PARAMS = 0xFD5A; - CMD_CONTROLLER_DEBUG_INFO = 0xFD5B; - CMD_CONTROLLER_A2DP_OPCODE = 0xFD5D; - CMD_BRCM_SET_ACL_PRIORITY = 0xFC57; - // Other vendor specific commands below here -} - -// HCI event codes from the Bluetooth 5.0 specification Vol 2, Part 7, Section 7 -// Original definition: system/bt/stack/include/hcidefs.h -enum EventEnum { - // Event is at most 1 byte (0xFF), thus 0xFFF must not be a valid value - EVT_UNKNOWN = 0xFFF; - EVT_INQUIRY_COMP = 0x01; - EVT_INQUIRY_RESULT = 0x02; - EVT_CONNECTION_COMP = 0x03; - EVT_CONNECTION_REQUEST = 0x04; - EVT_DISCONNECTION_COMP = 0x05; - EVT_AUTHENTICATION_COMP = 0x06; - EVT_RMT_NAME_REQUEST_COMP = 0x07; - EVT_ENCRYPTION_CHANGE = 0x08; - EVT_CHANGE_CONN_LINK_KEY = 0x09; - EVT_MASTER_LINK_KEY_COMP = 0x0A; - EVT_READ_RMT_FEATURES_COMP = 0x0B; - EVT_READ_RMT_VERSION_COMP = 0x0C; - EVT_QOS_SETUP_COMP = 0x0D; - EVT_COMMAND_COMPLETE = 0x0E; - EVT_COMMAND_STATUS = 0x0F; - EVT_HARDWARE_ERROR = 0x10; - EVT_FLUSH_OCCURRED = 0x11; - EVT_ROLE_CHANGE = 0x12; - EVT_NUM_COMPL_DATA_PKTS = 0x13; - EVT_MODE_CHANGE = 0x14; - EVT_RETURN_LINK_KEYS = 0x15; - EVT_PIN_CODE_REQUEST = 0x16; - EVT_LINK_KEY_REQUEST = 0x17; - EVT_LINK_KEY_NOTIFICATION = 0x18; - EVT_LOOPBACK_COMMAND = 0x19; - EVT_DATA_BUF_OVERFLOW = 0x1A; - EVT_MAX_SLOTS_CHANGED = 0x1B; - EVT_READ_CLOCK_OFF_COMP = 0x1C; - EVT_CONN_PKT_TYPE_CHANGE = 0x1D; - EVT_QOS_VIOLATION = 0x1E; - EVT_PAGE_SCAN_MODE_CHANGE = 0x1F; // Deprecated - EVT_PAGE_SCAN_REP_MODE_CHNG = 0x20; - EVT_FLOW_SPECIFICATION_COMP = 0x21; - EVT_INQUIRY_RSSI_RESULT = 0x22; - EVT_READ_RMT_EXT_FEATURES_COMP = 0x23; - EVT_ESCO_CONNECTION_COMP = 0x2C; - EVT_ESCO_CONNECTION_CHANGED = 0x2D; - EVT_SNIFF_SUB_RATE = 0x2E; - EVT_EXTENDED_INQUIRY_RESULT = 0x2F; - EVT_ENCRYPTION_KEY_REFRESH_COMP = 0x30; - EVT_IO_CAPABILITY_REQUEST = 0x31; - EVT_IO_CAPABILITY_RESPONSE = 0x32; - EVT_USER_CONFIRMATION_REQUEST = 0x33; - EVT_USER_PASSKEY_REQUEST = 0x34; - EVT_REMOTE_OOB_DATA_REQUEST = 0x35; - EVT_SIMPLE_PAIRING_COMPLETE = 0x36; - EVT_LINK_SUPER_TOUT_CHANGED = 0x38; - EVT_ENHANCED_FLUSH_COMPLETE = 0x39; - EVT_USER_PASSKEY_NOTIFY = 0x3B; - EVT_KEYPRESS_NOTIFY = 0x3C; - EVT_RMT_HOST_SUP_FEAT_NOTIFY = 0x3D; - EVT_BLE_META = 0x3E; - EVT_PHYSICAL_LINK_COMP = 0x40; - EVT_CHANNEL_SELECTED = 0x41; - EVT_DISC_PHYSICAL_LINK_COMP = 0x42; - EVT_PHY_LINK_LOSS_EARLY_WARNING = 0x43; - EVT_PHY_LINK_RECOVERY = 0x44; - EVT_LOGICAL_LINK_COMP = 0x45; - EVT_DISC_LOGICAL_LINK_COMP = 0x46; - EVT_FLOW_SPEC_MODIFY_COMP = 0x47; - EVT_NUM_COMPL_DATA_BLOCKS = 0x48; - EVT_AMP_TEST_START = 0x49; // Not currently used in system/bt - EVT_AMP_TEST_END = 0x4A; // Not currently used in system/bt - EVT_AMP_RECEIVER_RPT = 0x4B; // Not currently used in system/bt - EVT_SHORT_RANGE_MODE_COMPLETE = 0x4C; - EVT_AMP_STATUS_CHANGE = 0x4D; - EVT_SET_TRIGGERED_CLOCK_CAPTURE = 0x4E; - EVT_SYNC_TRAIN_CMPL = 0x4F; // Not currently used in system/bt - EVT_SYNC_TRAIN_RCVD = 0x50; // Not currently used in system/bt - EVT_CONNLESS_SLAVE_BROADCAST_RCVD = 0x51; // Not currently used in system/bt - EVT_CONNLESS_SLAVE_BROADCAST_TIMEOUT = 0x52; // Not currently used in system/bt - EVT_TRUNCATED_PAGE_CMPL = 0x53; // Not currently used in system/bt - EVT_SLAVE_PAGE_RES_TIMEOUT = 0x54; // Not currently used in system/bt - EVT_CONNLESS_SLAVE_BROADCAST_CHNL_MAP_CHANGE = 0x55; // Not currently used in system/bt - EVT_INQUIRY_RES_NOTIFICATION = 0x56; // Not currently used in system/bt - EVT_AUTHED_PAYLOAD_TIMEOUT = 0x57; // Not currently used in system/bt - EVT_SAM_STATUS_CHANGE = 0x58; // Not currently used in system/bt -} - -// Bluetooth low energy related meta event codes -// from the Bluetooth 5.0 specification Vol 2, Part E, Section 7.7.65 -// Original definition: system/bt/stack/include/hcidefs.h -enum BleMetaEventEnum { - // BLE meta event code is at most 1 byte (0xFF), thus 0xFFF must not be a valid value - BLE_EVT_UNKNOWN = 0xFFF; - BLE_EVT_CONN_COMPLETE_EVT = 0x01; - BLE_EVT_ADV_PKT_RPT_EVT = 0x02; - BLE_EVT_LL_CONN_PARAM_UPD_EVT = 0x03; - BLE_EVT_READ_REMOTE_FEAT_CMPL_EVT = 0x04; - BLE_EVT_LTK_REQ_EVT = 0x05; - BLE_EVT_RC_PARAM_REQ_EVT = 0x06; - BLE_EVT_DATA_LENGTH_CHANGE_EVT = 0x07; - BLE_EVT_READ_LOCAL_P256_PUB_KEY = 0x08; // Not currently used in system/bt - BLE_EVT_GEN_DHKEY_CMPL = 0x09; // Not currently used in system/bt - BLE_EVT_ENHANCED_CONN_COMPLETE_EVT = 0x0a; - BLE_EVT_DIRECT_ADV_EVT = 0x0b; - BLE_EVT_PHY_UPDATE_COMPLETE_EVT = 0x0c; - BLE_EVT_EXTENDED_ADVERTISING_REPORT_EVT = 0x0D; - BLE_EVT_PERIODIC_ADV_SYNC_EST_EVT = 0x0E; - BLE_EVT_PERIODIC_ADV_REPORT_EVT = 0x0F; - BLE_EVT_PERIODIC_ADV_SYNC_LOST_EVT = 0x10; - BLE_EVT_SCAN_TIMEOUT_EVT = 0x11; - BLE_EVT_ADVERTISING_SET_TERMINATED_EVT = 0x12; - BLE_EVT_SCAN_REQ_RX_EVT = 0x13; - BLE_EVT_CHNL_SELECTION_ALGORITHM = 0x14; // Not currently used in system/bt -} - -// HCI status code from the Bluetooth 5.0 specification Vol 2, Part D. -// Original definition: system/bt/stack/include/hcidefs.h -enum StatusEnum { - // Status is at most 1 byte (0xFF), thus 0xFFF must not be a valid value - STATUS_UNKNOWN = 0xFFF; - STATUS_SUCCESS = 0x00; - STATUS_ILLEGAL_COMMAND = 0x01; - STATUS_NO_CONNECTION = 0x02; - STATUS_HW_FAILURE = 0x03; - STATUS_PAGE_TIMEOUT = 0x04; - STATUS_AUTH_FAILURE = 0x05; - STATUS_KEY_MISSING = 0x06; - STATUS_MEMORY_FULL = 0x07; - STATUS_CONNECTION_TOUT = 0x08; - STATUS_MAX_NUM_OF_CONNECTIONS = 0x09; - STATUS_MAX_NUM_OF_SCOS = 0x0A; - STATUS_CONNECTION_EXISTS = 0x0B; - STATUS_COMMAND_DISALLOWED = 0x0C; - STATUS_HOST_REJECT_RESOURCES = 0x0D; - STATUS_HOST_REJECT_SECURITY = 0x0E; - STATUS_HOST_REJECT_DEVICE = 0x0F; - STATUS_HOST_TIMEOUT = 0x10; - STATUS_UNSUPPORTED_VALUE = 0x11; - STATUS_ILLEGAL_PARAMETER_FMT = 0x12; - STATUS_PEER_USER = 0x13; - STATUS_PEER_LOW_RESOURCES = 0x14; - STATUS_PEER_POWER_OFF = 0x15; - STATUS_CONN_CAUSE_LOCAL_HOST = 0x16; - STATUS_REPEATED_ATTEMPTS = 0x17; - STATUS_PAIRING_NOT_ALLOWED = 0x18; - STATUS_UNKNOWN_LMP_PDU = 0x19; - STATUS_UNSUPPORTED_REM_FEATURE = 0x1A; - STATUS_SCO_OFFSET_REJECTED = 0x1B; - STATUS_SCO_INTERVAL_REJECTED = 0x1C; - STATUS_SCO_AIR_MODE = 0x1D; - STATUS_INVALID_LMP_PARAM = 0x1E; - STATUS_UNSPECIFIED = 0x1F; - STATUS_UNSUPPORTED_LMP_FEATURE = 0x20; - STATUS_ROLE_CHANGE_NOT_ALLOWED = 0x21; - STATUS_LMP_RESPONSE_TIMEOUT = 0x22; - STATUS_LMP_STATUS_TRANS_COLLISION = 0x23; - STATUS_LMP_PDU_NOT_ALLOWED = 0x24; - STATUS_ENCRY_MODE_NOT_ACCEPTABLE = 0x25; - STATUS_UNIT_KEY_USED = 0x26; - STATUS_QOS_NOT_SUPPORTED = 0x27; - STATUS_INSTANT_PASSED = 0x28; - STATUS_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED = 0x29; - STATUS_DIFF_TRANSACTION_COLLISION = 0x2A; - STATUS_UNDEFINED_0x2B = 0x2B; // Not used - STATUS_QOS_UNACCEPTABLE_PARAM = 0x2C; - STATUS_QOS_REJECTED = 0x2D; - STATUS_CHAN_CLASSIF_NOT_SUPPORTED = 0x2E; - STATUS_INSUFFCIENT_SECURITY = 0x2F; - STATUS_PARAM_OUT_OF_RANGE = 0x30; - STATUS_UNDEFINED_0x31 = 0x31; // Not used - STATUS_ROLE_SWITCH_PENDING = 0x32; - STATUS_UNDEFINED_0x33 = 0x33; - STATUS_RESERVED_SLOT_VIOLATION = 0x34; - STATUS_ROLE_SWITCH_FAILED = 0x35; - STATUS_INQ_RSP_DATA_TOO_LARGE = 0x36; - STATUS_SIMPLE_PAIRING_NOT_SUPPORTED = 0x37; - STATUS_HOST_BUSY_PAIRING = 0x38; - STATUS_REJ_NO_SUITABLE_CHANNEL = 0x39; - STATUS_CONTROLLER_BUSY = 0x3A; - STATUS_UNACCEPT_CONN_INTERVAL = 0x3B; - STATUS_ADVERTISING_TIMEOUT = 0x3C; - STATUS_CONN_TOUT_DUE_TO_MIC_FAILURE = 0x3D; - STATUS_CONN_FAILED_ESTABLISHMENT = 0x3E; - STATUS_MAC_CONNECTION_FAILED = 0x3F; - STATUS_LT_ADDR_ALREADY_IN_USE = 0x40; - STATUS_LT_ADDR_NOT_ALLOCATED = 0x41; - STATUS_CLB_NOT_ENABLED = 0x42; - STATUS_CLB_DATA_TOO_BIG = 0x43; - STATUS_OPERATION_CANCELED_BY_HOST = 0x44; // Not currently used in system/bt -} - -enum BqrIdEnum { - BQR_ID_UNKNOWN = 0x00; - BQR_ID_MONITOR_MODE = 0x01; - BQR_ID_APPROACH_LSTO = 0x02; - BQR_ID_A2DP_AUDIO_CHOPPY = 0x03; - BQR_ID_SCO_VOICE_CHOPPY = 0x04; -} - -enum BqrPacketTypeEnum { - BQR_PACKET_TYPE_UNKNOWN = 0x00; - BQR_PACKET_TYPE_ID = 0x01; - BQR_PACKET_TYPE_NULL = 0x02; - BQR_PACKET_TYPE_POLL = 0x03; - BQR_PACKET_TYPE_FHS = 0x04; - BQR_PACKET_TYPE_HV1 = 0x05; - BQR_PACKET_TYPE_HV2 = 0x06; - BQR_PACKET_TYPE_HV3 = 0x07; - BQR_PACKET_TYPE_DV = 0x08; - BQR_PACKET_TYPE_EV3 = 0x09; - BQR_PACKET_TYPE_EV4 = 0x0A; - BQR_PACKET_TYPE_EV5 = 0x0B; - BQR_PACKET_TYPE_2EV3 = 0x0C; - BQR_PACKET_TYPE_2EV5 = 0x0D; - BQR_PACKET_TYPE_3EV3 = 0x0E; - BQR_PACKET_TYPE_3EV5 = 0x0F; - BQR_PACKET_TYPE_DM1 = 0x10; - BQR_PACKET_TYPE_DH1 = 0x11; - BQR_PACKET_TYPE_DM3 = 0x12; - BQR_PACKET_TYPE_DH3 = 0x13; - BQR_PACKET_TYPE_DM5 = 0x14; - BQR_PACKET_TYPE_DH5 = 0x15; - BQR_PACKET_TYPE_AUX1 = 0x16; - BQR_PACKET_TYPE_2DH1 = 0x17; - BQR_PACKET_TYPE_2DH3 = 0x18; - BQR_PACKET_TYPE_2DH5 = 0x19; - BQR_PACKET_TYPE_3DH1 = 0x1A; - BQR_PACKET_TYPE_3DH3 = 0x1B; - BQR_PACKET_TYPE_3DH5 = 0x1C; -} diff --git a/core/proto/android/bluetooth/hfp/enums.proto b/core/proto/android/bluetooth/hfp/enums.proto deleted file mode 100644 index d286e4b64d67..000000000000 --- a/core/proto/android/bluetooth/hfp/enums.proto +++ /dev/null @@ -1,28 +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. - */ - -syntax = "proto2"; -package android.bluetooth.hfp; - -option java_outer_classname = "BluetoothHfpProtoEnums"; -option java_multiple_files = true; - -enum ScoCodec { - SCO_CODEC_UNKNOWN = 0; - SCO_CODEC_CVSD = 1; - // Default codec behind Wide Band Speech - SCO_CODEC_MSBC = 2; -}
\ No newline at end of file diff --git a/core/proto/android/bluetooth/smp/enums.proto b/core/proto/android/bluetooth/smp/enums.proto deleted file mode 100644 index c6747b78dc29..000000000000 --- a/core/proto/android/bluetooth/smp/enums.proto +++ /dev/null @@ -1,58 +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. - */ - -syntax = "proto2"; -package android.bluetooth.smp; - -option java_outer_classname = "BluetoothSmpProtoEnums"; -option java_multiple_files = true; - -// SMP Pairing command codes -enum CommandEnum { - CMD_UNKNOWN = 0x00; - CMD_PAIRING_REQUEST = 0x01; - CMD_PAIRING_RESPONSE = 0x02; - CMD_PAIRING_CONFIRM = 0x03; - CMD_PAIRING_RANDOM = 0x04; - CMD_PAIRING_FAILED = 0x05; - CMD_ENCRYPTION_INFON = 0x06; - CMD_MASTER_IDENTIFICATION = 0x07; - CMD_IDENTITY_INFO = 0x08; - CMD_IDENTITY_ADDR_INFO = 0x09; - CMD_SIGNING_INFO = 0x0A; - CMD_SECURITY_REQUEST = 0x0B; - CMD_PAIRING_PUBLIC_KEY = 0x0C; - CMD_PAIRING_DHKEY_CHECK = 0x0D; - CMD_PAIRING_KEYPRESS_INFO = 0x0E; -} - -enum PairingFailReasonEnum { - PAIRING_FAIL_REASON_RESERVED = 0x00; - PAIRING_FAIL_REASON_PASSKEY_ENTRY = 0x01; - PAIRING_FAIL_REASON_OOB = 0x02; - PAIRING_FAIL_REASON_AUTH_REQ = 0x03; - PAIRING_FAIL_REASON_CONFIRM_VALUE = 0x04; - PAIRING_FAIL_REASON_PAIR_NOT_SUPPORT = 0x05; - PAIRING_FAIL_REASON_ENC_KEY_SIZE = 0x06; - PAIRING_FAIL_REASON_INVALID_CMD = 0x07; - PAIRING_FAIL_REASON_UNSPECIFIED = 0x08; - PAIRING_FAIL_REASON_REPEATED_ATTEMPTS = 0x09; - PAIRING_FAIL_REASON_INVALID_PARAMETERS = 0x0A; - PAIRING_FAIL_REASON_DHKEY_CHK = 0x0B; - PAIRING_FAIL_REASON_NUMERIC_COMPARISON = 0x0C; - PAIRING_FAIL_REASON_CLASSIC_PAIRING_IN_PROGR = 0x0D; - PAIRING_FAIL_REASON_XTRANS_DERIVE_NOT_ALLOW = 0x0E; -}
\ No newline at end of file diff --git a/core/proto/android/debug/enums.proto b/core/proto/android/debug/enums.proto deleted file mode 100644 index 6747bb7276b3..000000000000 --- a/core/proto/android/debug/enums.proto +++ /dev/null @@ -1,67 +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. - */ - -syntax = "proto2"; -package android.debug; - -option java_outer_classname = "AdbProtoEnums"; -option java_multiple_files = true; - -/** - * adb connection state used to track adb connection changes in AdbDebuggingManager.java. - */ -enum AdbConnectionStateEnum { - UNKNOWN = 0; - - /** - * The adb connection is waiting for approval from the user. - */ - AWAITING_USER_APPROVAL = 1; - - /** - * The user allowed the adb connection from the system. - */ - USER_ALLOWED = 2; - - /** - * The user denied the adb connection from the system. - */ - USER_DENIED = 3; - - /** - * The adb connection was automatically allowed without user interaction due to the system - * being previously allowed by the user with the 'always allow' option selected, and the adb - * grant has not yet expired. - */ - AUTOMATICALLY_ALLOWED = 4; - - /** - * An empty or invalid base64 encoded key was provided to the framework; the connection was - * automatically denied. - */ - DENIED_INVALID_KEY = 5; - - /** - * vold decrypt has not yet occurred; the connection was automatically denied. - */ - DENIED_VOLD_DECRYPT = 6; - - /** - * The adb session has been disconnected. - */ - DISCONNECTED = 7; -} - diff --git a/core/proto/android/hardware/biometrics/enums.proto b/core/proto/android/hardware/biometrics/enums.proto deleted file mode 100644 index f2e06383b5b1..000000000000 --- a/core/proto/android/hardware/biometrics/enums.proto +++ /dev/null @@ -1,60 +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. - */ - -syntax = "proto2"; - -package android.hardware.biometrics; - -option java_outer_classname = "BiometricsProtoEnums"; -option java_multiple_files = true; - -// Logging constants for <Biometric>Service and BiometricService - -enum ModalityEnum { - MODALITY_UNKNOWN = 0; - MODALITY_FINGERPRINT = 1; // 1 << 0 - MODALITY_IRIS = 2; // 1 << 1 - MODALITY_FACE = 4; // 1 << 2 -} - -enum ClientEnum { - CLIENT_UNKNOWN = 0; - CLIENT_KEYGUARD = 1; - CLIENT_BIOMETRIC_PROMPT = 2; - CLIENT_FINGERPRINT_MANAGER = 3; // Deprecated API before BiometricPrompt was introduced -} - -enum ActionEnum { - ACTION_UNKNOWN = 0; - ACTION_ENROLL = 1; - ACTION_AUTHENTICATE = 2; - ACTION_ENUMERATE = 3; - ACTION_REMOVE = 4; -} - -enum IssueEnum { - ISSUE_UNKNOWN = 0; - // When a biometric HAL has crashed. - ISSUE_HAL_DEATH = 1; - // When Android Framework has a template that doesn't exist in the HAL. The framework - // is expected to remove its template to stay in sync with the HAL. - ISSUE_UNKNOWN_TEMPLATE_ENROLLED_FRAMEWORK = 2; - // When the HAL has a template that doesn't exist in Android Framework. The framework - // is expected to notify the HAL to remove this template to stay in sync with the framework. - ISSUE_UNKNOWN_TEMPLATE_ENROLLED_HAL = 3; - // When the HAL has not sent ERROR_CANCELED within the specified timeout. - ISSUE_CANCEL_TIMED_OUT = 4; -}
\ No newline at end of file diff --git a/core/proto/android/hardware/sensor/assist/enums.proto b/core/proto/android/hardware/sensor/assist/enums.proto deleted file mode 100644 index 012dcb2e937e..000000000000 --- a/core/proto/android/hardware/sensor/assist/enums.proto +++ /dev/null @@ -1,34 +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. - */ - -syntax = "proto2"; -package android.hardware.sensor.assist; - -option java_outer_classname = "AssistGestureProtoEnums"; -option java_multiple_files = true; - -enum AssistGestureStageEnum { - ASSIST_GESTURE_STAGE_UNKNOWN = 0; - ASSIST_GESTURE_STAGE_PROGRESS = 1; - ASSIST_GESTURE_STAGE_PRIMED = 2; - ASSIST_GESTURE_STAGE_DETECTED = 3; -} - -enum AssistGestureFeedbackEnum { - ASSIST_GESTURE_FEEDBACK_UNKNOWN = 0; - ASSIST_GESTURE_FEEDBACK_NOT_USED = 1; - ASSIST_GESTURE_FEEDBACK_USED = 2; -}
\ No newline at end of file diff --git a/core/proto/android/net/networkcapabilities.proto b/core/proto/android/net/networkcapabilities.proto deleted file mode 100644 index be0cad18a24d..000000000000 --- a/core/proto/android/net/networkcapabilities.proto +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 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. - */ - -syntax = "proto2"; - -package android.net; - -option java_multiple_files = true; - -import "frameworks/base/core/proto/android/privacy.proto"; - -/** - * An android.net.NetworkCapabilities object. - */ -message NetworkCapabilitiesProto { - option (.android.msg_privacy).dest = DEST_AUTOMATIC; - - enum Transport { - // Indicates this network uses a Cellular transport. - TRANSPORT_CELLULAR = 0; - // Indicates this network uses a Wi-Fi transport. - TRANSPORT_WIFI = 1; - // Indicates this network uses a Bluetooth transport. - TRANSPORT_BLUETOOTH = 2; - // Indicates this network uses an Ethernet transport. - TRANSPORT_ETHERNET = 3; - // Indicates this network uses a VPN transport. - TRANSPORT_VPN = 4; - // Indicates this network uses a Wi-Fi Aware transport. - TRANSPORT_WIFI_AWARE = 5; - // Indicates this network uses a LoWPAN transport. - TRANSPORT_LOWPAN = 6; - } - repeated Transport transports = 1; - - enum NetCapability { - // Indicates this is a network that has the ability to reach the - // carrier's MMSC for sending and receiving MMS messages. - NET_CAPABILITY_MMS = 0; - // Indicates this is a network that has the ability to reach the - // carrier's SUPL server, used to retrieve GPS information. - NET_CAPABILITY_SUPL = 1; - // Indicates this is a network that has the ability to reach the - // carrier's DUN or tethering gateway. - NET_CAPABILITY_DUN = 2; - // Indicates this is a network that has the ability to reach the - // carrier's FOTA portal, used for over the air updates. - NET_CAPABILITY_FOTA = 3; - // Indicates this is a network that has the ability to reach the - // carrier's IMS servers, used for network registration and signaling. - NET_CAPABILITY_IMS = 4; - // Indicates this is a network that has the ability to reach the - // carrier's CBS servers, used for carrier specific services. - NET_CAPABILITY_CBS = 5; - // Indicates this is a network that has the ability to reach a Wi-Fi - // direct peer. - NET_CAPABILITY_WIFI_P2P = 6; - // Indicates this is a network that has the ability to reach a carrier's - // Initial Attach servers. - NET_CAPABILITY_IA = 7; - // Indicates this is a network that has the ability to reach a carrier's - // RCS servers, used for Rich Communication Services. - NET_CAPABILITY_RCS = 8; - // Indicates this is a network that has the ability to reach a carrier's - // XCAP servers, used for configuration and control. - NET_CAPABILITY_XCAP = 9; - // Indicates this is a network that has the ability to reach a carrier's - // Emergency IMS servers or other services, used for network signaling - // during emergency calls. - NET_CAPABILITY_EIMS = 10; - // Indicates that this network is unmetered. - NET_CAPABILITY_NOT_METERED = 11; - // Indicates that this network should be able to reach the internet. - NET_CAPABILITY_INTERNET = 12; - // Indicates that this network is available for general use. If this is - // not set applications should not attempt to communicate on this - // network. Note that this is simply informative and not enforcement - - // enforcement is handled via other means. Set by default. - NET_CAPABILITY_NOT_RESTRICTED = 13; - // Indicates that the user has indicated implicit trust of this network. - // This generally means it's a sim-selected carrier, a plugged in - // ethernet, a paired BT device or a wifi the user asked to connect to. - // Untrusted networks are probably limited to unknown wifi AP. Set by - // default. - NET_CAPABILITY_TRUSTED = 14; - // Indicates that this network is not a VPN. This capability is set by - // default and should be explicitly cleared for VPN networks. - NET_CAPABILITY_NOT_VPN = 15; - // Indicates that connectivity on this network was successfully - // validated. For example, for a network with NET_CAPABILITY_INTERNET, - // it means that Internet connectivity was successfully detected. - NET_CAPABILITY_VALIDATED = 16; - // Indicates that this network was found to have a captive portal in - // place last time it was probed. - NET_CAPABILITY_CAPTIVE_PORTAL = 17; - // Indicates that this network is not roaming. - NET_CAPABILITY_NOT_ROAMING = 18; - // Indicates that this network is available for use by apps, and not a - // network that is being kept up in the background to facilitate fast - // network switching. - NET_CAPABILITY_FOREGROUND = 19; - } - repeated NetCapability capabilities = 2; - - // Passive link bandwidth. This is a rough guide of the expected peak - // bandwidth for the first hop on the given transport. It is not measured, - // but may take into account link parameters (Radio technology, allocated - // channels, etc). - optional int32 link_up_bandwidth_kbps = 3; - optional int32 link_down_bandwidth_kbps = 4; - - optional string network_specifier = 5 [ (.android.privacy).dest = DEST_EXPLICIT ]; - - // True if this object specifies a signal strength. - optional bool can_report_signal_strength = 6; - // This is a signed integer, and higher values indicate better signal. The - // exact units are bearer-dependent. For example, Wi-Fi uses RSSI. - // Only valid if can_report_signal_strength is true. - optional sint32 signal_strength = 7; -} diff --git a/core/proto/android/net/networkrequest.proto b/core/proto/android/net/networkrequest.proto index b35a0203ff02..6794c8cd8acb 100644 --- a/core/proto/android/net/networkrequest.proto +++ b/core/proto/android/net/networkrequest.proto @@ -20,8 +20,8 @@ package android.net; option java_multiple_files = true; -import "frameworks/base/core/proto/android/net/networkcapabilities.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/net/networkcapabilities.proto"; /** * An android.net.NetworkRequest object. diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto index 892ebf70ca75..7d68a0df23d5 100644 --- a/core/proto/android/os/batterystats.proto +++ b/core/proto/android/os/batterystats.proto @@ -19,10 +19,10 @@ option java_multiple_files = true; package android.os; -import "frameworks/base/core/proto/android/app/job/enums.proto"; import "frameworks/base/core/proto/android/os/powermanager.proto"; -import "frameworks/base/core/proto/android/telephony/enums.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/app/job/enums.proto"; +import "frameworks/proto_logging/stats/enums/telephony/enums.proto"; message BatteryStatsProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; diff --git a/core/proto/android/os/enums.proto b/core/proto/android/os/enums.proto deleted file mode 100644 index 566861b6e836..000000000000 --- a/core/proto/android/os/enums.proto +++ /dev/null @@ -1,169 +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. - */ - -syntax = "proto2"; -package android.os; - -option java_outer_classname = "OsProtoEnums"; -option java_multiple_files = true; - -// These constants are defined in hardware/interfaces/health/1.0/types.hal -// They are primarily used by android/os/BatteryManager.java. -enum BatteryHealthEnum { - BATTERY_HEALTH_INVALID = 0; - BATTERY_HEALTH_UNKNOWN = 1; - BATTERY_HEALTH_GOOD = 2; - BATTERY_HEALTH_OVERHEAT = 3; - BATTERY_HEALTH_DEAD = 4; - BATTERY_HEALTH_OVER_VOLTAGE = 5; - BATTERY_HEALTH_UNSPECIFIED_FAILURE = 6; - BATTERY_HEALTH_COLD = 7; -} - -// Plug states, primarily used by android/os/BatteryManager.java. -enum BatteryPluggedStateEnum { - // Note that NONE is not in BatteryManager.java's constants. - BATTERY_PLUGGED_NONE = 0; - // Power source is an AC charger. - BATTERY_PLUGGED_AC = 1; - // Power source is a USB port. - BATTERY_PLUGGED_USB = 2; - // Power source is wireless. - BATTERY_PLUGGED_WIRELESS = 4; -} - -// These constants are defined in hardware/interfaces/health/1.0/types.hal -// They are primarily used by android/os/BatteryManager.java. -enum BatteryStatusEnum { - BATTERY_STATUS_INVALID = 0; - BATTERY_STATUS_UNKNOWN = 1; - BATTERY_STATUS_CHARGING = 2; - BATTERY_STATUS_DISCHARGING = 3; - BATTERY_STATUS_NOT_CHARGING = 4; - BATTERY_STATUS_FULL = 5; -} - -// These constants are defined in hardware/interfaces/thermal/1.0/types.hal -// and in hardware/interfaces/thermal/2.0/types.hal -// They are primarily used by android/os/HardwarePropertiesManager.java. -// Any change to the types in the thermal hal should be made here as well. -enum TemperatureTypeEnum { - TEMPERATURE_TYPE_UNKNOWN = -1; - TEMPERATURE_TYPE_CPU = 0; - TEMPERATURE_TYPE_GPU = 1; - TEMPERATURE_TYPE_BATTERY = 2; - TEMPERATURE_TYPE_SKIN = 3; - TEMPERATURE_TYPE_USB_PORT = 4; - TEMPERATURE_TYPE_POWER_AMPLIFIER = 5; - - // Battery Charge Limit - virtual thermal sensors. - TEMPERATURE_TYPE_BCL_VOLTAGE = 6; - TEMPERATURE_TYPE_BCL_CURRENT = 7; - TEMPERATURE_TYPE_BCL_PERCENTAGE = 8; - - // Neural Processing Unit. - TEMPERATURE_TYPE_NPU = 9; -} - -// Device throttling severity -// These constants are defined in hardware/interfaces/thermal/2.0/types.hal. -// Any change to the types in the thermal hal should be made here as well. -enum ThrottlingSeverityEnum { - // Not under throttling. - NONE = 0; - // Light throttling where UX is not impacted. - LIGHT = 1; - // Moderate throttling where UX is not largely impacted. - MODERATE = 2; - // Severe throttling where UX is largely impacted. - // Similar to 1.0 throttlingThreshold. - SEVERE = 3; - // Platform has done everything to reduce power. - CRITICAL = 4; - // Key components in platform are shutting down due to thermal condition. - // Device functionalities will be limited. - EMERGENCY = 5; - // Need shutdown immediately. - SHUTDOWN = 6; -}; - -// Device cooling device types. -// These constants are defined in hardware/interfaces/thermal/2.0/types.hal. -// Any change to the types in the thermal hal should be made here as well. -enum CoolingTypeEnum { - FAN = 0; - BATTERY = 1; - CPU = 2; - GPU = 3; - MODEM = 4; - NPU = 5; - COMPONENT = 6; -}; - -// Wakelock types, primarily used by android/os/PowerManager.java. -enum WakeLockLevelEnum { - // NOTE: Wake lock levels were previously defined as a bit field, except - // that only a few combinations were actually supported so the bit field - // was removed. This explains why the numbering scheme is so odd. If - // adding a new wake lock level, any unused value can be used. - - // Ensures that the CPU is running; the screen and keyboard backlight - // will be allowed to go off. - PARTIAL_WAKE_LOCK = 1; - - // Ensures that the screen is on (but may be dimmed); the keyboard - // backlight will be allowed to go off. If the user presses the power - // button, then the SCREEN_DIM_WAKE_LOCK will be implicitly released by - // the system, causing both the screen and the CPU to be turned off. - SCREEN_DIM_WAKE_LOCK = 6 [deprecated = true]; - - // Ensures that the screen is on at full brightness; the keyboard - // backlight will be allowed to go off. If the user presses the power - // button, then the SCREEN_BRIGHT_WAKE_LOCK will be implicitly released - // by the system, causing both the screen and the CPU to be turned off. - SCREEN_BRIGHT_WAKE_LOCK = 10 [deprecated = true]; - - // Ensures that the screen and keyboard backlight are on at full - // brightness. If the user presses the power button, then the - // FULL_WAKE_LOCK will be implicitly released by the system, causing - // both the screen and the CPU to be turned off. - FULL_WAKE_LOCK = 26 [deprecated = true]; - - // Turns the screen off when the proximity sensor activates. If the - // proximity sensor detects that an object is nearby, the screen turns - // off immediately. Shortly after the object moves away, the screen - // turns on again. - // A proximity wake lock does not prevent the device from falling asleep - // unlike FULL_WAKE_LOCK, SCREEN_BRIGHT_WAKE_LOCK and - // SCREEN_DIM_WAKE_LOCK. If there is no user activity and no other wake - // locks are held, then the device will fall asleep (and lock) as usual. - // However, the device will not fall asleep while the screen has been - // turned off by the proximity sensor because it effectively counts as - // ongoing user activity. - PROXIMITY_SCREEN_OFF_WAKE_LOCK = 32; - - // Put the screen in a low power state and allow the CPU to suspend if - // no other wake locks are held. This is used by the dream manager to - // implement doze mode. It currently has no effect unless the power - // manager is in the dozing state. - DOZE_WAKE_LOCK = 64; - - // Keep the device awake enough to allow drawing to occur. This is used - // by the window manager to allow applications to draw while the system - // is dozing. It currently has no effect unless the power manager is in - // the dozing state. - DRAW_WAKE_LOCK = 128; -} diff --git a/core/proto/android/os/incident.proto b/core/proto/android/os/incident.proto index 64cf75d51c3d..e97b1a8770ed 100644 --- a/core/proto/android/os/incident.proto +++ b/core/proto/android/os/incident.proto @@ -55,13 +55,13 @@ import "frameworks/base/core/proto/android/service/print.proto"; import "frameworks/base/core/proto/android/service/procstats.proto"; import "frameworks/base/core/proto/android/service/restricted_image.proto"; import "frameworks/base/core/proto/android/service/sensor_service.proto"; -import "frameworks/base/core/proto/android/service/usb.proto"; import "frameworks/base/core/proto/android/util/event_log_tags.proto"; import "frameworks/base/core/proto/android/util/log.proto"; import "frameworks/base/core/proto/android/util/textdump.proto"; import "frameworks/base/core/proto/android/privacy.proto"; import "frameworks/base/core/proto/android/section.proto"; import "frameworks/base/proto/src/ipconnectivity.proto"; +import "frameworks/proto_logging/stats/enums/service/usb.proto"; package android.os; diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto index 2d2ead455a4d..fa046c6593af 100644 --- a/core/proto/android/server/activitymanagerservice.proto +++ b/core/proto/android/server/activitymanagerservice.proto @@ -20,7 +20,6 @@ package com.android.server.am; import "frameworks/base/core/proto/android/app/activitymanager.proto"; import "frameworks/base/core/proto/android/app/appexitinfo.proto"; -import "frameworks/base/core/proto/android/app/enums.proto"; import "frameworks/base/core/proto/android/app/notification.proto"; import "frameworks/base/core/proto/android/app/profilerinfo.proto"; import "frameworks/base/core/proto/android/content/component_name.proto"; @@ -35,6 +34,7 @@ import "frameworks/base/core/proto/android/server/intentresolver.proto"; import "frameworks/base/core/proto/android/server/windowmanagerservice.proto"; import "frameworks/base/core/proto/android/util/common.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/app/enums.proto"; option java_multiple_files = true; diff --git a/core/proto/android/server/bluetooth_manager_service.proto b/core/proto/android/server/bluetooth_manager_service.proto index 998413f05ebe..c33f66a9aeca 100644 --- a/core/proto/android/server/bluetooth_manager_service.proto +++ b/core/proto/android/server/bluetooth_manager_service.proto @@ -17,8 +17,8 @@ syntax = "proto2"; package com.android.server; -import "frameworks/base/core/proto/android/bluetooth/enums.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/bluetooth/enums.proto"; option java_multiple_files = true; diff --git a/core/proto/android/server/connectivity/Android.bp b/core/proto/android/server/connectivity/Android.bp deleted file mode 100644 index 413623963851..000000000000 --- a/core/proto/android/server/connectivity/Android.bp +++ /dev/null @@ -1,24 +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. - -java_library_static { - name: "datastallprotosnano", - proto: { - type: "nano", - }, - srcs: [ - "data_stall_event.proto", - ], - sdk_version: "system_current", -} diff --git a/core/proto/android/server/connectivity/data_stall_event.proto b/core/proto/android/server/connectivity/data_stall_event.proto deleted file mode 100644 index 787074ba494e..000000000000 --- a/core/proto/android/server/connectivity/data_stall_event.proto +++ /dev/null @@ -1,91 +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. - */ - -syntax = "proto2"; - -package com.android.server.connectivity; -option java_multiple_files = true; -option java_outer_classname = "DataStallEventProto"; - -enum ProbeResult { - UNKNOWN = 0; - VALID = 1; - INVALID = 2; - PORTAL = 3; - PARTIAL = 4; -} - -enum ApBand { - AP_BAND_UNKNOWN = 0; - AP_BAND_2GHZ = 1; - AP_BAND_5GHZ = 2; - AP_BAND_6GHZ = 3; -} - -// Refer to definition in TelephonyManager.java. -enum RadioTech { - RADIO_TECHNOLOGY_UNKNOWN = 0; - RADIO_TECHNOLOGY_GPRS = 1; - RADIO_TECHNOLOGY_EDGE = 2; - RADIO_TECHNOLOGY_UMTS = 3; - RADIO_TECHNOLOGY_IS95A = 4; - RADIO_TECHNOLOGY_IS95B = 5; - RADIO_TECHNOLOGY_1XRTT = 6; - RADIO_TECHNOLOGY_EVDO_0 = 7; - RADIO_TECHNOLOGY_EVDO_A = 8; - RADIO_TECHNOLOGY_HSDPA = 9; - RADIO_TECHNOLOGY_HSUPA = 10; - RADIO_TECHNOLOGY_HSPA = 11; - RADIO_TECHNOLOGY_EVDO_B = 12; - RADIO_TECHNOLOGY_LTE = 13; - RADIO_TECHNOLOGY_EHRPD = 14; - RADIO_TECHNOLOGY_HSPAP = 15; - RADIO_TECHNOLOGY_GSM = 16; - RADIO_TECHNOLOGY_TD_SCDMA = 17; - RADIO_TECHNOLOGY_IWLAN = 18; - RADIO_TECHNOLOGY_LTE_CA = 19; - RADIO_TECHNOLOGY_NR = 20; -} - -// Cellular specific information. -message CellularData { - // Indicate the radio technology at the time of data stall suspected. - optional RadioTech rat_type = 1; - // True if device is in roaming network at the time of data stall suspected. - optional bool is_roaming = 2; - // Registered network MccMnc when data stall happen - optional string network_mccmnc = 3; - // Indicate the SIM card carrier. - optional string sim_mccmnc = 4; - // Signal strength level at the time of data stall suspected. - optional int32 signal_strength = 5; -} - -// Wifi specific information. -message WifiData { - // Signal strength at the time of data stall suspected. - // RSSI range is between -55 to -110. - optional int32 signal_strength = 1; - // AP band. - optional ApBand wifi_band = 2; -} - -message DnsEvent { - // The dns return code. - repeated int32 dns_return_code = 1; - // Indicate the timestamp of the dns event. - repeated int64 dns_time = 2; -} diff --git a/core/proto/android/server/enums.proto b/core/proto/android/server/enums.proto deleted file mode 100644 index 89f7010e8d81..000000000000 --- a/core/proto/android/server/enums.proto +++ /dev/null @@ -1,40 +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. - */ - -syntax = "proto2"; -package android.server; - -option java_outer_classname = "ServerProtoEnums"; -option java_multiple_files = true; - -enum DeviceIdleModeEnum { - // Device idle mode - not active. - DEVICE_IDLE_MODE_OFF = 0; - // Device idle mode - active in lightweight mode. - DEVICE_IDLE_MODE_LIGHT = 1; - // Device idle mode - active in full mode. - DEVICE_IDLE_MODE_DEEP = 2; -} - -enum ErrorSource { - ERROR_SOURCE_UNKNOWN = 0; - // Data app - DATA_APP = 1; - // System app - SYSTEM_APP = 2; - // System server. - SYSTEM_SERVER = 3; -} diff --git a/core/proto/android/server/job/enums.proto b/core/proto/android/server/job/enums.proto deleted file mode 100644 index 50fc0310ad99..000000000000 --- a/core/proto/android/server/job/enums.proto +++ /dev/null @@ -1,43 +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. - */ - -syntax = "proto2"; - -package com.android.server.job; - -// This file is for JobScheduler enums inside the server directory. If you're -// adding enums for app-side code, use the file in -// frameworks/base/core/proto/android/app/job. -option java_outer_classname = "JobServerProtoEnums"; -option java_multiple_files = true; - -// Set of constraints that a job potentially needs satisfied before it can run. -// Defined in -// frameworks/base/services/core/java/com/android/server/job/controllers/JobStatus.java -enum ConstraintEnum { - CONSTRAINT_UNKNOWN = 0; - CONSTRAINT_CHARGING = 1; - CONSTRAINT_BATTERY_NOT_LOW = 2; - CONSTRAINT_STORAGE_NOT_LOW = 3; - CONSTRAINT_TIMING_DELAY = 4; - CONSTRAINT_DEADLINE = 5; - CONSTRAINT_IDLE = 6; - CONSTRAINT_CONNECTIVITY = 7; - CONSTRAINT_CONTENT_TRIGGER = 8; - CONSTRAINT_DEVICE_NOT_DOZING = 9; - CONSTRAINT_WITHIN_QUOTA = 10; - CONSTRAINT_BACKGROUND_NOT_RESTRICTED = 11; -} diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto index f2f20e3ac12e..d16ba284c1fe 100644 --- a/core/proto/android/server/jobscheduler.proto +++ b/core/proto/android/server/jobscheduler.proto @@ -20,7 +20,6 @@ package com.android.server.job; option java_multiple_files = true; -import "frameworks/base/core/proto/android/app/job/enums.proto"; import "frameworks/base/core/proto/android/content/clipdata.proto"; import "frameworks/base/core/proto/android/content/component_name.proto"; import "frameworks/base/core/proto/android/content/intent.proto"; @@ -29,10 +28,11 @@ import "frameworks/base/core/proto/android/net/networkrequest.proto"; import "frameworks/base/core/proto/android/os/bundle.proto"; import "frameworks/base/core/proto/android/os/persistablebundle.proto"; import "frameworks/base/core/proto/android/server/appstatetracker.proto"; -import "frameworks/base/core/proto/android/server/job/enums.proto"; import "frameworks/base/core/proto/android/server/statlogger.proto"; import "frameworks/base/core/proto/android/privacy.proto"; import "frameworks/base/core/proto/android/util/quotatracker.proto"; +import "frameworks/proto_logging/stats/enums/app/job/enums.proto"; +import "frameworks/proto_logging/stats/enums/server/job/enums.proto"; message JobSchedulerServiceDumpProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; diff --git a/core/proto/android/server/location/enums.proto b/core/proto/android/server/location/enums.proto deleted file mode 100644 index 943ff181fe14..000000000000 --- a/core/proto/android/server/location/enums.proto +++ /dev/null @@ -1,132 +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. - */ - -syntax = "proto2"; - -package android.server.location; - -option java_outer_classname = "ServerLocationProtoEnums"; -option java_multiple_files = true; - -// GPS Signal Quality levels, -// primarily used by location/java/com/android/internal/location/gnssmetrics/GnssMetrics.java -enum GpsSignalQualityEnum { - GPS_SIGNAL_QUALITY_UNKNOWN = -1; - GPS_SIGNAL_QUALITY_POOR = 0; - GPS_SIGNAL_QUALITY_GOOD = 1; -} - -// A type which distinguishes different categories of NI request, such as VOICE, UMTS_SUPL etc. -enum GnssNiType { - VOICE = 1; - UMTS_SUPL = 2; - UMTS_CTRL_PLANE = 3; - EMERGENCY_SUPL = 4; -}; - -// GNSS NI responses, used to define the response in NI structures. -enum GnssUserResponseType { - RESPONSE_ACCEPT = 1; - RESPONSE_DENY = 2; - RESPONSE_NORESP = 3; -}; - -// GNSS NI data encoding scheme. -enum GnssNiEncodingType { - ENC_NONE = 0; - ENC_SUPL_GSM_DEFAULT = 1; - ENC_SUPL_UTF8 = 2; - ENC_SUPL_UCS2 = 3; - ENC_UNKNOWN = -1; -}; - -// Protocol stack that initiated the non-framework location request. -enum NfwProtocolStack { - // Cellular control plane requests. - CTRL_PLANE = 0; - // All types of SUPL requests. - SUPL = 1; - // All types of requests from IMS. - IMS = 10; - // All types of requests from SIM. - SIM = 11; - // Requests from other protocol stacks. - OTHER_PROTOCOL_STACK = 100; -}; - -// Source initiating/receiving the location information. -enum NfwRequestor { - // Wireless service provider. - CARRIER = 0; - // Device manufacturer. - OEM = 10; - // Modem chipset vendor. - MODEM_CHIPSET_VENDOR = 11; - // GNSS chipset vendor. - GNSS_CHIPSET_VENDOR = 12; - // Other chipset vendor. - OTHER_CHIPSET_VENDOR = 13; - // Automobile client. - AUTOMOBILE_CLIENT = 20; - // Other sources. - OTHER_REQUESTOR = 100; -}; - -// Indicates whether location information was provided for this request. -enum NfwResponseType { - // Request rejected because framework has not given permission for this use case. - REJECTED = 0; - // Request accepted but could not provide location because of a failure. - ACCEPTED_NO_LOCATION_PROVIDED = 1; - // Request accepted and location provided. - ACCEPTED_LOCATION_PROVIDED = 2; -}; - -// The SUPL mode. -enum SuplMode { - // Mobile Station Based. - MSB = 0x01; - // Mobile Station Assisted. - MSA = 0x02; -}; - -// Enum that hold the bit masks for various LTE Positioning Profile settings (LPP_PROFILE -// configuration parameter). If none of the bits in the enum are set, the default setting is -// Radio Resource Location Protocol(RRLP). -enum LppProfile { - // Enable LTE Positioning Protocol user plane. - USER_PLANE = 0x01; - // Enable LTE Positioning Protocol Control plane. - CONTROL_PLANE = 0x02; -}; - -// Positioning protocol on A-Glonass system. -enum GlonassPosProtocol { - // Radio Resource Control(RRC) control-plane. - RRC_CPLANE = 0x01; - // Radio Resource Location user-plane. - RRLP_CPLANE = 0x02; - // LTE Positioning Protocol User plane. - LPP_UPLANE = 0x04; -}; - -// Configurations of how GPS functionalities should be locked when user turns off GPS On setting. -enum GpsLock { - // Lock Mobile Originated GPS functionalitues. - MO = 0x01; - // Lock Network Initiated GPS functionalities. - NI = 0x02; -}; diff --git a/core/proto/android/server/powermanagerservice.proto b/core/proto/android/server/powermanagerservice.proto index 0455d58f498b..c5c4d7c59784 100644 --- a/core/proto/android/server/powermanagerservice.proto +++ b/core/proto/android/server/powermanagerservice.proto @@ -19,16 +19,16 @@ package com.android.server.power; option java_multiple_files = true; -import "frameworks/base/core/proto/android/app/enums.proto"; import "frameworks/base/core/proto/android/content/intent.proto"; -import "frameworks/base/core/proto/android/os/enums.proto"; import "frameworks/base/core/proto/android/os/looper.proto"; import "frameworks/base/core/proto/android/os/powermanager.proto"; import "frameworks/base/core/proto/android/os/worksource.proto"; import "frameworks/base/core/proto/android/providers/settings.proto"; import "frameworks/base/core/proto/android/server/wirelesschargerdetector.proto"; -import "frameworks/base/core/proto/android/view/enums.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/app/enums.proto"; +import "frameworks/proto_logging/stats/enums/os/enums.proto"; +import "frameworks/proto_logging/stats/enums/view/enums.proto"; message PowerManagerServiceDumpProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto index 0f5616f78e69..420fc7deef28 100644 --- a/core/proto/android/server/windowmanagerservice.proto +++ b/core/proto/android/server/windowmanagerservice.proto @@ -24,11 +24,12 @@ import "frameworks/base/core/proto/android/server/windowcontainerthumbnail.proto import "frameworks/base/core/proto/android/server/surfaceanimator.proto"; import "frameworks/base/core/proto/android/view/displaycutout.proto"; import "frameworks/base/core/proto/android/view/displayinfo.proto"; -import "frameworks/base/core/proto/android/view/enums.proto"; import "frameworks/base/core/proto/android/view/surface.proto"; import "frameworks/base/core/proto/android/view/windowlayoutparams.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/view/enums.proto"; + package com.android.server.wm; option java_multiple_files = true; diff --git a/core/proto/android/service/battery.proto b/core/proto/android/service/battery.proto index 586411f8ad96..3a112e7c85f0 100644 --- a/core/proto/android/service/battery.proto +++ b/core/proto/android/service/battery.proto @@ -20,8 +20,8 @@ package android.service.battery; option java_multiple_files = true; option java_outer_classname = "BatteryServiceProto"; -import "frameworks/base/core/proto/android/os/enums.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/os/enums.proto"; message BatteryServiceDumpProto { option (android.msg_privacy).dest = DEST_AUTOMATIC; diff --git a/core/proto/android/service/procstats.proto b/core/proto/android/service/procstats.proto index 7a4c0706e119..57051f07d124 100644 --- a/core/proto/android/service/procstats.proto +++ b/core/proto/android/service/procstats.proto @@ -21,8 +21,8 @@ option java_multiple_files = true; option java_outer_classname = "ProcessStatsServiceProto"; import "frameworks/base/core/proto/android/util/common.proto"; -import "frameworks/base/core/proto/android/service/procstats_enum.proto"; import "frameworks/base/core/proto/android/privacy.proto"; +import "frameworks/proto_logging/stats/enums/service/procstats_enum.proto"; /** * Data from ProcStatsService Dumpsys diff --git a/core/proto/android/service/procstats_enum.proto b/core/proto/android/service/procstats_enum.proto deleted file mode 100644 index 2abf3730aa9f..000000000000 --- a/core/proto/android/service/procstats_enum.proto +++ /dev/null @@ -1,102 +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. - */ - -syntax = "proto2"; -package android.service.procstats; - -option java_multiple_files = true; -option java_outer_classname = "ProcessStatsEnums"; - -enum ScreenState { - SCREEN_STATE_UNKNOWN = 0; - SCREEN_STATE_OFF = 1; - SCREEN_STATE_ON = 2; -} - -enum MemoryState { - MEMORY_STATE_UNKNOWN = 0; - MEMORY_STATE_NORMAL = 1; // normal. - MEMORY_STATE_MODERATE = 2; // moderate memory pressure. - MEMORY_STATE_LOW = 3; // low memory. - MEMORY_STATE_CRITICAL = 4; // critical memory. -} - -// this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java -// and not frameworks/base/core/java/android/app/ActivityManager.java -enum ProcessState { - PROCESS_STATE_UNKNOWN = 0; - // Persistent system process. - PROCESS_STATE_PERSISTENT = 1; - // Top activity; actually any visible activity. - PROCESS_STATE_TOP = 2; - // Important foreground process (ime, wallpaper, etc). - PROCESS_STATE_IMPORTANT_FOREGROUND = 3; - // Important background process. - PROCESS_STATE_IMPORTANT_BACKGROUND = 4; - // Performing backup operation. - PROCESS_STATE_BACKUP = 5; - // Background process running a service. - PROCESS_STATE_SERVICE = 6; - // Process not running, but would be if there was enough RAM. - PROCESS_STATE_SERVICE_RESTARTING = 7; - // Process running a receiver. - PROCESS_STATE_RECEIVER = 8; - // Heavy-weight process (currently not used). - PROCESS_STATE_HEAVY_WEIGHT = 9; - // Process hosting home/launcher app when not on top. - PROCESS_STATE_HOME = 10; - // Process hosting the last app the user was in. - PROCESS_STATE_LAST_ACTIVITY = 11; - // Cached process hosting a previous activity. - PROCESS_STATE_CACHED_ACTIVITY = 12; - // Cached process hosting a client activity. - PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 13; - // Cached process that is empty. - PROCESS_STATE_CACHED_EMPTY = 14; -} - -enum ServiceOperationState { - SERVICE_OPERATION_STATE_UNKNOWN = 0; - SERVICE_OPERATION_STATE_RUNNING = 1; - SERVICE_OPERATION_STATE_STARTED = 2; - SERVICE_OPERATION_STATE_FOREGROUND = 3; - SERVICE_OPERATION_STATE_BOUND = 4; - SERVICE_OPERATION_STATE_EXECUTING = 5; -} - -// this enum list is from frameworks/base/core/java/com/android/internal/app/procstats/ProcessStats.java -// and not frameworks/base/core/java/android/app/ActivityManager.java -enum AggregatedProcessState { - AGGREGATED_PROCESS_STATE_UNKNOWN = 0; - // Persistent system process; PERSISTENT or PERSISTENT_UI in ActivityManager - AGGREGATED_PROCESS_STATE_PERSISTENT = 1; - // Top activity; actually any visible activity; TOP or TOP_SLEEPING in ActivityManager - AGGREGATED_PROCESS_STATE_TOP = 2; - // Bound top foreground process; BOUND_TOP or BOUND_FOREGROUND_SERVICE in ActivityManager - AGGREGATED_PROCESS_STATE_BOUND_TOP_OR_FGS = 3; - // Important foreground process; FOREGROUND_SERVICE in ActivityManager - AGGREGATED_PROCESS_STATE_FGS = 4; - // Important foreground process ; IMPORTANT_FOREGROUND in ActivityManager - AGGREGATED_PROCESS_STATE_IMPORTANT_FOREGROUND = 5; - // Various background processes; IMPORTANT_BACKGROUND, TRANSIENT_BACKGROUND, BACKUP, SERVICE, - // HEAVY_WEIGHT in ActivityManager - AGGREGATED_PROCESS_STATE_BACKGROUND = 6; - // Process running a receiver; RECEIVER in ActivityManager - AGGREGATED_PROCESS_STATE_RECEIVER = 7; - // Various cached processes; HOME, LAST_ACTIVITY, CACHED_ACTIVITY, CACHED_RECENT, - // CACHED_ACTIVITY_CLIENT, CACHED_EMPTY in ActivityManager - AGGREGATED_PROCESS_STATE_CACHED = 8; -}
\ No newline at end of file diff --git a/core/proto/android/service/usb.proto b/core/proto/android/service/usb.proto deleted file mode 100644 index 40c5a85e1f24..000000000000 --- a/core/proto/android/service/usb.proto +++ /dev/null @@ -1,440 +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. - */ - -syntax = "proto2"; -package android.service.usb; - -option java_multiple_files = true; -option java_outer_classname = "UsbServiceProto"; - -import "frameworks/base/core/proto/android/content/component_name.proto"; -import "frameworks/base/core/proto/android/service/enums.proto"; -import "frameworks/base/core/proto/android/privacy.proto"; - -message UsbServiceDumpProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbDeviceManagerProto device_manager = 1; - optional UsbHostManagerProto host_manager = 2; - optional UsbPortManagerProto port_manager = 3; - optional UsbAlsaManagerProto alsa_manager = 4; - optional UsbSettingsManagerProto settings_manager = 5; - optional UsbPermissionsManagerProto permissions_manager = 6; -} - -message UsbDeviceManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbHandlerProto handler = 1; - optional UsbDebuggingManagerProto debugging_manager = 2; -} - -message UsbHandlerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - /* Same as android.hardware.usb.gadget.V1_0.GadgetFunction.* */ - enum Function { - FUNCTION_ADB = 1; - FUNCTION_ACCESSORY = 2; - FUNCTION_MTP = 4; - FUNCTION_MIDI = 8; - FUNCTION_PTP = 16; - FUNCTION_RNDIS = 32; - FUNCTION_AUDIO_SOURCE = 64; - } - - repeated Function current_functions = 1; - optional bool current_functions_applied = 2; - repeated Function screen_unlocked_functions = 3; - optional bool screen_locked = 4; - optional bool connected = 5; - optional bool configured = 6; - optional UsbAccessoryProto current_accessory = 7; - optional bool host_connected = 8; - optional bool source_power = 9; - optional bool sink_power = 10; - optional bool usb_charging = 11; - optional bool hide_usb_notification = 12; - optional bool audio_accessory_connected = 13; - optional bool adb_enabled = 14; - optional string kernel_state = 15; - optional string kernel_function_list = 16; -} - -message UsbAccessoryProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional string manufacturer = 1; - optional string model = 2; - // For "classical" USB-accessories the manufacturer bakes this into the - // firmware of the device. If an Android phone is configured as accessory, the - // app that sets up the accessory side of the connection set this. Either way, - // these are part of the detection protocol, and so they cannot be user set or - // unique. - optional string description = 3; - optional string version = 4; - optional string uri = 5 [ (android.privacy).dest = DEST_EXPLICIT ]; - // Non-resettable hardware ID. - optional string serial = 6 [ (android.privacy).dest = DEST_LOCAL ]; -} - -message UsbDebuggingManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional bool connected_to_adb = 1; - // A workstation that connects to the phone for debugging is identified by - // this key. - optional string last_key_received = 2 [ (android.privacy).dest = DEST_EXPLICIT ]; - optional string user_keys = 3 [ (android.privacy).dest = DEST_LOCAL ]; - optional string system_keys = 4 [ (android.privacy).dest = DEST_LOCAL ]; -} - -message UsbHostManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional android.content.ComponentNameProto default_usb_host_connection_handler = 1; - repeated UsbDeviceProto devices = 2; - optional int32 num_connects = 3; - repeated UsbConnectionRecordProto connections = 4; -} - -message UsbDeviceProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // Generic USB name, not user-provided. - optional string name = 1; - // ID specific to the vendor, not the device. - optional int32 vendor_id = 2; - // ID of this product type: Each vendor gives each product a unique ID. E.g. - // all mice of the same model would have the same ID. - optional int32 product_id = 3; - optional int32 class = 4; - optional int32 subclass = 5; - optional int32 protocol = 6; - optional string manufacturer_name = 7; - optional string product_name = 8; - optional string version = 9; - // Non-resettable hardware ID. - optional string serial_number = 10 [ (android.privacy).dest = DEST_LOCAL ]; - repeated UsbConfigurationProto configurations = 11; -} - -message UsbConfigurationProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // A single USB device can have several configurations and the app accessing - // the USB device can switch between them. At any time only one can be active. - // Each configuration can present completely different interfaces end - // endpoints, i.e. a completely different behavior. - optional int32 id = 1; - // Hardware-defined name, not set by the user. - optional string name = 2; - optional uint32 attributes = 3; - optional int32 max_power = 4; - repeated UsbInterfaceProto interfaces = 5; -} - -message UsbInterfaceProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // Hardware defined. This is the id used by the app to identify the interface. - optional int32 id = 1; - optional int32 alternate_settings = 2; - optional string name = 3; - optional int32 class = 4; - optional int32 subclass = 5; - optional int32 protocol = 6; - repeated UsbEndPointProto endpoints = 7; -} - -message UsbEndPointProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 endpoint_number = 1; - optional android.service.UsbEndPointDirection direction = 2; - // The address of the endpoint. Needed to read and write to the endpoint. - optional int32 address = 3; - optional android.service.UsbEndPointType type = 4; - optional uint32 attributes = 5; - optional int32 max_packet_size = 6; - optional int32 interval = 7; -} - -message UsbConnectionRecordProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // usb device's address, e.g. 001/002, nothing about the phone - optional string device_address = 1; - optional android.service.UsbConnectionRecordMode mode = 2; - optional int64 timestamp = 3; - optional int32 manufacturer = 4; - optional int32 product = 5; - optional UsbIsHeadsetProto is_headset = 6; -} - -message UsbIsHeadsetProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional bool in = 1; - optional bool out = 2; -} - -message UsbPortManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional bool is_simulation_active = 1; - repeated UsbPortInfoProto usb_ports = 2; -} - -message UsbPortInfoProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbPortProto port = 1; - optional UsbPortStatusProto status = 2; - optional bool can_change_mode = 3; - optional bool can_change_power_role = 4; - optional bool can_change_data_role = 5; - optional int64 connected_at_millis = 6; - optional int64 last_connect_duration_millis = 7; -} - -message UsbPortProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - /* Same as android.hardware.usb.V1_1.Constants.PortMode_1_1 */ - enum Mode { - MODE_NONE = 0; - MODE_UFP = 1; - MODE_DFP = 2; - MODE_DRP = 3; - MODE_AUDIO_ACCESSORY = 4; - MODE_DEBUG_ACCESSORY = 8; - } - - // ID of the port. A device (eg: Chromebooks) might have multiple ports. - optional string id = 1; - repeated Mode supported_modes = 2; -} - -/* Same as android.hardware.usb.V1_2.Constants.ContaminantPresenceStatus */ -enum ContaminantPresenceStatus { - CONTAMINANT_STATUS_UNKNOWN = 0; - CONTAMINANT_STATUS_NOT_SUPPORTED = 1; - CONTAMINANT_STATUS_DISABLED = 2; - CONTAMINANT_STATUS_NOT_DETECTED = 3; - CONTAMINANT_STATUS_DETECTED = 4; -} - -message UsbPortStatusProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - /* Same as android.hardware.usb.V1_0.Constants.PortPowerRole */ - enum PowerRole { - POWER_ROLE_NONE = 0; - POWER_ROLE_SOURCE = 1; - POWER_ROLE_SINK = 2; - } - - /* Same as android.hardware.usb.V1_0.Constants.PortDataRole */ - enum DataRole { - DATA_ROLE_NONE = 0; - DATA_ROLE_HOST = 1; - DATA_ROLE_DEVICE = 2; - } - - optional bool connected = 1; - optional UsbPortProto.Mode current_mode = 2; - optional PowerRole power_role = 3; - optional DataRole data_role = 4; - repeated UsbPortStatusRoleCombinationProto role_combinations = 5; - optional ContaminantPresenceStatus contaminant_presence_status = 6; -} - -message UsbPortStatusRoleCombinationProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbPortStatusProto.PowerRole power_role = 1; - optional UsbPortStatusProto.DataRole data_role = 2; -} - -message UsbAlsaManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 cards_parser = 1; - repeated UsbAlsaDeviceProto alsa_devices = 2; - repeated UsbMidiDeviceProto midi_devices = 3; -} - -message UsbAlsaDeviceProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 card = 1; - optional int32 device = 2; - optional string name = 3; - optional bool has_playback = 4; - optional bool has_capture = 5; - // usb device's address, e.g. 001/002, nothing about the phone - optional string address = 6; -} - -message UsbMidiDeviceProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 card = 1; - optional int32 device = 2; - // usb device's address, e.g. 001/002, nothing about the phone - optional string device_address = 3; -} - -message UsbSettingsManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - repeated UsbUserSettingsManagerProto user_settings = 1; - repeated UsbProfileGroupSettingsManagerProto profile_group_settings = 2; -} - -message UsbUserSettingsManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 user_id = 1; - reserved 2; // previously device_permissions, now unused - reserved 3; // previously accessory_permissions, now unused - repeated UsbDeviceAttachedActivities device_attached_activities = 4; - repeated UsbAccessoryAttachedActivities accessory_attached_activities = 5; -} - -message UsbProfileGroupSettingsManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // The user id of the personal profile if the device has a work profile. - optional int32 parent_user_id = 1; - repeated UsbSettingsDevicePreferenceProto device_preferences = 2; - repeated UsbSettingsAccessoryPreferenceProto accessory_preferences = 3; -} - -message UsbSettingsDevicePreferenceProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbDeviceFilterProto filter = 1; - optional UserPackageProto user_package = 2; -} - -message UsbPermissionsManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - repeated UsbUserPermissionsManagerProto user_permissions = 1; -} - -message UsbUserPermissionsManagerProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 user_id = 1; - - repeated UsbDevicePermissionProto device_permissions = 2; - repeated UsbAccessoryPermissionProto accessory_permissions = 3; - - repeated UsbDevicePersistentPermissionProto device_persistent_permissions = 4; - repeated UsbAccessoryPersistentPermissionProto accessory_persistent_permissions = 5; -} - -message UsbDevicePermissionProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // Name of device set by manufacturer - // All devices of the same model have the same name - optional string device_name = 1; - repeated int32 uids = 2; -} - -message UsbAccessoryPermissionProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // Description of accessory set by manufacturer - // All accessories of the same model have the same description - optional string accessory_description = 1; - repeated int32 uids = 2; -} - -message UsbDevicePersistentPermissionProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbDeviceFilterProto device_filter = 1; - repeated UsbUidPermissionProto permission_values = 2; -} - -message UsbAccessoryPersistentPermissionProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbAccessoryFilterProto accessory_filter = 1; - repeated UsbUidPermissionProto permission_values = 2; -} - -message UsbUidPermissionProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 uid = 1; - optional bool is_granted = 2; -} - -message UsbDeviceFilterProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - // Mirrors the vendor_id of UsbDeviceProto. - optional int32 vendor_id = 1; - optional int32 product_id = 2; - optional int32 class = 3; - optional int32 subclass = 4; - optional int32 protocol = 5; - optional string manufacturer_name = 6; - optional string product_name = 7; - optional string serial_number = 8 [ (android.privacy).dest = DEST_EXPLICIT ]; -} - -message UserPackageProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional int32 user_id = 1; - optional string package_name =2; -} - -message UsbSettingsAccessoryPreferenceProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional UsbAccessoryFilterProto filter = 1; - optional UserPackageProto user_package = 2; -} - -message UsbAccessoryFilterProto { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional string manufacturer = 1; - optional string model = 2; - optional string version = 3; -} - -message UsbDeviceAttachedActivities { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional android.content.ComponentNameProto activity = 1; - repeated UsbDeviceFilterProto filters = 2; -} - -message UsbAccessoryAttachedActivities { - option (android.msg_privacy).dest = DEST_AUTOMATIC; - - optional android.content.ComponentNameProto activity = 1; - repeated UsbAccessoryFilterProto filters = 2; -} diff --git a/core/proto/android/stats/accessibility/accessibility_enums.proto b/core/proto/android/stats/accessibility/accessibility_enums.proto deleted file mode 100644 index 5118ad5a322c..000000000000 --- a/core/proto/android/stats/accessibility/accessibility_enums.proto +++ /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. - */ - -syntax = "proto2"; -package android.stats.accessibility; -option java_multiple_files = true; - -// The entry point of the accessibility shortcut. -enum ShortcutType { - UNKNOWN_TYPE = 0; - A11Y_BUTTON = 1; - VOLUME_KEY = 2; - TRIPLE_TAP = 3; - A11Y_BUTTON_LONG_PRESS = 4; -} - -// The service status code. -enum ServiceStatus { - UNKNOWN = 0; - ENABLED = 1; - DISABLED = 2; -}
\ No newline at end of file diff --git a/core/proto/android/stats/connectivity/Android.bp b/core/proto/android/stats/connectivity/Android.bp deleted file mode 100644 index 5e6ac3cd3ca1..000000000000 --- a/core/proto/android/stats/connectivity/Android.bp +++ /dev/null @@ -1,38 +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. - -java_library_static { - name: "networkstackprotos", - proto: { - type: "lite", - }, - srcs: [ - "network_stack.proto", - ], - sdk_version: "system_29", -} - -java_library_static { - name: "tetheringprotos", - proto: { - type: "lite", - }, - srcs: [ - "tethering.proto", - ], - apex_available: [ - "com.android.tethering", - ], - sdk_version: "system_current", -} diff --git a/core/proto/android/stats/connectivity/network_stack.proto b/core/proto/android/stats/connectivity/network_stack.proto deleted file mode 100644 index e9726d7ce195..000000000000 --- a/core/proto/android/stats/connectivity/network_stack.proto +++ /dev/null @@ -1,180 +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. - */ - -syntax = "proto2"; - -package android.stats.connectivity; -option java_multiple_files = true; -option java_outer_classname = "NetworkStackProto"; - -enum DhcpRenewResult { - RR_UNKNOWN = 0; - RR_SUCCESS = 1; - RR_ERROR_NAK = 2; - RR_ERROR_IP_MISMATCH = 3; - RR_ERROR_IP_EXPIRE = 4; -} - -enum DisconnectCode { - DC_NONE = 0; - DC_NORMAL_TERMINATION = 1; - DC_PROVISIONING_FAIL = 2; - DC_ERROR_STARTING_IPV4 = 4; - DC_ERROR_STARTING_IPV6 = 5; - DC_ERROR_STARTING_IPREACHABILITYMONITOR = 6; - DC_INVALID_PROVISIONING = 7; - DC_INTERFACE_NOT_FOUND = 8; - DC_PROVISIONING_TIMEOUT = 9; -} - -enum TransportType { - TT_UNKNOWN = 0; - // Indicates this network uses a Cellular transport - TT_CELLULAR = 1; - // Indicates this network uses a Wi-Fi transport - TT_WIFI = 2; - // Indicates this network uses a Bluetooth transport - TT_BLUETOOTH = 3; - // Indicates this network uses an Ethernet transport - TT_ETHERNET = 4; - // Indicates this network uses a Wi-Fi Aware transport - TT_WIFI_AWARE = 5; - // Indicates this network uses a LoWPAN transport - TT_LOWPAN = 6; - // Indicates this network uses a Cellular+VPN transport - TT_CELLULAR_VPN = 7; - // Indicates this network uses a Wi-Fi+VPN transport - TT_WIFI_VPN = 8; - // Indicates this network uses a Bluetooth+VPN transport - TT_BLUETOOTH_VPN = 9; - // Indicates this network uses an Ethernet+VPN transport - TT_ETHERNET_VPN = 10; - // Indicates this network uses a Wi-Fi+Cellular+VPN transport - TT_WIFI_CELLULAR_VPN = 11; - // Indicates this network uses for test only - TT_TEST = 12; -} - -enum DhcpFeature { - DF_UNKNOWN = 0; - // DHCP INIT-REBOOT state - DF_INITREBOOT = 1; - // DHCP rapid commit option - DF_RAPIDCOMMIT = 2; - // Duplicate address detection - DF_DAD = 3; - // Fast initial Link setup - DF_FILS = 4; -} - -enum HostnameTransResult { - HTR_UNKNOWN = 0; - HTR_SUCCESS = 1; - HTR_FAILURE = 2; - HTR_DISABLE = 3; -} - -enum ProbeResult { - PR_UNKNOWN = 0; - PR_SUCCESS = 1; - PR_FAILURE = 2; - PR_PORTAL = 3; - // DNS query for the probe host returned a private IP address - PR_PRIVATE_IP_DNS = 4; -} - -enum ValidationResult { - VR_UNKNOWN = 0; - VR_SUCCESS = 1; - VR_FAILURE = 2; - VR_PORTAL = 3; - VR_PARTIAL = 4; -} - -enum ProbeType { - PT_UNKNOWN = 0; - PT_DNS = 1; - PT_HTTP = 2; - PT_HTTPS = 3; - PT_PAC = 4; - PT_FALLBACK = 5; - PT_PRIVDNS = 6; - PT_CAPPORT_API = 7; -} - -// The Dhcp error code is defined in android.net.metrics.DhcpErrorEvent -enum DhcpErrorCode { - ET_UNKNOWN = 0; - ET_L2_ERROR = 1; - ET_L3_ERROR = 2; - ET_L4_ERROR = 3; - ET_DHCP_ERROR = 4; - ET_MISC_ERROR = 5; - /* Reserve for error type - // ET_L2_ERROR_TYPE = ET_L2_ERROR << 8; - ET_L2_ERROR_TYPE = 256; - // ET_L3_ERROR_TYPE = ET_L3_ERROR << 8; - ET_L3_ERROR_TYPE = 512; - // ET_L4_ERROR_TYPE = ET_L4_ERROR << 8; - ET_L4_ERROR_TYPE = 768; - // ET_DHCP_ERROR_TYPE = ET_DHCP_ERROR << 8; - ET_DHCP_ERROR_TYPE = 1024; - // ET_MISC_ERROR_TYPE = ET_MISC_ERROR << 8; - ET_MISC_ERROR_TYPE = 1280; - */ - // ET_L2_TOO_SHORT = (ET_L2_ERROR_TYPE | 0x1) << 16; - ET_L2_TOO_SHORT = 16842752; - // ET_L2_WRONG_ETH_TYPE = (ET_L2_ERROR_TYPE | 0x2) << 16; - ET_L2_WRONG_ETH_TYPE = 16908288; - // ET_L3_TOO_SHORT = (ET_L3_ERROR_TYPE | 0x1) << 16; - ET_L3_TOO_SHORT = 33619968; - // ET_L3_NOT_IPV4 = (ET_L3_ERROR_TYPE | 0x2) << 16; - ET_L3_NOT_IPV4 = 33685504; - // ET_L3_INVALID_IP = (ET_L3_ERROR_TYPE | 0x3) << 16; - ET_L3_INVALID_IP = 33751040; - // ET_L4_NOT_UDP = (ET_L4_ERROR_TYPE | 0x1) << 16; - ET_L4_NOT_UDP = 50397184; - // ET_L4_WRONG_PORT = (ET_L4_ERROR_TYPE | 0x2) << 16; - ET_L4_WRONG_PORT = 50462720; - // ET_BOOTP_TOO_SHORT = (ET_DHCP_ERROR_TYPE | 0x1) << 16; - ET_BOOTP_TOO_SHORT = 67174400; - // ET_DHCP_BAD_MAGIC_COOKIE = (ET_DHCP_ERROR_TYPE | 0x2) << 16; - ET_DHCP_BAD_MAGIC_COOKIE = 67239936; - // ET_DHCP_INVALID_OPTION_LENGTH = (ET_DHCP_ERROR_TYPE | 0x3) << 16; - ET_DHCP_INVALID_OPTION_LENGTH = 67305472; - // ET_DHCP_NO_MSG_TYPE = (ET_DHCP_ERROR_TYPE | 0x4) << 16; - ET_DHCP_NO_MSG_TYPE = 67371008; - // ET_DHCP_UNKNOWN_MSG_TYPE = (ET_DHCP_ERROR_TYPE | 0x5) << 16; - ET_DHCP_UNKNOWN_MSG_TYPE = 67436544; - // ET_DHCP_NO_COOKIE = (ET_DHCP_ERROR_TYPE | 0x6) << 16; - ET_DHCP_NO_COOKIE = 67502080; - // ET_BUFFER_UNDERFLOW = (ET_MISC_ERROR_TYPE | 0x1) << 16; - ET_BUFFER_UNDERFLOW = 83951616; - // ET_RECEIVE_ERROR = (ET_MISC_ERROR_TYPE | 0x2) << 16; - ET_RECEIVE_ERROR = 84017152; - // ET_PARSING_ERROR = (ET_MISC_ERROR_TYPE | 0x3) << 16; - ET_PARSING_ERROR = 84082688; -} - -enum NetworkQuirkEvent { - QE_UNKNOWN = 0; - QE_IPV6_PROVISIONING_ROUTER_LOST = 1; -} - -message NetworkStackEventData { - -} - diff --git a/core/proto/android/stats/connectivity/tethering.proto b/core/proto/android/stats/connectivity/tethering.proto deleted file mode 100644 index 13f0b8c44fb5..000000000000 --- a/core/proto/android/stats/connectivity/tethering.proto +++ /dev/null @@ -1,97 +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. - */ -syntax = "proto2"; -package android.stats.connectivity; -option java_multiple_files = true; -option java_outer_classname = "TetheringProto"; - -enum ErrorCode { - EC_NO_ERROR = 0; - EC_UNKNOWN_IFACE = 1; - EC_SERVICE_UNAVAIL = 2; - EC_UNSUPPORTED = 3; - EC_UNAVAIL_IFACE = 4; - EC_INTERNAL_ERROR = 5; - EC_TETHER_IFACE_ERROR = 6; - EC_UNTETHER_IFACE_ERROR = 7; - EC_ENABLE_FORWARDING_ERROR = 8; - EC_DISABLE_FORWARDING_ERROR = 9; - EC_IFACE_CFG_ERROR = 10; - EC_PROVISIONING_FAILED = 11; - EC_DHCPSERVER_ERROR = 12; - EC_ENTITLEMENT_UNKNOWN = 13; - EC_NO_CHANGE_TETHERING_PERMISSION = 14; - EC_NO_ACCESS_TETHERING_PERMISSION = 15; - EC_UNKNOWN_TYPE = 16; -} - -enum DownstreamType { - // Unspecific tethering type. - DS_UNSPECIFIED = 0; - // Wifi tethering type. - DS_TETHERING_WIFI = 1; - // USB tethering type. - DS_TETHERING_USB = 2; - // Bluetooth tethering type. - DS_TETHERING_BLUETOOTH = 3; - // Wifi P2p tethering type. - DS_TETHERING_WIFI_P2P = 4; - // NCM (Network Control Model) local tethering type. - DS_TETHERING_NCM = 5; - // Ethernet tethering type. - DS_TETHERING_ETHERNET = 6; -} - -enum UpstreamType { - UT_UNKNOWN = 0; - // Indicates upstream using a Cellular transport. - UT_CELLULAR = 1; - // Indicates upstream using a Wi-Fi transport. - UT_WIFI = 2; - // Indicates upstream using a Bluetooth transport. - UT_BLUETOOTH = 3; - // Indicates upstream using an Ethernet transport. - UT_ETHERNET = 4; - // Indicates upstream using a Wi-Fi Aware transport. - UT_WIFI_AWARE = 5; - // Indicates upstream using a LoWPAN transport. - UT_LOWPAN = 6; - // Indicates upstream using a Cellular+VPN transport. - UT_CELLULAR_VPN = 7; - // Indicates upstream using a Wi-Fi+VPN transport. - UT_WIFI_VPN = 8; - // Indicates upstream using a Bluetooth+VPN transport. - UT_BLUETOOTH_VPN = 9; - // Indicates upstream using an Ethernet+VPN transport. - UT_ETHERNET_VPN = 10; - // Indicates upstream using a Wi-Fi+Cellular+VPN transport. - UT_WIFI_CELLULAR_VPN = 11; - // Indicates upstream using for test only. - UT_TEST = 12; - // Indicates upstream using DUN capability + Cellular transport. - UT_DUN_CELLULAR = 13; -} - -enum UserType { - // Unknown. - USER_UNKNOWN = 0; - // Settings. - USER_SETTINGS = 1; - // System UI. - USER_SYSTEMUI = 2; - // Google mobile service. - USER_GMS = 3; -} diff --git a/core/proto/android/stats/devicepolicy/Android.bp b/core/proto/android/stats/devicepolicy/Android.bp deleted file mode 100644 index 5fb278a34dae..000000000000 --- a/core/proto/android/stats/devicepolicy/Android.bp +++ /dev/null @@ -1,33 +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. - -java_library_static { - name: "devicepolicyprotosnano", - proto: { - type: "nano", - }, - srcs: [ - "*.proto", - ], - java_version: "1.8", - target: { - android: { - jarjar_rules: "jarjar-rules.txt", - }, - host: { - static_libs: ["libprotobuf-java-nano"], - } - }, - sdk_version: "core_platform", -} diff --git a/core/proto/android/stats/devicepolicy/device_policy.proto b/core/proto/android/stats/devicepolicy/device_policy.proto deleted file mode 100644 index af30cf3f9941..000000000000 --- a/core/proto/android/stats/devicepolicy/device_policy.proto +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -syntax = "proto2"; - -package android.stats.devicepolicy; -option java_multiple_files = true; - -message StringList { - repeated string string_value = 1; -} diff --git a/core/proto/android/stats/devicepolicy/device_policy_enums.proto b/core/proto/android/stats/devicepolicy/device_policy_enums.proto deleted file mode 100644 index 7c1a04944d68..000000000000 --- a/core/proto/android/stats/devicepolicy/device_policy_enums.proto +++ /dev/null @@ -1,204 +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. - */ - -syntax = "proto2"; - -package android.stats.devicepolicy; -option java_multiple_files = true; - -/** - * Id for device policy features. - */ -enum EventId { - SET_PASSWORD_QUALITY = 1; - SET_PASSWORD_MINIMUM_LENGTH = 2; - SET_PASSWORD_MINIMUM_NUMERIC = 3; - SET_PASSWORD_MINIMUM_NON_LETTER = 4; - SET_PASSWORD_MINIMUM_LETTERS = 5; - SET_PASSWORD_MINIMUM_LOWER_CASE = 6; - SET_PASSWORD_MINIMUM_UPPER_CASE = 7; - SET_PASSWORD_MINIMUM_SYMBOLS = 8; - SET_KEYGUARD_DISABLED_FEATURES = 9; - LOCK_NOW = 10; - WIPE_DATA_WITH_REASON = 11; - ADD_USER_RESTRICTION = 12; - REMOVE_USER_RESTRICTION = 13; - SET_SECURE_SETTING = 14; - SET_SECURITY_LOGGING_ENABLED = 15; - RETRIEVE_SECURITY_LOGS = 16; - RETRIEVE_PRE_REBOOT_SECURITY_LOGS = 17; - SET_PERMISSION_POLICY = 18; - SET_PERMISSION_GRANT_STATE = 19; - INSTALL_KEY_PAIR = 20; - INSTALL_CA_CERT = 21; - CHOOSE_PRIVATE_KEY_ALIAS = 22; - REMOVE_KEY_PAIR = 23; - UNINSTALL_CA_CERTS = 24; - SET_CERT_INSTALLER_PACKAGE = 25; - SET_ALWAYS_ON_VPN_PACKAGE = 26; - SET_PERMITTED_INPUT_METHODS = 27; - SET_PERMITTED_ACCESSIBILITY_SERVICES = 28; - SET_SCREEN_CAPTURE_DISABLED = 29; - SET_CAMERA_DISABLED = 30; - QUERY_SUMMARY_FOR_USER = 31; - QUERY_SUMMARY = 32; - QUERY_DETAILS = 33; - REBOOT = 34; - SET_MASTER_VOLUME_MUTED = 35; - SET_AUTO_TIME_REQUIRED = 36; - SET_KEYGUARD_DISABLED = 37; - SET_STATUS_BAR_DISABLED = 38; - SET_ORGANIZATION_COLOR = 39; - SET_PROFILE_NAME = 40; - SET_USER_ICON = 41; - SET_DEVICE_OWNER_LOCK_SCREEN_INFO = 42; - SET_SHORT_SUPPORT_MESSAGE = 43; - SET_LONG_SUPPORT_MESSAGE = 44; - SET_CROSS_PROFILE_CONTACTS_SEARCH_DISABLED = 45; - SET_CROSS_PROFILE_CALLER_ID_DISABLED = 46; - SET_BLUETOOTH_CONTACT_SHARING_DISABLED = 47; - ADD_CROSS_PROFILE_INTENT_FILTER = 48; - ADD_CROSS_PROFILE_WIDGET_PROVIDER = 49; - SET_SYSTEM_UPDATE_POLICY = 50; - SET_LOCKTASK_MODE_ENABLED = 51; - ADD_PERSISTENT_PREFERRED_ACTIVITY = 52; - REQUEST_BUGREPORT = 53; - GET_WIFI_MAC_ADDRESS = 54; - REQUEST_QUIET_MODE_ENABLED = 55; - WORK_PROFILE_LOCATION_CHANGED = 56; - DO_USER_INFO_CLICKED = 57; - TRANSFER_OWNERSHIP = 58; - GENERATE_KEY_PAIR = 59; - SET_KEY_PAIR_CERTIFICATE = 60; - SET_KEEP_UNINSTALLED_PACKAGES = 61; - SET_APPLICATION_RESTRICTIONS = 62; - SET_APPLICATION_HIDDEN = 63; - ENABLE_SYSTEM_APP = 64; - ENABLE_SYSTEM_APP_WITH_INTENT = 65; - INSTALL_EXISTING_PACKAGE = 66; - SET_UNINSTALL_BLOCKED = 67; - SET_PACKAGES_SUSPENDED = 68; - ON_LOCK_TASK_MODE_ENTERING = 69; - SET_CROSS_PROFILE_CALENDAR_PACKAGES = 70; - GET_USER_PASSWORD_COMPLEXITY_LEVEL = 72; - INSTALL_SYSTEM_UPDATE = 73; - INSTALL_SYSTEM_UPDATE_ERROR = 74; - IS_MANAGED_KIOSK = 75; - IS_UNATTENDED_MANAGED_KIOSK = 76; - PROVISIONING_MANAGED_PROFILE_ON_FULLY_MANAGED_DEVICE = 77; - PROVISIONING_PERSISTENT_DEVICE_OWNER = 78; - - // existing Tron logs to be migrated to statsd - PROVISIONING_ENTRY_POINT_NFC = 79; - PROVISIONING_ENTRY_POINT_QR_CODE = 80; - PROVISIONING_ENTRY_POINT_CLOUD_ENROLLMENT = 81; - PROVISIONING_ENTRY_POINT_ADB = 82; - PROVISIONING_ENTRY_POINT_TRUSTED_SOURCE = 83; - PROVISIONING_DPC_PACKAGE_NAME = 84; - PROVISIONING_DPC_INSTALLED_BY_PACKAGE = 85; - PROVISIONING_PROVISIONING_ACTIVITY_TIME_MS = 86; - PROVISIONING_PREPROVISIONING_ACTIVITY_TIME_MS = 87; - PROVISIONING_ENCRYPT_DEVICE_ACTIVITY_TIME_MS = 88; - PROVISIONING_WEB_ACTIVITY_TIME_MS = 89; - PROVISIONING_TRAMPOLINE_ACTIVITY_TIME_MS = 90 [deprecated=true]; - PROVISIONING_POST_ENCRYPTION_ACTIVITY_TIME_MS = 91 [deprecated=true]; - PROVISIONING_FINALIZATION_ACTIVITY_TIME_MS = 92 [deprecated=true]; - PROVISIONING_NETWORK_TYPE = 93; - PROVISIONING_ACTION = 94; - PROVISIONING_EXTRAS = 95; - PROVISIONING_COPY_ACCOUNT_TASK_MS = 96; - PROVISIONING_CREATE_PROFILE_TASK_MS = 97; - PROVISIONING_START_PROFILE_TASK_MS = 98; - PROVISIONING_DOWNLOAD_PACKAGE_TASK_MS = 99; - PROVISIONING_INSTALL_PACKAGE_TASK_MS = 100; - PROVISIONING_CANCELLED = 101; - PROVISIONING_ERROR = 102; - PROVISIONING_COPY_ACCOUNT_STATUS = 103; - PROVISIONING_TOTAL_TASK_TIME_MS = 104; - PROVISIONING_SESSION_STARTED = 105; - PROVISIONING_SESSION_COMPLETED = 106; - PROVISIONING_TERMS_ACTIVITY_TIME_MS = 107; - PROVISIONING_TERMS_COUNT = 108; - PROVISIONING_TERMS_READ = 109; - - SEPARATE_PROFILE_CHALLENGE_CHANGED = 110; - SET_GLOBAL_SETTING = 111; - INSTALL_PACKAGE = 112; - UNINSTALL_PACKAGE = 113; - WIFI_SERVICE_ADD_NETWORK_SUGGESTIONS = 114; - WIFI_SERVICE_ADD_OR_UPDATE_NETWORK = 115; - QUERY_SUMMARY_FOR_DEVICE = 116; - REMOVE_CROSS_PROFILE_WIDGET_PROVIDER = 117; - ESTABLISH_VPN = 118; - SET_NETWORK_LOGGING_ENABLED = 119; - RETRIEVE_NETWORK_LOGS = 120; - PROVISIONING_PREPARE_TOTAL_TIME_MS = 121; - PROVISIONING_PREPARE_STARTED = 122; - PROVISIONING_PREPARE_COMPLETED = 123; - PROVISIONING_FLOW_TYPE = 124; - CROSS_PROFILE_APPS_GET_TARGET_USER_PROFILES = 125; - CROSS_PROFILE_APPS_START_ACTIVITY_AS_USER = 126; - SET_AUTO_TIME = 127; - SET_AUTO_TIME_ZONE = 128; - SET_USER_CONTROL_DISABLED_PACKAGES = 129; - SET_FACTORY_RESET_PROTECTION = 130; - SET_COMMON_CRITERIA_MODE = 131; - ALLOW_MODIFICATION_OF_ADMIN_CONFIGURED_NETWORKS = 132; - SET_TIME = 133; - SET_TIME_ZONE = 134; - SET_PERSONAL_APPS_SUSPENDED = 135; - SET_MANAGED_PROFILE_MAXIMUM_TIME_OFF = 136; - COMP_TO_ORG_OWNED_PO_MIGRATED = 137; - SET_CROSS_PROFILE_PACKAGES = 138; - SET_INTERACT_ACROSS_PROFILES_APP_OP = 139; - GET_CROSS_PROFILE_PACKAGES = 140; - CAN_REQUEST_INTERACT_ACROSS_PROFILES_TRUE = 141; - CAN_REQUEST_INTERACT_ACROSS_PROFILES_FALSE_NO_PROFILES = 142; - CAN_REQUEST_INTERACT_ACROSS_PROFILES_FALSE_WHITELIST = 143; - CAN_REQUEST_INTERACT_ACROSS_PROFILES_FALSE_PERMISSION = 144; - CAN_INTERACT_ACROSS_PROFILES_TRUE = 145; - CAN_INTERACT_ACROSS_PROFILES_FALSE_PERMISSION = 146; - CAN_INTERACT_ACROSS_PROFILES_FALSE_NO_PROFILES = 147; - CREATE_CROSS_PROFILE_INTENT = 148; - IS_MANAGED_PROFILE = 149; - START_ACTIVITY_BY_INTENT = 150; - BIND_CROSS_PROFILE_SERVICE = 151; - PROVISIONING_DPC_SETUP_STARTED = 152; - PROVISIONING_DPC_SETUP_COMPLETED = 153; - PROVISIONING_ORGANIZATION_OWNED_MANAGED_PROFILE = 154; - RESOLVER_CROSS_PROFILE_TARGET_OPENED = 155; - RESOLVER_SWITCH_TABS = 156; - RESOLVER_EMPTY_STATE_WORK_APPS_DISABLED = 157; - RESOLVER_EMPTY_STATE_NO_SHARING_TO_PERSONAL= 158; - RESOLVER_EMPTY_STATE_NO_SHARING_TO_WORK= 159; - RESOLVER_EMPTY_STATE_NO_APPS_RESOLVED= 160; - RESOLVER_AUTOLAUNCH_CROSS_PROFILE_TARGET = 161; - CROSS_PROFILE_SETTINGS_PAGE_LAUNCHED_FROM_APP = 162; - CROSS_PROFILE_SETTINGS_PAGE_LAUNCHED_FROM_SETTINGS = 163; - CROSS_PROFILE_SETTINGS_PAGE_ADMIN_RESTRICTED = 164; - CROSS_PROFILE_SETTINGS_PAGE_MISSING_WORK_APP = 165; - CROSS_PROFILE_SETTINGS_PAGE_MISSING_PERSONAL_APP = 166; - CROSS_PROFILE_SETTINGS_PAGE_MISSING_INSTALL_BANNER_INTENT = 167; - CROSS_PROFILE_SETTINGS_PAGE_INSTALL_BANNER_CLICKED = 168; - CROSS_PROFILE_SETTINGS_PAGE_INSTALL_BANNER_NO_INTENT_CLICKED = 169; - CROSS_PROFILE_SETTINGS_PAGE_USER_CONSENTED = 170; - CROSS_PROFILE_SETTINGS_PAGE_USER_DECLINED_CONSENT = 171; - CROSS_PROFILE_SETTINGS_PAGE_PERMISSION_REVOKED = 172; - DOCSUI_EMPTY_STATE_NO_PERMISSION = 173; - DOCSUI_EMPTY_STATE_QUIET_MODE = 174; - DOCSUI_LAUNCH_OTHER_APP = 175; - DOCSUI_PICK_RESULT = 176; -} diff --git a/core/proto/android/stats/devicepolicy/jarjar-rules.txt b/core/proto/android/stats/devicepolicy/jarjar-rules.txt deleted file mode 100644 index 40043a861ceb..000000000000 --- a/core/proto/android/stats/devicepolicy/jarjar-rules.txt +++ /dev/null @@ -1 +0,0 @@ -rule com.google.protobuf.nano.** com.android.framework.protobuf.nano.@1 diff --git a/core/proto/android/stats/dnsresolver/Android.bp b/core/proto/android/stats/dnsresolver/Android.bp deleted file mode 100644 index 1e8c76314448..000000000000 --- a/core/proto/android/stats/dnsresolver/Android.bp +++ /dev/null @@ -1,24 +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. - -java_library_static { - name: "dnsresolverprotosnano", - proto: { - type: "nano", - }, - srcs: [ - "dns_resolver.proto", - ], - sdk_version: "system_current", -} diff --git a/core/proto/android/stats/dnsresolver/dns_resolver.proto b/core/proto/android/stats/dnsresolver/dns_resolver.proto deleted file mode 100644 index b17d12c9c315..000000000000 --- a/core/proto/android/stats/dnsresolver/dns_resolver.proto +++ /dev/null @@ -1,375 +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. - */ -syntax = "proto2"; -package android.stats.dnsresolver; - -enum EventType { - EVENT_UNKNOWN = 0; - EVENT_GETADDRINFO = 1; - EVENT_GETHOSTBYNAME = 2; - EVENT_GETHOSTBYADDR = 3; - EVENT_RES_NSEND = 4; -} - -// The return value of the DNS resolver for each DNS lookups. -// bionic/libc/include/netdb.h -// system/netd/resolv/include/netd_resolv/resolv.h -enum ReturnCode { - RC_EAI_NO_ERROR = 0; - RC_EAI_ADDRFAMILY = 1; - RC_EAI_AGAIN = 2; - RC_EAI_BADFLAGS = 3; - RC_EAI_FAIL = 4; - RC_EAI_FAMILY = 5; - RC_EAI_MEMORY = 6; - RC_EAI_NODATA = 7; - RC_EAI_NONAME = 8; - RC_EAI_SERVICE = 9; - RC_EAI_SOCKTYPE = 10; - RC_EAI_SYSTEM = 11; - RC_EAI_BADHINTS = 12; - RC_EAI_PROTOCOL = 13; - RC_EAI_OVERFLOW = 14; - RC_RESOLV_INTERNAL_ERROR = 254; - RC_RESOLV_TIMEOUT = 255; - RC_EAI_MAX = 256; -} - -enum NsRcode { - NS_R_NO_ERROR = 0; // No error occurred. - NS_R_FORMERR = 1; // Format error. - NS_R_SERVFAIL = 2; // Server failure. - NS_R_NXDOMAIN = 3; // Name error. - NS_R_NOTIMPL = 4; // Unimplemented. - NS_R_REFUSED = 5; // Operation refused. - // these are for BIND_UPDATE - NS_R_YXDOMAIN = 6; // Name exists - NS_R_YXRRSET = 7; // RRset exists - NS_R_NXRRSET = 8; // RRset does not exist - NS_R_NOTAUTH = 9; // Not authoritative for zone - NS_R_NOTZONE = 10; // Zone of record different from zone section - NS_R_MAX = 11; - // Define rcode=12~15(UNASSIGNED) in rcode enum type. - // Some DNS Servers might return undefined code to devices. - // Without the enum definition, that would be noise for our dashboard. - NS_R_UNASSIGNED12 = 12; // Unassigned - NS_R_UNASSIGNED13 = 13; // Unassigned - NS_R_UNASSIGNED14 = 14; // Unassigned - NS_R_UNASSIGNED15 = 15; // Unassigned - // The following are EDNS extended rcodes - NS_R_BADVERS = 16; - // The following are TSIG errors - // NS_R_BADSIG = 16, - NS_R_BADKEY = 17; - NS_R_BADTIME = 18; - NS_R_INTERNAL_ERROR = 254; - NS_R_TIMEOUT = 255; -} - -// Currently defined type values for resources and queries. -enum NsType { - NS_T_INVALID = 0; // Cookie. - NS_T_A = 1; // Host address. - NS_T_NS = 2; // Authoritative server. - NS_T_MD = 3; // Mail destination. - NS_T_MF = 4; // Mail forwarder. - NS_T_CNAME = 5; // Canonical name. - NS_T_SOA = 6; // Start of authority zone. - NS_T_MB = 7; // Mailbox domain name. - NS_T_MG = 8; // Mail group member. - NS_T_MR = 9; // Mail rename name. - NS_T_NULL = 10; // Null resource record. - NS_T_WKS = 11; // Well known service. - NS_T_PTR = 12; // Domain name pointer. - NS_T_HINFO = 13; // Host information. - NS_T_MINFO = 14; // Mailbox information. - NS_T_MX = 15; // Mail routing information. - NS_T_TXT = 16; // Text strings. - NS_T_RP = 17; // Responsible person. - NS_T_AFSDB = 18; // AFS cell database. - NS_T_X25 = 19; // X_25 calling address. - NS_T_ISDN = 20; // ISDN calling address. - NS_T_RT = 21; // Router. - NS_T_NSAP = 22; // NSAP address. - NS_T_NSAP_PTR = 23; // Reverse NSAP lookup (deprecated). - NS_T_SIG = 24; // Security signature. - NS_T_KEY = 25; // Security key. - NS_T_PX = 26; // X.400 mail mapping. - NS_T_GPOS = 27; // Geographical position (withdrawn). - NS_T_AAAA = 28; // IPv6 Address. - NS_T_LOC = 29; // Location Information. - NS_T_NXT = 30; // Next domain (security). - NS_T_EID = 31; // Endpoint identifier. - NS_T_NIMLOC = 32; // Nimrod Locator. - NS_T_SRV = 33; // Server Selection. - NS_T_ATMA = 34; // ATM Address - NS_T_NAPTR = 35; // Naming Authority PoinTeR - NS_T_KX = 36; // Key Exchange - NS_T_CERT = 37; // Certification record - NS_T_A6 = 38; // IPv6 address (experimental) - NS_T_DNAME = 39; // Non-terminal DNAME - NS_T_SINK = 40; // Kitchen sink (experimentatl) - NS_T_OPT = 41; // EDNS0 option (meta-RR) - NS_T_APL = 42; // Address prefix list (RFC 3123) - NS_T_DS = 43; // Delegation Signer - NS_T_SSHFP = 44; // SSH Fingerprint - NS_T_IPSECKEY = 45; // IPSEC Key - NS_T_RRSIG = 46; // RRset Signature - NS_T_NSEC = 47; // Negative security - NS_T_DNSKEY = 48; // DNS Key - NS_T_DHCID = 49; // Dynamic host configuratin identifier - NS_T_NSEC3 = 50; // Negative security type 3 - NS_T_NSEC3PARAM = 51; // Negative security type 3 parameters - NS_T_HIP = 55; // Host Identity Protocol - NS_T_SPF = 99; // Sender Policy Framework - NS_T_TKEY = 249; // Transaction key - NS_T_TSIG = 250; // Transaction signature. - NS_T_IXFR = 251; // Incremental zone transfer. - NS_T_AXFR = 252; // Transfer zone of authority. - NS_T_MAILB = 253; // Transfer mailbox records. - NS_T_MAILA = 254; // Transfer mail agent records. - NS_T_ANY = 255; // Wildcard match. - NS_T_ZXFR = 256; // BIND-specific, nonstandard. - NS_T_DLV = 32769; // DNSSEC look-aside validatation. - NS_T_MAX = 65536; -} - -enum IpVersion { - IV_UNKNOWN = 0; - IV_IPV4 = 1; - IV_IPV6 = 2; -} - -enum Protocol { - PROTO_UNKNOWN = 0; - PROTO_UDP = 1; - PROTO_TCP = 2; - PROTO_DOT = 3; -} - -enum PrivateDnsModes { - PDM_UNKNOWN = 0; - PDM_OFF = 1; - PDM_OPPORTUNISTIC = 2; - PDM_STRICT = 3; -} - -enum NetworkType { - NT_UNKNOWN = 0; - // Indicates this network uses a Cellular transport. - NT_CELLULAR = 1; - // Indicates this network uses a Wi-Fi transport. - NT_WIFI = 2; - // Indicates this network uses a Bluetooth transport. - NT_BLUETOOTH = 3; - // Indicates this network uses an Ethernet transport. - NT_ETHERNET = 4; - // Indicates this network uses a VPN transport, now deprecated. - NT_VPN = 5 [deprecated=true]; - // Indicates this network uses a Wi-Fi Aware transport. - NT_WIFI_AWARE = 6; - // Indicates this network uses a LoWPAN transport. - NT_LOWPAN = 7; - // Indicates this network uses a Cellular+VPN transport. - NT_CELLULAR_VPN = 8; - // Indicates this network uses a Wi-Fi+VPN transport. - NT_WIFI_VPN = 9; - // Indicates this network uses a Bluetooth+VPN transport. - NT_BLUETOOTH_VPN = 10; - // Indicates this network uses an Ethernet+VPN transport. - NT_ETHERNET_VPN = 11; - // Indicates this network uses a Wi-Fi+Cellular+VPN transport. - NT_WIFI_CELLULAR_VPN = 12; -} - -enum CacheStatus{ - // the cache can't handle that kind of queries. - // or the answer buffer is too small. - CS_UNSUPPORTED = 0; - // the cache doesn't know about this query. - CS_NOTFOUND = 1; - // the cache found the answer. - CS_FOUND = 2; - // Don't do anything on cache. - CS_SKIP = 3; -} - -// The enum LinuxErrno is defined in the following 2 files. -// 1. bionic/libc/kernel/uapi/asm-generic/errno-base.h -// 2. bionic/libc/kernel/uapi/asm-generic/errno.h -enum LinuxErrno { - SYS_NO_ERROR = 0; - SYS_EPERM = 1; // Not super-user - SYS_ENOENT = 2; // No such file or directory - SYS_ESRCH = 3; // No such process - SYS_EINTR = 4; // Interrupted system call - SYS_EIO = 5; // I/O error - SYS_ENXIO = 6; // No such device or address - SYS_E2BIG = 7; // Arg list too long - SYS_ENOEXEC = 8; // Exec format error - SYS_EBADF = 9; // Bad file number - SYS_ECHILD = 10; // No children - SYS_EAGAIN = 11; // No more processes - SYS_ENOMEM = 12; // Not enough core - SYS_EACCES = 13; // Permission denied - SYS_EFAULT = 14; // Bad address - SYS_ENOTBLK = 15; // Block device required - SYS_EBUSY = 16; // Mount device busy - SYS_EEXIST = 17; // File exists - SYS_EXDEV = 18; // Cross-device link - SYS_ENODEV = 19; // No such device - SYS_ENOTDIR = 20; // Not a directory - SYS_EISDIR = 21; // Is a directory - SYS_EINVAL = 22; // Invalid argument - SYS_ENFILE = 23; // Too many open files in system - SYS_EMFILE = 24; // Too many open files - SYS_ENOTTY = 25; // Not a typewriter - SYS_ETXTBSY = 26; // Text file busy - SYS_EFBIG = 27; // File too large - SYS_ENOSPC = 28; // No space left on device - SYS_ESPIPE = 29; // Illegal seek - SYS_EROFS = 30; // Read only file system - SYS_EMLINK = 31; // Too many links - SYS_EPIPE = 32; // Broken pipe - SYS_EDOM = 33; // Math arg out of domain of func - SYS_ERANGE = 34; // Math result not representable - SYS_EDEADLOCK = 35; // File locking deadlock error - SYS_ENAMETOOLONG = 36; // File or path name too long - SYS_ENOLCK = 37; // No record locks available - SYS_ENOSYS = 38; // Function not implemented - SYS_ENOTEMPTY = 39; // Directory not empty - SYS_ELOOP = 40; // Too many symbolic links - SYS_ENOMSG = 42; // No message of desired type - SYS_EIDRM = 43; // Identifier removed - SYS_ECHRNG = 44; // Channel number out of range - SYS_EL2NSYNC = 45; // Level 2 not synchronized - SYS_EL3HLT = 46; // Level 3 halted - SYS_EL3RST = 47; // Level 3 reset - SYS_ELNRNG = 48; // Link number out of range - SYS_EUNATCH = 49; // rotocol driver not attached - SYS_ENOCSI = 50; // No CSI structure available - SYS_EL2HLT = 51; // Level 2 halted - SYS_EBADE = 52; // Invalid exchange - SYS_EBADR = 53; // Invalid request descriptor - SYS_EXFULL = 54; // Exchange full - SYS_ENOANO = 55; // No anode - SYS_EBADRQC = 56; // Invalid request code - SYS_EBADSLT = 57; // Invalid slot - SYS_EBFONT = 59; // Bad font file fmt - SYS_ENOSTR = 60; // Device not a stream - SYS_ENODATA = 61; // No data (for no delay io) - SYS_ETIME = 62; // Timer expired - SYS_ENOSR = 63; // Out of streams resources - SYS_ENONET = 64; // Machine is not on the network - SYS_ENOPKG = 65; // Package not installed - SYS_EREMOTE = 66; // The object is remote - SYS_ENOLINK = 67; // The link has been severed - SYS_EADV = 68; // Advertise error - SYS_ESRMNT = 69; // Srmount error - SYS_ECOMM = 70; // Communication error on send - SYS_EPROTO = 71; // Protocol error - SYS_EMULTIHOP = 72; // Multihop attempted - SYS_EDOTDOT = 73; // Cross mount point (not really error) - SYS_EBADMSG = 74; // Trying to read unreadable message - SYS_EOVERFLOW = 75; // Value too large for defined data type - SYS_ENOTUNIQ = 76; // Given log. name not unique - SYS_EBADFD = 77; // f.d. invalid for this operation - SYS_EREMCHG = 78; // Remote address changed - SYS_ELIBACC = 79; // Can't access a needed shared lib - SYS_ELIBBAD = 80; // Accessing a corrupted shared lib - SYS_ELIBSCN = 81; // .lib section in a.out corrupted - SYS_ELIBMAX = 82; // Attempting to link in too many libs - SYS_ELIBEXEC = 83; // Attempting to exec a shared library - SYS_EILSEQ = 84; - SYS_ERESTART = 85; - SYS_ESTRPIPE = 86; - SYS_EUSERS = 87; - SYS_ENOTSOCK = 88; // Socket operation on non-socket - SYS_EDESTADDRREQ = 89; // Destination address required - SYS_EMSGSIZE = 90; // Message too long - SYS_EPROTOTYPE = 91; // Protocol wrong type for socket - SYS_ENOPROTOOPT = 92; // Protocol not available - SYS_EPROTONOSUPPORT = 93; // Unknown protocol - SYS_ESOCKTNOSUPPORT = 94; // Socket type not supported - SYS_EOPNOTSUPP = 95; // Operation not supported on transport endpoint - SYS_EPFNOSUPPORT = 96; // Protocol family not supported - SYS_EAFNOSUPPORT = 97; // Address family not supported by protocol family - SYS_EADDRINUSE = 98; // Address already in use - SYS_EADDRNOTAVAIL = 99; // Address not available - SYS_ENETDOWN = 100; // Network interface is not configured - SYS_ENETUNREACH = 101; // Network is unreachable - SYS_ENETRESET = 102; - SYS_ECONNABORTED = 103; // Connection aborted - SYS_ECONNRESET = 104; // Connection reset by peer - SYS_ENOBUFS = 105; // No buffer space available - SYS_EISCONN = 106; // Socket is already connected - SYS_ENOTCONN = 107; // Socket is not connected - SYS_ESHUTDOWN = 108; // Can't send after socket shutdown - SYS_ETOOMANYREFS = 109; - SYS_ETIMEDOUT = 110; // Connection timed out - SYS_ECONNREFUSED = 111; // Connection refused - SYS_EHOSTDOWN = 112; // Host is down - SYS_EHOSTUNREACH = 113; // Host is unreachable - SYS_EALREADY = 114; // Socket already connected - SYS_EINPROGRESS = 115; // Connection already in progress - SYS_ESTALE = 116; - SYS_EUCLEAN = 117; - SYS_ENOTNAM = 118; - SYS_ENAVAIL = 119; - SYS_EISNAM = 120; - SYS_EREMOTEIO = 121; - SYS_EDQUOT = 122; - SYS_ENOMEDIUM = 123; // No medium (in tape drive) - SYS_EMEDIUMTYPE = 124; - SYS_ECANCELED = 125; - SYS_ENOKEY = 126; - SYS_EKEYEXPIRED = 127; - SYS_EKEYREVOKED = 128; - SYS_EKEYREJECTED = 129; - SYS_EOWNERDEAD = 130; - SYS_ENOTRECOVERABLE = 131; - SYS_ERFKILL = 132; - SYS_EHWPOISON = 133; -} - -message DnsQueryEvent { - optional android.stats.dnsresolver.NsRcode rcode = 1; - - optional android.stats.dnsresolver.NsType type = 2; - - optional android.stats.dnsresolver.CacheStatus cache_hit = 3; - - optional android.stats.dnsresolver.IpVersion ip_version = 4; - - optional android.stats.dnsresolver.Protocol protocol = 5; - - // Number of DNS query retry times - optional int32 retry_times = 6; - - // Ordinal number of name server. - optional int32 dns_server_index = 7; - - // Used only by TCP and DOT. True for new connections. - optional bool connected = 8; - - optional int32 latency_micros = 9; - - optional android.stats.dnsresolver.LinuxErrno linux_errno = 10; -} - -message DnsQueryEvents { - repeated DnsQueryEvent dns_query_event = 1; -} diff --git a/core/proto/android/stats/docsui/docsui_enums.proto b/core/proto/android/stats/docsui/docsui_enums.proto deleted file mode 100644 index 5963f6a7f938..000000000000 --- a/core/proto/android/stats/docsui/docsui_enums.proto +++ /dev/null @@ -1,197 +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. - */ - -syntax = "proto2"; -package android.stats.docsui; -option java_multiple_files = true; - -enum LaunchAction { - UNKNOWN = 0; - OPEN = 1; - CREATE = 2; - GET_CONTENT = 3; - OPEN_TREE = 4; - PICK_COPY_DEST = 5; - BROWSE = 6; - OTHER = 7; -} - -enum MimeType { - MIME_UNKNOWN = 0; - MIME_NONE = 1; - MIME_ANY = 2; - MIME_APPLICATION = 3; - MIME_AUDIO = 4; - MIME_IMAGE = 5; - MIME_MESSAGE = 6; - MIME_MULTIPART = 7; - MIME_TEXT = 8; - MIME_VIDEO = 9; - MIME_OTHER = 10; -} - -enum Root { - ROOT_UNKNOWN = 0; - ROOT_NONE = 1; - ROOT_OTHER_DOCS_PROVIDER = 2; - ROOT_AUDIO = 3; - ROOT_DEVICE_STORAGE = 4; - ROOT_DOWNLOADS = 5; - ROOT_HOME = 6; - ROOT_IMAGES = 7; - ROOT_RECENTS = 8; - ROOT_VIDEOS = 9; - ROOT_MTP = 10; - ROOT_THIRD_PARTY_APP = 11; - ROOT_DOCUMENTS = 12; -} - -enum ContextScope { - SCOPE_UNKNOWN = 0; - SCOPE_FILES = 1; - SCOPE_PICKER = 2; -} - -enum Provider { - PROVIDER_UNKNOWN = 0; - PROVIDER_SYSTEM = 1; - PROVIDER_EXTERNAL = 2; -} - -enum FileOperation { - OP_UNKNOWN = 0; - OP_OTHER = 1; - OP_COPY = 2; - OP_COPY_INTRA_PROVIDER = 3; - OP_COPY_SYSTEM_PROVIDER = 4; - OP_COPY_EXTERNAL_PROVIDER = 5; - OP_MOVE = 6; - OP_MOVE_INTRA_PROVIDER = 7; - OP_MOVE_SYSTEM_PROVIDER = 8; - OP_MOVE_EXTERNAL_PROVIDER = 9; - OP_DELETE = 10; - OP_RENAME = 11; - OP_CREATE_DIR = 12; - OP_OTHER_ERROR = 13; - OP_DELETE_ERROR = 14; - OP_MOVE_ERROR = 15; - OP_COPY_ERROR = 16; - OP_RENAME_ERROR = 17; - OP_CREATE_DIR_ERROR = 18; - OP_COMPRESS_INTRA_PROVIDER = 19; - OP_COMPRESS_SYSTEM_PROVIDER = 20; - OP_COMPRESS_EXTERNAL_PROVIDER = 21; - OP_EXTRACT_INTRA_PROVIDER = 22; - OP_EXTRACT_SYSTEM_PROVIDER = 23; - OP_EXTRACT_EXTERNAL_PROVIDER = 24; - OP_COMPRESS_ERROR = 25; - OP_EXTRACT_ERROR = 26; -} - -enum SubFileOperation { - SUB_OP_UNKNOWN = 0; - SUB_OP_QUERY_DOC = 1; - SUB_OP_QUERY_CHILD = 2; - SUB_OP_OPEN_FILE = 3; - SUB_OP_READ_FILE = 4; - SUB_OP_CREATE_DOC = 5; - SUB_OP_WRITE_FILE = 6; - SUB_OP_DELETE_DOC = 7; - SUB_OP_OBTAIN_STREAM_TYPE = 8; - SUB_OP_QUICK_MOVE = 9; - SUB_OP_QUICK_COPY = 10; -} - -enum CopyMoveOpMode { - MODE_UNKNOWN = 0; - MODE_PROVIDER = 1; - MODE_CONVERTED = 2; - MODE_CONVENTIONAL = 3; -} - -enum Authority { - AUTH_UNKNOWN = 0; - AUTH_OTHER = 1; - AUTH_MEDIA = 2; - AUTH_STORAGE_INTERNAL = 3; - AUTH_STORAGE_EXTERNAL = 4; - AUTH_DOWNLOADS = 5; - AUTH_MTP = 6; -} - -enum UserAction { - ACTION_UNKNOWN = 0; - ACTION_OTHER = 1; - ACTION_GRID = 2; - ACTION_LIST = 3; - ACTION_SORT_NAME = 4; - ACTION_SORT_DATE = 5; - ACTION_SORT_SIZE = 6; - ACTION_SORT_TYPE = 7; - ACTION_SEARCH = 8; - ACTION_SHOW_SIZE = 9; - ACTION_HIDE_SIZE = 10; - ACTION_SETTINGS = 11; - ACTION_COPY_TO = 12; - ACTION_MOVE_TO = 13; - ACTION_DELETE = 14; - ACTION_RENAME = 15; - ACTION_CREATE_DIR = 16; - ACTION_SELECT_ALL = 17; - ACTION_SHARE = 18; - ACTION_OPEN = 19; - ACTION_SHOW_ADVANCED = 20; - ACTION_HIDE_ADVANCED = 21; - ACTION_NEW_WINDOW = 22; - ACTION_PASTE_CLIPBOARD = 23; - ACTION_COPY_CLIPBOARD = 24; - ACTION_DRAG_N_DROP = 25; - ACTION_DRAG_N_DROP_MULTI_WINDOW = 26; - ACTION_CUT_CLIPBOARD = 27; - ACTION_COMPRESS = 28; - ACTION_EXTRACT_TO = 29; - ACTION_VIEW_IN_APPLICATION = 30; - ACTION_INSPECTOR = 31; - ACTION_SEARCH_CHIP = 32; - ACTION_SEARCH_HISTORY = 33; -} - -enum InvalidScopedAccess { - SCOPED_DIR_ACCESS_UNKNOWN = 0; - SCOPED_DIR_ACCESS_INVALID_ARGUMENTS = 1; - SCOPED_DIR_ACCESS_INVALID_DIRECTORY = 2; - SCOPED_DIR_ACCESS_ERROR = 3; - SCOPED_DIR_ACCESS_DEPRECATED = 4; -} - -enum SearchType { - TYPE_UNKNOWN = 0; - TYPE_CHIP_IMAGES = 1; - TYPE_CHIP_AUDIOS = 2; - TYPE_CHIP_VIDEOS = 3; - TYPE_CHIP_DOCS = 4; - TYPE_SEARCH_HISTORY = 5; - TYPE_SEARCH_STRING = 6; - TYPE_CHIP_LARGE_FILES = 7; - TYPE_CHIP_FROM_THIS_WEEK = 8; -} - -enum SearchMode { - SEARCH_UNKNOWN = 0; - SEARCH_KEYWORD = 1; - SEARCH_CHIPS = 2; - SEARCH_KEYWORD_N_CHIPS = 3; -} diff --git a/core/proto/android/stats/enums.proto b/core/proto/android/stats/enums.proto deleted file mode 100644 index 8f8055ed2451..000000000000 --- a/core/proto/android/stats/enums.proto +++ /dev/null @@ -1,29 +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. - */ - -syntax = "proto2"; - -package android.stats; -option java_outer_classname = "StatsEnums"; - -enum EventType { - // Unknown. - TYPE_UNKNOWN = 0; - CONTENT_SUGGESTIONS_CLASSIFY_CONTENT_CALL_SUCCEEDED = 1; - CONTENT_SUGGESTIONS_CLASSIFY_CONTENT_CALL_FAILED = 2; - CONTENT_SUGGESTIONS_SUGGEST_CONTENT_CALL_SUCCEEDED = 3; - CONTENT_SUGGESTIONS_SUGGEST_CONTENT_CALL_FAILED = 4; -} diff --git a/core/proto/android/stats/intelligence/enums.proto b/core/proto/android/stats/intelligence/enums.proto deleted file mode 100644 index 0c210e3fd08f..000000000000 --- a/core/proto/android/stats/intelligence/enums.proto +++ /dev/null @@ -1,40 +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. - */ - -syntax = "proto2"; - -package android.stats.intelligence; -option java_outer_classname = "IntelligenceStatsEnums"; - -enum Status { - // The value wasn't set. - // protoc requires enum values to be unique by package rather than enum type. - // This forces us to prefix the enum values. - STATUS_UNKNOWN = 0; - // The event succeeded. - STATUS_SUCCEEDED = 1; - // The event had an error. - STATUS_FAILED = 2; -} - -enum EventType { - // The value wasn't set. - EVENT_UNKNOWN = 0; - // ContentSuggestionsService classifyContentSelections call. - EVENT_CONTENT_SUGGESTIONS_CLASSIFY_CONTENT_CALL = 1; - // ContentSuggestionsService suggestContentSelections call. - EVENT_CONTENT_SUGGESTIONS_SUGGEST_CONTENT_CALL = 2; -} diff --git a/core/proto/android/stats/launcher/Android.bp b/core/proto/android/stats/launcher/Android.bp deleted file mode 100644 index 976a0b8634a3..000000000000 --- a/core/proto/android/stats/launcher/Android.bp +++ /dev/null @@ -1,40 +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. - -java_library { - name: "launcherprotosnano", - proto: { - type: "nano", - output_params: ["store_unknown_fields=true"], - include_dirs: ["external/protobuf/src"], - }, - - sdk_version: "current", - srcs: [ - "*.proto", - ], -} - -java_library { - name: "launcherprotoslite", - proto: { - type: "lite", - include_dirs: ["external/protobuf/src"], - }, - - sdk_version: "current", - srcs: [ - "*.proto", - ], -} diff --git a/core/proto/android/stats/launcher/launcher.proto b/core/proto/android/stats/launcher/launcher.proto deleted file mode 100644 index fc177d57b193..000000000000 --- a/core/proto/android/stats/launcher/launcher.proto +++ /dev/null @@ -1,88 +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. - */ - -syntax = "proto2"; -package android.stats.launcher; -option java_multiple_files = true; - -enum LauncherAction { - DEFAULT_ACTION = 0; - LAUNCH_APP = 1; - LAUNCH_TASK = 2; - DISMISS_TASK = 3; - LONGPRESS = 4; - DRAGDROP = 5; - SWIPE_UP = 6; - SWIPE_DOWN = 7; - SWIPE_LEFT = 8; - SWIPE_RIGHT = 9; -} - -enum LauncherState { - LAUNCHER_STATE_UNSPECIFIED = 0; - BACKGROUND = 1; - HOME = 2; - OVERVIEW = 3; - ALLAPPS = 4; - UNCHANGED = 5; -} - -message LauncherTarget { - enum Type { - NONE = 0; - ITEM_TYPE = 1; - CONTROL_TYPE = 2; - CONTAINER_TYPE = 3; - } - enum Item { - DEFAULT_ITEM = 0; - APP_ICON = 1; - SHORTCUT = 2; - WIDGET = 3; - FOLDER_ICON = 4; - DEEPSHORTCUT = 5; - SEARCHBOX = 6; - EDITTEXT = 7; - NOTIFICATION = 8; - TASK = 9; - } - enum Container { - DEFAULT_CONTAINER = 0; - HOTSEAT = 1; - FOLDER = 2; - PREDICTION = 3; - SEARCHRESULT = 4; - } - enum Control { - DEFAULT_CONTROL = 0; - MENU = 1; - UNINSTALL = 2; - REMOVE = 3; - } - optional Type type = 1; - optional Item item = 2; - optional Container container = 3; - optional Control control = 4; - optional string launch_component = 5; - optional int32 page_id = 6; - optional int32 grid_x = 7; - optional int32 grid_y = 8; -} - -message LauncherExtension { - repeated LauncherTarget src_target = 1; - repeated LauncherTarget dst_target = 2; -} diff --git a/core/proto/android/stats/location/location_enums.proto b/core/proto/android/stats/location/location_enums.proto deleted file mode 100644 index 553c01c5d0dd..000000000000 --- a/core/proto/android/stats/location/location_enums.proto +++ /dev/null @@ -1,122 +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. - */ - -syntax = "proto2"; - -package android.stats.location; -option java_outer_classname = "LocationStatsEnums"; - - -// APIs from LocationManagerService -enum LocationManagerServiceApi { - API_UNKNOWN = 0; - API_REQUEST_LOCATION_UPDATES = 1; - API_ADD_GNSS_MEASUREMENTS_LISTENER = 2; - API_REGISTER_GNSS_STATUS_CALLBACK = 3; - API_REQUEST_GEOFENCE = 4; - API_SEND_EXTRA_COMMAND = 5; -} - -enum UsageState { - USAGE_STARTED = 0; - USAGE_ENDED = 1; -} - -// Type of location providers -enum ProviderType { - PROVIDER_UNKNOWN = 0; - PROVIDER_NETWORK = 1; - PROVIDER_GPS = 2; - PROVIDER_PASSIVE = 3; - PROVIDER_FUSED = 4; -} - -// Type of Callback passed in for this API -enum CallbackType { - CALLBACK_UNKNOWN = 0; - // Current API does not need a callback, e.g. sendExtraCommand - CALLBACK_NOT_APPLICABLE = 1; - CALLBACK_LISTENER = 2; - CALLBACK_PENDING_INTENT = 3; -} - -// Possible values for mQuality field in -// frameworks/base/location/java/android/location/LocationRequest.java -enum LocationRequestQuality { - QUALITY_UNKNOWN = 0; - ACCURACY_FINE = 100; - ACCURACY_BLOCK = 102; - ACCURACY_CITY = 104; - POWER_NONE = 200; - POWER_LOW = 201; - POWER_HIGH = 203; -} - -// Bucketized values for interval field in -// frameworks/base/location/java/android/location/LocationRequest.java -enum LocationRequestIntervalBucket { - INTERVAL_UNKNOWN = 0; - INTERVAL_BETWEEN_0_SEC_AND_1_SEC = 1; - INTERVAL_BETWEEN_1_SEC_AND_5_SEC = 2; - INTERVAL_BETWEEN_5_SEC_AND_1_MIN = 3; - INTERVAL_BETWEEN_1_MIN_AND_10_MIN = 4; - INTERVAL_BETWEEN_10_MIN_AND_1_HOUR = 5; - INTERVAL_LARGER_THAN_1_HOUR = 6; -} - -// Bucketized values for small displacement field in -// frameworks/base/location/java/android/location/LocationRequest.java -// Value in meters. -enum SmallestDisplacementBucket { - DISTANCE_UNKNOWN = 0; - DISTANCE_ZERO = 1; - DISTANCE_BETWEEN_0_AND_100 = 2; - DISTANCE_LARGER_THAN_100 = 3; -} - -// Bucketized values for expire_in field in -// frameworks/base/location/java/android/location/LocationRequest.java -enum ExpirationBucket { - EXPIRATION_UNKNOWN = 0; - EXPIRATION_BETWEEN_0_AND_20_SEC = 1; - EXPIRATION_BETWEEN_20_SEC_AND_1_MIN = 2; - EXPIRATION_BETWEEN_1_MIN_AND_10_MIN = 3; - EXPIRATION_BETWEEN_10_MIN_AND_1_HOUR = 4; - EXPIRATION_LARGER_THAN_1_HOUR = 5; - EXPIRATION_NO_EXPIRY = 6; -} - -// Bucketized values for radius field in -// frameworks/base/location/java/android/location/Geofence.java -// Value in meters. -enum GeofenceRadiusBucket { - RADIUS_UNKNOWN = 0; - RADIUS_BETWEEN_0_AND_100 = 1; - RADIUS_BETWEEN_100_AND_200 = 2; - RADIUS_BETWEEN_200_AND_300 = 3; - RADIUS_BETWEEN_300_AND_1000 = 4; - RADIUS_BETWEEN_1000_AND_10000 = 5; - RADIUS_LARGER_THAN_100000 = 6; - RADIUS_NEGATIVE = 7; -} - -// Caller Activity Importance. -enum ActivityImportance { - IMPORTANCE_UNKNOWN = 0; - IMPORTANCE_TOP = 1; - IMPORTANCE_FORGROUND_SERVICE = 2; - IMPORTANCE_BACKGROUND = 3; -} diff --git a/core/proto/android/stats/mediametrics/mediametrics.proto b/core/proto/android/stats/mediametrics/mediametrics.proto deleted file mode 100644 index 9f0ff591a506..000000000000 --- a/core/proto/android/stats/mediametrics/mediametrics.proto +++ /dev/null @@ -1,239 +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. - */ - -syntax = "proto2"; - -package android.stats.mediametrics; - -/** - * Track how we arbitrate between microphone/input requests. - * Logged from - * frameworks/av/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp - * frameworks/av/services/mediaanalytics/statsd_audiopolicy.cpp - * Next Tag: 10 - */ -message AudioPolicyData { - optional int32 status = 1; - optional string request_source = 2; - optional string request_package = 3; - optional int32 request_session = 4; - optional string request_device = 5; - optional string active_source = 6; - optional string active_package = 7; - optional int32 active_session = 8; - optional string active_device = 9; -} - -/** - * Track properties of audio recording - * Logged from - * frameworks/av/media/libaudioclient/AudioRecord.cpp - * frameworks/av/services/mediaanalytics/statsd_audiorecord.cpp - * Next Tag: 16 - */ -message AudioRecordData { - optional string encoding = 1; - optional string source = 2; - optional int32 latency = 3; - optional int32 samplerate = 4; - optional int32 channels = 5; - optional int64 created_millis = 6; - optional int64 duration_millis = 7; - optional int32 count = 8; - optional int32 error_code = 9; - optional string error_function = 10; - optional int32 port_id = 11; - optional int32 frame_count = 12; - optional string attributes = 13; - optional int64 channel_mask = 14; - optional int64 start_count = 15; - -} - -/** - * Track audio thread performance data - * Logged from - * frameworks/av/media/libnblog/ReportPerformance.cpp - * frameworks/av/services/mediaanalytics/statsd_audiothread.cpp - * Next Tag: 28 - */ -message AudioThreadData { - optional string type = 1; - optional int32 framecount = 2; - optional int32 samplerate = 3; - optional string work_millis_hist = 4; - optional string latency_millis_hist = 5; - optional string warmup_millis_hist = 6; - optional int64 underruns = 7; - optional int64 overruns = 8; - optional int64 active_millis = 9; - optional int64 duration_millis = 10; - - optional int32 id = 11; - optional int32 port_id = 12; - optional int32 sample_rate = 13; - optional int64 channel_mask = 14; - optional string encoding = 15; - optional int32 frame_count = 16; - optional string output_device = 17; - optional string input_device = 18; - optional double io_jitter_mean_millis = 19; - optional double io_jitter_stddev_millis = 20; - optional double process_time_mean_millis = 21; - optional double process_time_stddev_millis = 22; - optional double timestamp_jitter_mean_millis = 23; - optional double timestamp_jitter_stddev_millis = 24; - optional double latency_mean_millis = 25; - optional double latency_stddev_millis = 26; - -} - -/** - * Track audio track playback data - * Logged from - * frameworks/av/media/libaudioclient/AudioTrack.cpp - * frameworks/av/services/mediaanalytics/statsd_audiotrack.cpp - * Next Tag: 12 - */ -message AudioTrackData { - optional string stream_type = 1; - optional string content_type = 2; - optional string track_usage = 3; - optional int32 sample_rate = 4; - optional int64 channel_mask = 5; - - optional int32 underrun_frames = 6; - optional int32 startup_glitch = 7; - - optional int32 port_id = 8; - optional string encoding = 9; - optional int32 frame_count = 10; - optional string attributes = 11; - - -} - -/** - * Track Media Codec usage - * Logged from: - * frameworks/av/media/libstagefright/MediaCodec.cpp - * frameworks/av/services/mediaanalytics/statsd_codec.cpp - * Next Tag: 26 - */ -message CodecData { - optional string codec = 1; - optional string mime = 2; - optional string mode = 3; - optional int32 encoder = 4; - optional int32 secure = 5; - optional int32 width = 6; - optional int32 height = 7; - optional int32 rotation = 8; - optional int32 crypto = 9; - optional int32 profile = 10; - optional int32 level = 11; - optional int32 max_width = 12; - optional int32 max_height = 13; - optional int32 error_code = 14; - optional string error_state = 15; - optional int64 latency_max = 16; - optional int64 latency_min = 17; - optional int64 latency_avg = 18; - optional int64 latency_count = 19; - optional int64 latency_unknown = 20; - optional int32 queue_input_buffer_error = 21; - optional int32 queue_secure_input_buffer_error = 22; - optional string bitrate_mode = 23; - optional int32 bitrate = 24; - optional int64 lifetime_millis = 25; -} - -/** - * Track Media Extractor (pulling video/audio streams out of containers) usage - * Logged from: - * frameworks/av/media/libstagefright/RemoteMediaExtractor.cpp - * frameworks/av/services/mediaanalytics/statsd_extractor.cpp - * Next Tag: 4 - */ -message ExtractorData { - optional string format = 1; - optional string mime = 2; - optional int32 tracks = 3; -} - -/** - * Track Media Player usage - * this handles both nuplayer and nuplayer2 - * Logged from: - * frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp - * frameworks/av/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp - * frameworks/av/services/mediaanalytics/statsd_nuplayer.cpp - * Next Tag: 21 - */ -message NuPlayerData { - optional string whichPlayer = 1; - - optional string video_mime = 2; - optional string video_codec = 3; - optional int32 width = 4; - optional int32 height = 5; - optional int64 frames = 6; - optional int64 frames_dropped = 7; - optional double framerate = 8; - optional string audio_mime = 9; - optional string audio_codec = 10; - optional int64 duration_millis = 11; - optional int64 playing_millis = 12; - optional int32 error = 13; - optional int32 error_code = 14; - optional string error_state = 15; - optional string data_source_type = 16; - optional int64 rebuffering_millis = 17; - optional int32 rebuffers = 18; - optional int32 rebuffer_at_exit = 19; - optional int64 frames_dropped_startup = 20; -} - -/** - * Track information about recordings (e.g. camcorder) - * Logged from - * frameworks/av/media/libmediaplayerservice/StagefrightRecorder.cpp - * frameworks/av/services/mediaanalytics/if_statsd.cpp - * Next Tag: 22 - */ -message RecorderData { - optional string audio_mime = 1; - optional string video_mime = 2; - optional int32 video_profile = 3; - optional int32 video_level = 4; - optional int32 width = 5; - optional int32 height = 6; - optional int32 rotation = 7; - optional int32 framerate = 8; - optional int32 capture_fps = 9; - optional double capture_fps_enable = 10; - optional int64 duration_millis = 11; - optional int64 paused_millis = 12; - optional int32 paused_count = 13; - optional int32 audio_bitrate = 14; - optional int32 audio_channels = 15; - optional int32 audio_samplerate = 16; - optional int32 movie_timescale = 17; - optional int32 audio_timescale = 18; - optional int32 video_timescale = 19; - optional int32 video_bitrate = 20; - optional int32 iframe_interval = 21; -} diff --git a/core/proto/android/stats/mediaprovider/mediaprovider_enums.proto b/core/proto/android/stats/mediaprovider/mediaprovider_enums.proto deleted file mode 100644 index 138782bf5d19..000000000000 --- a/core/proto/android/stats/mediaprovider/mediaprovider_enums.proto +++ /dev/null @@ -1,30 +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. - */ - -syntax = "proto2"; -package android.stats.mediaprovider; -option java_multiple_files = true; - -enum VolumeType { - // Volume is unknown - UNKNOWN = 0; - // Volume is MediaStore.VOLUME_INTERNAL - INTERNAL = 1; - // Volume is MediaStore.VOLUME_EXTERNAL_PRIMARY - EXTERNAL_PRIMARY = 2; - // Volume is non-primary external storage - EXTERNAL_OTHER = 3; -} diff --git a/core/proto/android/stats/otaupdate/updateengine_enums.proto b/core/proto/android/stats/otaupdate/updateengine_enums.proto deleted file mode 100644 index a6e9919ba606..000000000000 --- a/core/proto/android/stats/otaupdate/updateengine_enums.proto +++ /dev/null @@ -1,82 +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. - */ - -syntax = "proto2"; -package android.stats.otaupdate; - -// The payload type of an OTA update attempt on A/B devices. -enum PayloadType { - FULL = 10000; - DELTA = 10001; -} - -// The attempt result reported by the update engine for an OTA update. -enum AttemptResult { - UPDATE_SUCCEEDED = 10000; - INTERNAL_ERROR = 10001; - PAYLOAD_DOWNLOAD_ERROR = 10002; - METADATA_MALFORMED = 10003; - OPERATION_MALFORMED = 10004; - OPERATION_EXECUTION_ERROR = 10005; - METADATA_VERIFICATION_FAILED = 10006; - PAYLOAD_VERIFICATION_FAILED = 10007; - VERIFICATION_FAILED = 10008; - POSTINSTALL_FAILED = 10009; - ABNORMAL_TERMINATION = 10010; - UPDATE_CANCELED = 10011; - UPDATE_SUCCEEDED_NOT_ACTIVE = 10012; -} - -// The error code reported by the update engine after an OTA update attempt -// on A/B devices. More details in system/update_engine/common/error_code.h -enum ErrorCode { - SUCCESS = 10000; - ERROR = 10001; - FILESYSTEM_COPIER_ERROR = 10004; - POST_INSTALL_RUNNER_ERROR = 10005; - PAYLOAD_MISMATCHED_TYPE_ERROR = 10006; - INSTALL_DEVICE_OPEN_ERROR = 10007; - KERNEL_DEVICE_OPEN_ERROR = 10008; - DOWNLOAD_TRANSFER_ERROR = 10009; - PAYLOAD_HASH_MISMATCH_ERROR = 10010; - PAYLOAD_SIZE_MISMATCH_ERROR = 10011; - DOWNLOAD_PAYLOAD_VERIFICATION_ERROR = 10012; - DOWNLOAD_NEW_PARTITION_INFO_ERROR = 10013; - DOWNLOAD_WRITE_ERROR = 10014; - NEW_ROOTFS_VERIFICATION_ERROR = 10015; - SIGNED_DELTA_PAYLOAD_EXPECTED_ERROR = 10017; - DOWNLOAD_PAYLOAD_PUB_KEY_VERIFICATION_ERROR = 10018; - DOWNLOAD_STATE_INITIALIZATION_ERROR = 10020; - DOWNLOAD_INVALID_METADATA_MAGIC_STRING = 10021; - DOWNLOAD_SIGNATURE_MISSING_IN_MANIFEST = 10022; - DOWNLOAD_MANIFEST_PARSE_ERROR = 10023; - DOWNLOAD_METADATA_SIGNATURE_ERROR = 10024; - DOWNLOAD_METADATA_SIGNATURE_VERIFICATION_ERROR = 10025; - DOWNLOAD_METADATA_SIGNATURE_MISMATCH = 10026; - DOWNLOAD_OPERATION_HASH_VERIFICATION_ERROR = 10027; - DOWNLOAD_OPERATION_EXECUTION_ERROR = 10028; - DOWNLOAD_OPERATION_HASH_MISMATCH = 10029; - DOWNLOAD_INVALID_METADATA_SIZE = 10032; - DOWNLOAD_INVALID_METADATA_SIGNATURE = 10033; - DOWNLOAD_OPERATION_HASH_MISSING_ERROR = 10038; - DOWNLOAD_METADATA_SIGNATURE_MISSING_ERROR = 10039; - UNSUPPORTED_MAJOR_PAYLOAD_VERSION = 10044; - UNSUPPORTED_MINOR_PAYLOAD_VERSION = 10045; - FILESYSTEM_VERIFIER_ERROR = 10047; - USER_CANCELED = 10048; - PAYLOAD_TIMESTAMP_ERROR = 10051; - UPDATED_BUT_NOT_ACTIVE = 10052; -} diff --git a/core/proto/android/stats/storage/storage_enums.proto b/core/proto/android/stats/storage/storage_enums.proto deleted file mode 100644 index 6892e287472f..000000000000 --- a/core/proto/android/stats/storage/storage_enums.proto +++ /dev/null @@ -1,26 +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. - */ - -syntax = "proto2"; - -package android.stats.storage; - -enum ExternalStorageType { - UNKNOWN = 0; - SD_CARD = 1; - USB = 2; - OTHER = 3; -} diff --git a/core/proto/android/stats/style/Android.bp b/core/proto/android/stats/style/Android.bp deleted file mode 100644 index f085a52f8cdb..000000000000 --- a/core/proto/android/stats/style/Android.bp +++ /dev/null @@ -1,27 +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. - -java_library { - name: "styleprotosnano", - proto: { - type: "nano", - output_params: ["store_unknown_fields=true"], - include_dirs: ["external/protobuf/src"], - }, - - sdk_version: "current", - srcs: [ - "*.proto", - ], -} diff --git a/core/proto/android/stats/style/style_enums.proto b/core/proto/android/stats/style/style_enums.proto deleted file mode 100644 index f3f491ff34cd..000000000000 --- a/core/proto/android/stats/style/style_enums.proto +++ /dev/null @@ -1,48 +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. - */ - -syntax = "proto2"; -package android.stats.style; -option java_multiple_files = true; - -enum Action { - DEFAULT_ACTION = 0; - ONRESUME = 1; - ONSTOP = 2; - PICKER_SELECT = 3; - PICKER_APPLIED = 4; - WALLPAPER_OPEN_CATEGORY = 5; - WALLPAPER_SELECT = 6; - WALLPAPER_APPLIED = 7; - WALLPAPER_EXPLORE = 8; - WALLPAPER_DOWNLOAD = 9; - WALLPAPER_REMOVE = 10; - LIVE_WALLPAPER_DOWNLOAD_SUCCESS = 11; - LIVE_WALLPAPER_DOWNLOAD_FAILED = 12; - LIVE_WALLPAPER_DOWNLOAD_CANCELLED = 13; - LIVE_WALLPAPER_DELETE_SUCCESS = 14; - LIVE_WALLPAPER_DELETE_FAILED = 15; - LIVE_WALLPAPER_APPLIED = 16; - LIVE_WALLPAPER_INFO_SELECT = 17; - LIVE_WALLPAPER_CUSTOMIZE_SELECT = 18; -} - -enum LocationPreference { - LOCATION_PREFERENCE_UNSPECIFIED = 0; - LOCATION_UNAVAILABLE = 1; - LOCATION_CURRENT = 2; - LOCATION_MANUAL = 3; -} diff --git a/core/proto/android/stats/sysui/notification_enums.proto b/core/proto/android/stats/sysui/notification_enums.proto deleted file mode 100644 index 30bdecae07d1..000000000000 --- a/core/proto/android/stats/sysui/notification_enums.proto +++ /dev/null @@ -1,30 +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. - */ - -syntax = "proto2"; - -package android.stats.sysui; - -// Enum used in NotificationReported and NotificationChannelModified atoms -enum NotificationImportance { // Constants from NotificationManager.java - IMPORTANCE_UNSPECIFIED = -1000; // Should not occur for real notifications. - IMPORTANCE_NONE = 0; // No importance: does not show in the shade. - IMPORTANCE_MIN = 1; // Minimum to show in the shade. - IMPORTANCE_LOW = 2; // Shows in shade, maybe status bar, no buzz/beep. - IMPORTANCE_DEFAULT = 3; // Shows everywhere, makes noise, no heads-up. - IMPORTANCE_HIGH = 4; // Shows everywhere, makes noise, heads-up, may full-screen. - IMPORTANCE_IMPORTANT_CONVERSATION = 5; // High + isImportantConversation(). -} diff --git a/core/proto/android/stats/textclassifier/Android.bp b/core/proto/android/stats/textclassifier/Android.bp deleted file mode 100644 index bf9022711206..000000000000 --- a/core/proto/android/stats/textclassifier/Android.bp +++ /dev/null @@ -1,23 +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. - -java_library_static { - name: "textclassifierprotoslite", - proto: { - type: "lite", - }, - srcs: [ - "*.proto", - ], -}
\ No newline at end of file diff --git a/core/proto/android/stats/textclassifier/textclassifier_enums.proto b/core/proto/android/stats/textclassifier/textclassifier_enums.proto deleted file mode 100644 index 4be7b7c2df7c..000000000000 --- a/core/proto/android/stats/textclassifier/textclassifier_enums.proto +++ /dev/null @@ -1,87 +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. - */ - -syntax = "proto2"; -package android.stats.textclassifier; -option java_multiple_files = true; - -enum EventType { - TYPE_UNKNOWN = 0; - // User started a new selection. - SELECTION_STARTED = 1; - // User modified an existing selection. - SELECTION_MODIFIED = 2; - // Smart selection triggered for a single token (word). - SMART_SELECTION_SINGLE = 3; - // Smart selection triggered spanning multiple tokens (words). - SMART_SELECTION_MULTI = 4; - // Something else other than user or the default TextClassifier triggered a selection. - AUTO_SELECTION = 5; - // Smart actions shown to the user. - ACTIONS_SHOWN = 6; - // User clicked a link. - LINK_CLICKED = 7; - // User typed over the selection. - OVERTYPE = 8; - // User clicked on Copy action. - COPY_ACTION = 9; - // User clicked on Paste action. - PASTE_ACTION = 10; - // User clicked on Cut action. - CUT_ACTION = 11; - // User clicked on Share action. - SHARE_ACTION = 12; - // User clicked on a Smart action. - SMART_ACTION = 13; - // User dragged+dropped the selection. - SELECTION_DRAG = 14; - // Selection is destroyed. - SELECTION_DESTROYED = 15; - // User clicked on a custom action. - OTHER_ACTION = 16; - // User clicked on Select All action - SELECT_ALL = 17; - // User reset the smart selection. - SELECTION_RESET = 18; - // User composed a reply. - MANUAL_REPLY = 19; - // TextClassifier generated some actions - ACTIONS_GENERATED = 20; - // Some text links were generated - LINKS_GENERATED = 21; -} - -enum WidgetType { - WIDGET_TYPE_UNKNOWN = 0; - // Standard TextView - WIDGET_TYPE_TEXTVIEW = 1; - // EditText - WIDGET_TYPE_EDITTEXT = 2; - // Not selectable textview - WIDGET_TYPE_UNSELECTABLE_TEXTVIEW = 3; - // Standard Webview - WIDGET_TYPE_WEBVIEW = 4; - // Editable TextView - WIDGET_TYPE_EDIT_WEBVIEW = 5; - // Custom text widget - WIDGET_TYPE_CUSTOM_TEXTVIEW = 6; - // Custom editable text widget. - WIDGET_TYPE_CUSTOM_EDITTEXT = 7; - // Non-selectable text widget. - WIDGET_TYPE_CUSTOM_UNSELECTABLE_TEXTVIEW = 8; - // Notification - WIDGET_TYPE_NOTIFICATION = 9; -} diff --git a/core/proto/android/telecomm/enums.proto b/core/proto/android/telecomm/enums.proto deleted file mode 100644 index 5ca4a85f7c6a..000000000000 --- a/core/proto/android/telecomm/enums.proto +++ /dev/null @@ -1,203 +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. - */ - -syntax = "proto2"; -package android.telecom; - -option java_outer_classname = "TelecomProtoEnums"; -option java_multiple_files = true; - -/** - * Call states, primarily used in CallState.java, - * Call.java, and CallsManager.java in packages/services. - */ -enum CallStateEnum { - /** - * Indicates that a call is new and not connected. This is used as the default state internally - * within Telecom and should not be used between Telecom and call services. Call services are - * not expected to ever interact with NEW calls, but {@link android.telecom.InCallService}s will - * see calls in this state. - */ - NEW = 0; - - /** - * The initial state of an outgoing {@code Call}. - * Common transitions are to {@link #DIALING} state for a successful call or - * {@link #DISCONNECTED} if it failed. - */ - CONNECTING = 1; - - /** - * The state of an outgoing {@code Call} when waiting on user to select a - * {@link android.telecom.PhoneAccount} through which to place the call. - */ - SELECT_PHONE_ACCOUNT = 2; - - /** - * Indicates that a call is outgoing and in the dialing state. A call transitions to this state - * once an outgoing call has begun (e.g., user presses the dial button in Dialer). Calls in this - * state usually transition to {@link #ACTIVE} if the call was answered or {@link #DISCONNECTED} - * if the call was disconnected somehow (e.g., failure or cancellation of the call by the user). - */ - DIALING = 3; - - /** - * Indicates that a call is incoming and the user still has the option of answering, rejecting, - * or doing nothing with the call. This state is usually associated with some type of audible - * ringtone. Normal transitions are to {@link #ACTIVE} if answered or {@link #DISCONNECTED} - * otherwise. - */ - RINGING = 4; - - /** - * Indicates that a call is currently connected to another party and a communication channel is - * open between them. The normal transition to this state is by the user answering a - * {@link #DIALING} call or a {@link #RINGING} call being answered by the other party. - */ - ACTIVE = 5; - - /** - * Indicates that the call is currently on hold. In this state, the call is not terminated - * but no communication is allowed until the call is no longer on hold. The typical transition - * to this state is by the user putting an {@link #ACTIVE} call on hold by explicitly performing - * an action, such as clicking the hold button. - */ - ON_HOLD = 6; - - /** - * Indicates that a call is currently disconnected. All states can transition to this state - * by the call service giving notice that the connection has been severed. When the user - * explicitly ends a call, it will not transition to this state until the call service confirms - * the disconnection or communication was lost to the call service currently responsible for - * this call (e.g., call service crashes). - */ - DISCONNECTED = 7; - - /** - * Indicates that the call was attempted (mostly in the context of outgoing, at least at the - * time of writing) but cancelled before it was successfully connected. - */ - ABORTED = 8; - - /** - * Indicates that the call is in the process of being disconnected and will transition next - * to a {@link #DISCONNECTED} state. - * <p> - * This state is not expected to be communicated from the Telephony layer, but will be reported - * to the InCall UI for calls where disconnection has been initiated by the user but the - * ConnectionService has confirmed the call as disconnected. - */ - DISCONNECTING = 9; - - /** - * Indicates that the call is in the process of being pulled to the local device. - * <p> - * This state should only be set on a call with - * {@link android.telecom.Connection#PROPERTY_IS_EXTERNAL_CALL} and - * {@link android.telecom.Connection#CAPABILITY_CAN_PULL_CALL}. - */ - PULLING = 10; - - /** - * Indicates that an incoming call has been answered by the in-call UI, but Telephony hasn't yet - * set the call to active. - */ - ANSWERED = 11; - - /** - * Indicates that the call is undergoing audio processing by a different app in the background. - * @see android.telecom.Call#STATE_AUDIO_PROCESSING - */ - AUDIO_PROCESSING = 12; - - /** - * Indicates that the call is in a fake ringing state. - * @see android.telecom.Call#STATE_SIMULATED_RINGING - */ - SIMULATED_RINGING = 13; -} - -// Disconnect causes for a call. Primarily used by android/telecom/DisconnectCause.java -enum DisconnectCauseEnum { - /** - * Disconnected because of an unknown or unspecified reason. - */ - UNKNOWN = 0; - - /** - * Disconnected because there was an error, such as a problem with the network. - */ - ERROR = 1; - - /** - * Disconnected because of a local user-initiated action, such as hanging up. - */ - LOCAL = 2; - - /** - * Disconnected because of a remote user-initiated action, such as the other party hanging up - * up. - */ - REMOTE = 3; - - /** - * Disconnected because it has been canceled. - */ - CANCELED = 4; - - /** - * Disconnected because there was no response to an incoming call. - */ - MISSED = 5; - - /** - * Disconnected because the user rejected an incoming call. - */ - REJECTED = 6; - - /** - * Disconnected because the other party was busy. - */ - BUSY = 7; - - /** - * Disconnected because of a restriction on placing the call, such as dialing in airplane - * mode. - */ - RESTRICTED = 8; - - /** - * Disconnected for reason not described by other disconnect codes. - */ - OTHER = 9; - - /** - * Disconnected because the connection manager did not support the call. The call will be tried - * again without a connection manager. See {@link PhoneAccount#CAPABILITY_CONNECTION_MANAGER}. - */ - CONNECTION_MANAGER_NOT_SUPPORTED = 10; - - /** - * Disconnected because the user did not locally answer the incoming call, but it was answered - * on another device where the call was ringing. - */ - ANSWERED_ELSEWHERE = 11; - - /** - * Disconnected because the call was pulled from the current device to another device. - */ - CALL_PULLED = 12; -} diff --git a/core/proto/android/telephony/enums.proto b/core/proto/android/telephony/enums.proto deleted file mode 100644 index f14e3ed1872d..000000000000 --- a/core/proto/android/telephony/enums.proto +++ /dev/null @@ -1,161 +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. - */ - -syntax = "proto2"; -package android.telephony; - -option java_outer_classname = "TelephonyProtoEnums"; -option java_multiple_files = true; - -enum CallBearerEnum { - /** Call bearer is unknown or invalid */ - CALL_BEARER_UNKNOWN = 0; - - /** Call bearer is legacy CS */ - CALL_BEARER_CS = 1; - - /** Call bearer is IMS */ - CALL_BEARER_IMS = 2; -} - -enum CallDirectionEnum { - /** Call direction: unknown or invalid */ - CALL_DIRECTION_UNKNOWN = 0; - - /** Call direction: mobile originated (outgoing for this device) */ - CALL_DIRECTION_MO = 1; - - /** Call direction: mobile terminated (incoming for this device) */ - CALL_DIRECTION_MT = 2; -} - -// Call setup duration buckets. -// See com.android.internal.telephony.metrics.VoiceCallSessionStats for definition. -enum CallSetupDurationEnum { - CALL_SETUP_DURATION_UNKNOWN = 0; - CALL_SETUP_DURATION_EXTREMELY_FAST = 1; - CALL_SETUP_DURATION_ULTRA_FAST = 2; - CALL_SETUP_DURATION_VERY_FAST = 3; - CALL_SETUP_DURATION_FAST = 4; - CALL_SETUP_DURATION_NORMAL = 5; - CALL_SETUP_DURATION_SLOW = 6; - CALL_SETUP_DURATION_VERY_SLOW = 7; - CALL_SETUP_DURATION_ULTRA_SLOW = 8; - CALL_SETUP_DURATION_EXTREMELY_SLOW = 9; -} - -// Data conn. power states, primarily used by android/telephony/DataConnectionRealTimeInfo.java. -enum DataConnectionPowerStateEnum { - DATA_CONNECTION_POWER_STATE_LOW = 1; - DATA_CONNECTION_POWER_STATE_MEDIUM = 2; - DATA_CONNECTION_POWER_STATE_HIGH = 3; - DATA_CONNECTION_POWER_STATE_UNKNOWN = 2147483647; // Java Integer.MAX_VALUE; -} - -// Network type enums, primarily used by android/telephony/TelephonyManager.java. -// Do not add negative types. -enum NetworkTypeEnum { - NETWORK_TYPE_UNKNOWN = 0; - NETWORK_TYPE_GPRS = 1; - NETWORK_TYPE_EDGE = 2; - NETWORK_TYPE_UMTS = 3; - NETWORK_TYPE_CDMA = 4; - NETWORK_TYPE_EVDO_0 = 5; - NETWORK_TYPE_EVDO_A = 6; - NETWORK_TYPE_1XRTT = 7; - NETWORK_TYPE_HSDPA = 8; - NETWORK_TYPE_HSUPA = 9; - NETWORK_TYPE_HSPA = 10; - NETWORK_TYPE_IDEN = 11; - NETWORK_TYPE_EVDO_B = 12; - NETWORK_TYPE_LTE = 13; - NETWORK_TYPE_EHRPD = 14; - NETWORK_TYPE_HSPAP = 15; - NETWORK_TYPE_GSM = 16; - NETWORK_TYPE_TD_SCDMA = 17; - NETWORK_TYPE_IWLAN = 18; - NETWORK_TYPE_LTE_CA = 19; - NETWORK_TYPE_NR = 20; -} - -// Signal strength levels, primarily used by android/telephony/SignalStrength.java. -enum SignalStrengthEnum { - SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0; - SIGNAL_STRENGTH_POOR = 1; - SIGNAL_STRENGTH_MODERATE = 2; - SIGNAL_STRENGTH_GOOD = 3; - SIGNAL_STRENGTH_GREAT = 4; -} - -enum ServiceStateEnum { - /** - * Normal operation condition, the phone is registered - * with an operator either in home network or in roaming. - */ - SERVICE_STATE_IN_SERVICE = 0; - - /** - * Phone is not registered with any operator, the phone - * can be currently searching a new operator to register to, or not - * searching to registration at all, or registration is denied, or radio - * signal is not available. - */ - SERVICE_STATE_OUT_OF_SERVICE = 1; - - /** - * The phone is registered and locked. Only emergency numbers are allowed. {@more} - */ - SERVICE_STATE_EMERGENCY_ONLY = 2; - - /** - * Radio of telephony is explicitly powered off. - */ - SERVICE_STATE_POWER_OFF = 3; -} - -enum SimStateEnum { - SIM_STATE_UNKNOWN = 0; - /** SIM card state: no SIM card is available in the device */ - SIM_STATE_ABSENT = 1; - /** SIM card state: Locked: requires the user's SIM PIN to unlock */ - SIM_STATE_PIN_REQUIRED = 2; - /** SIM card state: Locked: requires the user's SIM PUK to unlock */ - SIM_STATE_PUK_REQUIRED = 3; - /** SIM card state: Locked: requires a network PIN to unlock */ - SIM_STATE_NETWORK_LOCKED = 4; - /** SIM card state: Ready */ - SIM_STATE_READY = 5; - /** SIM card state: SIM Card is NOT READY */ - SIM_STATE_NOT_READY = 6; - /** SIM card state: SIM Card Error, permanently disabled */ - SIM_STATE_PERM_DISABLED = 7; - /** SIM card state: SIM Card Error, present but faulty */ - SIM_STATE_CARD_IO_ERROR = 8; - /** SIM card state: SIM Card restricted, present but not usable due to - * carrier restrictions. - */ - SIM_STATE_CARD_RESTRICTED = 9; - /** - * SIM card state: Loaded: SIM card applications have been loaded - * @hide - */ - SIM_STATE_LOADED = 10; - /** - * SIM card state: SIM Card is present - * @hide - */ - SIM_STATE_PRESENT = 11; -} diff --git a/core/proto/android/view/enums.proto b/core/proto/android/view/enums.proto deleted file mode 100644 index 0172e7899a18..000000000000 --- a/core/proto/android/view/enums.proto +++ /dev/null @@ -1,71 +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. - */ - -syntax = "proto2"; -package android.view; - -option java_outer_classname = "ViewProtoEnums"; -option java_multiple_files = true; - -// Screen states, primarily used by android/view/Display.java. -enum DisplayStateEnum { - // The display state is unknown. - DISPLAY_STATE_UNKNOWN = 0; - // The display state is off. - DISPLAY_STATE_OFF = 1; - // The display state is on. - DISPLAY_STATE_ON = 2; - // The display is dozing in a low power state; it is still on but is - // optimized for showing system-provided content while the device is - // non-interactive. - DISPLAY_STATE_DOZE = 3; - // The display is dozing in a suspended low power state; it is still on - // but is optimized for showing static system-provided content while the - // device is non-interactive. - DISPLAY_STATE_DOZE_SUSPEND = 4; - // The display is on and optimized for VR mode. - DISPLAY_STATE_VR = 5; - // The display is in a suspended full power state; it is still on but the - // CPU is not updating it. - DISPLAY_STATE_ON_SUSPEND = 6; -} - -// Constants found in android.view.WindowManager. -enum TransitionTypeEnum { - TRANSIT_NONE = 0; - TRANSIT_UNSET = -1; - TRANSIT_ACTIVITY_OPEN = 6; - TRANSIT_ACTIVITY_CLOSE = 7; - TRANSIT_TASK_OPEN = 8; - TRANSIT_TASK_CLOSE = 9; - TRANSIT_TASK_TO_FRONT = 10; - TRANSIT_TASK_TO_BACK = 11; - TRANSIT_WALLPAPER_CLOSE = 12; - TRANSIT_WALLPAPER_OPEN = 13; - TRANSIT_WALLPAPER_INTRA_OPEN = 14; - TRANSIT_WALLPAPER_INTRA_CLOSE = 15; - TRANSIT_TASK_OPEN_BEHIND = 16; - TRANSIT_TASK_IN_PLACE = 17; - TRANSIT_ACTIVITY_RELAUNCH = 18; - TRANSIT_DOCK_TASK_FROM_RECENTS = 19; - TRANSIT_KEYGUARD_GOING_AWAY = 20; - TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21; - TRANSIT_KEYGUARD_OCCLUDE = 22; - TRANSIT_KEYGUARD_UNOCCLUDE = 23; - TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24; - TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25; - TRANSIT_CRASHING_ACTIVITY_CLOSE = 26; -} diff --git a/core/proto/android/wifi/enums.proto b/core/proto/android/wifi/enums.proto deleted file mode 100644 index 315c5792c1de..000000000000 --- a/core/proto/android/wifi/enums.proto +++ /dev/null @@ -1,50 +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. - */ - -syntax = "proto2"; -package android.net.wifi; - -option java_outer_classname = "WifiProtoEnums"; -option java_multiple_files = true; - -/** - * Wifi Lock modes, primarily used in - * frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiLockManager.java. - */ -enum WifiModeEnum { - /** - * Deprecated. - * Wi-Fi will be kept active, and will behave normally. - */ - WIFI_MODE_FULL = 1 [deprecated=true]; - - /** - * Deprecated. - * Wi-Fi will be kept active, but the only operation that will be supported is initiation of - * scans, and the subsequent reporting of scan results. - */ - WIFI_MODE_SCAN_ONLY = 2 [deprecated=true]; - - /** - * Wi-Fi will not go to power save. - */ - WIFI_MODE_FULL_HIGH_PERF = 3; - - /** - * Wi-Fi will operate with a priority to achieve low latency. - */ - WIFI_MODE_FULL_LOW_LATENCY = 4; -} diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 944f0586feb4..001267180f35 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -123,28 +123,28 @@ <string name="roamingText11" msgid="5245687407203281407">"Baner rominga je uključen"</string> <string name="roamingText12" msgid="673537506362152640">"Baner rominga je isključen"</string> <string name="roamingTextSearching" msgid="5323235489657753486">"Pretraživanje usluge"</string> - <string name="wfcRegErrorTitle" msgid="3193072971584858020">"Podešavanje pozivanja preko WiFi-ja nije uspelo"</string> + <string name="wfcRegErrorTitle" msgid="3193072971584858020">"Podešavanje pozivanja preko WiFi-a nije uspelo"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="468830943567116703">"Da biste upućivali pozive i slali poruke preko WiFi-ja, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko WiFi-ja. (kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item> + <item msgid="468830943567116703">"Da biste upućivali pozive i slali poruke preko WiFi-a, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko WiFi-a. (kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="4795145070505729156">"Problem u vezi sa registrovanjem pozivanja preko Wi‑Fi-ja kod mobilnog operatera: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> <!-- no translation found for wfcSpnFormat_spn (2982505428519096311) --> <skip /> - <string name="wfcSpnFormat_spn_wifi_calling" msgid="3165949348000906194">"<xliff:g id="SPN">%s</xliff:g> pozivanje preko WiFi-ja"</string> - <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="3836827895369365298">"<xliff:g id="SPN">%s</xliff:g> – pozivanje preko WiFi-ja"</string> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="3165949348000906194">"<xliff:g id="SPN">%s</xliff:g> pozivanje preko WiFi-a"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="3836827895369365298">"<xliff:g id="SPN">%s</xliff:g> – pozivanje preko WiFi-a"</string> <string name="wfcSpnFormat_wlan_call" msgid="4895315549916165700">"WLAN poziv"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="255919245825481510">"<xliff:g id="SPN">%s</xliff:g> WLAN poziv"</string> <string name="wfcSpnFormat_spn_wifi" msgid="7232899594327126970">"<xliff:g id="SPN">%s</xliff:g> WiFi"</string> - <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="8383917598312067365">"Pozivanje preko WiFi-ja | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="8383917598312067365">"Pozivanje preko WiFi-a | <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_vowifi" msgid="6865214948822061486">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> - <string name="wfcSpnFormat_wifi_calling" msgid="6178935388378661755">"Pozivanje preko WiFi-ja"</string> + <string name="wfcSpnFormat_wifi_calling" msgid="6178935388378661755">"Pozivanje preko WiFi-a"</string> <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WiFi"</string> - <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Pozivanje preko WiFi-ja"</string> + <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Pozivanje preko WiFi-a"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Isključeno"</string> - <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Pozivanje preko WiFi-ja"</string> + <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Pozivanje preko WiFi-a"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Poziv preko mobilne mreže"</string> <string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Samo WiFi"</string> <string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Nije prosleđeno"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 1b143c84c17d..b95cab1aa3ae 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -795,7 +795,7 @@ <string name="orgTypeOther" msgid="5450675258408005553">"অন্যান্য"</string> <string name="orgTypeCustom" msgid="1126322047677329218">"কাস্টম"</string> <string name="relationTypeCustom" msgid="282938315217441351">"কাস্টম"</string> - <string name="relationTypeAssistant" msgid="4057605157116589315">"Assistant"</string> + <string name="relationTypeAssistant" msgid="4057605157116589315">"অ্যাসিস্ট্যান্ট"</string> <string name="relationTypeBrother" msgid="7141662427379247820">"ভাই"</string> <string name="relationTypeChild" msgid="9076258911292693601">"সন্তান"</string> <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"জীবনসাথি"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 0bd6353853bd..6fefb23f185b 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -947,7 +947,7 @@ <string name="autofill_district" msgid="6428712062213557327">"Districte"</string> <string name="autofill_department" msgid="9047276226873531529">"Departament"</string> <string name="autofill_prefecture" msgid="7267397763720241872">"Prefectura"</string> - <string name="autofill_parish" msgid="6847960518334530198">"Districte"</string> + <string name="autofill_parish" msgid="6847960518334530198">"Parròquia"</string> <string name="autofill_area" msgid="8289022370678448983">"Àrea"</string> <string name="autofill_emirate" msgid="2544082046790551168">"Emirat"</string> <string name="permlab_readHistoryBookmarks" msgid="9102293913842539697">"lectura dels marcadors i l\'historial web"</string> @@ -1219,8 +1219,8 @@ <string name="volume_music" msgid="7727274216734955095">"Volum de multimèdia"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"S\'està reproduint per Bluetooth"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"S\'ha establert el so de silenci"</string> - <string name="volume_call" msgid="7625321655265747433">"Volum en trucada"</string> - <string name="volume_bluetooth_call" msgid="2930204618610115061">"Volum en trucada per Bluetooth"</string> + <string name="volume_call" msgid="7625321655265747433">"Volum a la trucada"</string> + <string name="volume_bluetooth_call" msgid="2930204618610115061">"Volum a la trucada per Bluetooth"</string> <string name="volume_alarm" msgid="4486241060751798448">"Volum d\'alarma"</string> <string name="volume_notification" msgid="6864412249031660057">"Volum de notificacions"</string> <string name="volume_unknown" msgid="4041914008166576293">"Volum"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 1a51067cd513..38cbde6ef9c5 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -2044,7 +2044,7 @@ <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_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 depósito RESTRICTED"</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> <string name="conversation_single_line_image_placeholder" msgid="6983271082911936900">"envió una imagen"</string> <string name="conversation_title_fallback_one_to_one" msgid="1980753619726908614">"Conversación"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 1529f13e5f06..d2a16e348b62 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1629,7 +1629,7 @@ <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"Al mantener pulsadas ambas teclas de volumen durante unos segundos se activa <xliff:g id="SERVICE">%1$s</xliff:g>, una función de accesibilidad. Esta función puede modificar el funcionamiento del dispositivo.\n\nPuedes asignar este acceso directo a otra función en Ajustes > Accesibilidad."</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"Activar"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"No activar"</string> - <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"SÍ"</string> + <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ACTIVADO"</string> <string name="accessibility_shortcut_menu_item_status_off" msgid="5531598275559472393">"NO"</string> <string name="accessibility_enable_service_title" msgid="3931558336268541484">"¿Permitir que <xliff:g id="SERVICE">%1$s</xliff:g> pueda controlar totalmente tu dispositivo?"</string> <string name="accessibility_enable_service_encryption_warning" msgid="8603532708618236909">"Si activas <xliff:g id="SERVICE">%1$s</xliff:g>, el dispositivo no utilizará el bloqueo de pantalla para mejorar el cifrado de datos."</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 6b5741cb6913..d26bccda3647 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1216,7 +1216,7 @@ <string name="dump_heap_ready_text" msgid="5849618132123045516">"Protsessi <xliff:g id="PROC">%1$s</xliff:g> mälutõmmis on jagamiseks saadaval. Olge ettevaatlik: see mälutõmmis võib sisaldada tundlikke isiklikke andmeid, millele protsessil on juurdepääs. See võib hõlmata teie sisestatud teavet."</string> <string name="sendText" msgid="493003724401350724">"Valige teksti jaoks toiming"</string> <string name="volume_ringtone" msgid="134784084629229029">"Helina helitugevus"</string> - <string name="volume_music" msgid="7727274216734955095">"Meediumi helitugevus"</string> + <string name="volume_music" msgid="7727274216734955095">"Meedia helitugevus"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Esitatakse Bluetoothi kaudu"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Valitud on hääletu märguanne"</string> <string name="volume_call" msgid="7625321655265747433">"Kõne helitugevus"</string> @@ -1227,7 +1227,7 @@ <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Bluetoothi maht"</string> <string name="volume_icon_description_ringer" msgid="2187800636867423459">"Helina tugevus"</string> <string name="volume_icon_description_incall" msgid="4491255105381227919">"Kõne helitugevus"</string> - <string name="volume_icon_description_media" msgid="4997633254078171233">"Meediumi helitugevus"</string> + <string name="volume_icon_description_media" msgid="4997633254078171233">"Meedia helitugevus"</string> <string name="volume_icon_description_notification" msgid="579091344110747279">"Teatise helitugevus"</string> <string name="ringtone_default" msgid="9118299121288174597">"Vaikehelin"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Vaikimisi (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 11af9f20999c..0903e00640aa 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -589,9 +589,9 @@ <string name="face_acquired_recalibrate" msgid="8724013080976469746">"لطفاً چهرهتان را مجدداً ثبت کنید."</string> <string name="face_acquired_too_different" msgid="4699657338753282542">"دیگر چهره را تشخیص نمیدهد. دوباره امتحان کنید."</string> <string name="face_acquired_too_similar" msgid="7684650785108399370">"بسیار شبیه قبلی است، لطفاً قیافه دیگری بگیرید."</string> - <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"سرتان را کمی پایین آورید."</string> - <string name="face_acquired_tilt_too_extreme" msgid="8119978324129248059">"سرتان را کمی پایین آورید."</string> - <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"سرتان را کمی پایین آورید."</string> + <string name="face_acquired_pan_too_extreme" msgid="7822191262299152527">"سرتان را کمی صاف بگیرید."</string> + <string name="face_acquired_tilt_too_extreme" msgid="8119978324129248059">"سرتان را کمی صاف بگیرید."</string> + <string name="face_acquired_roll_too_extreme" msgid="1442830503572636825">"سرتان را کمی صاف بگیرید."</string> <string name="face_acquired_obscured" msgid="4917643294953326639">"هرچیزی را که حائل چهرهتان است بردارید."</string> <string name="face_acquired_sensor_dirty" msgid="8968391891086721678">"بالای صفحه و همچنین نوار مشکی را تمیز کنید."</string> <string-array name="face_acquired_vendor"> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index aee67394769b..2294a6979d57 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1792,8 +1792,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Järjestelmänvalvoja päivitti tämän."</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Järjestelmänvalvoja poisti tämän."</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Parantaakseen akunkestoa Virransäästö\n\n•·laittaa tumman teeman päälle\n•·laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Hei Google).\n\n"<annotation id="url">"Lue lisää"</annotation></string> - <string name="battery_saver_description" msgid="8587408568232177204">"Parantaakseen akunkestoa Virransäästö\n\n•·laittaa tumman teeman päälle\n•·laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. Hei Google)."</string> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Parantaakseen akunkestoa Virransäästö\n\n•·laittaa tumman teeman päälle\n•·laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. OK Google).\n\n"<annotation id="url">"Lue lisää"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Parantaakseen akunkestoa Virransäästö\n\n•·laittaa tumman teeman päälle\n•·laittaa pois päältä tai rajoittaa taustatoimintoja, joitakin visuaalisia tehosteita ja muita ominaisuuksia (esim. OK Google)."</string> <string name="data_saver_description" msgid="4995164271550590517">"Data Saver estää joitakin sovelluksia lähettämästä tai vastaanottamasta tietoja taustalla, jotta datan käyttöä voidaan vähentää. Käytössäsi oleva sovellus voi yhä käyttää dataa, mutta se saattaa tehdä niin tavallista harvemmin. Tämä voi tarkoittaa esimerkiksi sitä, että kuva ladataan vasta, kun kosketat sitä."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Otetaanko Data Saver käyttöön?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"Ota käyttöön"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 2b42c12a9fea..9d6105f25802 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -52,6 +52,7 @@ <string name="enablePin" msgid="2543771964137091212">"Opération infructueuse. Activez le verrouillage SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM soit verrouillée.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM soit verrouillée.</item> </plurals> <string name="imei" msgid="2157082351232630390">"Code IIEM"</string> @@ -179,6 +180,7 @@ <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029"> <item quantity="one">Autorité de certification installée</item> + <item quantity="many">Certificate authorities installed</item> <item quantity="other">Autorités de certification installées</item> </plurals> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string> @@ -251,6 +253,7 @@ <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information."</string> <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206"> <item quantity="one">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde.</item> + <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item> <item quantity="other">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes.</item> </plurals> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran prise avec le rapport de bogue"</string> @@ -683,9 +686,9 @@ <string name="policylab_forceLock" msgid="7360335502968476434">"Verrouiller l\'écran"</string> <string name="policydesc_forceLock" msgid="1008844760853899693">"Gérer le mode et les conditions de verrouillage de l\'écran"</string> <string name="policylab_wipeData" msgid="1359485247727537311">"Effacer toutes les données"</string> - <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Effacer les données de la tablette sans avertissement, en rétablissant la configuration d\'usine"</string> + <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Effacer les données de la tablette sans avertissement, en rétablissant les paramètres par défaut"</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Effacez les données de votre appareil Android TV sans avertissement en effectuant une réinitialisation des paramètres d\'usine."</string> - <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Effacer les données du téléphone sans avertissement, en rétablissant la configuration d\'usine"</string> + <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Effacer les données du téléphone sans avertissement en rétablissant les paramètres par défaut"</string> <string name="policylab_wipeData_secondaryUser" msgid="413813645323433166">"Effacer les données de l\'utilisateur"</string> <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Effacer les données de l\'utilisateur sur cette tablette sans avertissement."</string> <string name="policydesc_wipeData_secondaryUser" product="tv" msgid="2293713284515865200">"Effacez les données de cet utilisateur sur cet appareil Android TV sans avertissement."</string> @@ -863,12 +866,12 @@ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Au bout de <xliff:g id="NUMBER_1">%2$d</xliff:g> échecs supplémentaires, vous devrez déverrouiller votre tablette à l\'aide de votre identifiant Google.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"Vous avez dessiné votre schéma de déverrouillage incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), vous devrez déverrouiller votre appareil Android TV en vous connectant à votre compte Google.\n\n Réessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Au bout de <xliff:g id="NUMBER_1">%2$d</xliff:g> échecs supplémentaires, vous devrez déverrouiller votre téléphone à l\'aide de votre identifiant Google.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> - <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string> + <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), votre appareil Android TV sera réinitialisé à ses valeurs d\'usine et toutes les données personnelles seront supprimées."</string> - <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string> - <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string> + <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string> + <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="8682445539263683414">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER">%d</xliff:g> reprise(s). Votre appareil Android TV sera maintenant réinitialisé à ses valeurs d\'usine."</string> - <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string> + <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"Veuillez réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"Schéma oublié?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"Déverrouillage du compte"</string> @@ -994,6 +997,7 @@ <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string> <plurals name="last_num_days" formatted="false" msgid="687443109145393632"> <item quantity="one">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string> @@ -1016,66 +1020,82 @@ <string name="now_string_shortest" msgid="3684914126941650330">"maintenant"</string> <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019"> <item quantity="one">il y a<xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item> <item quantity="other">il y a<xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string> @@ -1446,6 +1466,7 @@ <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string> <plurals name="matches_found" formatted="false" msgid="1101758718194295554"> <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> + <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item> <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> </plurals> <string name="action_mode_done" msgid="2536182504764803222">"Terminé"</string> @@ -1582,6 +1603,7 @@ <string name="kg_wrong_pin" msgid="3680925703673166482">"NIP incorrect."</string> <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568"> <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item> + <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item> <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item> </plurals> <string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string> @@ -1608,12 +1630,12 @@ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="23741434207544038">"Vous avez saisi un NIP incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="3328686432962224215">"Vous avez saisi un mot de passe incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. \n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="7357404233979139075">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_1">%2$d</xliff:g> secondes."</string> - <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="3479940221343361587">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string> + <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="3479940221343361587">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="9064457748587850217">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), votre appareil Android TV sera réinitialisé à ses valeurs d\'usine et toutes les données personnelles seront supprimées."</string> - <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, sa configuration d\'usine sera rétablie, et toutes les données utilisateur seront perdues."</string> - <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string> + <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="5955398963754432548">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, ses paramètres par défaut seront rétablis, et toutes les données d\'utilisateur seront perdues."</string> + <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"Vous avez tenté de déverrouiller la tablette de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string> <string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"Vous avez tenté de déverrouiller votre appareil Android TV incorrectement à <xliff:g id="NUMBER">%d</xliff:g> reprise(s). Votre appareil Android TV sera maintenant réinitialisé à ses valeurs d\'usine."</string> - <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Sa configuration d\'usine va être rétablie."</string> + <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"Vous avez tenté de déverrouiller le téléphone de façon incorrecte à <xliff:g id="NUMBER">%d</xliff:g> reprises. Ses paramètres par défaut vont être rétablis."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre tablette à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"Vous avez dessiné votre schéma de déverrouillage incorrectement à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprise(s). Après <xliff:g id="NUMBER_1">%2$d</xliff:g> autre(s) tentative(s) incorrecte(s), vous devrez déverrouiller votre appareil Android TV à l\'aide d\'un compte de courriel.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%1$d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%2$d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> @@ -1768,6 +1790,7 @@ <string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153"> <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item> + <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item> <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item> </plurals> <string name="restr_pin_try_later" msgid="5897719962541636727">"Réessayez plus tard"</string> @@ -1799,34 +1822,42 @@ <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312"> <item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758"> <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642"> <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998"> <item quantity="one">Pendant %d minute</item> + <item quantity="many">For %d minutes</item> <item quantity="other">Pendant %d minutes</item> </plurals> <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859"> <item quantity="one">Pendant %d min</item> + <item quantity="many">For %d min</item> <item quantity="other">Pendant %d min</item> </plurals> <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022"> <item quantity="one">Pendant %d heure</item> + <item quantity="many">For %d hours</item> <item quantity="other">Pendant %d heures</item> </plurals> <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640"> <item quantity="one">Pendant %d h</item> + <item quantity="many">For %d hr</item> <item quantity="other">Pendant %d h</item> </plurals> <string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> @@ -1842,7 +1873,7 @@ <string name="zen_mode_default_events_name" msgid="2280682960128512257">"Événement"</string> <string name="zen_mode_default_every_night_name" msgid="1467765312174275823">"Sommeil"</string> <string name="muted_by" msgid="91464083490094950">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> désactive certains sons"</string> - <string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à sa configuration d\'usine."</string> + <string name="system_error_wipe_data" msgid="5910572292172208493">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à ses paramètres par défaut."</string> <string name="system_error_manufacturer" msgid="703545241070116315">"Un problème interne est survenu avec votre appareil. Communiquez avec le fabricant pour obtenir plus de détails."</string> <string name="stk_cc_ussd_to_dial" msgid="3139884150741157610">"La demande USSD a été remplacée par une demande d\'appel régulier"</string> <string name="stk_cc_ussd_to_ss" msgid="4826846653052609738">"La demande USSD a été remplacée par une demande SS"</string> @@ -1867,6 +1898,7 @@ <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> </plurals> <string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string> @@ -1934,6 +1966,7 @@ <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de remplissage automatique"</string> <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978"> <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de remplissage automatique</item> + <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item> <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de remplissage automatique</item> </plurals> <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer sous "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> @@ -2027,6 +2060,7 @@ <string name="car_loading_profile" msgid="8219978381196748070">"Chargement en cours…"</string> <plurals name="file_count" formatted="false" msgid="7063513834724389247"> <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item> + <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item> </plurals> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index d4978c355f51..6441b04dcb74 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -52,6 +52,7 @@ <string name="enablePin" msgid="2543771964137091212">"Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584"> <item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne soit verrouillée.</item> + <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne soit verrouillée.</item> </plurals> <string name="imei" msgid="2157082351232630390">"Code IMEI"</string> @@ -179,6 +180,7 @@ <string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string> <plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029"> <item quantity="one">Autorité de certification installée</item> + <item quantity="many">Certificate authorities installed</item> <item quantity="other">Autorités de certification installées</item> </plurals> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string> @@ -251,6 +253,7 @@ <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information."</string> <plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206"> <item quantity="one">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde</item> + <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item> <item quantity="other">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes</item> </plurals> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran avec rapport de bug effectuée"</string> @@ -994,6 +997,7 @@ <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string> <plurals name="last_num_days" formatted="false" msgid="687443109145393632"> <item quantity="one">Le dernier jour (<xliff:g id="COUNT_1">%d</xliff:g>)</item> + <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">Les <xliff:g id="COUNT_1">%d</xliff:g> derniers jours</item> </plurals> <string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string> @@ -1016,66 +1020,82 @@ <string name="now_string_shortest" msgid="3684914126941650330">"mainten."</string> <plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338"> <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item> </plurals> <plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item> </plurals> <plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item> </plurals> <plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item> </plurals> <plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159"> <item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item> + <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item> <item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> </plurals> <plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item> </plurals> <plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item> </plurals> <plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371"> <item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> an</item> + <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item> <item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item> </plurals> <string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string> @@ -1231,7 +1251,7 @@ <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume des notifications"</string> <string name="ringtone_default" msgid="9118299121288174597">"Sonnerie par défaut"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Sonnerie par défaut (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="397111123930141876">"Aucun(e)"</string> + <string name="ringtone_silent" msgid="397111123930141876">"Aucun"</string> <string name="ringtone_picker_title" msgid="667342618626068253">"Sonneries"</string> <string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"Sons de l\'alarme"</string> <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"Sons de notification"</string> @@ -1446,6 +1466,7 @@ <string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string> <plurals name="matches_found" formatted="false" msgid="1101758718194295554"> <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> + <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item> <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item> </plurals> <string name="action_mode_done" msgid="2536182504764803222">"OK"</string> @@ -1582,6 +1603,7 @@ <string name="kg_wrong_pin" msgid="3680925703673166482">"Code PIN incorrect."</string> <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568"> <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item> + <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item> <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item> </plurals> <string name="kg_pattern_instructions" msgid="8366024510502517748">"Dessinez votre schéma."</string> @@ -1768,6 +1790,7 @@ <string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le code PIN est trop court. Il doit comporter au moins 4 chiffres."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153"> <item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item> + <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item> <item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item> </plurals> <string name="restr_pin_try_later" msgid="5897719962541636727">"Veuillez réessayer ultérieurement."</string> @@ -1799,34 +1822,42 @@ <string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273"> <item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312"> <item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758"> <item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642"> <item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> + <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998"> <item quantity="one">Pendant %d minute</item> + <item quantity="many">For %d minutes</item> <item quantity="other">Pendant %d minutes</item> </plurals> <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859"> <item quantity="one">Pendant %d min</item> + <item quantity="many">For %d min</item> <item quantity="other">Pendant %d min</item> </plurals> <plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022"> <item quantity="one">Pendant %d heure</item> + <item quantity="many">For %d hours</item> <item quantity="other">Pendant %d heures</item> </plurals> <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640"> <item quantity="one">Pendant %d h</item> + <item quantity="many">For %d hr</item> <item quantity="other">Pendant %d h</item> </plurals> <string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> @@ -1867,6 +1898,7 @@ <string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> <plurals name="selected_count" formatted="false" msgid="3946212171128200491"> <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item> + <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item> </plurals> <string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string> @@ -1934,6 +1966,7 @@ <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de saisie automatique"</string> <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978"> <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de saisie automatique</item> + <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item> <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de saisie automatique</item> </plurals> <string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer dans "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ?"</string> @@ -2027,6 +2060,7 @@ <string name="car_loading_profile" msgid="8219978381196748070">"Chargement…"</string> <plurals name="file_count" formatted="false" msgid="7063513834724389247"> <item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item> + <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item> <item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item> </plurals> <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index e4ac0215f1dd..b3259e52c20f 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1587,7 +1587,7 @@ <string name="kg_pattern_instructions" msgid="8366024510502517748">"Debuxa o teu padrón"</string> <string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Introduce o PIN da tarxeta SIM"</string> <string name="kg_pin_instructions" msgid="7355933174673539021">"Introduce o PIN"</string> - <string name="kg_password_instructions" msgid="7179782578809398050">"Insire o teu contrasinal"</string> + <string name="kg_password_instructions" msgid="7179782578809398050">"Escribe o teu contrasinal"</string> <string name="kg_puk_enter_puk_hint" msgid="6696187482616360994">"Agora a tarxeta SIM está desactivada. Introduce o código PUK para continuar. Ponte en contacto co operador para obter información detallada."</string> <string name="kg_puk_enter_pin_hint" msgid="8190982314659429770">"Introduce o código PIN desexado"</string> <string name="kg_enter_confirm_pin_hint" msgid="6372557107414074580">"Confirma o código PIN desexado"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index b3d704dd7c61..c81f90ca91bf 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -189,7 +189,7 @@ <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"આ ઉપકરણ પર તમારી કાર્યાલયની પ્રોફાઇલ હવે ઉપલબ્ધ નથી"</string> <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"પાસવર્ડના ઘણા વધુ પ્રયત્નો"</string> <string name="device_ownership_relinquished" msgid="4080886992183195724">"વ્યવસ્થાપકે ડિવાઇસ વ્યક્તિગત ઉપયોગ માટે આપી દીધું છે"</string> - <string name="network_logging_notification_title" msgid="554983187553845004">"ઉપકરણ સંચાલિત છે"</string> + <string name="network_logging_notification_title" msgid="554983187553845004">"ડિવાઇસ મેનેજ થયેલ છે"</string> <string name="network_logging_notification_text" msgid="1327373071132562512">"તમારી સંસ્થા આ ઉપકરણનું સંચાલન કરે છે અને નેટવર્ક ટ્રાફિફનું નિયમન કરી શકે છે. વિગતો માટે ટૅપ કરો."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"ઍપ તમારા સ્થાનને ઍક્સેસ કરી શકે છે"</string> <string name="location_changed_notification_text" msgid="7158423339982706912">"વધુ જાણવા માટે તમારા IT વ્યવસ્થાપકનો સંપર્ક કરો"</string> @@ -312,7 +312,7 @@ <string name="permgrouplab_calllog" msgid="7926834372073550288">"કૉલ લૉગ"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"ફોન કૉલ લૉગ વાંચો અને લખો"</string> <string name="permgrouplab_phone" msgid="570318944091926620">"ફોન"</string> - <string name="permgroupdesc_phone" msgid="270048070781478204">"ફોન કૉલ કરો અને સંચાલિત કરો"</string> + <string name="permgroupdesc_phone" msgid="270048070781478204">"ફોન કૉલ કરો અને મેનેજ કરો"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"બૉડી સેન્સર"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"તમારા મહત્વપૂર્ણ ચિહ્નો વિશે સેન્સર ડેટા ઍક્સેસ કરો"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"વિંડો કન્ટેન્ટ પુનઃપ્રાપ્ત કરો"</string> @@ -363,7 +363,7 @@ <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"એપ્લિકેશનને WAP સંદેશા પ્રાપ્ત કરવાની અને તેના પર પ્રક્રિયા કરવાની મંજૂરી આપે છે. આ પરવાનગીમાં તમને દર્શાવ્યા વિના તમને મોકલેલ સંદેશાઓનું નિરીક્ષણ કરવાની અને કાઢી નાખવાની ક્ષમતાનો સમાવેશ થાય છે."</string> <string name="permlab_getTasks" msgid="7460048811831750262">"ચાલુ ઍપ્લિકેશનો પુનઃપ્રાપ્ત કરો"</string> <string name="permdesc_getTasks" msgid="7388138607018233726">"એપ્લિકેશનને વર્તમાનમાં અને તાજેતરમાં ચાલી રહેલ Tasks વિશેની વિગતવાર માહિતી પુનઃપ્રાપ્ત કરવાની મંજૂરી આપે છે. આ એપ્લિકેશનને ઉપકરણ પર કઈ એપ્લિકેશન્સનો ઉપયોગ થાય છે તેના વિશેની માહિતી શોધવાની મંજૂરી આપી શકે છે."</string> - <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"પ્રોફાઇલ અને ઉપકરણ માલિકોને સંચાલિત કરો"</string> + <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"પ્રોફાઇલ અને ડિવાઇસ માલિકોને મેનેજ કરો"</string> <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"એપ્લિકેશન્સને પ્રોફાઇલ માલિકો અને ઉપકરણ માલિકો સેટ કરવાની મંજૂરી આપે છે."</string> <string name="permlab_reorderTasks" msgid="7598562301992923804">"ચાલુ એપ્લિકેશન્સને ફરી ગોઠવો"</string> <string name="permdesc_reorderTasks" msgid="8796089937352344183">"ઍપ્લિકેશનને અગ્રભૂમિ અને પૃષ્ટભૂમિમાં Tasks ખસેડવાની મંજૂરી આપે છે. તમારા ઇનપુટ વિના ઍપ્લિકેશન આ કરી શકે છે."</string> @@ -524,7 +524,7 @@ <string name="permdesc_requestPasswordComplexity" msgid="1130556896836258567">"ઍપને સ્ક્રીન લૉકની જટિલતાનું લેવલ (ઊંચું, મધ્યમ, નીચું અથવા કોઈ નહીં) જાણવાની મંજૂરી આપે છે, જે સ્ક્રીન લૉકના પ્રકાર અને લંબાઈની સંભવિત શ્રેણી સૂચવે છે. ઍપ વપરાશકર્તાઓને સ્ક્રીન લૉકને ચોક્કસ લેવલ સુધી અપડેટ કરવાનું સૂચન પણ કરી શકે છે, પરંતુ વપરાશકર્તાઓ મુક્ત રીતે અવગણીને નૅવિગેટ કરી શકે છે. નોંધી લો કે સ્ક્રીન લૉકનો plaintextમાં સંગ્રહ કરવામાં આવતો નથી, તેથી ઍપને ચોક્કસ પાસવર્ડની જાણ હોતી નથી."</string> <string name="permlab_useBiometric" msgid="6314741124749633786">"બાયોમેટ્રિક હાર્ડવેરનો ઉપયોગ કરો"</string> <string name="permdesc_useBiometric" msgid="7502858732677143410">"ઍપને પ્રમાણીકરણ માટે બાયોમેટ્રિક હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string> - <string name="permlab_manageFingerprint" msgid="7432667156322821178">"ફિંગરપ્રિન્ટ હાર્ડવેરને સંચાલિત કરો"</string> + <string name="permlab_manageFingerprint" msgid="7432667156322821178">"ફિંગરપ્રિન્ટ હાર્ડવેરને મેનેજ કરો"</string> <string name="permdesc_manageFingerprint" msgid="2025616816437339865">"ઍપને ઉપયોગ માટે ફિંગરપ્રિન્ટ નમૂના ઉમેરવા અને કાઢી નાખવા માટે પદ્ધતિઓની વિનંતી કરવાની મંજૂરી આપે છે."</string> <string name="permlab_useFingerprint" msgid="1001421069766751922">"ફિંગરપ્રિન્ટ હાર્ડવેરનો ઉપયોગ કરો"</string> <string name="permdesc_useFingerprint" msgid="412463055059323742">"ઍપને પ્રમાણીકરણ માટે ફિંગરપ્રિન્ટ હાર્ડવેરનો ઉપયોગ કરવાની મંજૂરી આપે છે"</string> @@ -627,8 +627,8 @@ <string name="permdesc_register_sim_subscription" msgid="4183858662792232464">"એપ્લિકેશનને નવા ટેલિકોમ સિમ કનેક્શન્સની નોંધણી કરવાની મંજૂરી આપે છે."</string> <string name="permlab_register_call_provider" msgid="6135073566140050702">"નવા ટેલિકોમ કનેક્શન્સની નોંધણી કરો"</string> <string name="permdesc_register_call_provider" msgid="4201429251459068613">"એપ્લિકેશનને નવા ટેલિકોમ કનેક્શન્સની નોંધણી કરવાની મંજૂરી આપે છે."</string> - <string name="permlab_connection_manager" msgid="3179365584691166915">"ટેલિકોમ કનેક્શન્સ સંચાલિત કરો"</string> - <string name="permdesc_connection_manager" msgid="1426093604238937733">"એપ્લિકેશનને ટેલીકોમ કનેક્શન્સને સંચાલિત કરવાની મંજૂરી આપે છે."</string> + <string name="permlab_connection_manager" msgid="3179365584691166915">"ટેલિકોમ કનેક્શનને મેનેજ કરો"</string> + <string name="permdesc_connection_manager" msgid="1426093604238937733">"ઍપને ટેલિકોમ કનેક્શનને મેનેજ કરવાની મંજૂરી આપે છે."</string> <string name="permlab_bind_incall_service" msgid="5990625112603493016">"ઇન-કૉલ સ્ક્રીન વડે ક્રિયાપ્રતિક્રિયા કરો"</string> <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"વપરાશકર્તા ઇન-કૉલ સ્ર્કીન ક્યારે અને કેવી રીતે જુએ છે તે નિયંત્રિત કરવાની એપ્લિકેશનને મંજૂરી આપે છે."</string> <string name="permlab_bind_connection_service" msgid="5409268245525024736">"ટેલિફોની સેવાઓ સાથે વાર્તાલાપ કરો"</string> @@ -637,8 +637,8 @@ <string name="permdesc_control_incall_experience" msgid="5896723643771737534">"એપ્લિકેશનને કૉલમાં વપરાશકર્તા અનુભવ પ્રદાન કરવાની મંજૂરી આપે છે."</string> <string name="permlab_readNetworkUsageHistory" msgid="8470402862501573795">"ઐતિહાસિક નેટવર્ક ઉપયોગ વાંચો"</string> <string name="permdesc_readNetworkUsageHistory" msgid="1112962304941637102">"એપ્લિકેશનને ચોક્કસ નેટવર્ક્સ અને ઍપ્લિકેશનો માટે ઐતિહાસિક નેટવર્ક વપરાશ વાંચવાની મંજૂરી આપે છે."</string> - <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"નેટવર્ક નીતિ સંચાલિત કરો"</string> - <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"ઍપ્લિકેશનને નેટવર્ક નીતિઓ સંચાલિત કરવાની અને ઍપ્લિકેશન-વિશિષ્ટ નિયમો નિર્ધારિત કરવાની મંજૂરી આપે છે."</string> + <string name="permlab_manageNetworkPolicy" msgid="6872549423152175378">"નેટવર્ક નીતિ મેનેજ કરો"</string> + <string name="permdesc_manageNetworkPolicy" msgid="1865663268764673296">"ઍપને નેટવર્ક નીતિઓ મેનેજ કરવાની અને ઍપ-વિશિષ્ટ નિયમો નિર્ધારિત કરવાની મંજૂરી આપે છે."</string> <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"નેટવર્ક વપરાશ એકાઉન્ટિંગ સંશોધિત કરો"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"એપ્લિકેશનને કેવી રીતે ઍપ્લિકેશનો સામે નેટવર્ક વપરાશ ગણવામાં આવે છે તે સંશોધિત કરવાની મંજૂરી આપે છે. સામાન્ય ઍપ્લિકેશનો દ્વારા ઉપયોગમાં લેવા માટે નથી."</string> <string name="permlab_accessNotifications" msgid="7130360248191984741">"ઍક્સેસ સૂચનાઓ"</string> @@ -1426,8 +1426,8 @@ <string name="notification_ranker_binding_label" msgid="432708245635563763">"સૂચના રેંકર સેવા"</string> <string name="vpn_title" msgid="5906991595291514182">"VPN સક્રિય કર્યું"</string> <string name="vpn_title_long" msgid="6834144390504619998">"<xliff:g id="APP">%s</xliff:g> દ્વારા VPN સક્રિય થયું"</string> - <string name="vpn_text" msgid="2275388920267251078">"નેટવર્કને સંચાલિત કરવા માટે ટૅપ કરો."</string> - <string name="vpn_text_long" msgid="278540576806169831">"<xliff:g id="SESSION">%s</xliff:g> થી કનેક્ટ થયાં. નેટવર્કને સંચાલિત કરવા માટે ટૅપ કરો."</string> + <string name="vpn_text" msgid="2275388920267251078">"નેટવર્કને મેનેજ કરવા માટે ટૅપ કરો."</string> + <string name="vpn_text_long" msgid="278540576806169831">"<xliff:g id="SESSION">%s</xliff:g> થી કનેક્ટ થયાં. નેટવર્કને મેનેજ કરવા માટે ટૅપ કરો."</string> <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"હંમેશા-ચાલુ VPN કનેક્ટ થઈ રહ્યું છે…"</string> <string name="vpn_lockdown_connected" msgid="2853127976590658469">"હંમેશા-ચાલુ VPN કનેક્ટ થયું"</string> <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"હંમેશાં-ચાલુ VPN થી ડિસ્કનેક્ટ થયું"</string> @@ -1904,7 +1904,7 @@ <string name="pin_specific_target" msgid="7824671240625957415">"<xliff:g id="LABEL">%1$s</xliff:g>ને પિન કરો"</string> <string name="unpin_target" msgid="3963318576590204447">"અનપિન કરો"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g>ને અનપિન કરો"</string> - <string name="app_info" msgid="6113278084877079851">"ઍપ્લિકેશન માહિતી"</string> + <string name="app_info" msgid="6113278084877079851">"ઍપની માહિતી"</string> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"ડેમો પ્રારંભ કરી રહ્યાં છે…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"ઉપકરણ ફરીથી સેટ કરી રહ્યાં છે…"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 99bcffc7089b..4ae96f6b9932 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1219,7 +1219,7 @@ <string name="volume_music" msgid="7727274216734955095">"Մեդիա ձայնի բարձրություն"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Նվագարկում է Bluetooth-ի միջոցով"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Սահմանվել է անձայն զանգերանգ"</string> - <string name="volume_call" msgid="7625321655265747433">"Մուտքային զանգի ձայնի ուժգնությունը"</string> + <string name="volume_call" msgid="7625321655265747433">"Խոսակցություն"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"Bluetooth-ի ներզանգի բարձրություն"</string> <string name="volume_alarm" msgid="4486241060751798448">"Զարթուցիչի ձայնը"</string> <string name="volume_notification" msgid="6864412249031660057">"Ծանուցումների ձայնի ուժգնությունը"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index a36831965738..7616372bf77d 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1219,7 +1219,7 @@ <string name="volume_music" msgid="7727274216734955095">"Volume media"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Memutar melalui Bluetooth"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Nada dering senyap disetel"</string> - <string name="volume_call" msgid="7625321655265747433">"Volume saat-memanggil"</string> + <string name="volume_call" msgid="7625321655265747433">"Volume dalam panggilan"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"Volume saat-memanggil bluetooth"</string> <string name="volume_alarm" msgid="4486241060751798448">"Volume alarm"</string> <string name="volume_notification" msgid="6864412249031660057">"Volume pemberitahuan"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 78b23aa2a0f2..89da9dd3592e 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1231,7 +1231,7 @@ <string name="volume_icon_description_notification" msgid="579091344110747279">"Volume notifiche"</string> <string name="ringtone_default" msgid="9118299121288174597">"Suoneria predefinita"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Predefinita (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="397111123930141876">"Nessuna"</string> + <string name="ringtone_silent" msgid="397111123930141876">"Nessuno"</string> <string name="ringtone_picker_title" msgid="667342618626068253">"Suonerie"</string> <string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"Suoni delle sveglie"</string> <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"Suoni di notifica"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index aa60234fbc7a..33e517680dbe 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -61,7 +61,7 @@ <string name="ColpMmi" msgid="4736462893284419302">"Қосылған желі идентификаторы"</string> <string name="ColrMmi" msgid="5889782479745764278">"Қосылған желі идентификаторын шектеу"</string> <string name="CfMmi" msgid="8390012691099787178">"Қоңырауды басқа нөмірге бағыттау"</string> - <string name="CwMmi" msgid="3164609577675404761">"Күтудегі қоңырау"</string> + <string name="CwMmi" msgid="3164609577675404761">"Қоңырауды ұстап тұру"</string> <string name="BaMmi" msgid="7205614070543372167">"Қоңырауды бөгеу"</string> <string name="PwdMmi" msgid="3360991257288638281">"Құпия сөз өзгерту"</string> <string name="PinMmi" msgid="7133542099618330959">"PIN өзгерту"</string> @@ -317,7 +317,7 @@ <string name="permgroupdesc_sensors" msgid="2610631290633747752">"ағза күйінің көрсеткіштері туралы сенсор деректеріне қатынасу"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"Терезе мазмұнын оқып отыру"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"Ашық тұрған терезе мазмұнын тексеру."</string> - <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"Explore by Touch функциясын қосу"</string> + <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"Түртілген элементтерді дыбыстау функциясын қосу"</string> <string name="capability_desc_canRequestTouchExploration" msgid="4394677060796752976">"Түртілген элементтер дауыстап айтылады және экранды қимылдар арқылы зерттеуге болады."</string> <string name="capability_title_canRequestFilterKeyEvents" msgid="2772371671541753254">"Терілген мәтінді тексеру"</string> <string name="capability_desc_canRequestFilterKeyEvents" msgid="2381315802405773092">"Несиелік карта нөмірі және құпия сөздер сияқты жеке деректі қоса."</string> @@ -987,9 +987,9 @@ <string name="searchview_description_clear" msgid="1989371719192982900">"Сұрақты өшіру"</string> <string name="searchview_description_submit" msgid="6771060386117334686">"Сұрақ жіберу"</string> <string name="searchview_description_voice" msgid="42360159504884679">"Дауыс арқылы іздеу"</string> - <string name="enable_explore_by_touch_warning_title" msgid="5095399706284943314">"Explore by Touch функциясы қосылсын ба?"</string> - <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> қызметі Explore by Touch мүмкіндігін қосқысы келеді. Explore by Touch мүмкіндігі қосылған кезде, саусағыңыздың астындағы нәрсенің сипаттамаларын естисіз не көресіз немесе планшетпен өзара байланысу үшін қимылдайсыз."</string> - <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> қызметі Explore by Touch мүмкіндігін қосқысы келеді. Explore by Touch мүмкіндігі қосылған кезде, саусағыңыздың астындағы нәрсенің сипаттамаларын естисіз не көресіз немесе телефонмен өзара байланысу үшін қимылдайсыз."</string> + <string name="enable_explore_by_touch_warning_title" msgid="5095399706284943314">"Түртілген элементтерді дыбыстау функциясы қосылсын ба?"</string> + <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> қызметі Түртілген элементтерді дыбыстау функциясын қосуға рұқсат сұрап тұр. Ол қосылған кезде, саусағыңыздың астындағы элементтің сипаттамасын естіп не көріп тұрасыз немесе планшетті қимылмен басқарасыз."</string> + <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> қызметі Түртілген элементтерді дыбыстау функциясын қосуға рұқсат сұрап тұр. Ол қосылған кезде, саусағыңыздың астындағы элементтің сипаттамасын естіп не көріп тұрасыз немесе телефонды қимылмен басқарасыз."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"1 ай бұрын"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Осыған дейін 1 ай бұрын"</string> <plurals name="last_num_days" formatted="false" msgid="687443109145393632"> @@ -1219,9 +1219,9 @@ <string name="volume_music" msgid="7727274216734955095">"Mультимeдиа дыбыс деңгейі"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Bluetooth арқылы ойнату"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Үнсіз қоңырау әуенін орнату"</string> - <string name="volume_call" msgid="7625321655265747433">"Келетін қоңырау дыбысының қаттылығы"</string> + <string name="volume_call" msgid="7625321655265747433">"Сөйлесу кезіндегі дыбыс деңгейі"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"Bluetooth қоңырауының қаттылығы"</string> - <string name="volume_alarm" msgid="4486241060751798448">"Дабыл дыбысының қаттылығы"</string> + <string name="volume_alarm" msgid="4486241060751798448">"Дабыл дыбысының деңгейі"</string> <string name="volume_notification" msgid="6864412249031660057">"Хабар дыбысының қаттылығы"</string> <string name="volume_unknown" msgid="4041914008166576293">"Дыбыс қаттылығы"</string> <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Bluetooth дыбысының қаттылығы"</string> @@ -1307,7 +1307,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Аналогтық аудиожабдық анықталды"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Жалғанған құрылғы бұл телефонмен үйлесімсіз. Қосымша ақпарат алу үшін түртіңіз."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"USB арқылы түзету қосылған"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"USB арқылы түзетуді өшіру үшін түртіңіз"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"USB арқылы түзетуді өшіру үшін түртіңіз."</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB арқылы түзетуді өшіру үшін таңдаңыз."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Сымсыз түзету байланыстырылды"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Сымсыз түзетуді өшіру үшін түртіңіз."</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index c700a3978931..c60727f49cc5 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1219,8 +1219,8 @@ <string name="volume_music" msgid="7727274216734955095">"កម្រិតសំឡេងមេឌៀ"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"ចាក់តាមប៊្លូធូស"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"កំណត់សំឡេងរោទ៍ស្ងាត់"</string> - <string name="volume_call" msgid="7625321655265747433">"កម្រិតសំឡេងហៅចូល"</string> - <string name="volume_bluetooth_call" msgid="2930204618610115061">"កម្រិតសំឡេងហៅចូលតាមប៊្លូធូស"</string> + <string name="volume_call" msgid="7625321655265747433">"កម្រិតសំឡេងក្នុងពេលនិយាយទូរសព្ទ"</string> + <string name="volume_bluetooth_call" msgid="2930204618610115061">"កម្រិតសំឡេងក្នុងពេលនិយាយទូរសព្ទតាមប៊្លូធូស"</string> <string name="volume_alarm" msgid="4486241060751798448">"កម្រិតសំឡេងម៉ោងរោទ៍"</string> <string name="volume_notification" msgid="6864412249031660057">"កម្រិតសំឡេងការជូនដំណឹង"</string> <string name="volume_unknown" msgid="4041914008166576293">"កម្រិតសំឡេង"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 22dc3f14acff..34358c4789d0 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1221,7 +1221,7 @@ <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"ಶಾಂತ ರಿಂಗ್ಟೋನ್ ಹೊಂದಿಸಲಾಗಿದೆ"</string> <string name="volume_call" msgid="7625321655265747433">"ಒಳ-ಕರೆಯ ವಾಲ್ಯೂಮ್"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"ಬ್ಲೂಟೂತ್ ಒಳ-ಕರೆಯ ವಾಲ್ಯೂಮ್"</string> - <string name="volume_alarm" msgid="4486241060751798448">"ಅಲಾರಮ್ ವಾಲ್ಯೂಮ್"</string> + <string name="volume_alarm" msgid="4486241060751798448">"ಅಲಾರಂ ವಾಲ್ಯೂಮ್"</string> <string name="volume_notification" msgid="6864412249031660057">"ಅಧಿಸೂಚನೆಯ ವಾಲ್ಯೂಮ್"</string> <string name="volume_unknown" msgid="4041914008166576293">"ವಾಲ್ಯೂಮ್"</string> <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"ಬ್ಲೂಟೂತ್ ವಾಲ್ಯೂಮ್"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 30b2525f6b6d..d21acfb3577d 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -857,12 +857,12 @@ <string name="lockscreen_sim_puk_locked_instructions" msgid="5307979043730860995">"Колдонуучунун нускамасын караңыз же Кардарларды тейлөө борборуна кайрылыңыз."</string> <string name="lockscreen_sim_locked_message" msgid="3160196135801185938">"SIM-карта бөгөттөлгөн."</string> <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="2286497117428409709">"SIM-карта бөгөттөн чыгарылууда…"</string> - <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6458790975898594240">"Кулпуну ачуу үлгүсүн <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> + <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6458790975898594240">"Графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="3118353451602377380">"Сырсөзүңүздү <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тердиңиз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="2874278239714821984">"PIN-кодуңузду <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тердиңиз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"Кулпуну ачуу үлгүсүн <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> жолу туура эмес тартсаңыз, планшетиңиздин кулпусун Google\'га кирип ачууга туура келет.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="3069635524964070596">"Графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> жолу туура эмес тартсаңыз, планшетиңиздин кулпусун Google\'га кирип ачууга туура келет.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="6399092175942158529">"Графикалык ачкычыңызды <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес чийдиңиз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> ийгиликсиз аракеттен кийин, Android TV түзмөгүңүздүн кулпусун Google аккаунтуңузга кирип ачышыңыз керек болот.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секунддан кийин кайталап көрүңүз."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"Кулпуну ачуу үлгүсүн <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> жолу туура эмес тартсаңыз, телефонуңуздун кулпусун Google\'га кирип ачууга туура келет.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="5691623136957148335">"Графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> жолу туура эмес тартсаңыз, телефонуңуздун кулпусун Google\'га кирип ачууга туура келет.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундадан кийин дагы аракет кылып көрүңүз."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="7914445759242151426">"Сиз планшетиңизди бөгөттөн чыгарууга <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес аракет кылдыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> аракеттен кийин, планшет баштапкы абалына келтирилет жана бардык маалыматтар өчүрүлөт."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="4275591249631864248">"Android TV түзмөгүңүздүн кулпусун <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес ачууга аракет жасадыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> ийгиликсиз аракеттен кийин, Android TV түзмөгүңүз демейки жөндөөлөргө кайтарылып, бардык колдонуучу дайындары жоголот."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="1166532464798446579">"Сиз телефонуңузду бөгөттөн чыгарууга <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес аракет кылдыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> аракеттен кийин, телефон баштапкы абалына келтирилет жана бардык маалыматтар өчүрүлөт."</string> @@ -1219,7 +1219,7 @@ <string name="volume_music" msgid="7727274216734955095">"Мультимедианын катуулугу"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Bluetooth аркылуу ойнотулууда"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Үнсүз рингтон орнотулду"</string> - <string name="volume_call" msgid="7625321655265747433">"Чалуудагы үн көлөмү"</string> + <string name="volume_call" msgid="7625321655265747433">"Сүйлөшүүнүн катуулугу"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"Bluetooth чалуудагы үн көлөмү"</string> <string name="volume_alarm" msgid="4486241060751798448">"Ойготкучтун катуулугу"</string> <string name="volume_notification" msgid="6864412249031660057">"Эскертме үн көлөмү"</string> @@ -1792,7 +1792,7 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Администраторуңуз жаңыртып койгон"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Администраторуңуз жок кылып салган"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"ЖАРАЙТ"</string> - <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Батареянын мөөнөтүн узартуу үчүн, Батареяны үнөмдөгүч режими төмөнкүлөрдү аткарат:\n\n•Караңгы теманы күйгүзөт\n•Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Батареянын мөөнөтүн узартуу үчүн Батареяны үнөмдөгүч режими төмөнкүлөрдү аткарат:\n\n•Караңгы теманы күйгүзөт\n•Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт\n\n"<annotation id="url">"Кеңири маалымат"</annotation></string> <string name="battery_saver_description" msgid="8587408568232177204">"Батареянын иштешин узартуу үчүн, Батареяны үнөмдөөчү режим:\n\n•Караңгы теманы күйгүзөт\n•Фондогу аракеттерди, айрым визуалдык эффекттерди жана \"Окей Google\" сыяктуу башка функцияларды өчүрөт же чектейт"</string> <string name="data_saver_description" msgid="4995164271550590517">"Трафикти үнөмдөө режиминде айрым колдонмолор дайын-даректерди фондо өткөрө алышпайт. Учурда сиз пайдаланып жаткан колдонмо дайын-даректерди жөнөтүп/ала алат, бирок адаттагыдан азыраак өткөргөндүктөн, анын айрым функциялары талаптагыдай иштебей коюшу мүмкүн. Мисалы, сүрөттөр басылмайынча жүктөлбөйт."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"Трафикти үнөмдөө режимин иштетесизби?"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 50630027fb40..35d39cb7a87e 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -155,19 +155,19 @@ <string name="fcError" msgid="5325116502080221346">"Проблем со поврзувањето или неважечки код за карактеристиката."</string> <string name="httpErrorOk" msgid="6206751415788256357">"Во ред"</string> <string name="httpError" msgid="3406003584150566720">"Настана грешка на мрежа."</string> - <string name="httpErrorLookup" msgid="3099834738227549349">"Не можеше да се најде URL."</string> + <string name="httpErrorLookup" msgid="3099834738227549349">"Не може да се најде URL."</string> <string name="httpErrorUnsupportedAuthScheme" msgid="3976195595501606787">"Шемата за автентикација на локацијата не е поддржана."</string> - <string name="httpErrorAuth" msgid="469553140922938968">"Не можеше да се автентицира."</string> + <string name="httpErrorAuth" msgid="469553140922938968">"Не може да се автентицира."</string> <string name="httpErrorProxyAuth" msgid="7229662162030113406">"Автентикацијата преку прокси серверот беше неуспешна."</string> - <string name="httpErrorConnect" msgid="3295081579893205617">"Не можеше да се поврзе со серверот."</string> - <string name="httpErrorIO" msgid="3860318696166314490">"Не можеше да се комуницира со серверот. Обидете се повторно подоцна."</string> + <string name="httpErrorConnect" msgid="3295081579893205617">"Не може да се поврзе со серверот."</string> + <string name="httpErrorIO" msgid="3860318696166314490">"Не може да се комуницира со серверот. Обидете се повторно подоцна."</string> <string name="httpErrorTimeout" msgid="7446272815190334204">"Времето за поврзување до серверот истече."</string> <string name="httpErrorRedirectLoop" msgid="8455757777509512098">"Страницата содржи премногу пренасочувања од серверот."</string> <string name="httpErrorUnsupportedScheme" msgid="2664108769858966374">"Протоколот не е поддржан."</string> - <string name="httpErrorFailedSslHandshake" msgid="546319061228876290">"Не можеше да се воспостави безбедна врска."</string> - <string name="httpErrorBadUrl" msgid="754447723314832538">"Страницата не можеше да се отвори, бидејќи URL е неважечки."</string> - <string name="httpErrorFile" msgid="3400658466057744084">"Не можеше да се пристапи до датотеката."</string> - <string name="httpErrorFileNotFound" msgid="5191433324871147386">"Не можеше да се најде бараната датотека."</string> + <string name="httpErrorFailedSslHandshake" msgid="546319061228876290">"Не може да се воспостави безбедна врска."</string> + <string name="httpErrorBadUrl" msgid="754447723314832538">"Страницата не може да се отвори, бидејќи URL е неважечки."</string> + <string name="httpErrorFile" msgid="3400658466057744084">"Не може да се пристапи до датотеката."</string> + <string name="httpErrorFileNotFound" msgid="5191433324871147386">"Не може да се најде бараната датотека."</string> <string name="httpErrorTooManyRequests" msgid="2149677715552037198">"Се обработуваат премногу барања. Обидете се повторно подоцна."</string> <string name="notification_title" msgid="5783748077084481121">"Грешка при пријавување за <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> <string name="contentServiceSync" msgid="2341041749565687871">"Синхронизирај"</string> @@ -543,7 +543,7 @@ <string name="biometric_error_canceled" msgid="8266582404844179778">"Проверката е откажана"</string> <string name="biometric_error_device_not_secured" msgid="3129845065043995924">"Не е поставен PIN, шема или лозинка"</string> <string name="fingerprint_acquired_partial" msgid="8532380671091299342">"Откриен е делумен отпечаток. Обидете се повторно."</string> - <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Отпечатокот не можеше да се обработи. Обидете се повторно."</string> + <string name="fingerprint_acquired_insufficient" msgid="2545149524031515411">"Отпечатокот не може да се обработи. Обидете се повторно."</string> <string name="fingerprint_acquired_imager_dirty" msgid="4694800187151533990">"Сензорот за отпечатоци е валкан. Исчистете го и обидете се повторно."</string> <string name="fingerprint_acquired_too_fast" msgid="5151661932298844352">"Прстот се движеше пребрзо. Обидете се повторно."</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"Прстот се движеше премногу бавно. Обидете се повторно."</string> @@ -1396,7 +1396,7 @@ <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"прашај дали да се игнорираат оптимизациите на батеријата"</string> <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"Овозможува апликацијата да побара дозвола за игнорирање на оптимизациите на батеријата за таа апликација."</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"Допрете двапати за контрола на зумот"</string> - <string name="gadget_host_error_inflating" msgid="2449961590495198720">"Не можеше да се додаде виџет."</string> + <string name="gadget_host_error_inflating" msgid="2449961590495198720">"Не може да се додаде виџет."</string> <string name="ime_action_go" msgid="5536744546326495436">"Оди"</string> <string name="ime_action_search" msgid="4501435960587287668">"Пребарај"</string> <string name="ime_action_send" msgid="8456843745664334138">"Испрати"</string> @@ -1431,7 +1431,7 @@ <string name="vpn_lockdown_connecting" msgid="6096725311950342607">"Поврзување со секогаш вклучена VPN..."</string> <string name="vpn_lockdown_connected" msgid="2853127976590658469">"Поврзани со секогаш вклучена VPN"</string> <string name="vpn_lockdown_disconnected" msgid="5573611651300764955">"Исклучено од секогаш вклучената VPN"</string> - <string name="vpn_lockdown_error" msgid="4453048646854247947">"Не можеше да се поврзе на секогаш вклучената VPN"</string> + <string name="vpn_lockdown_error" msgid="4453048646854247947">"Не може да се поврзе на секогаш вклучената VPN"</string> <string name="vpn_lockdown_config" msgid="8331697329868252169">"Променете ја мрежата или поставките за VPN"</string> <string name="upload_file" msgid="8651942222301634271">"Избери датотека"</string> <string name="no_file_chosen" msgid="4146295695162318057">"Не е избрана датотека"</string> @@ -1975,9 +1975,9 @@ <string name="popup_window_default_title" msgid="6907717596694826919">"Појавен прозорец"</string> <string name="slice_more_content" msgid="3377367737876888459">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string> <string name="shortcut_restored_on_lower_version" msgid="9206301954024286063">"Верзијата на апликацијата е постара или не е компатибилна со кратенкава"</string> - <string name="shortcut_restore_not_supported" msgid="4763198938588468400">"Не можеше да се врати кратенката бидејќи апликацијата не поддржува бекап и враќање"</string> - <string name="shortcut_restore_signature_mismatch" msgid="579345304221605479">"Не можеше да се врати кратенката бидејќи потписот на апликацијата не се совпаѓа"</string> - <string name="shortcut_restore_unknown_issue" msgid="2478146134395982154">"Не можеше да се врати кратенката"</string> + <string name="shortcut_restore_not_supported" msgid="4763198938588468400">"Не може да се врати кратенката бидејќи апликацијата не поддржува бекап и враќање"</string> + <string name="shortcut_restore_signature_mismatch" msgid="579345304221605479">"Не може да се врати кратенката бидејќи потписот на апликацијата не се совпаѓа"</string> + <string name="shortcut_restore_unknown_issue" msgid="2478146134395982154">"Не може да се врати кратенката"</string> <string name="shortcut_disabled_reason_unknown" msgid="753074793553599166">"Кратенката е оневозможена"</string> <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"ДЕИНСТАЛИРАЈ"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"СЕПАК ОТВОРИ"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 9ef1402491bf..656227a04835 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -273,7 +273,7 @@ <string name="notification_channel_car_mode" msgid="2123919247040988436">"Машины горим"</string> <string name="notification_channel_account" msgid="6436294521740148173">"Бүртгэлийн төлөв"</string> <string name="notification_channel_developer" msgid="1691059964407549150">"Хөгжүүлэгчийн мессеж"</string> - <string name="notification_channel_developer_important" msgid="7197281908918789589">"Хөгжүүлэгчийн чухал зурвас"</string> + <string name="notification_channel_developer_important" msgid="7197281908918789589">"Хөгжүүлэгчийн чухал мессеж"</string> <string name="notification_channel_updates" msgid="7907863984825495278">"Шинэчлэлтүүд"</string> <string name="notification_channel_network_status" msgid="2127687368725272809">"Сүлжээний төлөв"</string> <string name="notification_channel_network_alerts" msgid="6312366315654526528">"Сүлжээний сануулга"</string> @@ -356,9 +356,9 @@ <string name="permlab_sendSms" msgid="7757368721742014252">"SMS мессежийг илгээх, харах"</string> <string name="permdesc_sendSms" msgid="6757089798435130769">"Апп нь SMS мессеж илгээх боломжтой. Энэ нь санаандгүй төлбөрт оруулж болзошгүй. Хортой апп нь таны зөвшөөрөлгүйгээр мессеж илгээн таныг төлбөрт оруулж болзошгүй."</string> <string name="permlab_readSms" msgid="5164176626258800297">"таны текст мессежийг унших(SMS эсвэл MMS)"</string> - <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"Энэ апп таны таблетад хадгалсан бүх SMS (текст) зурвасыг унших боломжтой."</string> + <string name="permdesc_readSms" product="tablet" msgid="7912990447198112829">"Энэ апп таны таблетад хадгалсан бүх SMS (текст) мессежийг унших боломжтой."</string> <string name="permdesc_readSms" product="tv" msgid="3054753345758011986">"Энэ апп таны Android TV төхөөрөмжид хадгалсан бүх SMS (текст) мессежийг уншиж чадна."</string> - <string name="permdesc_readSms" product="default" msgid="774753371111699782">"Энэ апп таны утсанд хадгалсан бүх SMS (текст) зурвасыг унших боломжтой."</string> + <string name="permdesc_readSms" product="default" msgid="774753371111699782">"Энэ апп таны утсанд хадгалсан бүх SMS (текст) мессежийг унших боломжтой."</string> <string name="permlab_receiveWapPush" msgid="4223747702856929056">"текст мессеж(WAP) хүлээн авах"</string> <string name="permdesc_receiveWapPush" msgid="1638677888301778457">"Апп нь WAP мессежийг хүлээн авах болон биелүүлэх боломжтой. Энэ зөвшөөрөл нь танд илгээсэн мессежийг танд харуулалгүйгээр хянах эсвэл устгах боломжийг агуулна."</string> <string name="permlab_getTasks" msgid="7460048811831750262">"ажиллаж байгаа апп-г дуудах"</string> @@ -416,9 +416,9 @@ <string name="permdesc_readCalendar" product="tv" msgid="5811726712981647628">"Энэ апп таны Android TV төхөөрөмжид хадгалсан календарийн бүх арга хэмжээг унших болон таны календарийн өгөгдлийг хуваалцах эсвэл хадгалах боломжтой."</string> <string name="permdesc_readCalendar" product="default" msgid="9118823807655829957">"Энэ апп таны утсанд хадгалсан хуанлийн бүх арга хэмжээг унших, хуанлийн өгөгдлийг хуваалцах, хадгалах боломжтой."</string> <string name="permlab_writeCalendar" msgid="6422137308329578076">"календарын хуваарийг нэмэх эсвэл өөрчлөх болон эзэмшигчид мэдэгдэлгүйгээр зочидруу имэйл илгээх"</string> - <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Энэ апп таны таблет дээр хуанлийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь хуанли эзэмшигчээс зурвас илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> + <string name="permdesc_writeCalendar" product="tablet" msgid="8722230940717092850">"Энэ апп таны таблет дээр хуанлийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь хуанли эзэмшигчээс мессеж илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"Энэ апп таны Android TV төхөөрөмжид календарийн арга хэмжээ нэмэх, үүнийг устгах, эсвэл өөрчлөх боломжтой. Энэ апп календарийн өмчлөгчөөс ирсэн мэт харагдаж болох мессеж илгээх эсвэл арга хэмжээг өмчлөгчид нь мэдэгдэлгүйгээр өөрчлөх боломжтой."</string> - <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"Энэ апп таны утсанд хуанлийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь хуанли эзэмшигчээс зурвас илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> + <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"Энэ апп таны утсанд хуанлийн арга хэмжээг нэмэх, устгах, эсвэл өөрчлөх боломжтой. Энэ апп нь хуанли эзэмшигчээс мессеж илгээсэн мэт харагдах, эсвэл эзэмшигчид мэдэгдэлгүйгээр арга хэмжээг өөрчлөх боломжтой."</string> <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"байршил нийлүүлэгчийн нэмэлт тушаалд хандах"</string> <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"Апп нь байршил нийлүүлэгчийн нэмэлт тушаалд хандах боломжтой. Энэ нь апп-д GPS эсвэл бусад байршлын үйлчилгээний ажиллагаанд нөлөөлөх боломжийг олгоно."</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"нарийвчилсан байршилд зөвхөн нүүр хэсэгт хандах"</string> @@ -661,8 +661,8 @@ <string name="permdesc_handoverStatus" msgid="3842269451732571070">"Одоогийн Андройд Бийм дамжуулалтын мэдээллийг хүлээн авахыг аппликейшнд зөвшөөрөх"</string> <string name="permlab_removeDrmCertificates" msgid="710576248717404416">"DRM сертификатыг устгах"</string> <string name="permdesc_removeDrmCertificates" msgid="4068445390318355716">"Аппликейшнд DRM сертификатыг устгахыг зөвшөөрнө. Энгийн апп-уудад хэзээ ч ашиглагдахгүй."</string> - <string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"зөөгч зурвасын үйлчилгээнд холбох"</string> - <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Эзэмшигчид зөөгч зурвасын үйлчилгээний түвшний интерфэйст холбогдохыг зөвшөөрдөг. Энгийн апп-д шаардлагагүй."</string> + <string name="permlab_bindCarrierMessagingService" msgid="3363450860593096967">"зөөгч мессежийн үйлчилгээнд холбох"</string> + <string name="permdesc_bindCarrierMessagingService" msgid="6316457028173478345">"Эзэмшигчид зөөгч мессежийн үйлчилгээний түвшний интерфэйст холбогдохыг зөвшөөрдөг. Энгийн апп-д шаардлагагүй."</string> <string name="permlab_bindCarrierServices" msgid="2395596978626237474">"Үүрэн холбооны үйлчилгээ үзүүлэгчтэй холбогдох"</string> <string name="permdesc_bindCarrierServices" msgid="9185614481967262900">"Аливаа эзэмшигчийг үүрэн холбооны үйлчилгээ үзүүлэгчтэй холбодог. Энгийн аппд шаардлагагүй."</string> <string name="permlab_access_notification_policy" msgid="5524112842876975537">"Бүү саад бол тохируулгад хандалт хийх"</string> @@ -959,7 +959,7 @@ <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="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> @@ -1893,7 +1893,7 @@ <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%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> + <string name="new_sms_notification_title" msgid="6528758221319927107">"Танд шинэ мессежүүд байна"</string> <string name="new_sms_notification_content" msgid="3197949934153460639">"Үзэхийн тулд SMS аппыг нээх"</string> <string name="profile_encrypted_title" msgid="9001208667521266472">"Зарим функцийг хязгаарласан байж болзошгүй"</string> <string name="profile_encrypted_detail" msgid="5279730442756849055">"Ажлын профайлыг түгжсэн"</string> @@ -1961,7 +1961,7 @@ <string name="etws_primary_default_message_earthquake" msgid="8401079517718280669">"Тайван байж, ойролцоох нуугдах газар хайна уу."</string> <string name="etws_primary_default_message_tsunami" msgid="5828171463387976279">"Эргийн бүс, голын эргийн бүсээс өндөрлөг газар зэрэг аюулгүй газар руу нэн даруй шилжинэ үү."</string> <string name="etws_primary_default_message_earthquake_and_tsunami" msgid="4888224011071875068">"Тайван байж, ойролцоох нуугдах газар хайна уу."</string> - <string name="etws_primary_default_message_test" msgid="4583367373909549421">"Онцгой байдлын зурвасын тест"</string> + <string name="etws_primary_default_message_test" msgid="4583367373909549421">"Онцгой байдлын мессежийн тест"</string> <string name="notification_reply_button_accessibility" msgid="5235776156579456126">"Хариу бичих"</string> <string name="etws_primary_default_message_others" msgid="7958161706019130739"></string> <string name="mmcc_authentication_reject" msgid="4891965994643876369">"SIM-г дуу хоолойд зөвшөөрдөггүй"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 46ab05094b4f..d639d3954b38 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -142,7 +142,7 @@ <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"Wi-Fi"</string> <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"WiFi कलिङ"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> - <string name="wifi_calling_off_summary" msgid="5626710010766902560">"निष्क्रिय"</string> + <string name="wifi_calling_off_summary" msgid="5626710010766902560">"अफ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Wi-Fi मार्फत कल गर्नुहोस्"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"मोबाइल नेटवर्कमार्फत कल गर्नुहोस्"</string> <string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Wi-Fi मात्र"</string> @@ -201,7 +201,7 @@ <string name="factory_reset_message" msgid="2657049595153992213">"प्रशासकको एप प्रयोग गर्न मिल्दैन। तपाईंको यन्त्रको डेटा अब मेटाइने छ।\n\nतपाईंसँग प्रश्नहरू भएका खण्डमा आफ्नो संगठनका प्रशासकसँग सम्पर्क गर्नुहोस्।"</string> <string name="printing_disabled_by" msgid="3517499806528864633">"<xliff:g id="OWNER_APP">%s</xliff:g> ले छाप्ने कार्यलाई असक्षम पार्यो।"</string> <string name="personal_apps_suspension_title" msgid="7561416677884286600">"आफ्नो कार्य प्रोफाइल सक्रिय गर्नुहोस्"</string> - <string name="personal_apps_suspension_text" msgid="6115455688932935597">"तपाईंले आफ्नो कार्य प्रोफाइल सक्रिय नगरुन्जेल तपाईंका व्यक्तिगत अनुप्रयोगहरूलाई रोक लगाइन्छ"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"तपाईंले आफ्नो कार्य प्रोफाइल सक्रिय नगरुन्जेल तपाईंका व्यक्तिगत एपहरूलाई रोक लगाइन्छ"</string> <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"मिति <xliff:g id="DATE">%1$s</xliff:g> <xliff:g id="TIME">%2$s</xliff:g> बजे व्यक्तिगत एपहरूलाई रोक लगाइने छ। तपाईंका IT एडमिन तपाईंलाई आफ्नो कार्य प्रोफाइल <xliff:g id="NUMBER">%3$d</xliff:g> भन्दा धेरै दिन निष्क्रिय राख्ने अनुमति दिनुहुन्न।"</string> <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"सक्रिय गर्नुहोस्"</string> <string name="me" msgid="6207584824693813140">"मलाई"</string> @@ -229,7 +229,7 @@ <string name="shutdown_confirm" product="default" msgid="136816458966692315">"तपाईँको फोन बन्द हुने छ।"</string> <string name="shutdown_confirm_question" msgid="796151167261608447">"के तपाईं बन्द गर्न चाहनुहुन्छ?"</string> <string name="reboot_safemode_title" msgid="5853949122655346734">"सुरक्षित मोडमा पुनःबुट गर्नुहोस्"</string> - <string name="reboot_safemode_confirm" msgid="1658357874737219624">"सुरक्षित मोडमा तपाईं पुनःबुट गर्न चाहनु हुन्छ? तपाईंले स्थापना गरेका सबै तेस्रो पक्षका अनुप्रयोगहरूलाई असक्षम गराउने छ।"</string> + <string name="reboot_safemode_confirm" msgid="1658357874737219624">"सुरक्षित मोडमा तपाईं पुनःबुट गर्न चाहनु हुन्छ? तपाईंले स्थापना गरेका सबै तेस्रो पक्षका एपहरूलाई असक्षम गराउने छ।"</string> <string name="recent_tasks_title" msgid="8183172372995396653">"नयाँ"</string> <string name="no_recent_tasks" msgid="9063946524312275906">"कुनै नयाँ एपहरू छैनन्।"</string> <string name="global_actions" product="tablet" msgid="4412132498517933867">"ट्याब्लेट विकल्पहरू"</string> @@ -364,13 +364,13 @@ <string name="permlab_getTasks" msgid="7460048811831750262">"चलिरहेका एपहरू पुनःबहाली गर्नुहोस्"</string> <string name="permdesc_getTasks" msgid="7388138607018233726">"वर्तमानमा र भरखरै चलिरहेका कार्यहरू बारेको सूचना पुनःबहाली गर्न एपलाई अनुमित दिन्छ। यसले उपकरणमा प्रयोग भएका अनुप्रयोगहरूको बारेमा सूचना पत्ता लगाउन एपलाई अनुमति दिन सक्छ।"</string> <string name="permlab_manageProfileAndDeviceOwners" msgid="639849495253987493">"प्रोफाइल र यन्त्र मालिकहरूको व्यवस्थापन गराउनुहोस्"</string> - <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"अनुप्रयोगहरूलाई प्रोफाइल र यन्त्र मालिकहरू सेट गर्न अनुमति दिनुहोस्।"</string> - <string name="permlab_reorderTasks" msgid="7598562301992923804">"चलिरहेका अनुप्रयोगहरूलाई पुनःक्रम गराउनुहोस्"</string> + <string name="permdesc_manageProfileAndDeviceOwners" msgid="7304240671781989283">"एपहरूलाई प्रोफाइल र यन्त्र मालिकहरू सेट गर्न अनुमति दिनुहोस्।"</string> + <string name="permlab_reorderTasks" msgid="7598562301992923804">"चलिरहेका एपहरूलाई पुनःक्रम गराउनुहोस्"</string> <string name="permdesc_reorderTasks" msgid="8796089937352344183">"कामहरूलाई अग्रभाग र पृष्ठभूमिमा सार्न एपलाई अनुमति दिन्छ। अनुप्रयोगले यो तपाईँको इनपुट बिना नै गर्न सक्छ।"</string> <string name="permlab_enableCarMode" msgid="893019409519325311">"कार मोड सक्षम गर्नुहोस्"</string> <string name="permdesc_enableCarMode" msgid="56419168820473508">"कार मोडलाई सक्षम पार्न एपलाई अनुमति दिन्छ।"</string> <string name="permlab_killBackgroundProcesses" msgid="6559320515561928348">"एपहरू बन्द गर्नुहोस्"</string> - <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"एपलाई अन्य अनुप्रयोगहरूको पृष्ठभूमि प्रक्रियाहरू बन्द गर्न अनुमति दिन्छ। यसले अन्य अनुप्रयोगहरूलाई चल्नबाट रोक्न सक्दछ।"</string> + <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"एपलाई अन्य अनुप्रयोगहरूको पृष्ठभूमि प्रक्रियाहरू बन्द गर्न अनुमति दिन्छ। यसले अन्य एपहरूलाई चल्नबाट रोक्न सक्दछ।"</string> <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"यो एप अन्य एपहरूमाथि देखा पर्न सक्छ"</string> <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"यो एप अन्य एपहरूमाथि वा स्क्रिनका अन्य भागहरूमा देखा पर्न सक्छ। यसले एपको सामान्य प्रयोगमा अवरोध पुर्याउन सक्छ र अन्य एपहरू देखा पर्ने तरिकालाई परिवर्तन गर्न सक्छ।"</string> <string name="permlab_runInBackground" msgid="541863968571682785">"पृष्ठभूमिमा चलाउनुहोस्"</string> @@ -378,7 +378,7 @@ <string name="permlab_useDataInBackground" msgid="783415807623038947">"पृष्ठभूमिमा डेटा प्रयोग गर्नुहोस्"</string> <string name="permdesc_useDataInBackground" msgid="1230753883865891987">"यो अनुप्रयोगले पृष्ठभूमिमा डेटा प्रयोग गर्नसक्छ। यसले गर्दा धेरै डेटा प्रयोग हुनसक्छ।"</string> <string name="permlab_persistentActivity" msgid="464970041740567970">"एपहरू जहिले पनि चल्ने बनाउनुहोस्"</string> - <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"यसको आफ्नै मेमोरीमा दृढ भएकोको अंश बनाउनको लागि एपलाई अनुमति दिन्छ। ट्याब्लेटलाई ढिलो गराउँदै गरेका अन्य अनुप्रयोगहरूलाई सीमित मात्रामा यसले मेमोरी उपलब्ध गराउन सक्छ।"</string> + <string name="permdesc_persistentActivity" product="tablet" msgid="6055271149187369916">"यसको आफ्नै मेमोरीमा दृढ भएकोको अंश बनाउनको लागि एपलाई अनुमति दिन्छ। ट्याब्लेटलाई ढिलो गराउँदै गरेका अन्य एपहरूलाई सीमित मात्रामा यसले मेमोरी उपलब्ध गराउन सक्छ।"</string> <string name="permdesc_persistentActivity" product="tv" msgid="6800526387664131321">"एपलाई आफ्ना केही अंशहरू मेमोरीमा स्थायी रूपमा राख्ने अनुमति दिन्छ। यसले गर्दा अन्य अनुप्रयोगहरूका लागि मेमोरीको अभाव हुन सक्ने भएकाले तपाईंको Android टिभी यन्त्र सुस्त हुन सक्छ।"</string> <string name="permdesc_persistentActivity" product="default" msgid="1914841924366562051">"एपलाई मेमोरीमा आफैंको निरन्तरको अंश बनाउन अनुमति दिन्छ। यसले फोनलाई ढिला बनाएर अन्य एपहरूमा मेमोरी SIMित गर्न सक्दछन्।"</string> <string name="permlab_foregroundService" msgid="1768855976818467491">"अग्रभूमिको सेवा सञ्चालन गर्नुहोस्"</string> @@ -396,9 +396,9 @@ <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"एपलाई प्रसारण समाप्त भइसकेपछि पनि रहिरहने स्टिकी प्रसारणहरू पठाउने अनुमति दिन्छ। यो सुविधाको अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग हुने भएकाले तपाईंको Android टिभी यन्त्र सुस्त वा अस्थिर हुन सक्छ।"</string> <string name="permdesc_broadcastSticky" product="default" msgid="134529339678913453">"औपचारिक प्रसारणलाई पठाउनको लागि एक एपलाई अनुमति दिन्छ, जुन प्रसारण समाप्त भएपछि बाँकी रहन्छ। अत्यधिक प्रयोगले धेरै मेमोरी प्रयोग गरेको कारणले फोनलाई ढिलो र अस्थिर बनाउन सक्छ।"</string> <string name="permlab_readContacts" msgid="8776395111787429099">"तपाईँका सम्पर्कहरू पढ्नुहोस्"</string> - <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"एपलाई तपाईंको ट्याब्लेटमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको ट्याब्लेटमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> - <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"एपलाई तपाईंको Android टिभी यन्त्रमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा पढ्न अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको Android टिभी यन्त्रमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> - <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"एपलाई तपाईंको फोनमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको फोनमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले अनुप्रयोगहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> + <string name="permdesc_readContacts" product="tablet" msgid="6430093481659992692">"एपलाई तपाईंको ट्याब्लेटमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको ट्याब्लेटमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> + <string name="permdesc_readContacts" product="tv" msgid="8400138591135554789">"एपलाई तपाईंको Android टिभी यन्त्रमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा पढ्न अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको Android टिभी यन्त्रमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> + <string name="permdesc_readContacts" product="default" msgid="4911989776203207644">"एपलाई तपाईंको फोनमा भण्डार गरिएका सम्पर्क ठेगानाहरूसँग सम्बन्धित डेटा पढ्ने अनुमति दिन्छ। एपहरूले सम्पर्क ठेगानाहरू बनाउने तपाईंको फोनमा भण्डार गरिएका खाताहरूमाथि पनि पहुँच प्राप्त गर्ने छन्। यसमा तपाईंले स्थापना गरेका एपहरूले बनाएका खाताहरू पर्न सक्छन्। यस अनुमतिले एपहरूलाई तपाईंको सम्पर्क ठेगानासम्बन्धी डेटा सुरक्षित गर्न दिने भएकाले हानिकारक एपहरूले तपाईंलाई थाहै नदिइकन सम्पर्क ठेगानासम्बन्धी डेटा आदान प्रदान गर्न सक्छन्।"</string> <string name="permlab_writeContacts" msgid="8919430536404830430">"तपाईँका सम्पर्कहरू परिवर्तन गर्नुहोस्"</string> <string name="permdesc_writeContacts" product="tablet" msgid="6422419281427826181">"एपलाई तपाईंको ट्याब्लेटमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले एपलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> <string name="permdesc_writeContacts" product="tv" msgid="6488872735379978935">"एपलाई तपाईंको Android टिभी यन्त्रमा भण्डारण गरिएका सम्पर्क ठेगानासम्बन्धी डेटा परिमार्जन गर्न अनुमति दिन्छ। यो अनुमतिले एपलाई सम्पर्क ठेगानासम्बन्धी डेटा मेटाउन अनुमति दिन्छ।"</string> @@ -614,7 +614,7 @@ <string name="permlab_readSyncSettings" msgid="6250532864893156277">"समीकरण सेटिङहरू पढ्नुहोस्"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"एपलाई खाताको लागि सिंक सेटिङहरू पढ्न अनुमति दिन्छ। उदाहरणको लागि यसले व्यक्तिहरको एप खातासँग सिंक भएको नभएको निर्धारण गर्न सक्दछ।"</string> <string name="permlab_writeSyncSettings" msgid="6583154300780427399">"टगल सिंक खुला र बन्द"</string> - <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"अनुप्रयोगहरूलाई खाताको लागि सिंक सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ। उदाहरणको लागि, यो खातासँग व्यक्ति एपको सिंक सक्षम गर्न प्रयोग गर्न सकिन्छ।"</string> + <string name="permdesc_writeSyncSettings" msgid="6029151549667182687">"एपहरूलाई खाताको लागि सिंक सेटिङहरू परिमार्जन गर्न अनुमति दिन्छ। उदाहरणको लागि, यो खातासँग व्यक्ति एपको सिंक सक्षम गर्न प्रयोग गर्न सकिन्छ।"</string> <string name="permlab_readSyncStats" msgid="3747407238320105332">"सिंक तथ्याङ्कहरू पढ्नुहोस्"</string> <string name="permdesc_readSyncStats" msgid="3867809926567379434">"एपलाई खाताको लागि समीकरणको आँकडा समीकरण घटनाहरूको इतिहास र समीकरण गरिएको डेटाको मापन समेत, पढ्न अनुमति दिन्छ।"</string> <string name="permlab_sdcardRead" msgid="5791467020950064920">"आफ्नो आदान प्रदान गरिएको भण्डारणको सामग्रीहरूहरू पढ्नुहोस्"</string> @@ -642,9 +642,9 @@ <string name="permlab_modifyNetworkAccounting" msgid="7448790834938749041">"नेटवर्क उपयोग लेखालाई परिमार्जन गर्नुहोस्"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5076042642247205390">"एपलाई कसरी अनुप्रयोगहरूको विरूद्धमा कसरी नेटवर्क उपयोगी अकाउन्टेड छ भनेर परिमार्जन गर्न अनुमति दिन्छ। साधारण अनुप्रयोगहरूद्वारा प्रयोगको लागि होइन।"</string> <string name="permlab_accessNotifications" msgid="7130360248191984741">"सूचनाहरू पहुँच गर्नुहोस्"</string> - <string name="permdesc_accessNotifications" msgid="761730149268789668">"अन्य अनुप्रयोगहरूबाट पोस्ट गरिएकासहित पुनःप्राप्त गर्न, परीक्षण गर्न र सूचनाहरू हटाउन अनुप्रयोगहरूलाई अनुमति दिन्छ।"</string> + <string name="permdesc_accessNotifications" msgid="761730149268789668">"अन्य अनुप्रयोगहरूबाट पोस्ट गरिएकासहित पुनःप्राप्त गर्न, परीक्षण गर्न र सूचनाहरू हटाउन एपहरूलाई अनुमति दिन्छ।"</string> <string name="permlab_bindNotificationListenerService" msgid="5848096702733262458">"जानकारी श्रोता सेवामा बाँध्नुहोस्"</string> - <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"होल्डरलाई सूचना श्रोता सेवाको शीर्ष-स्तरको इन्टरफेस बाँध्न अनुमति दिन्छ। सामान्य अनुप्रयोगहरूलाई कहिले पनि आवश्यक नपर्न सक्दछ।"</string> + <string name="permdesc_bindNotificationListenerService" msgid="4970553694467137126">"होल्डरलाई सूचना श्रोता सेवाको शीर्ष-स्तरको इन्टरफेस बाँध्न अनुमति दिन्छ। सामान्य एपहरूलाई कहिले पनि आवश्यक नपर्न सक्दछ।"</string> <string name="permlab_bindConditionProviderService" msgid="5245421224814878483">"सर्त प्रदायक सेवामा जोड्न"</string> <string name="permdesc_bindConditionProviderService" msgid="6106018791256120258">"सर्त प्रदायक सेवाको माथिल्लो स्तरको इन्टरफेसमा जोड्न बाहकलाई अनुमति दिन्छ। साधारण अनुप्रयोगहरूको लागि कहिल्यै पनि आवश्यक पर्दैन।"</string> <string name="permlab_bindDreamService" msgid="4776175992848982706">"सपना सेवामा बाँध्नुहोस्"</string> @@ -668,7 +668,7 @@ <string name="permlab_access_notification_policy" msgid="5524112842876975537">"बाधा नपुर्याउँनुहोस् पहुँच गर्नुहोस्"</string> <string name="permdesc_access_notification_policy" msgid="8538374112403845013">"बाधा नपुर्याउँनुहोस् कन्फिगरेसन पढ्न र लेख्नको लागि एपलाई अनुमति दिनुहोस्।"</string> <string name="permlab_startViewPermissionUsage" msgid="1504564328641112341">"हेर्ने अनुमतिको प्रयोग सुरु गर्नुहोस्"</string> - <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"वाहकलाई कुनै अनुप्रयोगसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण अनुप्रयोगहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।"</string> + <string name="permdesc_startViewPermissionUsage" msgid="2820325605959586538">"वाहकलाई कुनै एपसम्बन्धी अनुमतिको प्रयोग सुरु गर्न दिन्छ। साधारण एपहरूलाई कहिल्यै आवश्यक नपर्नु पर्ने हो।"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियमहरू मिलाउनुहोस्"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रिन लक पासवर्ड र PIN हरूमा अनुमति दिइएको लम्बाइ र वर्णहरूको नियन्त्रण गर्नुहोस्।"</string> <string name="policylab_watchLogin" msgid="7599669460083719504">"मनिटरको स्क्रिन अनलक गर्ने प्रयासहरू"</string> @@ -1119,7 +1119,7 @@ <string name="dialog_alert_title" msgid="651856561974090712">"सावधानी"</string> <string name="loading" msgid="3138021523725055037">"लोड हुँदै..."</string> <string name="capital_on" msgid="2770685323900821829">"चालु"</string> - <string name="capital_off" msgid="7443704171014626777">"बन्द"</string> + <string name="capital_off" msgid="7443704171014626777">"अफ"</string> <string name="checked" msgid="9179896827054513119">"जाँच गरिएको"</string> <string name="not_checked" msgid="7972320087569023342">"जाँच गरिएको छैन"</string> <string name="whichApplication" msgid="5432266899591255759">"प्रयोग गरेर कारबाही पुरा गर्नुहोस्"</string> @@ -1872,7 +1872,7 @@ <string name="default_notification_channel_label" msgid="3697928973567217330">"वर्गीकरण नगरिएको"</string> <string name="importance_from_user" msgid="2782756722448800447">"तपाईंले यी सूचनाहरूको महत्त्व सेट गर्नुहोस् ।"</string> <string name="importance_from_person" msgid="4235804979664465383">"यसमा सङ्लग्न भएका मानिसहरूको कारणले गर्दा यो महत्वपूर्ण छ।"</string> - <string name="notification_history_title_placeholder" msgid="7748630986182249599">"अनुप्रयोगसम्बन्धी आफ्नो रोजाइअनुसारको सूचना"</string> + <string name="notification_history_title_placeholder" msgid="7748630986182249599">"एपसम्बन्धी आफ्नो रोजाइअनुसारको सूचना"</string> <string name="user_creation_account_exists" msgid="2239146360099708035">"<xliff:g id="ACCOUNT">%2$s</xliff:g> (यस खाताको प्रयोगकर्ता पहिले नै अवस्थित छ) मा नयाँ प्रयोगकर्ता सिर्जना गर्न <xliff:g id="APP">%1$s</xliff:g> लाई अनुमति दिने हो?"</string> <string name="user_creation_adding" msgid="7305185499667958364">"<xliff:g id="ACCOUNT">%2$s</xliff:g> मा नयाँ प्रयोगकर्ता सिर्जना गर्न <xliff:g id="APP">%1$s</xliff:g> लाई अनुमति दिने हो?"</string> <string name="language_selection_title" msgid="52674936078683285">"भाषा थप्नुहोस्"</string> @@ -1904,7 +1904,7 @@ <string name="pin_specific_target" msgid="7824671240625957415">"<xliff:g id="LABEL">%1$s</xliff:g> लाई पिन गर्नुहोस्"</string> <string name="unpin_target" msgid="3963318576590204447">"अनपिन गर्नुहोस्"</string> <string name="unpin_specific_target" msgid="3859828252160908146">"<xliff:g id="LABEL">%1$s</xliff:g> लाई अनपिन गर्नुहोस्"</string> - <string name="app_info" msgid="6113278084877079851">"अनुप्रयोगका बारे जानकारी"</string> + <string name="app_info" msgid="6113278084877079851">"एपका बारे जानकारी"</string> <string name="negative_duration" msgid="1938335096972945232">"−<xliff:g id="TIME">%1$s</xliff:g>"</string> <string name="demo_starting_message" msgid="6577581216125805905">"डेमो सुरु गर्दै…"</string> <string name="demo_restarting_message" msgid="1160053183701746766">"यन्त्रलाई रिसेट गर्दै…"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 2627b53791f5..0565f2c3d43d 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1216,18 +1216,18 @@ <string name="dump_heap_ready_text" msgid="5849618132123045516">"ਸਾਂਝਾ ਕਰਨ ਲਈ <xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਪ੍ਰਕਿਰਿਆ ਦਾ ਹੀਪ ਡੰਪ ਤੁਹਾਡੇ ਲਈ ਉਪਲਬਧ ਹੈ। ਸਾਵਧਾਨ ਰਹੋ: ਸ਼ਾਇਦ ਇਸ ਹੀਪ ਡੰਪ ਵਿੱਚ ਕੋਈ ਵੀ ਸੰਵੇਦਨਸ਼ੀਲ ਨਿੱਜੀ ਜਾਣਕਾਰੀ ਸ਼ਾਮਲ ਹੋਵੇ, ਜਿਸ \'ਤੇ ਪ੍ਰਕਿਰਿਆ ਦੀ ਪਹੁੰਚ ਹੈ, ਜਿਸ ਵਿੱਚ ਸ਼ਾਇਦ ਤੁਹਾਡੇ ਵੱਲੋਂ ਟਾਈਪ ਕੀਤੀਆਂ ਚੀਜ਼ਾਂ ਸ਼ਾਮਲ ਹੋਣ।"</string> <string name="sendText" msgid="493003724401350724">"ਲਿਖਤ ਲਈ ਕੋਈ ਕਾਰਵਾਈ ਚੁਣੋ"</string> <string name="volume_ringtone" msgid="134784084629229029">"ਰਿੰਗਰ ਵੌਲਿਊਮ"</string> - <string name="volume_music" msgid="7727274216734955095">"ਮੀਡੀਆ ਵੌਲਿਊਮ"</string> + <string name="volume_music" msgid="7727274216734955095">"ਮੀਡੀਆ ਦੀ ਅਵਾਜ਼"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Bluetooth ਰਾਹੀਂ ਪਲੇ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"ਖਾਮੋਸ਼ ਰਿੰਗਟੋਨ ਸੈੱਟ ਕੀਤੀ"</string> <string name="volume_call" msgid="7625321655265747433">"ਇਨ-ਕਾਲ ਅਵਾਜ਼"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"ਬਲੂਟੁੱਥ ਇਨ-ਕਾਲ ਅਵਾਜ਼"</string> - <string name="volume_alarm" msgid="4486241060751798448">"ਅਲਾਰਮ ਵੌਲਿਊਮ"</string> + <string name="volume_alarm" msgid="4486241060751798448">"ਅਲਾਰਮ ਦੀ ਅਵਾਜ਼"</string> <string name="volume_notification" msgid="6864412249031660057">"ਸੂਚਨਾ ਵੌਲਿਊਮ"</string> <string name="volume_unknown" msgid="4041914008166576293">"ਵੌਲਿਊਮ"</string> <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Bluetooth ਵੌਲਿਊਮ"</string> <string name="volume_icon_description_ringer" msgid="2187800636867423459">"ਰਿੰਗਟੋਨ ਵੌਲਿਊਮ"</string> <string name="volume_icon_description_incall" msgid="4491255105381227919">"ਕਾਲ ਅਵਾਜ਼"</string> - <string name="volume_icon_description_media" msgid="4997633254078171233">"ਮੀਡੀਆ ਵੌਲਿਊਮ"</string> + <string name="volume_icon_description_media" msgid="4997633254078171233">"ਮੀਡੀਆ ਦੀ ਅਵਾਜ਼"</string> <string name="volume_icon_description_notification" msgid="579091344110747279">"ਸੂਚਨਾ ਵੌਲਿਊਮ"</string> <string name="ringtone_default" msgid="9118299121288174597">"ਪੂਰਵ-ਨਿਰਧਾਰਤ ਰਿੰਗਟੋਨ"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"ਪੂਰਵ-ਨਿਰਧਾਰਤ (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 254f1d04be87..4374e7fd7830 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -186,10 +186,10 @@ <item quantity="one">Urząd certyfikacji został zainstalowany</item> </plurals> <string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Przez nieznany podmiot zewnętrzny"</string> - <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Przez administratora Twojego profilu do pracy"</string> + <string name="ssl_ca_cert_noti_by_administrator" msgid="4564941950768783879">"Przez administratora Twojego profilu służbowego"</string> <string name="ssl_ca_cert_noti_managed" msgid="217337232273211674">"Przez <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> <string name="work_profile_deleted" msgid="5891181538182009328">"Usunięto profil służbowy"</string> - <string name="work_profile_deleted_details" msgid="3773706828364418016">"Brakuje aplikacji administratora profilu do pracy lub jest ona uszkodzona. Dlatego Twój profil służbowy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc."</string> + <string name="work_profile_deleted_details" msgid="3773706828364418016">"Brakuje aplikacji administratora profilu służbowego lub jest ona uszkodzona. Dlatego Twój profil służbowy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc."</string> <string name="work_profile_deleted_description_dpm_wipe" msgid="2477244968924647232">"Twój profil służbowy nie jest już dostępny na tym urządzeniu"</string> <string name="work_profile_deleted_reason_maximum_password_failure" msgid="1080323158315663167">"Zbyt wiele prób podania hasła"</string> <string name="device_ownership_relinquished" msgid="4080886992183195724">"Administrator odstąpił urządzenie do użytku osobistego"</string> @@ -204,8 +204,8 @@ <string name="factory_reset_warning" msgid="6858705527798047809">"Twoje urządzenie zostanie wyczyszczone"</string> <string name="factory_reset_message" msgid="2657049595153992213">"Nie można użyć aplikacji administratora. Dane z urządzenia zostaną wykasowane.\n\nJeśli masz pytania, skontaktuj się z administratorem organizacji."</string> <string name="printing_disabled_by" msgid="3517499806528864633">"Drukowanie wyłączone przez: <xliff:g id="OWNER_APP">%s</xliff:g>."</string> - <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Włącz profil do pracy"</string> - <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Zablokowano aplikacje osobiste do czasu włączenia profilu do pracy"</string> + <string name="personal_apps_suspension_title" msgid="7561416677884286600">"Włącz profil służbowy"</string> + <string name="personal_apps_suspension_text" msgid="6115455688932935597">"Zablokowano aplikacje osobiste do czasu włączenia profilu służbowego"</string> <string name="personal_apps_suspension_soon_text" msgid="8123898693479590">"Aplikacje osobiste zostaną zablokowane <xliff:g id="DATE">%1$s</xliff:g> o <xliff:g id="TIME">%2$s</xliff:g>. Administrator IT nie pozwala na wyłączenie profilu służbowego na dłużej niż <xliff:g id="NUMBER">%3$d</xliff:g> dni."</string> <string name="personal_apps_suspended_turn_profile_on" msgid="2758012869627513689">"Włącz"</string> <string name="me" msgid="6207584824693813140">"Ja"</string> @@ -709,7 +709,7 @@ <string-array name="phoneTypes"> <item msgid="8996339953292723951">"Dom"</item> <item msgid="7740243458912727194">"Komórka"</item> - <item msgid="8526146065496663766">"Praca"</item> + <item msgid="8526146065496663766">"Służbowy"</item> <item msgid="8150904584178569699">"Faks w pracy"</item> <item msgid="4537253139152229577">"Faks domowy"</item> <item msgid="6751245029698664340">"Pager"</item> @@ -718,24 +718,24 @@ </string-array> <string-array name="emailAddressTypes"> <item msgid="7786349763648997741">"Dom"</item> - <item msgid="435564470865989199">"Praca"</item> + <item msgid="435564470865989199">"Służbowy"</item> <item msgid="4199433197875490373">"Inne"</item> <item msgid="3233938986670468328">"Niestandardowy"</item> </string-array> <string-array name="postalAddressTypes"> <item msgid="3861463339764243038">"Dom"</item> - <item msgid="5472578890164979109">"Praca"</item> + <item msgid="5472578890164979109">"Służbowy"</item> <item msgid="5718921296646594739">"Inny"</item> <item msgid="5523122236731783179">"Niestandardowy"</item> </string-array> <string-array name="imAddressTypes"> <item msgid="588088543406993772">"Dom"</item> - <item msgid="5503060422020476757">"Praca"</item> + <item msgid="5503060422020476757">"Służbowy"</item> <item msgid="2530391194653760297">"Inne"</item> <item msgid="7640927178025203330">"Niestandardowy"</item> </string-array> <string-array name="organizationTypes"> - <item msgid="6144047813304847762">"Praca"</item> + <item msgid="6144047813304847762">"Służbowy"</item> <item msgid="7402720230065674193">"Inne"</item> <item msgid="808230403067569648">"Niestandardowy"</item> </string-array> @@ -1453,8 +1453,8 @@ <string name="deny" msgid="6632259981847676572">"Odmów"</string> <string name="permission_request_notification_title" msgid="1810025922441048273">"Prośba o pozwolenie"</string> <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"Prośba o pozwolenie\ndotyczące konta <xliff:g id="ACCOUNT">%s</xliff:g>"</string> - <string name="forward_intent_to_owner" msgid="4620359037192871015">"Używasz tej aplikacji poza profilem do pracy"</string> - <string name="forward_intent_to_work" msgid="3620262405636021151">"Używasz tej aplikacji w swoim profilu do pracy"</string> + <string name="forward_intent_to_owner" msgid="4620359037192871015">"Używasz tej aplikacji poza profilem służbowym"</string> + <string name="forward_intent_to_work" msgid="3620262405636021151">"Używasz tej aplikacji w swoim profilu służbowym"</string> <string name="input_method_binding_label" msgid="1166731601721983656">"Sposób wprowadzania tekstu"</string> <string name="sync_binding_label" msgid="469249309424662147">"Synchronizacja"</string> <string name="accessibility_binding_label" msgid="1974602776545801715">"Ułatwienia dostępu"</string> @@ -1591,7 +1591,7 @@ <string name="SetupCallDefault" msgid="5581740063237175247">"Odebrać połączenie?"</string> <string name="activity_resolver_use_always" msgid="5575222334666843269">"Zawsze"</string> <string name="activity_resolver_use_once" msgid="948462794469672658">"Tylko raz"</string> - <string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$s nie obsługuje profilu do pracy"</string> + <string name="activity_resolver_work_profiles_support" msgid="4071345609235361269">"%1$s nie obsługuje profilu służbowego"</string> <string name="default_audio_route_name" product="tablet" msgid="367936735632195517">"Tablet"</string> <string name="default_audio_route_name" product="tv" msgid="4908971385068087367">"Telewizor"</string> <string name="default_audio_route_name" product="default" msgid="9213546147739983977">"Telefon"</string> @@ -1828,7 +1828,7 @@ <string name="select_day" msgid="2060371240117403147">"Wybierz miesiąc i dzień"</string> <string name="select_year" msgid="1868350712095595393">"Wybierz rok"</string> <string name="deleted_key" msgid="9130083334943364001">"<xliff:g id="KEY">%1$s</xliff:g> usunięte"</string> - <string name="managed_profile_label_badge" msgid="6762559569999499495">"<xliff:g id="LABEL">%1$s</xliff:g> (praca)"</string> + <string name="managed_profile_label_badge" msgid="6762559569999499495">"<xliff:g id="LABEL">%1$s</xliff:g> (służbowy)"</string> <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"<xliff:g id="LABEL">%1$s</xliff:g> – praca 2"</string> <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"<xliff:g id="LABEL">%1$s</xliff:g> – praca 3"</string> <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"Podaj PIN, aby odpiąć"</string> @@ -1950,8 +1950,8 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"Aplikacja <xliff:g id="APP_NAME_0">%1$s</xliff:g> nie jest teraz dostępna. Zarządza tym aplikacja <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Więcej informacji"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Wznów działanie aplikacji"</string> - <string name="work_mode_off_title" msgid="5503291976647976560">"Włączyć profil do pracy?"</string> - <string name="work_mode_off_message" msgid="8417484421098563803">"Aplikacje do pracy, powiadomienia, dane i inne funkcje profilu do pracy zostaną włączone"</string> + <string name="work_mode_off_title" msgid="5503291976647976560">"Włączyć profil służbowy?"</string> + <string name="work_mode_off_message" msgid="8417484421098563803">"Aplikacje służbowe, powiadomienia, dane i inne funkcje profilu służbowego zostaną włączone"</string> <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> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 5dc9e5dd555e..3f2c6dff6d63 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1261,7 +1261,7 @@ <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Выбран режим \"Без звука\""</string> <string name="volume_call" msgid="7625321655265747433">"Громкость при разговоре"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"Громкость при разговоре"</string> - <string name="volume_alarm" msgid="4486241060751798448">"Громкость сигнала предупреждения"</string> + <string name="volume_alarm" msgid="4486241060751798448">"Громкость будильника"</string> <string name="volume_notification" msgid="6864412249031660057">"Громкость уведомления"</string> <string name="volume_unknown" msgid="4041914008166576293">"Громкость"</string> <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Громкость Bluetooth-устройства"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 7ec6d233e866..105ee44d0114 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -123,28 +123,28 @@ <string name="roamingText11" msgid="5245687407203281407">"Банер роминга је укључен"</string> <string name="roamingText12" msgid="673537506362152640">"Банер роминга је искључен"</string> <string name="roamingTextSearching" msgid="5323235489657753486">"Претраживање услуге"</string> - <string name="wfcRegErrorTitle" msgid="3193072971584858020">"Подешавање позивања преко WiFi-ја није успело"</string> + <string name="wfcRegErrorTitle" msgid="3193072971584858020">"Подешавање позивања преко WiFi-а није успело"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="468830943567116703">"Да бисте упућивали позиве и слали поруке преко WiFi-ја, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко WiFi-ја. (кôд грешке: <xliff:g id="CODE">%1$s</xliff:g>)"</item> + <item msgid="468830943567116703">"Да бисте упућивали позиве и слали поруке преко WiFi-а, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко WiFi-а. (кôд грешке: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="4795145070505729156">"Проблем у вези са регистровањем позивања преко Wi‑Fi-ја код мобилног оператера: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> <!-- no translation found for wfcSpnFormat_spn (2982505428519096311) --> <skip /> - <string name="wfcSpnFormat_spn_wifi_calling" msgid="3165949348000906194">"<xliff:g id="SPN">%s</xliff:g> позивање преко WiFi-ја"</string> - <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="3836827895369365298">"<xliff:g id="SPN">%s</xliff:g> – позивање преко WiFi-ја"</string> + <string name="wfcSpnFormat_spn_wifi_calling" msgid="3165949348000906194">"<xliff:g id="SPN">%s</xliff:g> позивање преко WiFi-а"</string> + <string name="wfcSpnFormat_spn_wifi_calling_vo_hyphen" msgid="3836827895369365298">"<xliff:g id="SPN">%s</xliff:g> – позивање преко WiFi-а"</string> <string name="wfcSpnFormat_wlan_call" msgid="4895315549916165700">"WLAN позив"</string> <string name="wfcSpnFormat_spn_wlan_call" msgid="255919245825481510">"<xliff:g id="SPN">%s</xliff:g> WLAN позив"</string> <string name="wfcSpnFormat_spn_wifi" msgid="7232899594327126970">"<xliff:g id="SPN">%s</xliff:g> WiFi"</string> - <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="8383917598312067365">"Позивање преко WiFi-ја | <xliff:g id="SPN">%s</xliff:g>"</string> + <string name="wfcSpnFormat_wifi_calling_bar_spn" msgid="8383917598312067365">"Позивање преко WiFi-а | <xliff:g id="SPN">%s</xliff:g>"</string> <string name="wfcSpnFormat_spn_vowifi" msgid="6865214948822061486">"<xliff:g id="SPN">%s</xliff:g> VoWifi"</string> - <string name="wfcSpnFormat_wifi_calling" msgid="6178935388378661755">"Позивање преко WiFi-ја"</string> + <string name="wfcSpnFormat_wifi_calling" msgid="6178935388378661755">"Позивање преко WiFi-а"</string> <string name="wfcSpnFormat_wifi" msgid="1376356951297043426">"WiFi"</string> - <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Позивање преко WiFi-ја"</string> + <string name="wfcSpnFormat_wifi_calling_wo_hyphen" msgid="7178561009225028264">"Позивање преко WiFi-а"</string> <string name="wfcSpnFormat_vowifi" msgid="8371335230890725606">"VoWifi"</string> <string name="wifi_calling_off_summary" msgid="5626710010766902560">"Искључено"</string> - <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Позивање преко WiFi-ја"</string> + <string name="wfc_mode_wifi_preferred_summary" msgid="1035175836270943089">"Позивање преко WiFi-а"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="4958965609212575619">"Позив преко мобилне мреже"</string> <string name="wfc_mode_wifi_only_summary" msgid="104951993894678665">"Само WiFi"</string> <string name="cfTemplateNotForwarded" msgid="862202427794270501">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: Није прослеђено"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 2476a2d722ba..45a0354311f6 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -305,7 +305,7 @@ <string name="permgroupdesc_storage" msgid="6351503740613026600">"ifikie picha, maudhui na faili kwenye kifaa chako"</string> <string name="permgrouplab_microphone" msgid="2480597427667420076">"Maikrofoni"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"irekodi sauti"</string> - <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Shughuli za kimwili"</string> + <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Mazoezi ya mwili"</string> <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"ifikie shughuli zako za kimwili"</string> <string name="permgrouplab_camera" msgid="9090413408963547706">"Kamera"</string> <string name="permgroupdesc_camera" msgid="7585150538459320326">"ipige picha na kurekodi video"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 32ea9795ed9d..9b0d9a26f1e8 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1307,7 +1307,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"அனலாக் ஆடியோ துணைக்கருவி கண்டறியப்பட்டது"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"இணைத்துள்ள சாதனமானது இந்த மொபைலுடன் இணங்கவில்லை. மேலும் அறிய, தட்டவும்."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"USB பிழைதிருத்தம் இணைக்கப்பட்டது"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"USB பிழைதிருத்தத்தை ஆஃப் செய்ய தட்டவும்"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"USB பிழைதிருத்தத்தை ஆஃப் செய்யத் தட்டவும்"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"USB பிழைதிருத்தத்தை முடக்க, தேர்ந்தெடுக்கவும்."</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"வைஃபை பிழைதிருத்தம் இணைக்கப்பட்டது"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"வைஃபை பிழைதிருத்தத்தை ஆஃப் செய்ய தட்டவும்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b3137e6d21e3..b97c6c785735 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -822,12 +822,12 @@ <string name="keyguard_password_enter_password_code" msgid="2751130557661643482">"అన్లాక్ చేయడానికి పాస్వర్డ్ను టైప్ చేయండి"</string> <string name="keyguard_password_enter_pin_password_code" msgid="7792964196473964340">"అన్లాక్ చేయడానికి పిన్ను టైప్ చేయండి"</string> <string name="keyguard_password_wrong_pin_code" msgid="8583732939138432793">"చెల్లని పిన్ కోడ్."</string> - <string name="keyguard_label_text" msgid="3841953694564168384">"అన్లాక్ చేయడానికి, మెను ఆపై 0ని నొక్కండి."</string> + <string name="keyguard_label_text" msgid="3841953694564168384">"అన్లాక్ చేయడానికి, మెనూ ఆపై 0ని నొక్కండి."</string> <string name="emergency_call_dialog_number_for_display" msgid="2978165477085612673">"అత్యవసర నంబర్"</string> <string name="lockscreen_carrier_default" msgid="6192313772955399160">"సేవ లేదు"</string> <string name="lockscreen_screen_locked" msgid="7364905540516041817">"స్క్రీన్ లాక్ చేయబడింది."</string> - <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"అన్లాక్ చేయడానికి లేదా అత్యవసర కాల్ చేయడానికి మెను నొక్కండి."</string> - <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"అన్లాక్ చేయడానికి మెను నొక్కండి."</string> + <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"అన్లాక్ చేయడానికి లేదా అత్యవసర కాల్ చేయడానికి మెనూ నొక్కండి."</string> + <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"అన్లాక్ చేయడానికి మెనూ నొక్కండి."</string> <string name="lockscreen_pattern_instructions" msgid="3169991838169244941">"అన్లాక్ చేయడానికి నమూనాను గీయండి"</string> <string name="lockscreen_emergency_call" msgid="7500692654885445299">"అత్యవసరం"</string> <string name="lockscreen_return_to_call" msgid="3156883574692006382">"కాల్కు తిరిగి వెళ్లు"</string> @@ -970,7 +970,7 @@ <string name="text_copied" msgid="2531420577879738860">"వచనం క్లిప్బోర్డ్కు కాపీ చేయబడింది."</string> <string name="copied" msgid="4675902854553014676">"కాపీ చేయబడింది"</string> <string name="more_item_label" msgid="7419249600215749115">"ఎక్కువ"</string> - <string name="prepend_shortcut_label" msgid="1743716737502867951">"మెను+"</string> + <string name="prepend_shortcut_label" msgid="1743716737502867951">"మెనూ+"</string> <string name="menu_meta_shortcut_label" msgid="1623390163674762478">"Meta+"</string> <string name="menu_ctrl_shortcut_label" msgid="131911133027196485">"Ctrl+"</string> <string name="menu_alt_shortcut_label" msgid="343761069945250991">"Alt+"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 4cea142cbe60..03c65688a56a 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1792,8 +1792,8 @@ <string name="package_updated_device_owner" msgid="7560272363805506941">"Na-update ng iyong admin"</string> <string name="package_deleted_device_owner" msgid="2292335928930293023">"Na-delete ng iyong admin"</string> <string name="confirm_battery_saver" msgid="5247976246208245754">"OK"</string> - <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para patagalin ang baterya, ginagawa ng Pangtipid sa Baterya na:\n\n•I-on ang Madilim na tema\n•I-off o paghigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”\n\n"<annotation id="url">"Matuto pa"</annotation></string> - <string name="battery_saver_description" msgid="8587408568232177204">"Para patagalin ang baterya, ginagawa ng Pangtipid sa Baterya na:\n\n•I-on ang Madilim na tema\n•I-off o paghigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”"</string> + <string name="battery_saver_description_with_learn_more" msgid="5997766757551917769">"Para patagalin ang baterya, ginagawa ng Pantipid ng Baterya na:\n\n•I-on ang Madilim na tema\n•I-off o paghigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”\n\n"<annotation id="url">"Matuto pa"</annotation></string> + <string name="battery_saver_description" msgid="8587408568232177204">"Para patagalin ang baterya, ginagawa ng Pantipid ng Baterya na:\n\n•I-on ang Madilim na tema\n•I-off o paghigpitan ang aktibidad sa background, ilang visual effect, at iba pang feature gaya ng “Hey Google”"</string> <string name="data_saver_description" msgid="4995164271550590517">"Upang makatulong na mabawasan ang paggamit ng data, pinipigilan ng Data Saver ang ilang app na magpadala o makatanggap ng data sa background. Maaaring mag-access ng data ang isang app na ginagamit mo sa kasalukuyan, ngunit mas bihira na nito magagawa iyon. Halimbawa, maaaring hindi lumabas ang mga larawan hangga\'t hindi mo nata-tap ang mga ito."</string> <string name="data_saver_enable_title" msgid="7080620065745260137">"I-on ang Data Saver?"</string> <string name="data_saver_enable_button" msgid="4399405762586419726">"I-on"</string> @@ -1999,9 +1999,9 @@ <string name="notification_appops_overlay_active" msgid="5571732753262836481">"ipinapakita sa ibabaw ng ibang app sa iyong screen"</string> <string name="dynamic_mode_notification_channel_name" msgid="2986926422100223328">"Notification ng impormasyon ng Routine Mode"</string> <string name="dynamic_mode_notification_title" msgid="9205715501274608016">"Maaaring maubos ang baterya bago ang karaniwang pag-charge"</string> - <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Na-activate ang Pangtipid sa Baterya para patagalin ang buhay ng baterya"</string> - <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"Pangtipid sa Baterya"</string> - <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"Na-off ang Pangtipid sa Baterya"</string> + <string name="dynamic_mode_notification_summary" msgid="4141614604437372157">"Na-activate ang Pantipid ng Baterya para patagalin ang buhay ng baterya"</string> + <string name="battery_saver_notification_channel_name" msgid="3918243458067916913">"Pantipid ng Baterya"</string> + <string name="battery_saver_off_notification_title" msgid="7637255960468032515">"Na-off ang Pantipid ng Baterya"</string> <string name="battery_saver_charged_notification_summary" product="default" msgid="5544457317418624367">"May sapat na charge ang telepono. Hindi na pinaghihigpitan ang mga feature."</string> <string name="battery_saver_charged_notification_summary" product="tablet" msgid="4426317048139996888">"May sapat na charge ang tablet. Hindi na pinaghihigpitan ang mga feature."</string> <string name="battery_saver_charged_notification_summary" product="device" msgid="1031562417867646649">"May sapat na charge ang device. Hindi na pinaghihigpitan ang mga feature."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 09b670b86216..1f00a5dc8137 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1259,9 +1259,9 @@ <string name="volume_music" msgid="7727274216734955095">"Гучність медіа"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Відтвор. через Bluetooth"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Установлено сигнал дзвінка без звуку"</string> - <string name="volume_call" msgid="7625321655265747433">"Обсяг вхідних"</string> - <string name="volume_bluetooth_call" msgid="2930204618610115061">"Обсяг вхідних Bluetooth"</string> - <string name="volume_alarm" msgid="4486241060751798448">"Гучн. сповіщ."</string> + <string name="volume_call" msgid="7625321655265747433">"Гучність під час розмови"</string> + <string name="volume_bluetooth_call" msgid="2930204618610115061">"Гучність у викликах Bluetooth"</string> + <string name="volume_alarm" msgid="4486241060751798448">"Гучність будильника"</string> <string name="volume_notification" msgid="6864412249031660057">"Гучність сповіщень"</string> <string name="volume_unknown" msgid="4041914008166576293">"Гучність"</string> <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"Гучність Bluetooth"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 44c217c0a1fb..34c48966bc8c 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1219,7 +1219,7 @@ <string name="volume_music" msgid="7727274216734955095">"Multimedia tovushi"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="2614142915948898228">"Bluetooth orqali ijro etilmoqda"</string> <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"Ovozsiz rejim tanlandi"</string> - <string name="volume_call" msgid="7625321655265747433">"Suhbat vaqtidagi tovush balandligi"</string> + <string name="volume_call" msgid="7625321655265747433">"Suhbat tovushi"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"Kiruvchi bluetooth tovushi"</string> <string name="volume_alarm" msgid="4486241060751798448">"Signal tovushi"</string> <string name="volume_notification" msgid="6864412249031660057">"Eslatma tovushi"</string> @@ -1231,7 +1231,7 @@ <string name="volume_icon_description_notification" msgid="579091344110747279">"Eslatma tovushi"</string> <string name="ringtone_default" msgid="9118299121288174597">"Standart rington"</string> <string name="ringtone_default_with_actual" msgid="2709686194556159773">"Standart (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="397111123930141876">"Yo‘q"</string> + <string name="ringtone_silent" msgid="397111123930141876">"Hech qanday"</string> <string name="ringtone_picker_title" msgid="667342618626068253">"Ringtonlar"</string> <string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"Signal ovozlari"</string> <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"Bildirishnoma ovozlari"</string> diff --git a/graphics/java/android/graphics/GraphicsStatsService.java b/graphics/java/android/graphics/GraphicsStatsService.java index 8dfd6ee92a9a..2d6848b618a1 100644 --- a/graphics/java/android/graphics/GraphicsStatsService.java +++ b/graphics/java/android/graphics/GraphicsStatsService.java @@ -16,7 +16,6 @@ package android.graphics; -import android.annotation.SystemApi; import android.app.AlarmManager; import android.app.AppOpsManager; import android.content.Context; @@ -100,7 +99,6 @@ public class GraphicsStatsService extends IGraphicsStats.Stub { private Handler mWriteOutHandler; private boolean mRotateIsScheduled = false; - @SystemApi public GraphicsStatsService(Context context) { mContext = context; mAppOps = context.getSystemService(AppOpsManager.class); diff --git a/keystore/java/android/security/keystore/AttestationUtils.java b/keystore/java/android/security/keystore/AttestationUtils.java index f82d8b62e21e..f1eea820829c 100644 --- a/keystore/java/android/security/keystore/AttestationUtils.java +++ b/keystore/java/android/security/keystore/AttestationUtils.java @@ -20,7 +20,6 @@ import android.Manifest; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.content.res.Resources; import android.os.Build; @@ -46,7 +45,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi public abstract class AttestationUtils { private AttestationUtils() { } diff --git a/keystore/java/android/security/keystore/DeviceIdAttestationException.java b/keystore/java/android/security/keystore/DeviceIdAttestationException.java index 8ba0317845d0..4f9f9e633a98 100644 --- a/keystore/java/android/security/keystore/DeviceIdAttestationException.java +++ b/keystore/java/android/security/keystore/DeviceIdAttestationException.java @@ -18,7 +18,6 @@ package android.security.keystore; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; /** * Thrown when {@link AttestationUtils} is unable to attest the given device ids. @@ -26,7 +25,6 @@ import android.annotation.TestApi; * @hide */ @SystemApi -@TestApi public class DeviceIdAttestationException extends Exception { /** * Constructs a new {@code DeviceIdAttestationException} with the current stack trace and the diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java index 9aa0c870e512..fa3815ca6fdf 100644 --- a/location/java/android/location/Location.java +++ b/location/java/android/location/Location.java @@ -17,7 +17,6 @@ package android.location; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Bundle; @@ -73,7 +72,6 @@ public class Location implements Parcelable { * gps locations separate from other locations for coarsening. Providers that do not need to * support platforms below Android R should not use this constant. */ - @TestApi @SystemApi @Deprecated public static final String EXTRA_NO_GPS_LOCATION = "noGPSLocation"; @@ -1062,7 +1060,6 @@ public class Location implements Parcelable { * @see #isComplete * @hide */ - @TestApi @SystemApi public void makeComplete() { if (mProvider == null) mProvider = "?"; diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 2a2aaea035ff..0c7d96d9f136 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -514,7 +514,6 @@ public class LocationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean enabled, @NonNull UserHandle userHandle) { try { @@ -708,7 +707,6 @@ public class LocationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void getCurrentLocation(@NonNull LocationRequest locationRequest, @Nullable CancellationSignal cancellationSignal, @@ -1130,7 +1128,6 @@ public class LocationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates( @Nullable LocationRequest locationRequest, @@ -1158,7 +1155,6 @@ public class LocationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates( @Nullable LocationRequest locationRequest, @@ -1209,7 +1205,6 @@ public class LocationManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates( @Nullable LocationRequest locationRequest, diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java index 5f0acc8f7647..1708c25fc2cf 100644 --- a/location/java/android/location/LocationRequest.java +++ b/location/java/android/location/LocationRequest.java @@ -21,7 +21,6 @@ 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; import android.os.Build; import android.os.Parcel; @@ -94,7 +93,6 @@ import com.android.internal.util.Preconditions; * @hide */ @SystemApi -@TestApi public final class LocationRequest implements Parcelable { /** * Used with {@link #setQuality} to request the most accurate locations available. diff --git a/media/java/android/media/AudioFocusInfo.java b/media/java/android/media/AudioFocusInfo.java index 675cf7360b82..3647b6ebcfbc 100644 --- a/media/java/android/media/AudioFocusInfo.java +++ b/media/java/android/media/AudioFocusInfo.java @@ -19,7 +19,6 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import java.util.Objects; * @hide * A class to encapsulate information about an audio focus owner or request. */ -@TestApi @SystemApi public final class AudioFocusInfo implements Parcelable { diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 3ac71b2cff1d..83e7fb5e12dc 100755 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3449,7 +3449,6 @@ public class AudioManager { * @param requestResult the result to the focus request to be passed to the requester * @param ap a valid registered {@link AudioPolicy} configured as a focus policy. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull AudioFocusInfo afi, @@ -3489,7 +3488,6 @@ public class AudioManager { * if there was an error sending the request. * @throws NullPointerException if the {@link AudioFocusInfo} or {@link AudioPolicy} are null. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull AudioFocusInfo afi, int focusChange, @@ -3752,7 +3750,6 @@ public class AudioManager { * {@link android.Manifest.permission#MODIFY_AUDIO_ROUTING} permission, * {@link #SUCCESS} otherwise. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull AudioPolicy policy) { @@ -3787,7 +3784,6 @@ public class AudioManager { * Unregisters an {@link AudioPolicy} asynchronously. * @param policy the non-null {@link AudioPolicy} to unregister. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicyAsync(@NonNull AudioPolicy policy) { @@ -3814,7 +3810,6 @@ public class AudioManager { * associated with mixes of this policy. * @param policy the non-null {@link AudioPolicy} to unregister. */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull AudioPolicy policy) { @@ -5153,7 +5148,6 @@ public class AudioManager { */ /** @hide */ - @TestApi @SystemApi public static final int SUCCESS = AudioSystem.SUCCESS; /** diff --git a/media/java/android/media/MediaMetrics.java b/media/java/android/media/MediaMetrics.java index eaf86bb3936c..3a5216e1c4e7 100644 --- a/media/java/android/media/MediaMetrics.java +++ b/media/java/android/media/MediaMetrics.java @@ -18,7 +18,6 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.TestApi; import android.os.Bundle; import java.nio.ByteBuffer; @@ -583,7 +582,6 @@ public class MediaMetrics { * * @return a Bundle with the keys set according to data in the Item's buffer. */ - @TestApi public Bundle toBundle() { updateHeader(); @@ -596,23 +594,14 @@ public class MediaMetrics { // The following constants are used for tests to extract // the content of the Bundle for CTS testing. - @TestApi public static final String BUNDLE_TOTAL_SIZE = "_totalSize"; - @TestApi public static final String BUNDLE_HEADER_SIZE = "_headerSize"; - @TestApi public static final String BUNDLE_VERSION = "_version"; - @TestApi public static final String BUNDLE_KEY_SIZE = "_keySize"; - @TestApi public static final String BUNDLE_KEY = "_key"; - @TestApi public static final String BUNDLE_PID = "_pid"; - @TestApi public static final String BUNDLE_UID = "_uid"; - @TestApi public static final String BUNDLE_TIMESTAMP = "_timestamp"; - @TestApi public static final String BUNDLE_PROPERTY_COUNT = "_propertyCount"; /** @@ -623,7 +612,6 @@ public class MediaMetrics { * @param buffer contains the byte data serialized according to the byte string version. * @return a Bundle with the keys set according to data in the buffer. */ - @TestApi public static Bundle toBundle(ByteBuffer buffer) { final Bundle bundle = new Bundle(); diff --git a/media/java/android/media/Utils.java b/media/java/android/media/Utils.java index 7a4e7b897de1..ecb6b3d495ad 100644 --- a/media/java/android/media/Utils.java +++ b/media/java/android/media/Utils.java @@ -18,7 +18,6 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.TestApi; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; @@ -440,7 +439,6 @@ public class Utils { * * @param <V> The class of the object returned to the listener. */ - @TestApi public static class ListenerList<V> { /** * The Listener interface for callback. diff --git a/media/java/android/media/audiopolicy/AudioMix.java b/media/java/android/media/audiopolicy/AudioMix.java index 61113bc858db..4e451c6e42b1 100644 --- a/media/java/android/media/audiopolicy/AudioMix.java +++ b/media/java/android/media/audiopolicy/AudioMix.java @@ -19,7 +19,6 @@ package android.media.audiopolicy; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.media.AudioDeviceInfo; import android.media.AudioFormat; @@ -32,7 +31,6 @@ import java.util.Objects; /** * @hide */ -@TestApi @SystemApi public class AudioMix { diff --git a/media/java/android/media/audiopolicy/AudioMixingRule.java b/media/java/android/media/audiopolicy/AudioMixingRule.java index 68c9593d102d..f6f982a4ebe2 100644 --- a/media/java/android/media/audiopolicy/AudioMixingRule.java +++ b/media/java/android/media/audiopolicy/AudioMixingRule.java @@ -18,7 +18,6 @@ package android.media.audiopolicy; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.media.AudioAttributes; import android.os.Parcel; @@ -42,7 +41,6 @@ import java.util.Objects; * .build(); * </pre> */ -@TestApi @SystemApi public class AudioMixingRule { diff --git a/media/java/android/media/audiopolicy/AudioPolicy.java b/media/java/android/media/audiopolicy/AudioPolicy.java index d3e9c7e91056..098b65c649fa 100644 --- a/media/java/android/media/audiopolicy/AudioPolicy.java +++ b/media/java/android/media/audiopolicy/AudioPolicy.java @@ -58,7 +58,6 @@ import java.util.Objects; * @hide * AudioPolicy provides access to the management of audio routing and audio focus. */ -@TestApi @SystemApi public class AudioPolicy { @@ -418,7 +417,6 @@ public class AudioPolicy { * @param devices list of devices to which the audio stream of the application may be routed. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean setUidDeviceAffinity(int uid, @NonNull List<AudioDeviceInfo> devices) { if (devices == null) { @@ -460,7 +458,6 @@ public class AudioPolicy { * @param uid UID of the application affected. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean removeUidDeviceAffinity(int uid) { synchronized (mLock) { @@ -486,7 +483,6 @@ public class AudioPolicy { * {@link UserHandle#getIdentifier}. Not to be confused with application uid. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean removeUserIdDeviceAffinity(@UserIdInt int userId) { synchronized (mLock) { @@ -519,7 +515,6 @@ public class AudioPolicy { * @param devices list of devices to which the audio stream of the application may be routed. * @return true if the change was successful, false otherwise. */ - @TestApi @SystemApi public boolean setUserIdDeviceAffinity(@UserIdInt int userId, @NonNull List<AudioDeviceInfo> devices) { diff --git a/media/java/android/media/audiopolicy/AudioProductStrategy.java b/media/java/android/media/audiopolicy/AudioProductStrategy.java index 090f78e4e4f7..fca3498838ad 100644 --- a/media/java/android/media/audiopolicy/AudioProductStrategy.java +++ b/media/java/android/media/audiopolicy/AudioProductStrategy.java @@ -19,7 +19,6 @@ package android.media.audiopolicy; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.media.AudioAttributes; import android.media.AudioSystem; import android.media.MediaRecorder; @@ -108,7 +107,6 @@ public final class AudioProductStrategy implements Parcelable { * @param id the ID for the invalid strategy, always use a different one than in use * @return an invalid instance that cannot successfully be used for volume groups or routing */ - @TestApi @SystemApi public static @NonNull AudioProductStrategy createInvalidAudioProductStrategy(int id) { return new AudioProductStrategy("dummy strategy", id, new AudioAttributesGroup[0]); diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt index 5f15216e8400..086ba819e064 100644 --- a/non-updatable-api/current.txt +++ b/non-updatable-api/current.txt @@ -3712,7 +3712,7 @@ package android.app { ctor public ActionBar.LayoutParams(int); ctor public ActionBar.LayoutParams(android.app.ActionBar.LayoutParams); ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams); - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=0xffffffff, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.NO_GRAVITY, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.TOP, to="TOP"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.BOTTOM, to="BOTTOM"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.LEFT, to="LEFT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.RIGHT, to="RIGHT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.START, to="START"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.END, to="END"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_VERTICAL, to="CENTER_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_VERTICAL, to="FILL_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_HORIZONTAL, to="CENTER_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_HORIZONTAL, to="FILL_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL, to="FILL")}) public int gravity; + field public int gravity; } public static interface ActionBar.OnMenuVisibilityListener { @@ -10092,7 +10092,7 @@ package android.content { method public final <T> T getSystemService(@NonNull Class<T>); method @Nullable public abstract String getSystemServiceName(@NonNull Class<?>); method @NonNull public final CharSequence getText(@StringRes int); - method @android.view.ViewDebug.ExportedProperty(deepExport=true) public abstract android.content.res.Resources.Theme getTheme(); + method public abstract android.content.res.Resources.Theme getTheme(); method @Deprecated public abstract android.graphics.drawable.Drawable getWallpaper(); method @Deprecated public abstract int getWallpaperDesiredMinimumHeight(); method @Deprecated public abstract int getWallpaperDesiredMinimumWidth(); @@ -51999,13 +51999,13 @@ package android.view { method @Nullable public CharSequence getAccessibilityPaneTitle(); method @IdRes public int getAccessibilityTraversalAfter(); method @IdRes public int getAccessibilityTraversalBefore(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getAlpha(); + method public float getAlpha(); method public android.view.animation.Animation getAnimation(); method @Nullable public android.graphics.Matrix getAnimationMatrix(); method public android.os.IBinder getApplicationWindowToken(); method @NonNull public int[] getAttributeResolutionStack(@AttrRes int); method @NonNull public java.util.Map<java.lang.Integer,java.lang.Integer> getAttributeSourceResourceMap(); - method @android.view.ViewDebug.ExportedProperty @Nullable public String[] getAutofillHints(); + method @Nullable public String[] getAutofillHints(); method public final android.view.autofill.AutofillId getAutofillId(); method public int getAutofillType(); method @Nullable public android.view.autofill.AutofillValue getAutofillValue(); @@ -52013,8 +52013,8 @@ package android.view { method @Nullable public android.graphics.BlendMode getBackgroundTintBlendMode(); method @Nullable public android.content.res.ColorStateList getBackgroundTintList(); method @Nullable public android.graphics.PorterDuff.Mode getBackgroundTintMode(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public int getBaseline(); - method @android.view.ViewDebug.CapturedViewProperty public final int getBottom(); + method public int getBaseline(); + method public final int getBottom(); method protected float getBottomFadingEdgeStrength(); method protected int getBottomPaddingOffset(); method public float getCameraDistance(); @@ -52022,10 +52022,10 @@ package android.view { method public boolean getClipBounds(android.graphics.Rect); method public final boolean getClipToOutline(); method @Nullable public final android.view.contentcapture.ContentCaptureSession getContentCaptureSession(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility") public CharSequence getContentDescription(); - method @android.view.ViewDebug.CapturedViewProperty public final android.content.Context getContext(); + method public CharSequence getContentDescription(); + method public final android.content.Context getContext(); method protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean getDefaultFocusHighlightEnabled(); + method public final boolean getDefaultFocusHighlightEnabled(); method public static int getDefaultSize(int, int); method public android.view.Display getDisplay(); method public final int[] getDrawableState(); @@ -52035,11 +52035,11 @@ package android.view { method @Deprecated public int getDrawingCacheQuality(); method public void getDrawingRect(android.graphics.Rect); method public long getDrawingTime(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getElevation(); + method public float getElevation(); method @StyleRes public int getExplicitStyle(); - method @android.view.ViewDebug.ExportedProperty public boolean getFilterTouchesWhenObscured(); - method @android.view.ViewDebug.ExportedProperty public boolean getFitsSystemWindows(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.NOT_FOCUSABLE, to="NOT_FOCUSABLE"), @android.view.ViewDebug.IntToString(from=android.view.View.FOCUSABLE, to="FOCUSABLE"), @android.view.ViewDebug.IntToString(from=android.view.View.FOCUSABLE_AUTO, to="FOCUSABLE_AUTO")}, category="focus") public int getFocusable(); + method public boolean getFilterTouchesWhenObscured(); + method public boolean getFitsSystemWindows(); + method public int getFocusable(); method public java.util.ArrayList<android.view.View> getFocusables(int); method public void getFocusedRect(android.graphics.Rect); method public android.graphics.drawable.Drawable getForeground(); @@ -52051,23 +52051,23 @@ package android.view { method public final boolean getGlobalVisibleRect(android.graphics.Rect); method public android.os.Handler getHandler(); method public final boolean getHasOverlappingRendering(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public final int getHeight(); + method public final int getHeight(); method public void getHitRect(android.graphics.Rect); method public int getHorizontalFadingEdgeLength(); method protected int getHorizontalScrollbarHeight(); method @Nullable public android.graphics.drawable.Drawable getHorizontalScrollbarThumbDrawable(); method @Nullable public android.graphics.drawable.Drawable getHorizontalScrollbarTrackDrawable(); - method @android.view.ViewDebug.CapturedViewProperty @IdRes public int getId(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS, to="noHideDescendants")}) public int getImportantForAccessibility(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForAutofill(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_AUTO, to="auto"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES, to="yes"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO, to="no"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_YES_EXCLUDE_DESCENDANTS, to="yesExcludeDescendants"), @android.view.ViewDebug.IntToString(from=android.view.View.IMPORTANT_FOR_CONTENT_CAPTURE_NO_EXCLUDE_DESCENDANTS, to="noExcludeDescendants")}) public int getImportantForContentCapture(); + method @IdRes public int getId(); + method public int getImportantForAccessibility(); + method public int getImportantForAutofill(); + method public int getImportantForContentCapture(); method public boolean getKeepScreenOn(); method public android.view.KeyEvent.DispatcherState getKeyDispatcherState(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility") @IdRes public int getLabelFor(); + method @IdRes public int getLabelFor(); method public int getLayerType(); - method @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_LTR, to="RESOLVED_DIRECTION_LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.LAYOUT_DIRECTION_RTL, to="RESOLVED_DIRECTION_RTL")}) public int getLayoutDirection(); - method @android.view.ViewDebug.ExportedProperty(deepExport=true, prefix="layout_") public android.view.ViewGroup.LayoutParams getLayoutParams(); - method @android.view.ViewDebug.CapturedViewProperty public final int getLeft(); + method public int getLayoutDirection(); + method public android.view.ViewGroup.LayoutParams getLayoutParams(); + method public final int getLeft(); method protected float getLeftFadingEdgeStrength(); method protected int getLeftPaddingOffset(); method public final boolean getLocalVisibleRect(android.graphics.Rect); @@ -52076,10 +52076,10 @@ package android.view { method public void getLocationOnScreen(@Size(2) int[]); method public android.graphics.Matrix getMatrix(); method public final int getMeasuredHeight(); - method @android.view.ViewDebug.ExportedProperty(category="measurement", flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.View.MEASURED_STATE_MASK, equals=android.view.View.MEASURED_STATE_TOO_SMALL, name="MEASURED_STATE_TOO_SMALL")}) public final int getMeasuredHeightAndState(); + method public final int getMeasuredHeightAndState(); method public final int getMeasuredState(); method public final int getMeasuredWidth(); - method @android.view.ViewDebug.ExportedProperty(category="measurement", flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.View.MEASURED_STATE_MASK, equals=android.view.View.MEASURED_STATE_TOO_SMALL, name="MEASURED_STATE_TOO_SMALL")}) public final int getMeasuredWidthAndState(); + method public final int getMeasuredWidthAndState(); method public int getMinimumHeight(); method public int getMinimumWidth(); method @IdRes public int getNextClusterForwardId(); @@ -52102,51 +52102,51 @@ package android.view { method public int getPaddingTop(); method public final android.view.ViewParent getParent(); method public android.view.ViewParent getParentForAccessibility(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getPivotX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getPivotY(); + method public float getPivotX(); + method public float getPivotY(); method public android.view.PointerIcon getPointerIcon(); method public android.content.res.Resources getResources(); method public final boolean getRevealOnFocusHint(); - method @android.view.ViewDebug.CapturedViewProperty public final int getRight(); + method public final int getRight(); method protected float getRightFadingEdgeStrength(); method protected int getRightPaddingOffset(); method public android.view.View getRootView(); method public android.view.WindowInsets getRootWindowInsets(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotation(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotationX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getRotationY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getScaleX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getScaleY(); + method public float getRotation(); + method public float getRotationX(); + method public float getRotationY(); + method public float getScaleX(); + method public float getScaleY(); method public int getScrollBarDefaultDelayBeforeFade(); method public int getScrollBarFadeDuration(); method public int getScrollBarSize(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_INSIDE_OVERLAY, to="INSIDE_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_INSIDE_INSET, to="INSIDE_INSET"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_OUTSIDE_OVERLAY, to="OUTSIDE_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.View.SCROLLBARS_OUTSIDE_INSET, to="OUTSIDE_INSET")}) public int getScrollBarStyle(); + method public int getScrollBarStyle(); method public int getScrollIndicators(); method public final int getScrollX(); method public final int getScrollY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") @ColorInt public int getSolidColor(); + method @ColorInt public int getSolidColor(); method @LayoutRes public int getSourceLayoutResId(); - method @android.view.ViewDebug.ExportedProperty(category="accessibility") @Nullable public final CharSequence getStateDescription(); + method @Nullable public final CharSequence getStateDescription(); method public android.animation.StateListAnimator getStateListAnimator(); method protected int getSuggestedMinimumHeight(); method protected int getSuggestedMinimumWidth(); method @NonNull public java.util.List<android.graphics.Rect> getSystemGestureExclusionRects(); method @Deprecated public int getSystemUiVisibility(); - method @android.view.ViewDebug.ExportedProperty public Object getTag(); + method public Object getTag(); method public Object getTag(int); - method @android.view.ViewDebug.ExportedProperty(category="text", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_INHERIT, to="INHERIT"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_GRAVITY, to="GRAVITY"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_TEXT_START, to="TEXT_START"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_TEXT_END, to="TEXT_END"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_VIEW_START, to="VIEW_START"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_ALIGNMENT_VIEW_END, to="VIEW_END")}) public int getTextAlignment(); - method @android.view.ViewDebug.ExportedProperty(category="text", mapping={@android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_INHERIT, to="INHERIT"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG, to="FIRST_STRONG"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_ANY_RTL, to="ANY_RTL"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_LTR, to="LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_RTL, to="RTL"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_LOCALE, to="LOCALE"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG_LTR, to="FIRST_STRONG_LTR"), @android.view.ViewDebug.IntToString(from=android.view.View.TEXT_DIRECTION_FIRST_STRONG_RTL, to="FIRST_STRONG_RTL")}) public int getTextDirection(); + method public int getTextAlignment(); + method public int getTextDirection(); method @Nullable public CharSequence getTooltipText(); - method @android.view.ViewDebug.CapturedViewProperty public final int getTop(); + method public final int getTop(); method protected float getTopFadingEdgeStrength(); method protected int getTopPaddingOffset(); method public android.view.TouchDelegate getTouchDelegate(); method public java.util.ArrayList<android.view.View> getTouchables(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTransitionAlpha(); - method @android.view.ViewDebug.ExportedProperty public String getTransitionName(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getTranslationZ(); + method public float getTransitionAlpha(); + method public String getTransitionName(); + method public float getTranslationX(); + method public float getTranslationY(); + method public float getTranslationZ(); method public long getUniqueDrawingId(); method public int getVerticalFadingEdgeLength(); method public int getVerticalScrollbarPosition(); @@ -52154,8 +52154,8 @@ package android.view { method @Nullable public android.graphics.drawable.Drawable getVerticalScrollbarTrackDrawable(); method public int getVerticalScrollbarWidth(); method public android.view.ViewTreeObserver getViewTreeObserver(); - method @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.View.VISIBLE, to="VISIBLE"), @android.view.ViewDebug.IntToString(from=android.view.View.INVISIBLE, to="INVISIBLE"), @android.view.ViewDebug.IntToString(from=android.view.View.GONE, to="GONE")}) public int getVisibility(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public final int getWidth(); + method public int getVisibility(); + method public final int getWidth(); method protected int getWindowAttachCount(); method public android.view.WindowId getWindowId(); method @Nullable public android.view.WindowInsetsController getWindowInsetsController(); @@ -52163,18 +52163,18 @@ package android.view { method public android.os.IBinder getWindowToken(); method public int getWindowVisibility(); method public void getWindowVisibleDisplayFrame(android.graphics.Rect); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getX(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getY(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public float getZ(); + method public float getX(); + method public float getY(); + method public float getZ(); method public boolean hasExplicitFocusable(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean hasFocus(); + method public boolean hasFocus(); method public boolean hasFocusable(); method public boolean hasNestedScrollingParent(); method public boolean hasOnClickListeners(); method public boolean hasOnLongClickListeners(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean hasOverlappingRendering(); + method public boolean hasOverlappingRendering(); method public boolean hasPointerCapture(); - method @android.view.ViewDebug.ExportedProperty(category="layout") public boolean hasTransientState(); + method public boolean hasTransientState(); method public boolean hasWindowFocus(); method public static android.view.View inflate(android.content.Context, @LayoutRes int, android.view.ViewGroup); method @Deprecated public void invalidate(android.graphics.Rect); @@ -52184,50 +52184,50 @@ package android.view { method public void invalidateOutline(); method public boolean isAccessibilityFocused(); method public boolean isAccessibilityHeading(); - method @android.view.ViewDebug.ExportedProperty public boolean isActivated(); + method public boolean isActivated(); method public boolean isAttachedToWindow(); - method @android.view.ViewDebug.ExportedProperty public boolean isClickable(); + method public boolean isClickable(); method public boolean isContextClickable(); method public boolean isDirty(); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isDrawingCacheEnabled(); + method @Deprecated public boolean isDrawingCacheEnabled(); method public boolean isDuplicateParentStateEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusable(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusableInTouchMode(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean isFocused(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isFocusedByDefault(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isForceDarkAllowed(); - method @android.view.ViewDebug.ExportedProperty public boolean isHapticFeedbackEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isHardwareAccelerated(); + method public boolean isEnabled(); + method public final boolean isFocusable(); + method public final boolean isFocusableInTouchMode(); + method public boolean isFocused(); + method public final boolean isFocusedByDefault(); + method public boolean isForceDarkAllowed(); + method public boolean isHapticFeedbackEnabled(); + method public boolean isHardwareAccelerated(); method public boolean isHorizontalFadingEdgeEnabled(); method public boolean isHorizontalScrollBarEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isHovered(); + method public boolean isHovered(); method public boolean isImportantForAccessibility(); method public final boolean isImportantForAutofill(); method public final boolean isImportantForContentCapture(); method public boolean isInEditMode(); method public boolean isInLayout(); - method @android.view.ViewDebug.ExportedProperty public boolean isInTouchMode(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public final boolean isKeyboardNavigationCluster(); + method public boolean isInTouchMode(); + method public final boolean isKeyboardNavigationCluster(); method public boolean isLaidOut(); method public boolean isLayoutDirectionResolved(); method public boolean isLayoutRequested(); method public boolean isLongClickable(); method public boolean isNestedScrollingEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean isOpaque(); + method public boolean isOpaque(); method protected boolean isPaddingOffsetRequired(); method public boolean isPaddingRelative(); method public boolean isPivotSet(); - method @android.view.ViewDebug.ExportedProperty public boolean isPressed(); + method public boolean isPressed(); method public boolean isSaveEnabled(); method public boolean isSaveFromParentEnabled(); method public boolean isScreenReaderFocusable(); method public boolean isScrollContainer(); method public boolean isScrollbarFadingEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isSelected(); + method public boolean isSelected(); method public final boolean isShowingLayoutBounds(); method public boolean isShown(); - method @android.view.ViewDebug.ExportedProperty public boolean isSoundEffectsEnabled(); + method public boolean isSoundEffectsEnabled(); method public final boolean isTemporarilyDetached(); method public boolean isTextAlignmentResolved(); method public boolean isTextDirectionResolved(); @@ -52518,8 +52518,8 @@ package android.view { method public void unscheduleDrawable(android.graphics.drawable.Drawable); method public final void updateDragShadow(android.view.View.DragShadowBuilder); method @CallSuper protected boolean verifyDrawable(@NonNull android.graphics.drawable.Drawable); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean willNotCacheDrawing(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean willNotDraw(); + method @Deprecated public boolean willNotCacheDrawing(); + method public boolean willNotDraw(); field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2 field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0 field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1 @@ -52960,9 +52960,9 @@ package android.view { method public static int getChildMeasureSpec(int, int, int); method protected boolean getChildStaticTransformation(android.view.View, android.view.animation.Transformation); method public boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean getClipChildren(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") public boolean getClipToPadding(); - method @android.view.ViewDebug.ExportedProperty(category="focus", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_BEFORE_DESCENDANTS, to="FOCUS_BEFORE_DESCENDANTS"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_AFTER_DESCENDANTS, to="FOCUS_AFTER_DESCENDANTS"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.FOCUS_BLOCK_DESCENDANTS, to="FOCUS_BLOCK_DESCENDANTS")}) public int getDescendantFocusability(); + method public boolean getClipChildren(); + method public boolean getClipToPadding(); + method public int getDescendantFocusability(); method public android.view.View getFocusedChild(); method public android.view.animation.LayoutAnimationController getLayoutAnimation(); method public android.view.animation.Animation.AnimationListener getLayoutAnimationListener(); @@ -52970,14 +52970,14 @@ package android.view { method public android.animation.LayoutTransition getLayoutTransition(); method public int getNestedScrollAxes(); method public android.view.ViewGroupOverlay getOverlay(); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="drawing", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_NO_CACHE, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_ANIMATION_CACHE, to="ANIMATION"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_SCROLLING_CACHE, to="SCROLLING"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.PERSISTENT_ALL_CACHES, to="ALL")}) public int getPersistentDrawingCache(); - method @android.view.ViewDebug.ExportedProperty(category="focus") public boolean getTouchscreenBlocksFocus(); + method @Deprecated public int getPersistentDrawingCache(); + method public boolean getTouchscreenBlocksFocus(); method public int indexOfChild(android.view.View); method @Deprecated public final void invalidateChild(android.view.View, android.graphics.Rect); method @Deprecated public android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect); method @Deprecated public boolean isAlwaysDrawnWithCacheEnabled(); method @Deprecated public boolean isAnimationCacheEnabled(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") protected boolean isChildrenDrawingOrderEnabled(); + method protected boolean isChildrenDrawingOrderEnabled(); method @Deprecated protected boolean isChildrenDrawnWithCacheEnabled(); method public boolean isLayoutSuppressed(); method public boolean isMotionEventSplittingEnabled(); @@ -53068,9 +53068,9 @@ package android.view { field @Deprecated public static final int FILL_PARENT = -1; // 0xffffffff field public static final int MATCH_PARENT = -1; // 0xffffffff field public static final int WRAP_CONTENT = -2; // 0xfffffffe - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.MATCH_PARENT, to="MATCH_PARENT"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.WRAP_CONTENT, to="WRAP_CONTENT")}) public int height; + field public int height; field public android.view.animation.LayoutAnimationController.AnimationParameters layoutAnimationParameters; - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.MATCH_PARENT, to="MATCH_PARENT"), @android.view.ViewDebug.IntToString(from=android.view.ViewGroup.LayoutParams.WRAP_CONTENT, to="WRAP_CONTENT")}) public int width; + field public int width; } public static class ViewGroup.MarginLayoutParams extends android.view.ViewGroup.LayoutParams { @@ -53086,10 +53086,10 @@ package android.view { method public void setMarginEnd(int); method public void setMarginStart(int); method public void setMargins(int, int, int, int); - field @android.view.ViewDebug.ExportedProperty(category="layout") public int bottomMargin; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int leftMargin; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int rightMargin; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int topMargin; + field public int bottomMargin; + field public int leftMargin; + field public int rightMargin; + field public int topMargin; } public static interface ViewGroup.OnHierarchyChangeListener { @@ -53886,11 +53886,11 @@ package android.view { field public float alpha; field public float buttonBrightness; field public float dimAmount; - field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, name="ALLOW_LOCK_WHILE_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND, equals=android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND, name="DIM_BEHIND"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND, equals=android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND, name="BLUR_BEHIND"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, name="NOT_FOCUSABLE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, name="NOT_TOUCHABLE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, equals=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, name="NOT_TOUCH_MODAL"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, equals=android.view.WindowManager.LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING, name="TOUCHABLE_WHEN_WAKING"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, name="KEEP_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, name="LAYOUT_IN_SCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, name="LAYOUT_NO_LIMITS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN, name="FULLSCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, equals=android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, name="FORCE_NOT_FULLSCREEN"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DITHER, equals=android.view.WindowManager.LayoutParams.FLAG_DITHER, name="DITHER"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SECURE, equals=android.view.WindowManager.LayoutParams.FLAG_SECURE, name="SECURE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SCALED, equals=android.view.WindowManager.LayoutParams.FLAG_SCALED, name="SCALED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES, equals=android.view.WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES, name="IGNORE_CHEEK_PRESSES"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR, name="LAYOUT_INSET_DECOR"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, equals=android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, name="ALT_FOCUSABLE_IM"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, equals=android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, name="WATCH_OUTSIDE_TOUCH"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, equals=android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, name="SHOW_WHEN_LOCKED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, equals=android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER, name="SHOW_WALLPAPER"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, equals=android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, name="TURN_SCREEN_ON"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, equals=android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD, name="DISMISS_KEYGUARD"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, equals=android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, name="SPLIT_TOUCH"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, equals=android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, name="HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN, name="LOCAL_FOCUS_MODE"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, equals=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, name="TRANSLUCENT_STATUS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, equals=android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, name="TRANSLUCENT_NAVIGATION"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE, equals=android.view.WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE, name="LOCAL_FOCUS_MODE"), @android.view.ViewDebug.FlagToString(mask=0x20000000, equals=0x20000000, name="FLAG_SLIPPERY"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR, equals=android.view.WindowManager.LayoutParams.FLAG_LAYOUT_ATTACHED_IN_DECOR, name="FLAG_LAYOUT_ATTACHED_IN_DECOR"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, equals=android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, name="DRAWS_SYSTEM_BAR_BACKGROUNDS")}, formatToHexString=true) public int flags; + field public int flags; field public int format; field public int gravity; field public float horizontalMargin; - field @android.view.ViewDebug.ExportedProperty public float horizontalWeight; + field public float horizontalWeight; field public int layoutInDisplayCutoutMode; field @Deprecated public int memoryType; field public String packageName; @@ -53903,12 +53903,12 @@ package android.view { field public int softInputMode; field @Deprecated public int systemUiVisibility; field public android.os.IBinder token; - field @android.view.ViewDebug.ExportedProperty(mapping={@android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION, to="BASE_APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION, to="APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING, to="APPLICATION_STARTING"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION, to="DRAWN_APPLICATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL, to="APPLICATION_PANEL"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA, to="APPLICATION_MEDIA"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL, to="APPLICATION_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=0x3ed, to="APPLICATION_ABOVE_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG, to="APPLICATION_ATTACHED_DIALOG"), @android.view.ViewDebug.IntToString(from=0x3ec, to="APPLICATION_MEDIA_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR, to="STATUS_BAR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SEARCH_BAR, to="SEARCH_BAR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PHONE, to="PHONE"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, to="SYSTEM_ALERT"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_TOAST, to="TOAST"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, to="SYSTEM_OVERLAY"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PRIORITY_PHONE, to="PRIORITY_PHONE"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG, to="SYSTEM_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG, to="KEYGUARD_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, to="SYSTEM_ERROR"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD, to="INPUT_METHOD"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG, to="INPUT_METHOD_DIALOG"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_WALLPAPER, to="WALLPAPER"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, to="STATUS_BAR_PANEL"), @android.view.ViewDebug.IntToString(from=0x7df, to="SECURE_SYSTEM_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7e0, to="DRAG"), @android.view.ViewDebug.IntToString(from=0x7e1, to="STATUS_BAR_SUB_PANEL"), @android.view.ViewDebug.IntToString(from=0x7e2, to="POINTER"), @android.view.ViewDebug.IntToString(from=0x7e3, to="NAVIGATION_BAR"), @android.view.ViewDebug.IntToString(from=0x7e4, to="VOLUME_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7e5, to="BOOT_PROGRESS"), @android.view.ViewDebug.IntToString(from=0x7e6, to="INPUT_CONSUMER"), @android.view.ViewDebug.IntToString(from=0x7e8, to="NAVIGATION_BAR_PANEL"), @android.view.ViewDebug.IntToString(from=0x7ea, to="DISPLAY_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7eb, to="MAGNIFICATION_OVERLAY"), @android.view.ViewDebug.IntToString(from=0x7f5, to="PRESENTATION"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION, to="PRIVATE_PRESENTATION"), @android.view.ViewDebug.IntToString(from=0x7ef, to="VOICE_INTERACTION"), @android.view.ViewDebug.IntToString(from=0x7f1, to="VOICE_INTERACTION_STARTING"), @android.view.ViewDebug.IntToString(from=0x7f2, to="DOCK_DIVIDER"), @android.view.ViewDebug.IntToString(from=0x7f3, to="QS_DIALOG"), @android.view.ViewDebug.IntToString(from=0x7f4, to="SCREENSHOT"), @android.view.ViewDebug.IntToString(from=android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, to="APPLICATION_OVERLAY")}) public int type; + field public int type; field public float verticalMargin; - field @android.view.ViewDebug.ExportedProperty public float verticalWeight; + field public float verticalWeight; field public int windowAnimations; - field @android.view.ViewDebug.ExportedProperty public int x; - field @android.view.ViewDebug.ExportedProperty public int y; + field public int x; + field public int y; } public final class WindowMetrics { @@ -56645,21 +56645,21 @@ package android.webkit { method public void flingScroll(int, int); method @Deprecated public void freeMemory(); method @Nullable public android.net.http.SslCertificate getCertificate(); - method @android.view.ViewDebug.ExportedProperty(category="webview") public int getContentHeight(); + method public int getContentHeight(); method @Nullable public static android.content.pm.PackageInfo getCurrentWebViewPackage(); method @Nullable public android.graphics.Bitmap getFavicon(); method @NonNull public android.webkit.WebView.HitTestResult getHitTestResult(); method @Deprecated @Nullable public String[] getHttpAuthUsernamePassword(String, String); - method @android.view.ViewDebug.ExportedProperty(category="webview") @Nullable public String getOriginalUrl(); + method @Nullable public String getOriginalUrl(); method public int getProgress(); method public boolean getRendererPriorityWaivedWhenNotVisible(); method public int getRendererRequestedPriority(); method @NonNull public static android.net.Uri getSafeBrowsingPrivacyPolicyUrl(); - method @Deprecated @android.view.ViewDebug.ExportedProperty(category="webview") public float getScale(); + method @Deprecated public float getScale(); method @NonNull public android.webkit.WebSettings getSettings(); method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier(); - method @android.view.ViewDebug.ExportedProperty(category="webview") @Nullable public String getTitle(); - method @android.view.ViewDebug.ExportedProperty(category="webview") @Nullable public String getUrl(); + method @Nullable public String getTitle(); + method @Nullable public String getUrl(); method @Nullable public android.webkit.WebChromeClient getWebChromeClient(); method @NonNull public static ClassLoader getWebViewClassLoader(); method @NonNull public android.webkit.WebViewClient getWebViewClient(); @@ -56861,7 +56861,7 @@ package android.widget { method public void fling(int); method public android.widget.AbsListView.LayoutParams generateLayoutParams(android.util.AttributeSet); method @ColorInt public int getBottomEdgeEffectColor(); - method @android.view.ViewDebug.ExportedProperty(category="drawing") @ColorInt public int getCacheColorHint(); + method @ColorInt public int getCacheColorHint(); method public int getCheckedItemCount(); method public long[] getCheckedItemIds(); method public int getCheckedItemPosition(); @@ -56871,7 +56871,7 @@ package android.widget { method public int getListPaddingLeft(); method public int getListPaddingRight(); method public int getListPaddingTop(); - method @android.view.ViewDebug.ExportedProperty public android.view.View getSelectedView(); + method public android.view.View getSelectedView(); method public android.graphics.drawable.Drawable getSelector(); method public CharSequence getTextFilter(); method @ColorInt public int getTopEdgeEffectColor(); @@ -56881,13 +56881,13 @@ package android.widget { method public void invalidateViews(); method public boolean isDrawSelectorOnTop(); method public boolean isFastScrollAlwaysVisible(); - method @android.view.ViewDebug.ExportedProperty public boolean isFastScrollEnabled(); + method public boolean isFastScrollEnabled(); method protected boolean isInFilterMode(); method public boolean isItemChecked(int); - method @android.view.ViewDebug.ExportedProperty public boolean isScrollingCacheEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isSmoothScrollbarEnabled(); - method @android.view.ViewDebug.ExportedProperty public boolean isStackFromBottom(); - method @android.view.ViewDebug.ExportedProperty public boolean isTextFilterEnabled(); + method public boolean isScrollingCacheEnabled(); + method public boolean isSmoothScrollbarEnabled(); + method public boolean isStackFromBottom(); + method public boolean isTextFilterEnabled(); method protected void layoutChildren(); method public void onFilterComplete(int); method public void onGlobalLayout(); @@ -57084,7 +57084,7 @@ package android.widget { ctor public AdapterView(android.content.Context, android.util.AttributeSet, int); ctor public AdapterView(android.content.Context, android.util.AttributeSet, int, int); method public abstract T getAdapter(); - method @android.view.ViewDebug.CapturedViewProperty public int getCount(); + method public int getCount(); method public android.view.View getEmptyView(); method public int getFirstVisiblePosition(); method public Object getItemAtPosition(int); @@ -57095,8 +57095,8 @@ package android.widget { method @Nullable public final android.widget.AdapterView.OnItemSelectedListener getOnItemSelectedListener(); method public int getPositionForView(android.view.View); method public Object getSelectedItem(); - method @android.view.ViewDebug.CapturedViewProperty public long getSelectedItemId(); - method @android.view.ViewDebug.CapturedViewProperty public int getSelectedItemPosition(); + method public long getSelectedItemId(); + method public int getSelectedItemPosition(); method public abstract android.view.View getSelectedView(); method public boolean performItemClick(android.view.View, int, long); method public abstract void setAdapter(T); @@ -57397,7 +57397,7 @@ package android.widget { method @Nullable public android.graphics.BlendMode getCheckMarkTintBlendMode(); method @Nullable public android.content.res.ColorStateList getCheckMarkTintList(); method @Nullable public android.graphics.PorterDuff.Mode getCheckMarkTintMode(); - method @android.view.ViewDebug.ExportedProperty public boolean isChecked(); + method public boolean isChecked(); method public void setCheckMarkDrawable(@DrawableRes int); method public void setCheckMarkDrawable(@Nullable android.graphics.drawable.Drawable); method public void setCheckMarkTintBlendMode(@Nullable android.graphics.BlendMode); @@ -57438,7 +57438,7 @@ package android.widget { method @Nullable public android.graphics.BlendMode getButtonTintBlendMode(); method @Nullable public android.content.res.ColorStateList getButtonTintList(); method @Nullable public android.graphics.PorterDuff.Mode getButtonTintMode(); - method @android.view.ViewDebug.ExportedProperty public boolean isChecked(); + method public boolean isChecked(); method public void setButtonDrawable(@DrawableRes int); method public void setButtonDrawable(@Nullable android.graphics.drawable.Drawable); method public void setButtonTintBlendMode(@Nullable android.graphics.BlendMode); @@ -57827,7 +57827,7 @@ package android.widget { method public int getColumnWidth(); method public int getGravity(); method public int getHorizontalSpacing(); - method @android.view.ViewDebug.ExportedProperty public int getNumColumns(); + method public int getNumColumns(); method public int getRequestedColumnWidth(); method public int getRequestedHorizontalSpacing(); method public int getStretchMode(); @@ -58018,8 +58018,8 @@ package android.widget { ctor public LinearLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams); ctor public LinearLayout.LayoutParams(android.widget.LinearLayout.LayoutParams); method public String debug(String); - field @android.view.ViewDebug.ExportedProperty(category="layout", mapping={@android.view.ViewDebug.IntToString(from=0xffffffff, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.NO_GRAVITY, to="NONE"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.TOP, to="TOP"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.BOTTOM, to="BOTTOM"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.LEFT, to="LEFT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.RIGHT, to="RIGHT"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.START, to="START"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.END, to="END"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_VERTICAL, to="CENTER_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_VERTICAL, to="FILL_VERTICAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER_HORIZONTAL, to="CENTER_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL_HORIZONTAL, to="FILL_HORIZONTAL"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.CENTER, to="CENTER"), @android.view.ViewDebug.IntToString(from=android.view.Gravity.FILL, to="FILL")}) public int gravity; - field @android.view.ViewDebug.ExportedProperty(category="layout") public float weight; + field public int gravity; + field public float weight; } public interface ListAdapter extends android.widget.Adapter { @@ -58408,13 +58408,13 @@ package android.widget { method @Nullable public android.content.res.ColorStateList getIndeterminateTintList(); method @Nullable public android.graphics.PorterDuff.Mode getIndeterminateTintMode(); method public android.view.animation.Interpolator getInterpolator(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getMax(); + method public int getMax(); method @Px public int getMaxHeight(); method @Px public int getMaxWidth(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getMin(); + method public int getMin(); method @Px public int getMinHeight(); method @Px public int getMinWidth(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getProgress(); + method public int getProgress(); method @Nullable public android.graphics.BlendMode getProgressBackgroundTintBlendMode(); method @Nullable public android.content.res.ColorStateList getProgressBackgroundTintList(); method @Nullable public android.graphics.PorterDuff.Mode getProgressBackgroundTintMode(); @@ -58422,14 +58422,14 @@ package android.widget { method @Nullable public android.graphics.BlendMode getProgressTintBlendMode(); method @Nullable public android.content.res.ColorStateList getProgressTintList(); method @Nullable public android.graphics.PorterDuff.Mode getProgressTintMode(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public int getSecondaryProgress(); + method public int getSecondaryProgress(); method @Nullable public android.graphics.BlendMode getSecondaryProgressTintBlendMode(); method @Nullable public android.content.res.ColorStateList getSecondaryProgressTintList(); method @Nullable public android.graphics.PorterDuff.Mode getSecondaryProgressTintMode(); method public final void incrementProgressBy(int); method public final void incrementSecondaryProgressBy(int); method public boolean isAnimating(); - method @android.view.ViewDebug.ExportedProperty(category="progress") public boolean isIndeterminate(); + method public boolean isIndeterminate(); method public void onRestoreInstanceState(android.os.Parcelable); method public android.os.Parcelable onSaveInstanceState(); method public void setIndeterminate(boolean); @@ -58580,7 +58580,7 @@ package android.widget { method public int getRule(int); method public int[] getRules(); method public void removeRule(int); - field @android.view.ViewDebug.ExportedProperty(category="layout") public boolean alignWithParent; + field public boolean alignWithParent; } public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable { @@ -59139,8 +59139,8 @@ package android.widget { ctor public TableRow.LayoutParams(int); ctor public TableRow.LayoutParams(android.view.ViewGroup.LayoutParams); ctor public TableRow.LayoutParams(android.view.ViewGroup.MarginLayoutParams); - field @android.view.ViewDebug.ExportedProperty(category="layout") public int column; - field @android.view.ViewDebug.ExportedProperty(category="layout") public int span; + field public int column; + field public int span; } @android.widget.RemoteViews.RemoteView public class TextClock extends android.widget.TextView { @@ -59148,8 +59148,8 @@ package android.widget { ctor public TextClock(android.content.Context, android.util.AttributeSet); ctor public TextClock(android.content.Context, android.util.AttributeSet, int); ctor public TextClock(android.content.Context, android.util.AttributeSet, int, int); - method @android.view.ViewDebug.ExportedProperty public CharSequence getFormat12Hour(); - method @android.view.ViewDebug.ExportedProperty public CharSequence getFormat24Hour(); + method public CharSequence getFormat12Hour(); + method public CharSequence getFormat24Hour(); method public String getTimeZone(); method public boolean is24HourModeEnabled(); method public void refreshTime(); @@ -59208,7 +59208,7 @@ package android.widget { method protected boolean getDefaultEditable(); method protected android.text.method.MovementMethod getDefaultMovementMethod(); method public android.text.Editable getEditableText(); - method @android.view.ViewDebug.ExportedProperty public android.text.TextUtils.TruncateAt getEllipsize(); + method public android.text.TextUtils.TruncateAt getEllipsize(); method public CharSequence getError(); method public int getExtendedPaddingBottom(); method public int getExtendedPaddingTop(); @@ -59219,7 +59219,7 @@ package android.widget { method public boolean getFreezesText(); method public int getGravity(); method @ColorInt public int getHighlightColor(); - method @android.view.ViewDebug.CapturedViewProperty public CharSequence getHint(); + method public CharSequence getHint(); method public final android.content.res.ColorStateList getHintTextColors(); method public int getHyphenationFrequency(); method public int getImeActionId(); @@ -59255,14 +59255,14 @@ package android.widget { method public android.text.TextPaint getPaint(); method public int getPaintFlags(); method public String getPrivateImeOptions(); - method @android.view.ViewDebug.ExportedProperty(category="text") public int getSelectionEnd(); - method @android.view.ViewDebug.ExportedProperty(category="text") public int getSelectionStart(); + method public int getSelectionEnd(); + method public int getSelectionStart(); method @ColorInt public int getShadowColor(); method public float getShadowDx(); method public float getShadowDy(); method public float getShadowRadius(); method public final boolean getShowSoftInputOnFocus(); - method @android.view.ViewDebug.CapturedViewProperty public CharSequence getText(); + method public CharSequence getText(); method @NonNull public android.view.textclassifier.TextClassifier getTextClassifier(); method public final android.content.res.ColorStateList getTextColors(); method @Nullable public android.graphics.drawable.Drawable getTextCursorDrawable(); @@ -59274,7 +59274,7 @@ package android.widget { method @Nullable public android.graphics.drawable.Drawable getTextSelectHandle(); method @Nullable public android.graphics.drawable.Drawable getTextSelectHandleLeft(); method @Nullable public android.graphics.drawable.Drawable getTextSelectHandleRight(); - method @android.view.ViewDebug.ExportedProperty(category="text") public float getTextSize(); + method public float getTextSize(); method public int getTextSizeUnit(); method public int getTotalPaddingBottom(); method public int getTotalPaddingEnd(); diff --git a/non-updatable-api/system-lint-baseline.txt b/non-updatable-api/system-lint-baseline.txt index 2829243e830b..395ddc16913d 100644 --- a/non-updatable-api/system-lint-baseline.txt +++ b/non-updatable-api/system-lint-baseline.txt @@ -1,74 +1,88 @@ // Baseline format: 1.0 ArrayReturn: android.view.contentcapture.ViewNode#getAutofillOptions(): - Method should return Collection<CharSequence> (or subclass) instead of raw array; was `java.lang.CharSequence[]` + + + +BuilderSetStyle: android.net.IpSecTransform.Builder#buildTunnelModeTransform(java.net.InetAddress, android.net.IpSecManager.SecurityParameterIndex): + Builder methods names should use setFoo() / addFoo() / clearFoo() style: method android.net.IpSecTransform.Builder.buildTunnelModeTransform(java.net.InetAddress,android.net.IpSecManager.SecurityParameterIndex) GenericException: android.app.prediction.AppPredictor#finalize(): - Methods must not throw generic exceptions (`java.lang.Throwable`) + GenericException: android.hardware.location.ContextHubClient#finalize(): - Methods must not throw generic exceptions (`java.lang.Throwable`) + GenericException: android.net.IpSecManager.IpSecTunnelInterface#finalize(): - Methods must not throw generic exceptions (`java.lang.Throwable`) + GenericException: android.service.autofill.augmented.FillWindow#finalize(): - Methods must not throw generic exceptions (`java.lang.Throwable`) + KotlinKeyword: android.app.Notification#when: - Avoid field names that are Kotlin hard keywords ("when"); see https://android.github.io/kotlin-guides/interop.html#no-hard-keywords + + + +MissingGetterMatchingBuilder: android.security.keystore.KeyGenParameterSpec.Builder#setUid(int): + android.security.keystore.KeyGenParameterSpec does not declare a `getUid()` method matching method android.security.keystore.KeyGenParameterSpec.Builder.setUid(int) +MissingGetterMatchingBuilder: android.service.autofill.Dataset.Builder#setFieldInlinePresentation(android.view.autofill.AutofillId, android.view.autofill.AutofillValue, java.util.regex.Pattern, android.service.autofill.InlinePresentation): + android.service.autofill.Dataset does not declare a `getFieldInlinePresentation()` method matching method android.service.autofill.Dataset.Builder.setFieldInlinePresentation(android.view.autofill.AutofillId,android.view.autofill.AutofillValue,java.util.regex.Pattern,android.service.autofill.InlinePresentation) +MissingGetterMatchingBuilder: android.telecom.CallScreeningService.CallResponse.Builder#setShouldScreenCallViaAudioProcessing(boolean): + android.telecom.CallScreeningService.CallResponse does not declare a `shouldScreenCallViaAudioProcessing()` method matching method android.telecom.CallScreeningService.CallResponse.Builder.setShouldScreenCallViaAudioProcessing(boolean) +MissingGetterMatchingBuilder: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String): + android.telephony.mbms.DownloadRequest does not declare a `getServiceId()` method matching method android.telephony.mbms.DownloadRequest.Builder.setServiceId(String) MissingNullability: android.media.soundtrigger.SoundTriggerDetectionService#onUnbind(android.content.Intent) parameter #0: - Missing nullability on parameter `intent` in method `onUnbind` + MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #0: - Missing nullability on parameter `inputId` in method `onEvent` + MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #1: - Missing nullability on parameter `eventType` in method `onEvent` + MissingNullability: android.media.tv.TvRecordingClient.RecordingCallback#onEvent(String, String, android.os.Bundle) parameter #2: - Missing nullability on parameter `eventArgs` in method `onEvent` + MissingNullability: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context) parameter #0: - Missing nullability on parameter `base` in method `attachBaseContext` + MissingNullability: android.provider.ContactsContract.MetadataSync#CONTENT_URI: - Missing nullability on field `CONTENT_URI` in class `class android.provider.ContactsContract.MetadataSync` + MissingNullability: android.provider.ContactsContract.MetadataSync#METADATA_AUTHORITY_URI: - Missing nullability on field `METADATA_AUTHORITY_URI` in class `class android.provider.ContactsContract.MetadataSync` + MissingNullability: android.provider.ContactsContract.MetadataSyncState#CONTENT_URI: - Missing nullability on field `CONTENT_URI` in class `class android.provider.ContactsContract.MetadataSyncState` + MissingNullability: android.provider.SearchIndexablesProvider#attachInfo(android.content.Context, android.content.pm.ProviderInfo) parameter #0: - Missing nullability on parameter `context` in method `attachInfo` + MissingNullability: android.provider.SearchIndexablesProvider#attachInfo(android.content.Context, android.content.pm.ProviderInfo) parameter #1: - Missing nullability on parameter `info` in method `attachInfo` + MissingNullability: android.service.autofill.augmented.AugmentedAutofillService#onUnbind(android.content.Intent) parameter #0: - Missing nullability on parameter `intent` in method `onUnbind` + MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #0: - Missing nullability on parameter `fd` in method `dump` + MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #1: - Missing nullability on parameter `pw` in method `dump` + MissingNullability: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]) parameter #2: - Missing nullability on parameter `args` in method `dump` + MissingNullability: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context) parameter #0: - Missing nullability on parameter `base` in method `attachBaseContext` + MissingNullability: android.telephony.NetworkService#onUnbind(android.content.Intent) parameter #0: - Missing nullability on parameter `intent` in method `onUnbind` + MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringDaily(java.time.ZonedDateTime) parameter #0: - Missing nullability on parameter `start` in method `createRecurringDaily` + MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringMonthly(java.time.ZonedDateTime) parameter #0: - Missing nullability on parameter `start` in method `createRecurringMonthly` + MissingNullability: android.telephony.SubscriptionPlan.Builder#createRecurringWeekly(java.time.ZonedDateTime) parameter #0: - Missing nullability on parameter `start` in method `createRecurringWeekly` + MissingNullability: android.telephony.data.DataService#onUnbind(android.content.Intent) parameter #0: - Missing nullability on parameter `intent` in method `onUnbind` + MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String): - Missing nullability on method `setServiceId` return + MissingNullability: android.telephony.mbms.DownloadRequest.Builder#setServiceId(String) parameter #0: - Missing nullability on parameter `serviceId` in method `setServiceId` + ProtectedMember: android.printservice.recommendation.RecommendationService#attachBaseContext(android.content.Context): - Protected methods not allowed; must be public: method android.printservice.recommendation.RecommendationService.attachBaseContext(android.content.Context)} + ProtectedMember: android.service.contentcapture.ContentCaptureService#dump(java.io.FileDescriptor, java.io.PrintWriter, String[]): - Protected methods not allowed; must be public: method android.service.contentcapture.ContentCaptureService.dump(java.io.FileDescriptor,java.io.PrintWriter,String[])} + ProtectedMember: android.service.notification.NotificationAssistantService#attachBaseContext(android.content.Context): - Protected methods not allowed; must be public: method android.service.notification.NotificationAssistantService.attachBaseContext(android.content.Context)} + SamShouldBeLast: android.accounts.AccountManager#addAccount(String, String, String[], android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler): @@ -168,7 +182,7 @@ SamShouldBeLast: android.media.AudioRecordingMonitor#registerAudioRecordingCallb SamShouldBeLast: android.media.AudioRouting#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): SamShouldBeLast: android.media.AudioTrack#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): - SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioTrack.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions + SamShouldBeLast: android.media.MediaRecorder#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): SamShouldBeLast: android.media.MediaRecorder#registerAudioRecordingCallback(java.util.concurrent.Executor, android.media.AudioManager.AudioRecordingCallback): diff --git a/packages/CarSystemUI/res/values-ca/strings.xml b/packages/CarSystemUI/res/values-ca/strings.xml index 083f9d05069e..375fc5c10baf 100644 --- a/packages/CarSystemUI/res/values-ca/strings.xml +++ b/packages/CarSystemUI/res/values-ca/strings.xml @@ -24,7 +24,7 @@ <string name="start_guest_session" msgid="497784785761754874">"Convidat"</string> <string name="car_add_user" msgid="4067337059622483269">"Afegeix un usuari"</string> <string name="car_new_user" msgid="6637442369728092473">"Usuari nou"</string> - <string name="user_add_user_message_setup" msgid="1035578846007352323">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai."</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"Quan s\'afegeix un usuari nou, aquesta persona ha de configurar el seu espai."</string> <string name="user_add_user_message_update" msgid="7061671307004867811">"Qualsevol usuari pot actualitzar les aplicacions de la resta d\'usuaris."</string> <string name="car_loading_profile" msgid="4507385037552574474">"S\'està carregant"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"S\'està carregant l\'usuari (de <xliff:g id="FROM_USER">%1$d</xliff:g> a <xliff:g id="TO_USER">%2$d</xliff:g>)"</string> diff --git a/packages/CarSystemUI/res/values-es-rUS/strings.xml b/packages/CarSystemUI/res/values-es-rUS/strings.xml index c1c21d17a3a7..027242a536fa 100644 --- a/packages/CarSystemUI/res/values-es-rUS/strings.xml +++ b/packages/CarSystemUI/res/values-es-rUS/strings.xml @@ -25,7 +25,7 @@ <string name="car_add_user" msgid="4067337059622483269">"Agregar usuario"</string> <string name="car_new_user" msgid="6637442369728092473">"Usuario nuevo"</string> <string name="user_add_user_message_setup" msgid="1035578846007352323">"Cuando agregues un usuario nuevo, esa persona deberá configurar su espacio."</string> - <string name="user_add_user_message_update" msgid="7061671307004867811">"Cualquier usuario podrá actualizar las apps de otras personas."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"Cualquier usuario puede actualizar las aplicaciones del resto de los usuarios."</string> <string name="car_loading_profile" msgid="4507385037552574474">"Cargando"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Cargando usuario (de <xliff:g id="FROM_USER">%1$d</xliff:g> a <xliff:g id="TO_USER">%2$d</xliff:g>)"</string> </resources> diff --git a/packages/CarSystemUI/res/values-fi/strings.xml b/packages/CarSystemUI/res/values-fi/strings.xml index 60689695725c..6abf92ffa77a 100644 --- a/packages/CarSystemUI/res/values-fi/strings.xml +++ b/packages/CarSystemUI/res/values-fi/strings.xml @@ -25,7 +25,7 @@ <string name="car_add_user" msgid="4067337059622483269">"Lisää käyttäjä"</string> <string name="car_new_user" msgid="6637442369728092473">"Uusi käyttäjä"</string> <string name="user_add_user_message_setup" msgid="1035578846007352323">"Kun lisäät uuden käyttäjän, hänen on valittava oman tilansa asetukset."</string> - <string name="user_add_user_message_update" msgid="7061671307004867811">"Kaikki käyttäjät voivat päivittää muiden käyttäjien sovelluksia."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"Kaikki käyttäjät voivat päivittää sovelluksia muille käyttäjille."</string> <string name="car_loading_profile" msgid="4507385037552574474">"Ladataan"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Ladataan käyttäjäprofiilia (<xliff:g id="FROM_USER">%1$d</xliff:g>–<xliff:g id="TO_USER">%2$d</xliff:g>)"</string> </resources> diff --git a/packages/CarSystemUI/res/values-in/strings.xml b/packages/CarSystemUI/res/values-in/strings.xml index 901cbe759d63..1145dc32dcb0 100644 --- a/packages/CarSystemUI/res/values-in/strings.xml +++ b/packages/CarSystemUI/res/values-in/strings.xml @@ -24,7 +24,7 @@ <string name="start_guest_session" msgid="497784785761754874">"Tamu"</string> <string name="car_add_user" msgid="4067337059622483269">"Tambahkan Pengguna"</string> <string name="car_new_user" msgid="6637442369728092473">"Pengguna Baru"</string> - <string name="user_add_user_message_setup" msgid="1035578846007352323">"Saat Anda menambahkan pengguna baru, orang tersebut perlu menyiapkan ruangnya sendiri."</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"Jika ditambahkan, pengguna baru harus menyiapkan ruangnya sendiri."</string> <string name="user_add_user_message_update" msgid="7061671307004867811">"Setiap pengguna dapat mengupdate aplikasi untuk semua pengguna lain."</string> <string name="car_loading_profile" msgid="4507385037552574474">"Memuat"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Memuat pengguna (dari <xliff:g id="FROM_USER">%1$d</xliff:g> menjadi <xliff:g id="TO_USER">%2$d</xliff:g>)"</string> diff --git a/packages/CarSystemUI/res/values-kk/strings.xml b/packages/CarSystemUI/res/values-kk/strings.xml index f9449be39540..5220aa5bf1bd 100644 --- a/packages/CarSystemUI/res/values-kk/strings.xml +++ b/packages/CarSystemUI/res/values-kk/strings.xml @@ -24,7 +24,7 @@ <string name="start_guest_session" msgid="497784785761754874">"Қонақ"</string> <string name="car_add_user" msgid="4067337059622483269">"Пайдаланушыны енгізу"</string> <string name="car_new_user" msgid="6637442369728092473">"Жаңа пайдаланушы"</string> - <string name="user_add_user_message_setup" msgid="1035578846007352323">"Енгізілген жаңа пайдаланушы өз профилін реттеуі керек."</string> + <string name="user_add_user_message_setup" msgid="1035578846007352323">"Қосылған жаңа пайдаланушы өз профилін реттеуі керек."</string> <string name="user_add_user_message_update" msgid="7061671307004867811">"Кез келген пайдаланушы қолданбаларды басқа пайдаланушылар үшін жаңарта алады."</string> <string name="car_loading_profile" msgid="4507385037552574474">"Жүктелуде"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Пайдаланушы профилі жүктелуде (<xliff:g id="FROM_USER">%1$d</xliff:g> – <xliff:g id="TO_USER">%2$d</xliff:g>)"</string> diff --git a/packages/CarSystemUI/res/values-ky/strings.xml b/packages/CarSystemUI/res/values-ky/strings.xml index b093363d0c23..b3b355a42aa8 100644 --- a/packages/CarSystemUI/res/values-ky/strings.xml +++ b/packages/CarSystemUI/res/values-ky/strings.xml @@ -25,7 +25,7 @@ <string name="car_add_user" msgid="4067337059622483269">"Колдонуучу кошуу"</string> <string name="car_new_user" msgid="6637442369728092473">"Жаңы колдонуучу"</string> <string name="user_add_user_message_setup" msgid="1035578846007352323">"Жаңы колдонуучу кошулганда, ал өзүнүн профилин жөндөп алышы керек."</string> - <string name="user_add_user_message_update" msgid="7061671307004867811">"Колдонмолорду бир колдонуучу калган бардык колдонуучулар үчүн да жаңырта алат."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"Колдонмолорду бир колдонуучу жаңыртканда, ал калган бардык колдонуучулар үчүн да жаңырат."</string> <string name="car_loading_profile" msgid="4507385037552574474">"Жүктөлүүдө"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Колдонуучу тууралуу маалымат жүктөлүүдө (<xliff:g id="FROM_USER">%1$d</xliff:g> – <xliff:g id="TO_USER">%2$d</xliff:g>)"</string> </resources> diff --git a/packages/CarSystemUI/res/values-ne/strings.xml b/packages/CarSystemUI/res/values-ne/strings.xml index 70bcfc763cf2..40639dedc4b5 100644 --- a/packages/CarSystemUI/res/values-ne/strings.xml +++ b/packages/CarSystemUI/res/values-ne/strings.xml @@ -25,7 +25,7 @@ <string name="car_add_user" msgid="4067337059622483269">"प्रयोगकर्ता थप्नुहोस्"</string> <string name="car_new_user" msgid="6637442369728092473">"नयाँ प्रयोगकर्ता"</string> <string name="user_add_user_message_setup" msgid="1035578846007352323">"तपाईंले नयाँ प्रयोगकर्ता थप्दा ती व्यक्तिले आफ्नो स्थान सेटअप गर्नु पर्छ।"</string> - <string name="user_add_user_message_update" msgid="7061671307004867811">"सबै प्रयोगकर्ताले अन्य प्रयोगकर्ताका अनुप्रयोगहरू अद्यावधिक गर्न सक्छन्।"</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"सबै प्रयोगकर्ताले अन्य प्रयोगकर्ताका एपहरू अद्यावधिक गर्न सक्छन्।"</string> <string name="car_loading_profile" msgid="4507385037552574474">"लोड गरिँदै"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"प्रयोगकर्तासम्बन्धी जानकारी लोड गरिँदै (<xliff:g id="FROM_USER">%1$d</xliff:g> बाट <xliff:g id="TO_USER">%2$d</xliff:g> मा)"</string> </resources> diff --git a/packages/CarSystemUI/res/values-sk/strings.xml b/packages/CarSystemUI/res/values-sk/strings.xml index ea99f0faf5e0..2016b7b18adf 100644 --- a/packages/CarSystemUI/res/values-sk/strings.xml +++ b/packages/CarSystemUI/res/values-sk/strings.xml @@ -25,7 +25,7 @@ <string name="car_add_user" msgid="4067337059622483269">"Pridať používateľa"</string> <string name="car_new_user" msgid="6637442369728092473">"Nový používateľ"</string> <string name="user_add_user_message_setup" msgid="1035578846007352323">"Keď pridáte nového používateľa, musí si nastaviť vlastný priestor."</string> - <string name="user_add_user_message_update" msgid="7061671307004867811">"Ktorýkoľvek používateľ môže aktualizovať aplikácie všetkých ostatných používateľov."</string> + <string name="user_add_user_message_update" msgid="7061671307004867811">"Každý používateľ môže aktualizovať aplikácie pre všetkých ostatných používateľov."</string> <string name="car_loading_profile" msgid="4507385037552574474">"Načítava sa"</string> <string name="car_loading_profile_developer_message" msgid="1660962766911529611">"Načítava sa používateľ (predchádzajúci: <xliff:g id="FROM_USER">%1$d</xliff:g>, nasledujúci: <xliff:g id="TO_USER">%2$d</xliff:g>)"</string> </resources> diff --git a/packages/DynamicSystemInstallationService/res/values-nl/strings.xml b/packages/DynamicSystemInstallationService/res/values-nl/strings.xml index 2b9fa414dcc5..47eeb839c6dc 100644 --- a/packages/DynamicSystemInstallationService/res/values-nl/strings.xml +++ b/packages/DynamicSystemInstallationService/res/values-nl/strings.xml @@ -2,7 +2,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="keyguard_description" msgid="8582605799129954556">"Geef je wachtwoord op en ga door naar \'Dynamische systeemupdates\'"</string> - <string name="notification_install_completed" msgid="6252047868415172643">"Dynamisch systeem is klaar. Start je apparaat opnieuw op om het te gebruiken."</string> + <string name="notification_install_completed" msgid="6252047868415172643">"Dynamisch systeem is gereed. Start je apparaat opnieuw op om het te gebruiken."</string> <string name="notification_install_inprogress" msgid="7383334330065065017">"Installatie wordt uitgevoerd"</string> <string name="notification_install_failed" msgid="4066039210317521404">"Installatie mislukt"</string> <string name="notification_image_validation_failed" msgid="2720357826403917016">"Valideren van afbeelding mislukt. Installatie afbreken."</string> diff --git a/packages/DynamicSystemInstallationService/res/values-ur/strings.xml b/packages/DynamicSystemInstallationService/res/values-ur/strings.xml index 1e098fb82ddb..48dddbea3281 100644 --- a/packages/DynamicSystemInstallationService/res/values-ur/strings.xml +++ b/packages/DynamicSystemInstallationService/res/values-ur/strings.xml @@ -5,7 +5,7 @@ <string name="notification_install_completed" msgid="6252047868415172643">"ڈائنیمک سسٹم تیار ہے۔ اس کا استعمال شروع کرنے کے لیے، اپنا آلہ ری سٹارٹ کریں۔"</string> <string name="notification_install_inprogress" msgid="7383334330065065017">"انسٹال جاری ہے"</string> <string name="notification_install_failed" msgid="4066039210317521404">"انسٹال ناکام ہو گیا"</string> - <string name="notification_image_validation_failed" msgid="2720357826403917016">"ڈسک امیج کی توثیق ناکام ہو گئی۔ انسٹالیشن منسوخ کریں۔"</string> + <string name="notification_image_validation_failed" msgid="2720357826403917016">"تصویر کی توثیق ناکام ہو گئی۔ انسٹالیشن منسوخ کریں-"</string> <string name="notification_dynsystem_in_use" msgid="1053194595682188396">"فی الحال ہم ایک ڈائنیمک سسٹم چلا رہے ہیں۔ Android کا اصل ورژن استعمال کرنے کے لیے ری سٹارٹ کریں۔"</string> <string name="notification_action_cancel" msgid="5929299408545961077">"منسوخ کریں"</string> <string name="notification_action_discard" msgid="1817481003134947493">"مسترد کریں"</string> diff --git a/packages/InputDevices/res/values-ru/strings.xml b/packages/InputDevices/res/values-ru/strings.xml index 423243716208..49bf0b7f3aad 100644 --- a/packages/InputDevices/res/values-ru/strings.xml +++ b/packages/InputDevices/res/values-ru/strings.xml @@ -42,6 +42,6 @@ <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"испанский (Латинская Америка)"</string> <string name="keyboard_layout_latvian" msgid="4405417142306250595">"латышский"</string> <string name="keyboard_layout_persian" msgid="3920643161015888527">"Персидский"</string> - <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"азербайджанский"</string> + <string name="keyboard_layout_azerbaijani" msgid="7315895417176467567">"Азербайджанский"</string> <string name="keyboard_layout_polish" msgid="1121588624094925325">"польский"</string> </resources> diff --git a/packages/PackageInstaller/Android.bp b/packages/PackageInstaller/Android.bp index 9420954748c4..75bd32ec0301 100644 --- a/packages/PackageInstaller/Android.bp +++ b/packages/PackageInstaller/Android.bp @@ -20,6 +20,7 @@ android_app { certificate: "platform", privileged: true, platform_apis: true, + rename_resources_package: false, static_libs: [ "xz-java", diff --git a/packages/PackageInstaller/res/values-ar/strings.xml b/packages/PackageInstaller/res/values-ar/strings.xml index c840374d3f6b..87f89ce192c4 100644 --- a/packages/PackageInstaller/res/values-ar/strings.xml +++ b/packages/PackageInstaller/res/values-ar/strings.xml @@ -57,7 +57,7 @@ <string name="uninstall_application_text_all_users" msgid="575491774380227119">"هل تريد إزالة هذا التطبيق "<b>"لكل"</b>" المستخدمين؟ ستتم إزالة التطبيق وبياناته من "<b>"كل"</b>" المستخدمين على هذا الجهاز."</string> <string name="uninstall_application_text_user" msgid="498072714173920526">"هل تريد إزالة هذا التطبيق للمستخدم <xliff:g id="USERNAME">%1$s</xliff:g>؟"</string> <string name="uninstall_update_text" msgid="863648314632448705">"هل تريد استبدال هذا التطبيق بإصدار المصنع؟ ستتم إزالة جميع البيانات."</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"هل تريد إعادة ضبط هذا التطبيق على الإعدادات الأصلية؟ سؤدي ذلك إلى إزالة جميع البيانات، كما سيؤثر على جميع مستخدمي هذا الجهاز، بما في ذلك من لديهم ملفات شخصية للعمل."</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"هل تريد استبدال هذا التطبيق بإصدار المصنع؟ ستتم إزالة جميع البيانات. وسيؤثر هذا في جميع مستخدمي هذا الجهاز، بما في ذلك من لديهم ملفات شخصية للعمل."</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"الاحتفاظ بالحجم <xliff:g id="SIZE">%1$s</xliff:g> من بيانات التطبيق."</string> <string name="uninstalling_notification_channel" msgid="840153394325714653">"عمليات إلغاء التثبيت الجارية"</string> <string name="uninstall_failure_notification_channel" msgid="1136405866767576588">"عمليات إلغاء التثبيت غير الناجحة"</string> diff --git a/packages/PackageInstaller/res/values-nl/strings.xml b/packages/PackageInstaller/res/values-nl/strings.xml index d3a958922d1c..108c86fe8369 100644 --- a/packages/PackageInstaller/res/values-nl/strings.xml +++ b/packages/PackageInstaller/res/values-nl/strings.xml @@ -18,7 +18,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="app_name" msgid="7488448184431507488">"Pakket-installatie"</string> <string name="install" msgid="711829760615509273">"Installeren"</string> - <string name="done" msgid="6632441120016885253">"Klaar"</string> + <string name="done" msgid="6632441120016885253">"Gereed"</string> <string name="cancel" msgid="1018267193425558088">"Annuleren"</string> <string name="installing" msgid="4921993079741206516">"Installeren…"</string> <string name="installing_app" msgid="1165095864863849422">"<xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> installeren…"</string> diff --git a/packages/PrintSpooler/res/values-as/strings.xml b/packages/PrintSpooler/res/values-as/strings.xml index b6b287ff66aa..a93fceb87959 100644 --- a/packages/PrintSpooler/res/values-as/strings.xml +++ b/packages/PrintSpooler/res/values-as/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"PDFৰ জৰিয়তে ছেভ কৰক"</string> <string name="print_options_expanded" msgid="6944679157471691859">"প্ৰিণ্ট বিকল্পসমূহ বিস্তাৰ কৰা হ’ল"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"প্ৰিণ্ট বিকল্পসমূহ সংকুচিত কৰা হ’ল"</string> - <string name="search" msgid="5421724265322228497">"Search"</string> + <string name="search" msgid="5421724265322228497">"সন্ধান কৰক"</string> <string name="all_printers_label" msgid="3178848870161526399">"সকলো প্ৰিণ্টাৰ"</string> <string name="add_print_service_label" msgid="5356702546188981940">"সেৱা যোগ কৰক"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"সন্ধান বাকচটো দেখুওৱা হ’ল"</string> diff --git a/packages/PrintSpooler/res/values-bn/strings.xml b/packages/PrintSpooler/res/values-bn/strings.xml index b2e1eed85f0c..637becbe23f0 100644 --- a/packages/PrintSpooler/res/values-bn/strings.xml +++ b/packages/PrintSpooler/res/values-bn/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"পিডিএফ হিসাবে সেভ করুন"</string> <string name="print_options_expanded" msgid="6944679157471691859">"প্রিন্ট বিকল্প প্রসারিত হয়েছে"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"প্রিন্ট বিকল্প সংকুচিত হয়েছে"</string> - <string name="search" msgid="5421724265322228497">"সার্চ"</string> + <string name="search" msgid="5421724265322228497">"খুঁজুন"</string> <string name="all_printers_label" msgid="3178848870161526399">"সমস্ত প্রিন্টার"</string> <string name="add_print_service_label" msgid="5356702546188981940">"পরিষেবা যোগ করুন"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"সার্চ বাক্স দেখানো হচ্ছে"</string> diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index 719fc9219450..596947dfb6dc 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -31,7 +31,7 @@ <string name="template_all_pages" msgid="3322235982020148762">"همه <xliff:g id="PAGE_COUNT">%1$s</xliff:g> صفحه"</string> <string name="template_page_range" msgid="428638530038286328">"محدوده <xliff:g id="PAGE_COUNT">%1$s</xliff:g> صفحه"</string> <string name="pages_range_example" msgid="8558694453556945172">"مثلاً ۱—۵،۹،۷—۱۰"</string> - <string name="print_preview" msgid="8010217796057763343">"پیشنمای چاپ"</string> + <string name="print_preview" msgid="8010217796057763343">"پیشنمایش چاپ"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"نصب نمایشگر PDF برای پیشنمایش"</string> <string name="printing_app_crashed" msgid="854477616686566398">"برنامه چاپ خراب شد"</string> <string name="generating_print_job" msgid="3119608742651698916">"در حال ایجاد کار چاپ"</string> diff --git a/packages/PrintSpooler/res/values-kn/strings.xml b/packages/PrintSpooler/res/values-kn/strings.xml index 261fe4b0de9a..150ede4f8e62 100644 --- a/packages/PrintSpooler/res/values-kn/strings.xml +++ b/packages/PrintSpooler/res/values-kn/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"PDF ಗೆ ಉಳಿಸು"</string> <string name="print_options_expanded" msgid="6944679157471691859">"ಪ್ರಿಂಟ್ ಆಯ್ಕೆಗಳನ್ನು ವಿಸ್ತರಿಸಲಾಗಿದೆ"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"ಪ್ರಿಂಟ್ ಆಯ್ಕೆಗಳನ್ನು ಮುಚ್ಚಲಾಗಿದೆ"</string> - <string name="search" msgid="5421724265322228497">"Search"</string> + <string name="search" msgid="5421724265322228497">"ಹುಡುಕಿ"</string> <string name="all_printers_label" msgid="3178848870161526399">"ಎಲ್ಲಾ ಪ್ರಿಂಟರ್ಗಳು"</string> <string name="add_print_service_label" msgid="5356702546188981940">"ಸೇವೆಯನ್ನು ಸೇರಿಸು"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ಹುಡುಕಾಟ ಪೆಟ್ಟಿಗೆಯನ್ನು ತೋರಿಸಲಾಗಿದೆ"</string> diff --git a/packages/PrintSpooler/res/values-ml/strings.xml b/packages/PrintSpooler/res/values-ml/strings.xml index 73af95d2e117..dbcd34b1360d 100644 --- a/packages/PrintSpooler/res/values-ml/strings.xml +++ b/packages/PrintSpooler/res/values-ml/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"PDF-ൽ സംരക്ഷിക്കുക"</string> <string name="print_options_expanded" msgid="6944679157471691859">"പ്രിന്റ് ചെയ്യാനുള്ള ഓപ്ഷനുകൾ വിപുലീകരിച്ചു"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"പ്രിന്റ് ചെയ്യാനുള്ള ഓപ്ഷനുകൾ ചുരുക്കി"</string> - <string name="search" msgid="5421724265322228497">"Search"</string> + <string name="search" msgid="5421724265322228497">"തിരയൽ"</string> <string name="all_printers_label" msgid="3178848870161526399">"എല്ലാ പ്രിന്ററുകളും"</string> <string name="add_print_service_label" msgid="5356702546188981940">"സേവനം ചേർക്കുക"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"തിരയൽ ബോക്സ് ദൃശ്യമാക്കിയിരിക്കുന്നു"</string> diff --git a/packages/PrintSpooler/res/values-mr/strings.xml b/packages/PrintSpooler/res/values-mr/strings.xml index 81194399c00e..44456b4cae05 100644 --- a/packages/PrintSpooler/res/values-mr/strings.xml +++ b/packages/PrintSpooler/res/values-mr/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"पीडीएफ वर सेव्ह करा"</string> <string name="print_options_expanded" msgid="6944679157471691859">"प्रिंट पर्याय विस्तृत झाले"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"प्रिंट पर्याय संक्षिप्त झाले"</string> - <string name="search" msgid="5421724265322228497">"Search"</string> + <string name="search" msgid="5421724265322228497">"शोध"</string> <string name="all_printers_label" msgid="3178848870161526399">"सर्व प्रिंटर"</string> <string name="add_print_service_label" msgid="5356702546188981940">"सेवा जोडा"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"शोध बॉक्स दर्शविला"</string> @@ -63,7 +63,7 @@ <string name="printer_info_desc" msgid="7181988788991581654">"या प्रिंटर विषयी अधिक माहिती"</string> <string name="notification_channel_progress" msgid="872788690775721436">"प्रिंट कार्ये चालवणे"</string> <string name="notification_channel_failure" msgid="9042250774797916414">"अयशस्वी प्रिंट कार्ये"</string> - <string name="could_not_create_file" msgid="3425025039427448443">"फाइल तयार करणेे शक्य झाले नाही"</string> + <string name="could_not_create_file" msgid="3425025039427448443">"फाईल तयार करणेे शक्य झाले नाही"</string> <string name="print_services_disabled_toast" msgid="9089060734685174685">"काही प्रिंट सेवा अक्षम केल्या आहेत"</string> <string name="print_searching_for_printers" msgid="6550424555079932867">"प्रिंटर शोधत आहे"</string> <string name="print_no_print_services" msgid="8561247706423327966">"कोणत्याही प्रिंट सेवा सक्षम केलेल्या नाहीत"</string> diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml index 7000b95b35d6..a1675fa7ca76 100644 --- a/packages/PrintSpooler/res/values-or/strings.xml +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"PDFରେ ସେଭ୍ କରନ୍ତୁ"</string> <string name="print_options_expanded" msgid="6944679157471691859">"ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ବଡ଼ କରାଯାଇଛି"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ଛୋଟ କରାଯାଇଛି"</string> - <string name="search" msgid="5421724265322228497">"Search"</string> + <string name="search" msgid="5421724265322228497">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string> <string name="all_printers_label" msgid="3178848870161526399">"ସମସ୍ତ ପ୍ରିଣ୍ଟର୍"</string> <string name="add_print_service_label" msgid="5356702546188981940">"ସେବା ଯୋଗ କରନ୍ତୁ"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ସର୍ଚ୍ଚ ବକ୍ସ ଦେଖାଯାଇଛି"</string> diff --git a/packages/PrintSpooler/res/values-te/strings.xml b/packages/PrintSpooler/res/values-te/strings.xml index 79944bb9994c..b01b50a60f6b 100644 --- a/packages/PrintSpooler/res/values-te/strings.xml +++ b/packages/PrintSpooler/res/values-te/strings.xml @@ -47,7 +47,7 @@ <string name="savetopdf_button" msgid="2976186791686924743">"PDF వలె సేవ్ చేయి"</string> <string name="print_options_expanded" msgid="6944679157471691859">"ముద్రణ ఎంపికలు విస్తరించబడ్డాయి"</string> <string name="print_options_collapsed" msgid="7455930445670414332">"ముద్రణ ఎంపికలు కుదించబడ్డాయి"</string> - <string name="search" msgid="5421724265322228497">"సెర్చ్"</string> + <string name="search" msgid="5421724265322228497">"వెతుకు"</string> <string name="all_printers_label" msgid="3178848870161526399">"అన్ని ప్రింటర్లు"</string> <string name="add_print_service_label" msgid="5356702546188981940">"సేవను జోడించు"</string> <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"శోధన పెట్టె చూపబడింది"</string> diff --git a/packages/PrintSpooler/res/values-uz/strings.xml b/packages/PrintSpooler/res/values-uz/strings.xml index ea0a6ea2f7b8..d17bce7ae54e 100644 --- a/packages/PrintSpooler/res/values-uz/strings.xml +++ b/packages/PrintSpooler/res/values-uz/strings.xml @@ -100,7 +100,7 @@ </string-array> <string-array name="orientation_labels"> <item msgid="4061931020926489228">"Tik holat"</item> - <item msgid="3199660090246166812">"Yotiq"</item> + <item msgid="3199660090246166812">"Eniga"</item> </string-array> <string name="print_write_error_message" msgid="5787642615179572543">"Faylga yozib bo‘lmadi"</string> <string name="print_error_default_message" msgid="8602678405502922346">"Xatolik yuz berdi. Qaytadan urining."</string> diff --git a/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java index 6125b8509fcf..5dc0b7274408 100644 --- a/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java +++ b/packages/SettingsLib/Utils/src/com/android/settingslib/utils/applications/AppUtils.java @@ -52,6 +52,9 @@ public class AppUtils { public static String getAppContentDescription(Context context, String packageName, int userId) { final CharSequence appLabel = getApplicationLabel(context.getPackageManager(), packageName); + if (appLabel == null) { + return ""; + } return context.getSystemService(UserManager.class).isManagedProfile(userId) ? context.getString(R.string.accessibility_work_profile_app_description, appLabel) : appLabel.toString(); diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 08e92242a363..df7a260b4045 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -85,7 +85,7 @@ <string name="bluetooth_profile_headset" msgid="5395952236133499331">"المكالمات الهاتفية"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"نقل الملف"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"جهاز الإرسال"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"الدخول إلى الإنترنت"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"استخدام الإنترنت"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"مشاركة جهة الاتصال"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"استخدام مع مشاركة جهة الاتصال"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"مشاركة اتصال الإنترنت"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 7a83b3bed2af..00a6bfc935a7 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Узровень зараду: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, П: акумулятар: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Уключана"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аўдыё медыяпрылады"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аўдыя медыяфайлаў"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Тэлефонныя выклікі"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Перадача файлаў"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Прылада ўводу"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index dbec19bc40f6..a68b9a4c3a0a 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -211,9 +211,9 @@ <string name="adb_wireless_error" msgid="721958772149779856">"সমস্যা"</string> <string name="adb_wireless_settings" msgid="2295017847215680229">"ওয়্যারলেস ডিবাগিং"</string> <string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"কোন কোন ডিভাইস উপলভ্য আছে তা দেখে নিয়ে ব্যবহার করার জন্য, ওয়্যারলেস ডিবাগিং চালু করুন"</string> - <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR কোড ব্যবহার করে ডিভাইস যোগ করুন"</string> + <string name="adb_pair_method_qrcode_title" msgid="6982904096137468634">"QR কোড ব্যবহার করে ডিভাইসের সাথে পেয়ার করুন"</string> <string name="adb_pair_method_qrcode_summary" msgid="7130694277228970888">"QR কোড স্ক্যানার ব্যবহার করে নতুন ডিভাইস যোগ করুন"</string> - <string name="adb_pair_method_code_title" msgid="1122590300445142904">"যোগ করার কোড ব্যবহার করে ডিভাইস যোগ করুন"</string> + <string name="adb_pair_method_code_title" msgid="1122590300445142904">"পেয়ারিং কোড ব্যবহার করে ডিভাইসের সাথে পেয়ার করুন"</string> <string name="adb_pair_method_code_summary" msgid="6370414511333685185">"ছয় সংখ্যার কোড ব্যবহার করে নতুন ডিভাইস যোগ করুন"</string> <string name="adb_paired_devices_title" msgid="5268997341526217362">"যোগ করা ডিভাইস"</string> <string name="adb_wireless_device_connected_summary" msgid="3039660790249148713">"এখন কানেক্ট রয়েছে"</string> @@ -222,16 +222,16 @@ <string name="adb_device_fingerprint_title_format" msgid="291504822917843701">"ডিভাইসে আঙ্গুলের ছাপ: <xliff:g id="FINGERPRINT_PARAM">%1$s</xliff:g>"</string> <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"কানেক্ট করা যায়নি"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>টি সঠিক নেটওয়ার্কে কানেক্ট আছে কিনা দেখে নিন"</string> - <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"ডিভাইসের সাথে যোগ করুন"</string> - <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"ওয়াই-ফাই যোগ করার কোড"</string> - <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"যোগ করা যায়নি"</string> + <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"ডিভাইসের সাথে পেয়ার করুন"</string> + <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"ওয়াই-ফাইয়ের সাথে পেয়ার করার কোড"</string> + <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"পেয়ার করা যায়নি"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"ডিভাইসটি একই নেটওয়ার্কে কানেক্ট আছে কিনা দেখে নিন।"</string> - <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR কোড স্ক্যান করে ওয়াই-ফাই ব্যবহার করে ডিভাইস যোগ করুন"</string> + <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR কোড স্ক্যান করে ওয়াই-ফাই ব্যবহার করে ডিভাইসের সাথে পেয়ার করুন"</string> <string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"ডিভাইস যোগ করা হচ্ছে…"</string> <string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"ডিভাইস যোগ করা যায়নি। এটি দুটি কারণে হয়ে থাকে - QR কোডটি সঠিক নয় বা ডিভাইসটি একই নেটওয়ার্কে কানেক্ট করা নেই।"</string> <string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"IP অ্যাড্রেস ও পোর্ট"</string> <string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"QR কোড স্ক্যান করুন"</string> - <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR কোড স্ক্যান করে ওয়াই-ফাইয়ের সাহায্যে ডিভাইস যোগ করুন"</string> + <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"QR কোড স্ক্যান করে ওয়াই-ফাই ব্যবহার করে ডিভাইসের সাথে পেয়ার করুন"</string> <string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"একটি ওয়াই-ফাই নেটওয়ার্কের সাথে কানেক্ট করুন"</string> <string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string> <string name="bugreport_in_power" msgid="8664089072534638709">"ত্রুটি প্রতিবেদনের শর্টকাট"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 3ca9d5272d48..3363fddbb8d3 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -66,7 +66,7 @@ <string name="bluetooth_disconnected" msgid="7739366554710388701">"Desconnectat"</string> <string name="bluetooth_disconnecting" msgid="7638892134401574338">"S\'està desconnectant..."</string> <string name="bluetooth_connecting" msgid="5871702668260192755">"S\'està connectant…"</string> - <string name="bluetooth_connected" msgid="8065345572198502293">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat"</string> + <string name="bluetooth_connected" msgid="8065345572198502293">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> Connectat"</string> <string name="bluetooth_pairing" msgid="4269046942588193600">"S\'està vinculant..."</string> <string name="bluetooth_connected_no_headset" msgid="2224101138659967604">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat (sense accés al telèfon)"</string> <string name="bluetooth_connected_no_a2dp" msgid="8566874395813947092">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat (sense contingut multimèdia)"</string> @@ -532,7 +532,7 @@ <string name="user_add_profile_item_title" msgid="3111051717414643029">"Perfil restringit"</string> <string name="user_add_user_title" msgid="5457079143694924885">"Vols afegir un usuari nou?"</string> <string name="user_add_user_message_long" msgid="1527434966294733380">"Pots compartir aquest dispositiu amb altres persones creant usuaris addicionals. Cada usuari té el seu propi espai, que pot personalitzar amb aplicacions i fons de pantalla, entre d\'altres. Els usuaris també poden ajustar opcions de configuració del dispositiu, com ara la Wi-Fi, que afecten els altres usuaris.\n\nQuan afegeixis un usuari nou, haurà de configurar el seu espai.\n\nTots els usuaris poden actualitzar les aplicacions de la resta. És possible que la configuració i els serveis d\'accessibilitat no es transfereixin a l\'usuari nou."</string> - <string name="user_add_user_message_short" msgid="3295959985795716166">"Quan s\'afegeix un usuari nou, aquest usuari ha de configurar el seu espai.\n\nQualsevol usuari pot actualitzar les aplicacions dels altres usuaris."</string> + <string name="user_add_user_message_short" msgid="3295959985795716166">"Quan s\'afegeix un usuari nou, aquesta persona ha de configurar el seu espai.\n\nQualsevol usuari pot actualitzar les aplicacions dels altres usuaris."</string> <string name="user_setup_dialog_title" msgid="8037342066381939995">"Vols configurar l\'usuari ara?"</string> <string name="user_setup_dialog_message" msgid="269931619868102841">"Assegura\'t que la persona estigui disponible per accedir al dispositiu i configurar el seu espai."</string> <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"Vols configurar el perfil ara?"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 287a1aca2fbd..8b4ae9eb0ab7 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -196,7 +196,7 @@ <string name="choose_profile" msgid="343803890897657450">"Elegir perfil"</string> <string name="category_personal" msgid="6236798763159385225">"Personal"</string> <string name="category_work" msgid="4014193632325996115">"Trabajo"</string> - <string name="development_settings_title" msgid="140296922921597393">"Opciones para programadores"</string> + <string name="development_settings_title" msgid="140296922921597393">"Opciones para desarrolladores"</string> <string name="development_settings_enable" msgid="4285094651288242183">"Activar opciones para programador"</string> <string name="development_settings_summary" msgid="8718917813868735095">"Establecer opciones para desarrollar aplicaciones"</string> <string name="development_settings_not_available" msgid="355070198089140951">"Las opciones de programador no están disponibles para este usuario."</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index d003ef0b9c71..dcb23d891113 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> akut"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"V: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> akut, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> akut"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktiivne"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Meedia heli"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Meediaheli"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonikõned"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Failiedastus"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Sisendseade"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 140d4cee6ad7..cb601c164f83 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -142,7 +142,7 @@ <string name="process_kernel_label" msgid="950292573930336765">"Système d\'exploitation Android"</string> <string name="data_usage_uninstalled_apps" msgid="1933665711856171491">"Applications supprimées"</string> <string name="data_usage_uninstalled_apps_users" msgid="5533981546921913295">"Applications et utilisateurs supprimés"</string> - <string name="data_usage_ota" msgid="7984667793701597001">"Mises à jour système"</string> + <string name="data_usage_ota" msgid="7984667793701597001">"Mises à jour du système"</string> <string name="tether_settings_title_usb" msgid="3728686573430917722">"Partage de connexion par USB"</string> <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Point d\'accès Wi-Fi mobile"</string> <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Partage connexion Bluetooth"</string> @@ -489,6 +489,7 @@ <string name="wifi_status_mac_randomized" msgid="466382542497832189">"Les adresses MAC sont randomisées"</string> <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139"> <item quantity="one">%1$d appareil connecté</item> + <item quantity="many">%1$d devices connected</item> <item quantity="other">%1$d appareils connectés</item> </plurals> <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string> @@ -498,7 +499,7 @@ <string name="zen_mode_enable_dialog_turn_on" msgid="6418297231575050426">"Activer"</string> <string name="zen_mode_settings_turn_on_dialog_title" msgid="2760567063190790696">"Activer le mode Ne pas déranger"</string> <string name="zen_mode_settings_summary_off" msgid="3832876036123504076">"Jamais"</string> - <string name="zen_interruption_level_priority" msgid="5392140786447823299">"Priorités seulement"</string> + <string name="zen_interruption_level_priority" msgid="5392140786447823299">"Prioritaires seulement"</string> <string name="zen_mode_and_condition" msgid="8877086090066332516">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="zen_alarm_warning_indef" msgid="4146527909616457163">"Vous n\'entendrez pas votre prochaine alarme à <xliff:g id="WHEN">%1$s</xliff:g> sauf si vous désactivez préalablement cette option"</string> <string name="zen_alarm_warning" msgid="245729928048586280">"Vous n\'entendrez pas votre prochaine alarme à <xliff:g id="WHEN">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index bb5959e6f515..d4d79495e955 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -489,6 +489,7 @@ <string name="wifi_status_mac_randomized" msgid="466382542497832189">"La sélection des adresses MAC est aléatoire"</string> <plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139"> <item quantity="one">%1$d appareil connecté</item> + <item quantity="many">%1$d devices connected</item> <item quantity="other">%1$d appareils connectés</item> </plurals> <string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 0ce52f88f062..eac8ba8aaac0 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -33,11 +33,11 @@ <string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\' સાથે કનેક્ટ કરી શકાતું નથી"</string> <string name="wifi_check_password_try_again" msgid="8817789642851605628">"પાસવર્ડ તપાસો અને ફરી પ્રયાસ કરો"</string> <string name="wifi_not_in_range" msgid="1541760821805777772">"રેન્જમાં નથી"</string> - <string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"આપમેળે કનેક્ટ કરશે નહીં"</string> + <string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"ઑટોમૅટિક રીતે કનેક્ટ કરશે નહીં"</string> <string name="wifi_no_internet" msgid="1774198889176926299">"કોઈ ઇન્ટરનેટ ઍક્સેસ નથી"</string> <string name="saved_network" msgid="7143698034077223645">"<xliff:g id="NAME">%1$s</xliff:g> દ્વારા સચવાયું"</string> <string name="connected_via_network_scorer" msgid="7665725527352893558">"%1$s દ્વારા સ્વત: કનેક્ટ થયેલ"</string> - <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"નેટવર્ક રેટિંગ પ્રદાતા દ્વારા આપમેળે કનેક્ટ થયું"</string> + <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"નેટવર્ક રેટિંગ પ્રદાતા દ્વારા ઑટોમૅટિક રીતે કનેક્ટ થયું"</string> <string name="connected_via_passpoint" msgid="7735442932429075684">"%1$s દ્વારા કનેક્ટ થયેલ"</string> <string name="connected_via_app" msgid="3532267661404276584">"<xliff:g id="NAME">%1$s</xliff:g> દ્વારા કનેક્ટ થયેલ"</string> <string name="available_via_passpoint" msgid="1716000261192603682">"%1$s દ્વારા ઉપલબ્ધ"</string> @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> બૅટરી, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> બૅટરી"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"સક્રિય"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"મીડિયા ઑડિઓ"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"મીડિયા ઑડિયો"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ફોન કૉલ"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ફાઇલ સ્થાનાંતરણ"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"ઇનપુટ ઉપકરણ"</string> @@ -113,7 +113,7 @@ <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"ઇનપુટ માટે ઉપયોગ કરો"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"શ્રવણ યંત્રો માટે ઉપયોગ કરો"</string> <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"જોડી"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"જોડાણ બનાવો"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"જોડી કરો"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"રદ કરો"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"એ કનેક્ટ કરેલ હોય ત્યારે જોડાણ બનાવવાથી તમારા સંપર્કો અને કૉલ ઇતિહાસનો અૅક્સેસ મળે છે."</string> <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> સાથે જોડી કરી શક્યાં નહીં."</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 50fdfc9a9136..94cd9f66a027 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -66,7 +66,7 @@ <string name="bluetooth_disconnected" msgid="7739366554710388701">"Disconnesso"</string> <string name="bluetooth_disconnecting" msgid="7638892134401574338">"Disconnessione…"</string> <string name="bluetooth_connecting" msgid="5871702668260192755">"Connessione…"</string> - <string name="bluetooth_connected" msgid="8065345572198502293">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso"</string> + <string name="bluetooth_connected" msgid="8065345572198502293">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> Connesso"</string> <string name="bluetooth_pairing" msgid="4269046942588193600">"Accoppiamento…"</string> <string name="bluetooth_connected_no_headset" msgid="2224101138659967604">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso (telefono escluso)"</string> <string name="bluetooth_connected_no_a2dp" msgid="8566874395813947092">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso (contenuti multimediali esclusi)"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 03065e896da2..98c4f1032636 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -85,7 +85,7 @@ <string name="bluetooth_profile_headset" msgid="5395952236133499331">"ការហៅទូរសព្ទ"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"ផ្ទេរឯកសារ"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"ឧបករណ៍បញ្ចូល"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"ចូលអ៊ីនធឺណិត"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"ការចូលប្រើអ៊ីនធឺណិត"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"ការចែករំលែកទំនាក់ទំនង"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"ប្រើសម្រាប់ការចែករំលែកទំនាក់ទំនង"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"ចែករំលែកការតភ្ជាប់អ៊ីនធឺណិត"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 71c5e491d927..ddaf97087519 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -307,7 +307,7 @@ <string name="adb_keys_warning_message" msgid="2968555274488101220">"ನೀವು ಹಿಂದೆ ಅಧಿಕೃತಗೊಳಿಸಿದ ಎಲ್ಲ ಕಂಪ್ಯೂಟರ್ಗಳಿಂದ USB ಡೀಬಗ್ಗೆ ಪ್ರವೇಶವನ್ನು ರದ್ದುಗೊಳಿಸುವುದೇ?"</string> <string name="dev_settings_warning_title" msgid="8251234890169074553">"ಅಭಿವೃದ್ಧಿಯ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಅನುಮತಿಸುವುದೇ?"</string> <string name="dev_settings_warning_message" msgid="37741686486073668">"ಈ ಸೆಟ್ಟಿಂಗ್ಗಳು ಅಭಿವೃದ್ಧಿಯ ಬಳಕೆಗೆ ಮಾತ್ರ. ಅವುಗಳು ನಿಮ್ಮ ಸಾಧನ ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗೆ ಧಕ್ಕೆ ಮಾಡಬಹುದು ಅಥವಾ ಅವು ಸರಿಯಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರುವಂತೆ ಮಾಡಬಹುದು."</string> - <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB ಮೂಲಕ ಆಪ್ ಪರಿಶೀಲಿಸಿ"</string> + <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB ಮೂಲಕ ಆ್ಯಪ್ ಪರಿಶೀಲಿಸಿ"</string> <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"ಹಾನಿಮಾಡುವಂತಹ ವರ್ತನೆಗಾಗಿ ADB/ADT ಮೂಲಕ ಸ್ಥಾಪಿಸಲಾದ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ."</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"ಹೆಸರುಗಳಿಲ್ಲದ (ಕೇವಲ MAC ವಿಳಾಸಗಳು ಮಾತ್ರ) ಬ್ಲೂಟೂತ್ ಸಾಧನಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲಾಗುತ್ತದೆ"</string> <string name="bluetooth_disable_absolute_volume_summary" msgid="2006309932135547681">"ರಿಮೋಟ್ ಸಾಧನಗಳಲ್ಲಿ ಕಂಡುಬರುವ ಸ್ವೀಕಾರಾರ್ಹವಲ್ಲದ ಜೋರಾದ ವಾಲ್ಯೂಮ್ ಅಥವಾ ನಿಯಂತ್ರಣದ ಕೊರತೆಯಂತಹ ವಾಲ್ಯೂಮ್ ಸಮಸ್ಯೆಗಳಂತಹ ಸಂದರ್ಭದಲ್ಲಿ ಬ್ಲೂಟೂತ್ನ ನಿಚ್ಚಳ ವಾಲ್ಯೂಮ್ ವೈಶಿಷ್ಟ್ಯವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 15322dd98ec4..4cb93fac0868 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Файл өткөрүү үчүн колдонулсун"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Киргизүү үчүн колдонулсун"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Угуу аппараттары үчүн колдонуу"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Жупташтыруу"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Байланыштыруу"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ЖУПТАШТЫРУУ"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Жок"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Жупташканда байланыштарыңыз менен чалуу таржымалыңызды пайдалана аласыз."</string> @@ -223,7 +223,7 @@ <string name="adb_wireless_connection_failed_title" msgid="664211177427438438">"Байланышкан жок"</string> <string name="adb_wireless_connection_failed_message" msgid="9213896700171602073">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> туура тармакка туташып турганын текшериңиз"</string> <string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Түзмөктү жупташтыруу"</string> - <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wi‑Fi жупташтыруучу коду"</string> + <string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Wi‑Fi аркылуу байланыштыруу коду"</string> <string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Туташкан жок"</string> <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Түзмөк бир тармакка туташып турушу керек."</string> <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"QR кодун скандап, түзмөктү Wi‑Fi аркылуу жупташтырыңыз"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index c4c72012adf1..b3532954f2f7 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -51,9 +51,9 @@ <string name="connected_via_carrier" msgid="1968057009076191514">"Поврзано преку %1$s"</string> <string name="available_via_carrier" msgid="465598683092718294">"Достапно преку %1$s"</string> <string name="osu_opening_provider" msgid="4318105381295178285">"Се отвора <xliff:g id="PASSPOINTPROVIDER">%1$s</xliff:g>"</string> - <string name="osu_connect_failed" msgid="9107873364807159193">"Не можеше да се поврзе"</string> + <string name="osu_connect_failed" msgid="9107873364807159193">"Не може да се поврзе"</string> <string name="osu_completing_sign_up" msgid="8412636665040390901">"Се завршува регистрацијата…"</string> - <string name="osu_sign_up_failed" msgid="5605453599586001793">"Не можеше да се заврши регистрацијата. Допрете за да се обидете повторно."</string> + <string name="osu_sign_up_failed" msgid="5605453599586001793">"Не може да се заврши регистрацијата. Допрете за да се обидете повторно."</string> <string name="osu_sign_up_complete" msgid="7640183358878916847">"Регистрацијата е завршена. Се поврзува…"</string> <string name="speed_label_very_slow" msgid="8526005255731597666">"Многу бавна"</string> <string name="speed_label_slow" msgid="6069917670665664161">"Бавна"</string> @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> батерија"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Л: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> батерија, Д: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> батерија"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Активен"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Аудио на медиуми"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Звук на аудио/видео"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Телефонски повици"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Пренос на датотека"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Влезен уред"</string> @@ -116,8 +116,8 @@ <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"СПАРИ"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Откажи"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Кога е поврзано, спарувањето одобрува пристап до контактите и историјата на повиците."</string> - <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Не можеше да се спари со <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> - <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Не можеше да се спари со <xliff:g id="DEVICE_NAME">%1$s</xliff:g> поради погрешен PIN или лозинка."</string> + <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Не може да се спари со <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> + <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Не може да се спари со <xliff:g id="DEVICE_NAME">%1$s</xliff:g> поради погрешен PIN или лозинка."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"Не може да комуницира со <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> <string name="bluetooth_pairing_rejected_error_message" msgid="5943444352777314442">"Спарувањето е одбиено од <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"Компјутер"</string> diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml index c5e87bcf3945..aebbe9808607 100644 --- a/packages/SettingsLib/res/values-mn/arrays.xml +++ b/packages/SettingsLib/res/values-mn/arrays.xml @@ -171,11 +171,11 @@ </string-array> <string-array name="select_logd_size_summaries"> <item msgid="409235464399258501">"Идэвхгүй"</item> - <item msgid="4195153527464162486">"лог буфер бүрт 64K"</item> - <item msgid="7464037639415220106">"лог буфер бүрт 256K"</item> - <item msgid="8539423820514360724">"лог буфер бүрт 1M"</item> - <item msgid="1984761927103140651">"лог буфер бүрт 4M"</item> - <item msgid="7892098981256010498">"лог буфер бүрт 16M"</item> + <item msgid="4195153527464162486">"лог буфер бүрд 64K"</item> + <item msgid="7464037639415220106">"лог буфер бүрд 256K"</item> + <item msgid="8539423820514360724">"лог буфер бүрд 1M"</item> + <item msgid="1984761927103140651">"лог буфер бүрд 4M"</item> + <item msgid="7892098981256010498">"лог буфер бүрд 16M"</item> </string-array> <string-array name="select_logpersist_titles"> <item msgid="704720725704372366">"Идэвхгүй"</item> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 8407db6d3a08..ed7fdc7c7877 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -70,7 +70,7 @@ <string name="bluetooth_pairing" msgid="4269046942588193600">"Хослуулж байна…"</string> <string name="bluetooth_connected_no_headset" msgid="2224101138659967604">"Холбогдсон (утас байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_a2dp" msgid="8566874395813947092">"Холбогдсон (медиа байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> - <string name="bluetooth_connected_no_map" msgid="3381860077002724689">"Холбогдсон (зурвасын хандалт байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> + <string name="bluetooth_connected_no_map" msgid="3381860077002724689">"Холбогдсон (мессежийн хандалт байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2893204819854215433">"Холбогдсон (утас эсвэл медиа байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_connected_battery_level" msgid="5410325759372259950">"Холбогдсон, батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> <string name="bluetooth_connected_no_headset_battery_level" msgid="2661863370509206428">"Холбогдсон (утас байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string> @@ -288,7 +288,7 @@ <string name="wifi_metered_label" msgid="8737187690304098638">"Хязгаартай"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"Хязгааргүй"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Логгерын буферын хэмжээ"</string> - <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Лог буфер бүрт ногдох логгерын хэмжээг сонгоно уу"</string> + <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Лог буфер бүрд ногдох логгерын хэмжээг сонгоно уу"</string> <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Нэвтрэгчийн тогтмол санг устгах уу?"</string> <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Бид байнгын логоор хянаагүй үед таны төхөөрөмжтэй холбоотой нэвтрэгч өгөгдлийг устгах шаардлагатай."</string> <string name="select_logpersist_title" msgid="447071974007104196">"Төхөөрөмжид тогтмол нэвтрэгчийн өгөгдлийн сан"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index d5764969c12f..136c6fd7d900 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"फाइल ट्रान्सफरका लागि प्रयोग गर्नुहोस्"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"इनपुटको लागि प्रयोग गर्नुहोस्"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"श्रवण यन्त्रहरूका लागि प्रयोग गर्नुहोस्"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"जोडी"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"जोडा बनाउनुहोस्"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"जोडी"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"रद्द गर्नुहोस्"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"जब जडान हुन्छ जोडी अनुदानले तपाईँको सम्पर्कहरू पहुँच गर्छ र इतिहास सम्झाउँछ।"</string> @@ -306,7 +306,7 @@ <string name="adbwifi_warning_message" msgid="8005936574322702388">"वायरलेस डिबगिङ डिभलपमेन्ट प्रयोजनका लागि मात्रै हो। यसलाई आफ्ना कम्प्युटर र उपकरणका बिच डेटा प्रतिलिपि गर्न, सूचना नदिई आफ्नो उपकरणमा एपहरू स्थापना गर्न र लग डेटा पढ्न प्रयोग गर्नुहोस्।"</string> <string name="adb_keys_warning_message" msgid="2968555274488101220">"तपाईं पहिले नै अधिकृत गर्नुभएका सबै कम्प्यूटरबाट USB डिबग गर्नको लागि पहुँच रद्द गर्ने हो?"</string> <string name="dev_settings_warning_title" msgid="8251234890169074553">"विकास सेटिङहरू अनुमति दिने हो?"</string> - <string name="dev_settings_warning_message" msgid="37741686486073668">"यी सेटिङहरू केवल विकास प्रयोगको लागि विचार गरिएको हो। तिनीहरूले तपाईंको उपकरण र अनुप्रयोगहरूलाई विच्छेदन गर्न वा दुर्व्यवहार गर्न सक्दछ।"</string> + <string name="dev_settings_warning_message" msgid="37741686486073668">"यी सेटिङहरू केवल विकास प्रयोगको लागि विचार गरिएको हो। तिनीहरूले तपाईंको उपकरण र एपहरूलाई विच्छेदन गर्न वा दुर्व्यवहार गर्न सक्दछ।"</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"USB मा एपहरू रुजु गर्नुहोस्"</string> <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"हानिकारक व्यवहारको लागि ADB/ADT को माध्यमबाट स्थापित अनुप्रयोगहरूको जाँच गर्नुहोस्।"</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"नामकरण नगरिएका ब्लुटुथ यन्त्रहरू (MAC ठेगाना भएका मात्र) देखाइनेछ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 1120c504717f..6d66e20b7fbd 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -148,7 +148,7 @@ <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Tethering przez Bluetooth"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Tethering"</string> <string name="tether_settings_title_all" msgid="8910259483383010470">"Tethering i punkt dostępu"</string> - <string name="managed_user_title" msgid="449081789742645723">"Wszystkie aplikacje do pracy"</string> + <string name="managed_user_title" msgid="449081789742645723">"Wszystkie aplikacje służbowe"</string> <string name="user_guest" msgid="6939192779649870792">"Gość"</string> <string name="unknown" msgid="3544487229740637809">"Nieznana"</string> <string name="running_process_item_user_label" msgid="3988506293099805796">"Użytkownik: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 4214a2720813..10ad329eb324 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -147,7 +147,7 @@ <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Ponto de acesso portátil"</string> <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Tethering Bluetooth"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Tethering"</string> - <string name="tether_settings_title_all" msgid="8910259483383010470">"Tethering e acesso portátil"</string> + <string name="tether_settings_title_all" msgid="8910259483383010470">"Tethering e ponto de acesso"</string> <string name="managed_user_title" msgid="449081789742645723">"Todos os apps de trabalho"</string> <string name="user_guest" msgid="6939192779649870792">"Convidado"</string> <string name="unknown" msgid="3544487229740637809">"Desconhecido"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 4214a2720813..10ad329eb324 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -147,7 +147,7 @@ <string name="tether_settings_title_wifi" msgid="4803402057533895526">"Ponto de acesso portátil"</string> <string name="tether_settings_title_bluetooth" msgid="916519902721399656">"Tethering Bluetooth"</string> <string name="tether_settings_title_usb_bluetooth" msgid="1727111807207577322">"Tethering"</string> - <string name="tether_settings_title_all" msgid="8910259483383010470">"Tethering e acesso portátil"</string> + <string name="tether_settings_title_all" msgid="8910259483383010470">"Tethering e ponto de acesso"</string> <string name="managed_user_title" msgid="449081789742645723">"Todos os apps de trabalho"</string> <string name="user_guest" msgid="6939192779649870792">"Convidado"</string> <string name="unknown" msgid="3544487229740637809">"Desconhecido"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index f39a741e3a4b..d2560d46d3c2 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Batéria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Ľ: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> batérie, P: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> batérie"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Aktívne"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk medií"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Zvuk médií"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefonické hovory"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Prenos súborov"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Vstupné zariadenie"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index bb911ec283db..053579e9b4d9 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Använd för filöverföring"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Använd för inmatning"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Använd med hörapparater"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Parkoppling"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Parkoppla"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"PARKOPPLA"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Avbryt"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Om du kopplar enheten får du tillgång till dina kontakter och din samtalshistorik när du är ansluten."</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 85275c1afbec..306c1fba031c 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -81,11 +81,11 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Chaji ya betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g> ya betri, R: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g> ya betri"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Kimeunganishwa"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media ya sauti"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Sauti ya maudhui"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Simu"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Uhamishaji wa faili"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Kifaa cha kuingiza"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Ufikiaji wa mtandao"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Ufikiaji wa intaneti"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Kushiriki anwani"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"Tumia kwa kushiriki anwani"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Kushiriki muunganisho wa tovuti"</string> @@ -107,7 +107,7 @@ <string name="bluetooth_pan_profile_summary_use_for" msgid="7422039765025340313">"Tumia kuunganisha kwenye intaneti"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="4453622103977592583">"Tumia kwa ramani"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Tumia kwa ufikiaji wa SIM"</string> - <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Tumia kwa sauti ya media"</string> + <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Tumia kwa sauti ya maudhui"</string> <string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"Tumia kwa sauti ya simu"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Tumia kwa hali faili"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Tumia kwa kuingiza"</string> diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index 23256eeb7d03..a93defaea361 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -86,7 +86,7 @@ <item msgid="8147982633566548515">"map14"</item> </string-array> <string-array name="bluetooth_a2dp_codec_titles"> - <item msgid="2494959071796102843">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="2494959071796102843">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="4055460186095649420">"SBC"</item> <item msgid="720249083677397051">"AAC"</item> <item msgid="1049450003868150455">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ఆడియో"</item> @@ -94,7 +94,7 @@ <item msgid="3825367753087348007">"LDAC"</item> </string-array> <string-array name="bluetooth_a2dp_codec_summaries"> - <item msgid="8868109554557331312">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="8868109554557331312">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="9024885861221697796">"SBC"</item> <item msgid="4688890470703790013">"AAC"</item> <item msgid="8627333814413492563">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ఆడియో"</item> @@ -102,38 +102,38 @@ <item msgid="2553206901068987657">"LDAC"</item> </string-array> <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> - <item msgid="926809261293414607">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="926809261293414607">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="8003118270854840095">"44.1 kHz"</item> <item msgid="3208896645474529394">"48.0 kHz"</item> <item msgid="8420261949134022577">"88.2 kHz"</item> <item msgid="8887519571067543785">"96.0 kHz"</item> </string-array> <string-array name="bluetooth_a2dp_codec_sample_rate_summaries"> - <item msgid="2284090879080331090">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="2284090879080331090">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="1872276250541651186">"44.1 kHz"</item> <item msgid="8736780630001704004">"48.0 kHz"</item> <item msgid="7698585706868856888">"88.2 kHz"</item> <item msgid="8946330945963372966">"96.0 kHz"</item> </string-array> <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles"> - <item msgid="2574107108483219051">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="2574107108483219051">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="4671992321419011165">"16 బిట్లు/నమూనా"</item> <item msgid="1933898806184763940">"24 బిట్లు/నమూనా"</item> <item msgid="1212577207279552119">"32 బిట్లు/నమూనా"</item> </string-array> <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries"> - <item msgid="9196208128729063711">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="9196208128729063711">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="1084497364516370912">"16 బిట్లు/నమూనా"</item> <item msgid="2077889391457961734">"24 బిట్లు/నమూనా"</item> <item msgid="3836844909491316925">"32 బిట్లు/నమూనా"</item> </string-array> <string-array name="bluetooth_a2dp_codec_channel_mode_titles"> - <item msgid="3014194562841654656">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="3014194562841654656">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="5982952342181788248">"మోనో"</item> <item msgid="927546067692441494">"స్టీరియో"</item> </string-array> <string-array name="bluetooth_a2dp_codec_channel_mode_summaries"> - <item msgid="1997302811102880485">"సిస్టమ్ ఎంపికను ఉపయోగించండి (డిఫాల్ట్)"</item> + <item msgid="1997302811102880485">"సిస్టమ్ ఎంపికను ఉపయోగించండి (ఆటోమేటిక్)"</item> <item msgid="8005696114958453588">"మోనో"</item> <item msgid="1333279807604675720">"స్టీరియో"</item> </string-array> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 20955baa4d68..4aa131d24cd4 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -156,14 +156,14 @@ <string name="launch_defaults_none" msgid="8049374306261262709">"ఆటోమేటిక్ ఆప్షన్లు ఏవీ సెట్ చేయలేదు"</string> <string name="tts_settings" msgid="8130616705989351312">"వచనం నుండి ప్రసంగం సెట్టింగ్లు"</string> <string name="tts_settings_title" msgid="7602210956640483039">"టెక్స్ట్-టు-స్పీచ్ అవుట్పుట్"</string> - <string name="tts_default_rate_title" msgid="3964187817364304022">"ప్రసంగం రేట్"</string> + <string name="tts_default_rate_title" msgid="3964187817364304022">"స్పీచ్ రేట్"</string> <string name="tts_default_rate_summary" msgid="3781937042151716987">"వచనాన్ని చదివి వినిపించాల్సిన వేగం"</string> <string name="tts_default_pitch_title" msgid="6988592215554485479">"పిచ్"</string> <string name="tts_default_pitch_summary" msgid="9132719475281551884">"సమన్వయం చేసిన ప్రసంగం యొక్క టోన్ను ప్రభావితం చేస్తుంది"</string> <string name="tts_default_lang_title" msgid="4698933575028098940">"భాష"</string> <string name="tts_lang_use_system" msgid="6312945299804012406">"సిస్టమ్ భాషను ఉపయోగించు"</string> <string name="tts_lang_not_selected" msgid="7927823081096056147">"భాష ఎంచుకోబడలేదు"</string> - <string name="tts_default_lang_summary" msgid="9042620014800063470">"చదవి వినిపించబడే వచనం కోసం భాష-నిర్దిష్ట వాయిస్ను సెట్ చేస్తుంది"</string> + <string name="tts_default_lang_summary" msgid="9042620014800063470">"టెక్స్ట్ను చదివి వినిపించేటప్పుడు, ఒక్కో భాషకు వాడాల్సిన నిర్దిష్ట వాయిస్ను సెట్ చేస్తుంది"</string> <string name="tts_play_example_title" msgid="1599468547216481684">"ఒక ఉదాహరణ వినండి"</string> <string name="tts_play_example_summary" msgid="634044730710636383">"ప్రసంగ సమన్వయం గురించి సంక్షిప్త ప్రదర్శనను ప్లే చేయి"</string> <string name="tts_install_data_title" msgid="1829942496472751703">"వాయిస్ డేటాను ఇన్స్టాల్ చేయి"</string> @@ -196,7 +196,7 @@ <string name="choose_profile" msgid="343803890897657450">"ప్రొఫైల్ను ఎంచుకోండి"</string> <string name="category_personal" msgid="6236798763159385225">"వ్యక్తిగతం"</string> <string name="category_work" msgid="4014193632325996115">"ఆఫీస్"</string> - <string name="development_settings_title" msgid="140296922921597393">"డెవలపర్ ఎంపికలు"</string> + <string name="development_settings_title" msgid="140296922921597393">"డెవలపర్ ఆప్షన్లు"</string> <string name="development_settings_enable" msgid="4285094651288242183">"డెవలపర్ ఎంపికలను ప్రారంభించండి"</string> <string name="development_settings_summary" msgid="8718917813868735095">"అనువర్తన అభివృద్ధి కోసం ఎంపికలను సెట్ చేయండి"</string> <string name="development_settings_not_available" msgid="355070198089140951">"ఈ వినియోగదారు కోసం డెవలపర్ ఎంపికలు అందుబాటులో లేవు"</string> @@ -281,7 +281,7 @@ <string name="private_dns_mode_provider" msgid="3619040641762557028">"ప్రైవేట్ DNS ప్రదాత హోస్ట్పేరు"</string> <string name="private_dns_mode_provider_hostname_hint" msgid="6564868953748514595">"DNS ప్రదాత యొక్క హోస్ట్పేరును నమోదు చేయండి"</string> <string name="private_dns_mode_provider_failure" msgid="8356259467861515108">"కనెక్ట్ చేయడం సాధ్యపడలేదు"</string> - <string name="wifi_display_certification_summary" msgid="8111151348106907513">"వైర్లెస్ ప్రదర్శన సర్టిఫికెట్ కోసం ఎంపికలను చూపు"</string> + <string name="wifi_display_certification_summary" msgid="8111151348106907513">"వైర్లెస్ డిస్ప్లే సర్టిఫికేషన్ ఆప్షన్లను చూపు"</string> <string name="wifi_verbose_logging_summary" msgid="4993823188807767892">"Wi‑Fi ఎంపికలో SSID RSSI ప్రకారం చూపబడే Wi‑Fi లాగింగ్ స్థాయిని పెంచండి"</string> <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"బ్యాటరీ శక్తి వినియోగాన్ని తగ్గించి & నెట్వర్క్ పనితీరును మెరుగుపరుస్తుంది"</string> <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"ఈ మోడ్ ఎనేబుల్ అయ్యాక, MAC ర్యాండమైజేషన్ను ఎనేబుల్ చేసిన నెట్వర్క్తో కనెక్ట్ అయ్యే ప్రతిసారీ ఈ పరికరం MAC అడ్రస్ మారవచ్చు."</string> @@ -367,7 +367,7 @@ <string name="overlay_display_devices_title" msgid="5411894622334469607">"ప్రత్యామ్నాయ ప్రదర్శనలను అనుకరించండి"</string> <string name="debug_applications_category" msgid="5394089406638954196">"యాప్లు"</string> <string name="immediately_destroy_activities" msgid="1826287490705167403">"కార్యకలాపాలను ఉంచవద్దు"</string> - <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"ప్రతి కార్యకలాపాన్ని వినియోగదారు నిష్క్రమించిన వెంటనే తొలగించండి"</string> + <string name="immediately_destroy_activities_summary" msgid="6289590341144557614">"యూజర్ నిష్క్రమించాక పూర్తి యాక్టివిటీ తొలగింపు"</string> <string name="app_process_limit_title" msgid="8361367869453043007">"బ్యాక్గ్రౌండ్ ప్రాసెస్ పరిమితి"</string> <string name="show_all_anrs" msgid="9160563836616468726">"బ్యాక్గ్రౌండ్ ANRలను చూపు"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"నేపథ్య యాప్ల కోసం యాప్ ప్రతిస్పందించడం లేదు అనే డైలాగ్ను చూపు"</string> @@ -473,7 +473,7 @@ <string name="screen_zoom_summary_very_large" msgid="7317423942896999029">"చాలా పెద్దగా"</string> <string name="screen_zoom_summary_extremely_large" msgid="1438045624562358554">"అతి పెద్దగా"</string> <string name="screen_zoom_summary_custom" msgid="3468154096832912210">"అనుకూలం (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> - <string name="content_description_menu_button" msgid="6254844309171779931">"మెను"</string> + <string name="content_description_menu_button" msgid="6254844309171779931">"మెనూ"</string> <string name="retail_demo_reset_message" msgid="5392824901108195463">"డెమో మోడ్లో ఫ్యాక్టరీ రీసెట్ను నిర్వహించడానికి పాస్వర్డ్ను నమోదు చేయండి"</string> <string name="retail_demo_reset_next" msgid="3688129033843885362">"తర్వాత"</string> <string name="retail_demo_reset_title" msgid="1866911701095959800">"పాస్వర్డ్ అవసరం"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index f81731ab2723..48940a214c2e 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -22,7 +22,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="wifi_fail_to_scan" msgid="2333336097603822490">"Tarmoqlarni tekshirib chiqishni iloji bo‘lmadi"</string> <string name="wifi_security_none" msgid="7392696451280611452">"Hech qanday"</string> - <string name="wifi_remembered" msgid="3266709779723179188">"Saqlandi"</string> + <string name="wifi_remembered" msgid="3266709779723179188">"Saqlangan"</string> <string name="wifi_disconnected" msgid="7054450256284661757">"Ulanmagan"</string> <string name="wifi_disabled_generic" msgid="2651916945380294607">"Yoqilmagan"</string> <string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP manzilini sozlab bo‘lmadi"</string> @@ -81,11 +81,11 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"L: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, R: batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Faol"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Media audio"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"A2DP profili"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Telefon chaqiruvlari"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Fayl uzatish"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Kiritish qurilmasi"</string> - <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Internetga kirish"</string> + <string name="bluetooth_profile_pan" msgid="1006235139308318188">"Internetga ulanish"</string> <string name="bluetooth_profile_pbap" msgid="7064307749579335765">"Kontaktlarni ulashish"</string> <string name="bluetooth_profile_pbap_summary" msgid="2955819694801952056">"Kontaktlarni ulashish uchun ishlatilsin"</string> <string name="bluetooth_profile_pan_nap" msgid="7871974753822470050">"Internet aloqasi ulashmasi"</string> @@ -112,7 +112,7 @@ <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Fayl almashinish uchun foydalanish"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Kiritish qurilmasi sifatida foydalanish"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Eshitish apparatlari uchun foydalanish"</string> - <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Biriktirish"</string> + <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"OK"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"ULANISH"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Bekor qilish"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Agar ulanishga ruxsat bersangiz, ulangan vaqtda kontakt va qo‘ng‘iroqlaringiz tarixiga kirishi mumkin."</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index b7ccf8d85677..b6ac92f1cfd2 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -81,7 +81,7 @@ <string name="bluetooth_battery_level" msgid="2893696778200201555">"Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="bluetooth_battery_level_untethered" msgid="4002282355111504349">"Trái: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_0">%1$s</xliff:g>, Phải: Mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE_1">%2$s</xliff:g>"</string> <string name="bluetooth_active_no_battery_level" msgid="4155462233006205630">"Đang hoạt động"</string> - <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Âm thanh của phương tiện"</string> + <string name="bluetooth_profile_a2dp" msgid="4632426382762851724">"Âm thanh nội dung nghe nhìn"</string> <string name="bluetooth_profile_headset" msgid="5395952236133499331">"Cuộc gọi điện thoại"</string> <string name="bluetooth_profile_opp" msgid="6692618568149493430">"Chuyển tệp"</string> <string name="bluetooth_profile_hid" msgid="2969922922664315866">"Thiết bị đầu vào"</string> @@ -95,7 +95,7 @@ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"Âm thanh HD"</string> <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"Thiết bị trợ thính"</string> <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"Đã kết nối với Thiết bị trợ thính"</string> - <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Đã kết nối với âm thanh phương tiện"</string> + <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Đã kết nối với âm thanh nội dung nghe nhìn"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Đã kết nối với âm thanh điện thoại"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2393521801478157362">"Đã kết nối với máy chủ chuyển tệp"</string> <string name="bluetooth_map_profile_summary_connected" msgid="4141725591784669181">"Đã kết nối với bản đồ"</string> @@ -107,7 +107,7 @@ <string name="bluetooth_pan_profile_summary_use_for" msgid="7422039765025340313">"Sử dụng để truy cập Internet"</string> <string name="bluetooth_map_profile_summary_use_for" msgid="4453622103977592583">"Sử dụng cho bản đồ"</string> <string name="bluetooth_sap_profile_summary_use_for" msgid="6204902866176714046">"Sử dụng để truy cập SIM"</string> - <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Sử dụng cho âm thanh phương tiện"</string> + <string name="bluetooth_a2dp_profile_summary_use_for" msgid="7324694226276491807">"Sử dụng cho âm thanh nội dung nghe nhìn"</string> <string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"Sử dụng cho âm thanh điện thoại"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Sử dụng để chuyển tệp"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Sử dụng để nhập"</string> @@ -306,7 +306,7 @@ <string name="adbwifi_warning_message" msgid="8005936574322702388">"Tính năng gỡ lỗi qua Wi-Fi chỉ dành cho mục đích phát triển. Hãy sử dụng tính năng này để sao chép dữ liệu giữa máy tính và thiết bị của bạn, cài đặt ứng dụng trên thiết bị mà không thông báo và đọc dữ liệu nhật ký."</string> <string name="adb_keys_warning_message" msgid="2968555274488101220">"Thu hồi quyền truy cập gỡ lỗi USB từ tất cả máy tính mà bạn đã ủy quyền trước đó?"</string> <string name="dev_settings_warning_title" msgid="8251234890169074553">"Cho phép cài đặt phát triển?"</string> - <string name="dev_settings_warning_message" msgid="37741686486073668">"Những cài đặt này chỉ dành cho mục đích phát triển. Chúng có thể làm cho thiết bị và ứng dụng trên thiết bị của bạn bị lỗi và hoạt động sai."</string> + <string name="dev_settings_warning_message" msgid="37741686486073668">"Những tùy chọn cài đặt này chỉ dành cho mục đích phát triển. Chúng có thể làm cho thiết bị và ứng dụng trên thiết bị của bạn bị lỗi và hoạt động không đúng cách."</string> <string name="verify_apps_over_usb_title" msgid="6031809675604442636">"Xác minh ứng dụng qua USB"</string> <string name="verify_apps_over_usb_summary" msgid="1317933737581167839">"Kiểm tra các ứng dụng được cài đặt qua ADB/ADT để xem có hoạt động gây hại hay không."</string> <string name="bluetooth_show_devices_without_names_summary" msgid="780964354377854507">"Các thiết bị Bluetooth không có tên (chỉ có địa chỉ MAC) sẽ được hiển thị"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 6b8739fd017a..237b5846e9d2 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -113,7 +113,7 @@ <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Isetshenziselwa okufakwayo"</string> <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Sebenzisa izinsiza zokuzwa"</string> <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Bhangqa"</string> - <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"BHANQA"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"BHANGQA"</string> <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Khansela"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Ukubhanqa kunika ukufinyelela koxhumana nabo nomlando wekholi uma uxhumekile."</string> <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Ayikwazanga ukuhlangana ne <xliff:g id="DEVICE_NAME">%1$s</xliff:g>."</string> diff --git a/packages/Shell/res/values-mr/strings.xml b/packages/Shell/res/values-mr/strings.xml index a957184cdf6a..9595e28eb6e2 100644 --- a/packages/Shell/res/values-mr/strings.xml +++ b/packages/Shell/res/values-mr/strings.xml @@ -31,8 +31,8 @@ <string name="bugreport_confirm" msgid="5917407234515812495">"बग रीपोर्टांमध्ये तुम्ही संवेदनशील (अॅप-वापर आणि स्थान डेटा यासारखा) डेटा म्हणून विचार करता त्या डेटाच्या समावेशासह सिस्टीमच्या विविध लॉग फायलींमधील डेटा असतो. ज्या लोकांवर आणि अॅपवर तुमचा विश्वास आहे केवळ त्यांच्यासह हा बग रीपोर्ट शेअर करा."</string> <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"पुन्हा दर्शवू नका"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"बग रीपोर्ट"</string> - <string name="bugreport_unreadable_text" msgid="586517851044535486">"बग रीपोर्ट फाइल वाचणे शक्य झाले नाही"</string> - <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"झिप फाइल मध्ये बग रीपोर्ट तपशील जोडणे शक्य झाले नाही"</string> + <string name="bugreport_unreadable_text" msgid="586517851044535486">"बग रीपोर्ट फाईल वाचणे शक्य झाले नाही"</string> + <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"झिप फाईल मध्ये बग रीपोर्ट तपशील जोडणे शक्य झाले नाही"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"अनामित"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"तपशील"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"स्क्रीनशॉट"</string> diff --git a/packages/SoundPicker/res/values-ar/strings.xml b/packages/SoundPicker/res/values-ar/strings.xml index f8844e94815f..a91795545269 100644 --- a/packages/SoundPicker/res/values-ar/strings.xml +++ b/packages/SoundPicker/res/values-ar/strings.xml @@ -25,5 +25,5 @@ <string name="delete_ringtone_text" msgid="201443984070732499">"حذف"</string> <string name="unable_to_add_ringtone" msgid="4583511263449467326">"يتعذر إضافة نغمة رنين مخصصة"</string> <string name="unable_to_delete_ringtone" msgid="6792301380142859496">"يتعذر حذف نغمة الرنين المخصصة"</string> - <string name="app_label" msgid="3091611356093417332">"الأصوات"</string> + <string name="app_label" msgid="3091611356093417332">"Sounds"</string> </resources> diff --git a/packages/SoundPicker/res/values-cs/strings.xml b/packages/SoundPicker/res/values-cs/strings.xml index dc67c960cca9..e8fc97e44174 100644 --- a/packages/SoundPicker/res/values-cs/strings.xml +++ b/packages/SoundPicker/res/values-cs/strings.xml @@ -16,14 +16,14 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="ringtone_default" msgid="798836092118824500">"Výchozí vyzvánění"</string> + <string name="ringtone_default" msgid="798836092118824500">"Výchozí vyzváněcí tón"</string> <string name="notification_sound_default" msgid="8133121186242636840">"Výchozí zvuk oznámení"</string> <string name="alarm_sound_default" msgid="4787646764557462649">"Výchozí zvuk budíku"</string> - <string name="add_ringtone_text" msgid="6642389991738337529">"Přidat vyzvánění"</string> + <string name="add_ringtone_text" msgid="6642389991738337529">"Přidat vyzváněcí tón"</string> <string name="add_alarm_text" msgid="3545497316166999225">"Přidat budík"</string> <string name="add_notification_text" msgid="4431129543300614788">"Přidat oznámení"</string> <string name="delete_ringtone_text" msgid="201443984070732499">"Smazat"</string> - <string name="unable_to_add_ringtone" msgid="4583511263449467326">"Vlastní vyzvánění se nepodařilo přidat"</string> - <string name="unable_to_delete_ringtone" msgid="6792301380142859496">"Vlastní vyzvánění se nepodařilo smazat"</string> + <string name="unable_to_add_ringtone" msgid="4583511263449467326">"Vlastní vyzváněcí tón se nepodařilo přidat"</string> + <string name="unable_to_delete_ringtone" msgid="6792301380142859496">"Vlastní vyzváněcí tón se nepodařilo smazat"</string> <string name="app_label" msgid="3091611356093417332">"Zvuky"</string> </resources> diff --git a/packages/SoundPicker/res/values-uz/strings.xml b/packages/SoundPicker/res/values-uz/strings.xml index a617733737e7..9018e660d8fc 100644 --- a/packages/SoundPicker/res/values-uz/strings.xml +++ b/packages/SoundPicker/res/values-uz/strings.xml @@ -21,7 +21,7 @@ <string name="alarm_sound_default" msgid="4787646764557462649">"Standart signal tovushi"</string> <string name="add_ringtone_text" msgid="6642389991738337529">"Rington qo‘shish"</string> <string name="add_alarm_text" msgid="3545497316166999225">"Signal qo‘shish"</string> - <string name="add_notification_text" msgid="4431129543300614788">"Bildirishnoma kiritish"</string> + <string name="add_notification_text" msgid="4431129543300614788">"Bildirishnoma qo‘shish"</string> <string name="delete_ringtone_text" msgid="201443984070732499">"O‘chirish"</string> <string name="unable_to_add_ringtone" msgid="4583511263449467326">"Maxsus rington qo‘shib bo‘lmadi"</string> <string name="unable_to_delete_ringtone" msgid="6792301380142859496">"Maxsus ringtonni o‘chirib bo‘lmadi"</string> diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index 65e3f0dbd176..6d86a78360d8 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -112,7 +112,7 @@ <string name="kg_pin_accepted" msgid="1625501841604389716">"تم قبول الرمز"</string> <string name="keyguard_carrier_default" msgid="6359808469637388586">"لا تتوفر خدمة."</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"تبديل أسلوب الإدخال"</string> - <string name="airplane_mode" msgid="2528005343938497866">"وضع الطيران"</string> + <string name="airplane_mode" msgid="2528005343938497866">"وضع الطائرة"</string> <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"يجب رسم النقش بعد إعادة تشغيل الجهاز"</string> <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"يجب إدخال رقم التعريف الشخصي بعد إعادة تشغيل الجهاز"</string> <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"يجب إدخال كلمة المرور بعد إعادة تشغيل الجهاز"</string> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 52b7fab768c5..24b5c23a6732 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -100,7 +100,7 @@ <string name="kg_pin_accepted" msgid="1625501841604389716">"កូដត្រូវបានទទួលយក!"</string> <string name="keyguard_carrier_default" msgid="6359808469637388586">"គ្មានសេវាទេ។"</string> <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"ប្ដូរវិធីបញ្ចូល"</string> - <string name="airplane_mode" msgid="2528005343938497866">"ពេលជិះយន្តហោះ"</string> + <string name="airplane_mode" msgid="2528005343938497866">"មុខងារពេលជិះយន្តហោះ"</string> <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"តម្រូវឲ្យប្រើលំនាំ បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string> <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"តម្រូវឲ្យបញ្ចូលកូដ PIN បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string> <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"តម្រូវឲ្យបញ្ចូលពាក្យសម្ងាត់ បន្ទាប់ពីឧបករណ៍ចាប់ផ្តើមឡើងវិញ"</string> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index d44003bc5b95..74386bc7a487 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -134,7 +134,7 @@ <item quantity="other">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_1">%d</xliff:g> ప్రయత్నాలు మిగిలి ఉన్నాయి. వివరాల కోసం కారియర్ను సంప్రదించండి.</item> <item quantity="one">SIM ఇప్పుడు నిలిపివేయబడింది. PUK కోడ్ను నమోదు చేయండి. SIM శాశ్వతంగా నిరుపయోగం కాకుండా ఉండటానికి మీకు <xliff:g id="_NUMBER_0">%d</xliff:g> ప్రయత్నం మిగిలి ఉంది వివరాల కోసం కారియర్ను సంప్రదించండి.</item> </plurals> - <string name="clock_title_default" msgid="6342735240617459864">"ఆటోమేటిక్"</string> + <string name="clock_title_default" msgid="6342735240617459864">"డిఫాల్ట్"</string> <string name="clock_title_bubble" msgid="2204559396790593213">"బబుల్"</string> <string name="clock_title_analog" msgid="8409262532900918273">"ఎనలాగ్"</string> </resources> diff --git a/packages/SystemUI/res-product/values-in/strings.xml b/packages/SystemUI/res-product/values-in/strings.xml index 1451e2c063c9..2e0580f568f9 100644 --- a/packages/SystemUI/res-product/values-in/strings.xml +++ b/packages/SystemUI/res-product/values-in/strings.xml @@ -26,10 +26,10 @@ <string name="keyguard_missing_sim_message" product="tablet" msgid="5018086454277963787">"Tidak ada kartu SIM dalam tablet."</string> <string name="keyguard_missing_sim_message" product="default" msgid="7053347843877341391">"Tidak ada kartu SIM dalam ponsel."</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="6278551068943958651">"Kode PIN tidak cocok"</string> - <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="302165994845009232">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali berupaya membuka kunci tablet dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, tablet ini akan direset, sehingga semua datanya akan dihapus."</string> - <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="2594813176164266847">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali berupaya membuka kunci ponsel dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, ponsel ini akan direset, sehingga semua datanya akan dihapus."</string> - <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="8710104080409538587">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali berupaya membuka kunci tablet dengan tidak benar. Tablet ini akan direset, sehingga semua datanya akan dihapus."</string> - <string name="kg_failed_attempts_now_wiping" product="default" msgid="6381835450014881813">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali berupaya membuka kunci ponsel dengan tidak benar. Ponsel ini akan direset, sehingga semua datanya akan dihapus."</string> + <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="302165994845009232">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali berupaya membuka kunci tablet dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, tablet ini akan disetel ulang, sehingga semua datanya akan dihapus."</string> + <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="2594813176164266847">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali berupaya membuka kunci ponsel dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, ponsel ini akan disetel ulang, sehingga semua datanya akan dihapus."</string> + <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="8710104080409538587">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali berupaya membuka kunci tablet dengan tidak benar. Tablet ini akan disetel ulang, sehingga semua datanya akan dihapus."</string> + <string name="kg_failed_attempts_now_wiping" product="default" msgid="6381835450014881813">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali berupaya membuka kunci ponsel dengan tidak benar. Ponsel ini akan disetel ulang, sehingga semua datanya akan dihapus."</string> <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="7325071812832605911">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali berupaya membuka kunci tablet dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, pengguna ini akan dihapus, sehingga semua data pengguna akan dihapus."</string> <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="8110939900089863103">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali berupaya membuka kunci ponsel dengan tidak benar. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, pengguna ini akan dihapus, sehingga semua data pengguna akan dihapus."</string> <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="8509811676952707883">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali berupaya membuka kunci tablet dengan tidak benar. Pengguna ini akan dihapus, sehingga semua data pengguna akan dihapus."</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 30a09d3d4e5b..8710cb805a0b 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -73,7 +73,7 @@ <string name="usb_contaminant_message" msgid="7730476585174719805">"መሣሪያዎን ከፈሳሽ ወይም ፍርስራሽ ለመጠበቅ ሲባል የዩኤስቢ ወደቡ ተሰናክሏል፣ እና ማናቸውም ተቀጥላዎችን አያገኝም።\n\nየዩኤስቢ ወደቡን እንደገና መጠቀም ችግር በማይኖረው ጊዜ ማሳወቂያ ይደርሰዎታል።"</string> <string name="usb_port_enabled" msgid="531823867664717018">"ኃይል መሙያዎችን እና ተጨማሪ መሣሪያዎችን ፈልጎ ለማግኘት የነቃ የዩኤስቢ ወደብ"</string> <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"ዩኤስቢ አንቃ"</string> - <string name="learn_more" msgid="4690632085667273811">"የበለጠ ለመረዳት"</string> + <string name="learn_more" msgid="4690632085667273811">"የበለጠ መረዳት"</string> <string name="compat_mode_on" msgid="4963711187149440884">"ማያ እንዲሞላ አጉላ"</string> <string name="compat_mode_off" msgid="7682459748279487945">"ማያ ለመሙለት ሳብ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ቅጽበታዊ ገጽ እይታ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 872bca858498..ec1e076f8f67 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -234,7 +234,7 @@ <string name="not_default_data_content_description" msgid="6757881730711522517">"لم يتم الضبط على استخدام البيانات"</string> <string name="cell_data_off" msgid="4886198950247099526">"غير مفعّلة"</string> <string name="accessibility_bluetooth_tether" msgid="6327291292208790599">"التوصيل عبر البلوتوث"</string> - <string name="accessibility_airplane_mode" msgid="1899529214045998505">"وضع الطيران."</string> + <string name="accessibility_airplane_mode" msgid="1899529214045998505">"وضع الطائرة."</string> <string name="accessibility_vpn_on" msgid="8037549696057288731">"الشبكة الافتراضية الخاصة (VPN) قيد التفعيل."</string> <string name="accessibility_no_sims" msgid="5711270400476534667">"ليس هناك شريحة SIM."</string> <string name="carrier_network_change_mode" msgid="5174141476991149918">"جارٍ تغيير شبكة مشغِّل شبكة الجوّال."</string> @@ -269,10 +269,10 @@ <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"تم تفعيل Wifi."</string> <string name="accessibility_quick_settings_mobile" msgid="1817825313718492906">"الجوّال <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> <string name="accessibility_quick_settings_battery" msgid="533594896310663853">"البطارية <xliff:g id="STATE">%s</xliff:g>."</string> - <string name="accessibility_quick_settings_airplane_off" msgid="1275658769368793228">"إيقاف وضع الطيران."</string> - <string name="accessibility_quick_settings_airplane_on" msgid="8106176561295294255">"تفعيل وضع الطيران."</string> - <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"تم إيقاف وضع الطيران."</string> - <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"تم تفعيل وضع الطيران."</string> + <string name="accessibility_quick_settings_airplane_off" msgid="1275658769368793228">"إيقاف وضع الطائرة."</string> + <string name="accessibility_quick_settings_airplane_on" msgid="8106176561295294255">"تفعيل وضع الطائرة."</string> + <string name="accessibility_quick_settings_airplane_changed_off" msgid="8880183481476943754">"تم إيقاف وضع الطائرة."</string> + <string name="accessibility_quick_settings_airplane_changed_on" msgid="6327378061894076288">"تم تفعيل وضع الطائرة."</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="3235552940146035383">"كتم الصوت تمامًا"</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="3375848309132140014">"المنبِّهات فقط"</string> <string name="accessibility_quick_settings_dnd" msgid="2415967452264206047">"عدم الإزعاج"</string> @@ -320,7 +320,7 @@ <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"تم الوصول إلى حد البيانات الذي عيَّنته. لم يُعد بإمكانك استخدام بيانات الجوال.\n\nفي حالة الاستئناف، قد يتم تطبيق الرسوم لاستخدام البيانات."</string> <string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"استئناف"</string> <string name="gps_notification_searching_text" msgid="231304732649348313">"جارٍ البحث عن GPS"</string> - <string name="gps_notification_found_text" msgid="3145873880174658526">"تم ضبط الموقع بواسطة GPS"</string> + <string name="gps_notification_found_text" msgid="3145873880174658526">"تم تعيين الموقع بواسطة GPS"</string> <string name="accessibility_location_active" msgid="2845747916764660369">"طلبات الموقع نشطة"</string> <string name="accessibility_sensors_off_active" msgid="2619725434618911551">"أجهزة الاستشعار غير مفعّلة"</string> <string name="accessibility_clear_all" msgid="970525598287244592">"محو جميع الإشعارات."</string> @@ -666,7 +666,7 @@ <string name="status_bar_ethernet" msgid="5690979758988647484">"إيثرنت"</string> <string name="status_bar_alarm" msgid="87160847643623352">"المنبّه"</string> <string name="status_bar_work" msgid="5238641949837091056">"الملف الشخصي للعمل"</string> - <string name="status_bar_airplane" msgid="4848702508684541009">"وضع الطيران"</string> + <string name="status_bar_airplane" msgid="4848702508684541009">"وضع الطائرة"</string> <string name="add_tile" msgid="6239678623873086686">"إضافة فئة"</string> <string name="broadcast_tile" msgid="5224010633596487481">"إرسال فئة"</string> <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"لن تسمع المنبّه القادم في <xliff:g id="WHEN">%1$s</xliff:g> إلا إذا أوقفت هذا قبل الموعد"</string> @@ -699,7 +699,7 @@ <string name="tuner_full_importance_settings" msgid="1388025816553459059">"عناصر التحكم في إشعارات التشغيل"</string> <string name="tuner_full_importance_settings_on" msgid="917981436602311547">"تشغيل"</string> <string name="tuner_full_importance_settings_off" msgid="5580102038749680829">"إيقاف"</string> - <string name="power_notification_controls_description" msgid="1334963837572708952">"باستخدام عناصر التحكم في إشعار التشغيل، يمكنك ضبط مستوى الأهمية من 0 إلى 5 لإشعارات التطبيق. \n\n"<b>"المستوى 5"</b>" \n- العرض أعلى قائمة الإشعارات \n- يسمح بمقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 4"</b>" \n- منع مقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 3"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n\n"<b>"المستوى 2"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات واهتزاز \n\n"<b>"المستوى 1"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات أو اهتزاز أبدًا \n- الإخفاء من شاشة القفل وشريط الحالة \n- العرض أسفل قائمة الإشعارات \n\n"<b>"المستوى 0"</b>" \n- حظر جميع الإشعارات من التطبيق"</string> + <string name="power_notification_controls_description" msgid="1334963837572708952">"باستخدام عناصر التحكم في إشعار التشغيل، يمكنك تعيين مستوى الأهمية من 0 إلى 5 لإشعارات التطبيق. \n\n"<b>"المستوى 5"</b>" \n- العرض أعلى قائمة الإشعارات \n- يسمح بمقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 4"</b>" \n- منع مقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 3"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n\n"<b>"المستوى 2"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات واهتزاز \n\n"<b>"المستوى 1"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات أو اهتزاز أبدًا \n- الإخفاء من شاشة القفل وشريط الحالة \n- العرض أسفل قائمة الإشعارات \n\n"<b>"المستوى 0"</b>" \n- حظر جميع الإشعارات من التطبيق"</string> <string name="notification_header_default_channel" msgid="225454696914642444">"الإشعارات"</string> <string name="notification_channel_disabled" msgid="928065923928416337">"لن تتلقى هذه الإشعارات بعد الآن."</string> <string name="notification_channel_minimized" msgid="6892672757877552959">"سيتم تصغير هذه الإشعارات."</string> @@ -1062,7 +1062,7 @@ <string name="accessibility_control_favorite" msgid="8694362691985545985">"تمت الإضافة إلى المفضّلة"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"تمت الإضافة إلى المفضّلة، الموضع <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="accessibility_control_not_favorite" msgid="1291760269563092359">"تمت الإزالة من المفضّلة"</string> - <string name="accessibility_control_change_favorite" msgid="2943178027582253261">"إضافة إلى المحتوى المفضّل"</string> + <string name="accessibility_control_change_favorite" msgid="2943178027582253261">"إضافة إلى المُفضلة"</string> <string name="accessibility_control_change_unfavorite" msgid="6997408061750740327">"إزالة من المفضّلة"</string> <string name="accessibility_control_move" msgid="8980344493796647792">"نقل إلى الموضع <xliff:g id="NUMBER">%d</xliff:g>"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"عناصر التحكّم"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 43bfa890d434..289efd5c7f52 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -125,7 +125,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"দিব্যাংগসকলৰ বাবে থকা সুবিধাসমূহ"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"স্ক্ৰীণ ঘূৰাওক"</string> <string name="accessibility_recent" msgid="901641734769533575">"অৱলোকন"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"Search"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"সন্ধান কৰক"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"কেমেৰা"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ফ\'ন"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"কণ্ঠধ্বনিৰে সহায়"</string> @@ -441,7 +441,7 @@ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"বেটাৰিৰ চ্চাৰ্জ সম্পূর্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME">%s</xliff:g> বাকী"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"চ্চার্জ কৰি থকা নাই"</string> <string name="ssl_ca_cert_warning" msgid="8373011375250324005">"নেটৱৰ্ক \nনিৰীক্ষণ কৰা হ\'ব পাৰে"</string> - <string name="description_target_search" msgid="3875069993128855865">"Search"</string> + <string name="description_target_search" msgid="3875069993128855865">"অনুসন্ধান কৰক"</string> <string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে ওপৰলৈ শ্লাইড কৰক।"</string> <string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে বাওঁফাললৈ শ্লাইড কৰক।"</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"আপুনি নিৰ্দিষ্ট কৰা এলাৰ্ম, ৰিমাইণ্ডাৰ, ইভেন্ট আৰু কল কৰোঁতাৰ বাহিৰে আন কোনো শব্দৰ পৰা আপুনি অসুবিধা নাপাব। কিন্তু, সংগীত, ভিডিঅ\' আৰু খেলসমূহকে ধৰি আপুনি প্লে কৰিব খোজা যিকোনো বস্তু তথাপি শুনিব পাৰিব।"</string> @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"বেটাৰি সঞ্চয়কাৰী অন হৈ আছে"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"বেটাৰি সঞ্চয়কাৰী অফ কৰক"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>এ আপোনাৰ স্ক্ৰীনত দৃশ্যমান হোৱা অথবা ৰেকর্ডিং অথবা কাষ্টিঙৰ সময়ত আপোনাৰ ডিভাইচত প্লে\' কৰা সকলো তথ্যলৈ এক্সেছ পাব। এইটোত পাছৱর্ড, পৰিশোধৰ সবিশেষ, ফট\', বার্তাসমূহ আৰু আপুনি প্লে\' কৰা অডিঅ\'ৰ দৰে তথ্য অন্তর্ভুক্ত হয়।"</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>এ আপোনাৰ স্ক্ৰীনত দৃশ্যমান হোৱা অথবা ৰেকর্ডিং অথবা কাষ্টিংৰ সময়ত আপোনাৰ ডিভাইচত প্লে\' কৰা সকলো তথ্যলৈ এক্সেছ পাব। এইটোত পাছৱর্ড, পৰিশোধৰ সবিশেষ, ফট\', বার্তাসমূহ আৰু আপুনি প্লে\' কৰা অডিঅ\'ৰ দৰে তথ্য অন্তর্ভুক্ত হয়।"</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"এই সুবিধাটো প্ৰদান কৰা সেৱাটোৱে আপোনাৰ স্ক্ৰীনত দৃশ্যমান হোৱা অথবা ৰেকর্ডিং অথবা কাষ্টিংৰ সময়ত আপোনাৰ ডিভাইচত প্লে\' কৰা সকলো তথ্যলৈ এক্সেছ পাব। এইটোত পাছৱর্ড, পৰিশোধৰ সবিশেষ, ফট\', বার্তাসমূহ আৰু আপুনি প্লে\' কৰা অডিঅ\'ৰ দৰে তথ্য অন্তর্ভুক্ত হয়।"</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ৰেকর্ডিং অথবা কাষ্টিং আৰম্ভ কৰিবনে?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>ৰ জৰিয়তে ৰেকর্ডিং অথবা কাষ্টিং আৰম্ভ কৰিবনে ?"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index c4693bef25bf..93db53ee43e1 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -405,7 +405,7 @@ <item quantity="one">%d cihaz</item> </plurals> <string name="quick_settings_notifications_label" msgid="3379631363952582758">"Bildirişlər"</string> - <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Fənər"</string> + <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"İşartı"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Kamera istifadə olunur"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Mobil data"</string> <string name="quick_settings_cellular_detail_data_usage" msgid="6105969068871138427">"Data istifadəsi"</string> @@ -791,7 +791,7 @@ <string name="keyboard_key_page_up" msgid="173914303254199845">"Yuxarı Səhifə"</string> <string name="keyboard_key_page_down" msgid="9035902490071829731">"Aşağı Səhifə"</string> <string name="keyboard_key_forward_del" msgid="5325501825762733459">"Silin"</string> - <string name="keyboard_key_move_home" msgid="3496502501803911971">"Home"</string> + <string name="keyboard_key_move_home" msgid="3496502501803911971">"Əsas səhifə"</string> <string name="keyboard_key_move_end" msgid="99190401463834854">"Son"</string> <string name="keyboard_key_insert" msgid="4621692715704410493">"Daxil edin"</string> <string name="keyboard_key_num_lock" msgid="7209960042043090548">"Nömrələr"</string> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index e526114fd0ea..6ff5d5dc86ac 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -38,7 +38,7 @@ <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Uključi"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"Uključi Uštedu baterije"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Podešavanja"</string> - <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"WiFi"</string> + <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Automatsko rotiranje ekrana"</string> <string name="status_bar_settings_mute_label" msgid="914392730086057522">"UGASI"</string> <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"AUTOM."</string> @@ -226,7 +226,7 @@ <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string> <string name="data_connection_roaming" msgid="375650836665414797">"Roming"</string> <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string> - <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WiFi"</string> + <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string> <string name="accessibility_no_sim" msgid="1140839832913084973">"Nema SIM kartice."</string> <string name="accessibility_cell_data" msgid="172950885786007392">"Mobilni podaci"</string> <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobilni podaci su uključeni"</string> @@ -265,8 +265,8 @@ <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Zaključan ekran za posao"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Zatvori"</string> <string name="accessibility_quick_settings_wifi" msgid="167707325133803052">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> - <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WiFi je isključen."</string> - <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WiFi je uključen."</string> + <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi je isključen."</string> + <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi je uključen."</string> <string name="accessibility_quick_settings_mobile" msgid="1817825313718492906">"Mobilna mreža: <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> <string name="accessibility_quick_settings_battery" msgid="533594896310663853">"Baterija: <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_airplane_off" msgid="1275658769368793228">"Režim rada u avionu je isključen."</string> @@ -375,19 +375,19 @@ <string name="quick_settings_user_label" msgid="1253515509432672496">"Ja"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"Korisnik"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"Novi korisnik"</string> - <string name="quick_settings_wifi_label" msgid="2879507532983487244">"WiFi"</string> + <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Veza nije uspostavljena"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Nema mreže"</string> - <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WiFi je isključen"</string> - <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"WiFi je uključen"</string> - <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Nije dostupna nijedna WiFi mreža"</string> + <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi je isključen"</string> + <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi je uključen"</string> + <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Nije dostupna nijedna Wi-Fi mreža"</string> <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Uključuje se..."</string> <string name="quick_settings_cast_title" msgid="2279220930629235211">"Prebacivanje ekrana"</string> <string name="quick_settings_casting" msgid="1435880708719268055">"Prebacivanje"</string> <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Neimenovani uređaj"</string> <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Spremno za prebacivanje"</string> <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"Nije dostupan nijedan uređaj"</string> - <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"WiFi nije povezan"</string> + <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi nije povezan"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Osvetljenost"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"AUTOMATSKA"</string> <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Obrni boje"</string> @@ -643,8 +643,8 @@ <string name="output_none_found" msgid="5488087293120982770">"Nije pronađen nijedan uređaj"</string> <string name="output_none_found_service_off" msgid="935667567681386368">"Nije pronađen nijedan uređaj. Probajte da uključite uslugu <xliff:g id="SERVICE">%1$s</xliff:g>"</string> <string name="output_service_bt" msgid="4315362133973911687">"Bluetooth"</string> - <string name="output_service_wifi" msgid="9003667810868222134">"WiFi"</string> - <string name="output_service_bt_wifi" msgid="7186882540475524124">"Bluetooth i WiFi"</string> + <string name="output_service_wifi" msgid="9003667810868222134">"Wi-Fi"</string> + <string name="output_service_bt_wifi" msgid="7186882540475524124">"Bluetooth i Wi-Fi"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Tjuner za korisnički interfejs sistema"</string> <string name="show_battery_percentage" msgid="6235377891802910455">"Prikazuj ugrađeni procenat baterije"</string> <string name="show_battery_percentage_summary" msgid="9053024758304102915">"Prikazivanje nivoa napunjenosti baterije u procentima unutar ikone na statusnoj traci kada se baterija ne puni"</string> @@ -964,7 +964,7 @@ <string name="mobile_data" msgid="4564407557775397216">"Mobilni podaci"</string> <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string> - <string name="wifi_is_off" msgid="5389597396308001471">"WiFi je isključen"</string> + <string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi je isključen"</string> <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth je isključen"</string> <string name="dnd_is_off" msgid="3185706903793094463">"Režim Ne uznemiravaj je isključen"</string> <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Automatsko pravilo (<xliff:g id="ID_1">%s</xliff:g>) je uključilo režim Ne uznemiravaj."</string> @@ -976,7 +976,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"Aplikacije pokrenute u pozadini"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Dodirnite za detalje o bateriji i potrošnji podataka"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"Želite da isključite mobilne podatke?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nećete imati pristup podacima ili internetu preko mobilnog operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo preko WiFi veze."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"Nećete imati pristup podacima ili internetu preko mobilnog operatera <xliff:g id="CARRIER">%s</xliff:g>. Internet će biti dostupan samo preko Wi-Fi veze."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"mobilni operater"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Podešavanja ne mogu da verifikuju vaš odgovor jer aplikacija skriva zahtev za dozvolu."</string> <string name="slice_permission_title" msgid="3262615140094151017">"Želite li da dozvolite aplikaciji <xliff:g id="APP_0">%1$s</xliff:g> da prikazuje isečke iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 5416e030846c..41d7fa81006c 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -722,7 +722,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"У залежнасці ад налад тэлефона магчымы званок або вібрацыя"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"У залежнасці ад налад тэлефона магчымы званок або вібрацыя. Размовы ў праграме \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" стандартна паяўляюцца ў выглядзе ўсплывальных апавяшчэнняў."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Прыцягвае ўвагу да гэтага змесціва ўсплывальнай кнопкай."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Паказваецца ўверсе раздзела размоў, як усплывальнае апавяшчэнне, паказвае фота профілю на экране блакіроўкі"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Паказваецца ўверсе раздзела размоў у выглядзе ўсплывальнага апавяшчэння, а на экране блакіроўкі – у выглядзе відарыса профілю"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Налады"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Прыярытэт"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не падтрымлівае функцыі размовы"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index afb444104a32..7913674df7aa 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Може да звъни или да вибрира въз основа на настройките за телефона"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Може да звъни или да вибрира въз основа на настройките за телефона. Разговорите от <xliff:g id="APP_NAME">%1$s</xliff:g> се показват като балончета по подразбиране."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Задържа вниманието ви посредством плаващ пряк път към това съдържание."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Показва се като плаващо балонче в горната част на секцията с разговори, показва снимката на потр. профил на заключения екран"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Показва се като плаващо балонче в горната част на секцията с разговори и показва снимката на потребителския профил на заключения екран"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддържа функциите за разговор"</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index f9627ab4db19..08cf5d19d315 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -125,7 +125,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"অ্যাক্সেসযোগ্যতা"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"স্ক্রিন ঘোরান"</string> <string name="accessibility_recent" msgid="901641734769533575">"এক নজরে"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"সার্চ"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"খুঁজুন"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"ক্যামেরা"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ফোন"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ভয়েস সহায়তা"</string> @@ -441,7 +441,7 @@ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"পূর্ণ হতে <xliff:g id="CHARGING_TIME">%s</xliff:g> সময় লাগবে"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"চার্জ হচ্ছে না"</string> <string name="ssl_ca_cert_warning" msgid="8373011375250324005">"নেটওয়ার্ক নিরীক্ষণ\nকরা হতে পারে"</string> - <string name="description_target_search" msgid="3875069993128855865">"সার্চ"</string> + <string name="description_target_search" msgid="3875069993128855865">"খুঁজুন"</string> <string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য উপরের দিকে স্লাইড করুন৷"</string> <string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> এর জন্য বাঁ দিকে স্লাইড করুন৷"</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"অ্যালার্ম, রিমাইন্ডার, ইভেন্ট, এবং আপনার নির্দিষ্ট করে দেওয়া ব্যক্তিদের কল ছাড়া অন্য কোনও আওয়াজ বা ভাইব্রেশন হবে না। তবে সঙ্গীত, ভিডিও, এবং গেম সহ আপনি যা কিছু চালাবেন তার আওয়াজ শুনতে পাবেন।"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 25c01f602168..34f4b9fbc3e2 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -651,9 +651,9 @@ <string name="quick_settings" msgid="6211774484997470203">"Brze postavke"</string> <string name="status_bar" msgid="4357390266055077437">"Statusna traka"</string> <string name="overview" msgid="3522318590458536816">"Pregled"</string> - <string name="demo_mode" msgid="263484519766901593">"Način rada za demonstraciju Sistemskog UI-a"</string> - <string name="enable_demo_mode" msgid="3180345364745966431">"Omogući način rada za demonstraciju"</string> - <string name="show_demo_mode" msgid="3677956462273059726">"Prikaži način rada za demonstraciju"</string> + <string name="demo_mode" msgid="263484519766901593">"Način demonstracije Sistemskog UI-a"</string> + <string name="enable_demo_mode" msgid="3180345364745966431">"Omogući način demonstracije"</string> + <string name="show_demo_mode" msgid="3677956462273059726">"Prikaži način demonstracije"</string> <string name="status_bar_ethernet" msgid="5690979758988647484">"Ethernet"</string> <string name="status_bar_alarm" msgid="87160847643623352">"Alarm"</string> <string name="status_bar_work" msgid="5238641949837091056">"Profil za posao"</string> @@ -726,7 +726,7 @@ <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nema nedavnih oblačića"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Nedavni i odbačeni oblačići će se pojaviti ovdje"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"Ta obavještenja se ne mogu izmijeniti."</string> - <string name="notification_multichannel_desc" msgid="7414593090056236179">"Ovu grupu obavještenja nije moguće konfigurirati ovdje"</string> + <string name="notification_multichannel_desc" msgid="7414593090056236179">"Ovdje nije moguće konfigurirati ovu grupu obavještenja"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"Obavještenje preko proksi servera"</string> <string name="notification_channel_dialog_title" msgid="6856514143093200019">"Sva obavještenja aplikacije <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="see_more_title" msgid="7409317011708185729">"Prikaži više"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 658beec8a721..f5330d3b2d6a 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -92,10 +92,10 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processant gravació de pantalla"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Notificació en curs d\'una sessió de gravació de la pantalla"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Vols iniciar la gravació?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"Durant la gravació, el sistema Android pot capturar qualsevol informació sensible que es mostri a la pantalla o que es reprodueixi al dispositiu. Això inclou contrasenyes, informació de pagament, fotos, missatges i àudio."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"Quan graves contingut, el sistema Android pot capturar qualsevol informació sensible que es mostri a la pantalla o que es reprodueixi al dispositiu. Això inclou les contrasenyes, la informació de pagament, les fotos, els missatges i l\'àudio."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Grava l\'àudio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Àudio del dispositiu"</string> - <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"So del dispositiu, com ara música, trucades i sons de trucada"</string> + <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sons del dispositiu, com ara la música, les trucades i els sons de trucada"</string> <string name="screenrecord_mic_label" msgid="2111264835791332350">"Micròfon"</string> <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Àudio del dispositiu i micròfon"</string> <string name="screenrecord_start" msgid="330991441575775004">"Inicia"</string> @@ -389,7 +389,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"La Wi‑Fi no està connectada"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Brillantor"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"AUTOMÀTICA"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverteix colors"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Inverteix els colors"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Mode de correcció de color"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Més opcions"</string> <string name="quick_settings_done" msgid="2163641301648855793">"Fet"</string> @@ -447,7 +447,7 @@ <string name="zen_priority_introduction" msgid="3159291973383796646">"No t\'interromprà cap so ni cap vibració, tret dels de les alarmes, recordatoris, esdeveniments i trucades de les persones que especifiquis. Continuaràs sentint tot allò que decideixis reproduir, com ara música, vídeos i jocs."</string> <string name="zen_alarms_introduction" msgid="3987266042682300470">"No t\'interromprà cap so ni cap vibració, tret dels de les alarmes. Continuaràs sentint tot allò que decideixis reproduir, com ara música, vídeos i jocs."</string> <string name="zen_priority_customize_button" msgid="4119213187257195047">"Personalitza"</string> - <string name="zen_silence_introduction_voice" msgid="853573681302712348">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música. Encara podràs fer trucades telefòniques."</string> + <string name="zen_silence_introduction_voice" msgid="853573681302712348">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música. Encara podràs fer trucades."</string> <string name="zen_silence_introduction" msgid="6117517737057344014">"Es bloquejaran TOTS els sons i totes les vibracions, inclosos els de vídeos, jocs, alarmes i música."</string> <string name="keyguard_more_overflow_text" msgid="5819512373606638727">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="7248696377626341060">"Notificacions menys urgents a continuació"</string> @@ -709,7 +709,7 @@ <string name="inline_turn_off_notifications" msgid="8543989584403106071">"Desactiva les notificacions"</string> <string name="inline_keep_showing_app" msgid="4393429060390649757">"Vols continuar rebent notificacions d\'aquesta aplicació?"</string> <string name="notification_silence_title" msgid="8608090968400832335">"Silenci"</string> - <string name="notification_alert_title" msgid="3656229781017543655">"Predeterminat"</string> + <string name="notification_alert_title" msgid="3656229781017543655">"Predeterminada"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Bombolla"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Sense so ni vibració"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Sense so ni vibració i es mostra més avall a la secció de converses"</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 484c63131555..40dce03b46c8 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -95,7 +95,7 @@ <string name="screenrecord_description" msgid="1123231719680353736">"Při nahrávání může systém Android zaznamenávat citlivé údaje, které jsou viditelné na obrazovce nebo které jsou přehrávány na zařízení. Týká se to hesel, údajů o platbě, fotek, zpráv a zvuků."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Nahrát zvuk"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvuk zařízení"</string> - <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk ze zařízení, například hudba, hovory a vyzvánění"</string> + <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvuk ze zařízení, například hudba, hovory a vyzváněcí tóny"</string> <string name="screenrecord_mic_label" msgid="2111264835791332350">"Mikrofon"</string> <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Zvuk a mikrofon zařízení"</string> <string name="screenrecord_start" msgid="330991441575775004">"Spustit"</string> @@ -722,7 +722,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Může vyzvánět nebo vibrovat v závislosti na nastavení telefonu. Konverzace z aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> ve výchozím nastavení bublají."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Přitahuje pozornost pomocí plovoucí zkratky k tomuto obsahu."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Zobrazuje se v horní části sekce konverzací a má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Zobrazuje se v horní části sekce konverzace a má podobu plovoucí bubliny, zobrazuje profilovou fotku na obrazovce uzamčení"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Nastavení"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorita"</string> <string name="no_shortcut" msgid="8257177117568230126">"Aplikace <xliff:g id="APP_NAME">%1$s</xliff:g> funkce konverzace nepodporuje"</string> @@ -1026,7 +1026,7 @@ <string name="inattentive_sleep_warning_title" msgid="3891371591713990373">"Pohotovostní režim"</string> <string name="priority_onboarding_title" msgid="2893070698479227616">"Konverzace byla nastavena jako prioritní"</string> <string name="priority_onboarding_behavior" msgid="5342816047020432929">"Chování prioritních konverzací:"</string> - <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovat v horní části sekce konverzací"</string> + <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"Zobrazovat v horní části sekce konverzace"</string> <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"Zobrazovat profilovou fotku na zámku obrazovky"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"Zobrazuje se jako plovoucí bublina nad aplikacemi"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"Přerušit režim Nerušit"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 334d896ffe4d..59aaa5aa5034 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Kan ringe eller vibrere baseret på telefonens indstillinger"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kan ringe eller vibrere baseret på telefonens indstillinger. Samtaler fra <xliff:g id="APP_NAME">%1$s</xliff:g> vises som standard i bobler."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Fastholder din opmærksomhed med en svævende genvej til indholdet."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtalesektionen som en svævende boble og med profilbillede på låseskærmen"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Vises øverst i samtalesektionen, som en svævende boble og med profilbillede på låseskærmen"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Indstillinger"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioritet"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> understøtter ikke samtalefunktioner"</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index edee95fa2322..e303886d6923 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Energiesparmodus ist aktiviert"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduzierung der Leistung und Hintergrunddaten"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Energiesparmodus deaktivieren"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"Die App \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" erhält Zugriff auf alle Informationen, die auf deinem Bildschirm sichtbar sind oder von deinem Gerät wiedergegeben werden, während du aufnimmst oder streamst. Dazu gehören beispielsweise angezeigte Passwörter und Zahlungsdetails, Fotos, Nachrichten und Audioinhalte."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"Die App \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" erhält Zugriff auf alle Informationen, die auf deinem Bildschirm sichtbar sind oder von deinem Gerät wiedergegeben werden, während du aufnimmst oder streamst. Dazu gehören beispielsweise Passwörter, Zahlungsdetails, Fotos, Nachrichten und Audioinhalte."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Der Anbieter dieser App erhält Zugriff auf alle Informationen, die auf deinem Bildschirm sichtbar sind oder von deinem Gerät wiedergegeben werden, während du aufnimmst oder streamst. Dazu gehören beispielsweise Passwörter, Zahlungsdetails, Fotos, Nachrichten und Audioinhalte."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Aufnahme oder Stream starten?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Aufnehmen oder Streamen mit der App \"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>\" starten?"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index becbaa4a9b2e..b54b5f15d2e5 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -693,7 +693,7 @@ <string name="notification_channel_minimized" msgid="6892672757877552959">"Αυτές οι ειδοποιήσεις θα ελαχιστοποιηθούν"</string> <string name="notification_channel_silenced" msgid="1995937493874511359">"Αυτές οι ειδοποιήσεις θα εμφανίζονται σιωπηλά"</string> <string name="notification_channel_unsilenced" msgid="94878840742161152">"Αυτές οι ειδοποιήσεις θα σας ενημερώνουν"</string> - <string name="inline_blocking_helper" msgid="2891486013649543452">"Συνήθως παραβλέπετε αυτές τις ειδοποιήσεις. \nΝα εξακολουθήσουν να εμφανίζονται;"</string> + <string name="inline_blocking_helper" msgid="2891486013649543452">"Συνήθως απορρίπτετε αυτές τις ειδοποιήσεις. \nΝα εξακολουθήσουν να εμφανίζονται;"</string> <string name="inline_done_button" msgid="6043094985588909584">"Τέλος"</string> <string name="inline_ok_button" msgid="603075490581280343">"Εφαρμογή"</string> <string name="inline_keep_showing" msgid="8736001253507073497">"Να συνεχίσουν να εμφανίζονται αυτές οι ειδοποιήσεις;"</string> @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Ενδέχεται να κουδουνίζει ή να δονείται βάσει των ρυθμίσεων του τηλεφώνου"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Ενδέχεται να κουδουνίζει ή να δονείται βάσει των ρυθμίσεων του τηλεφώνου. Οι συζητήσεις από την εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> εμφανίζονται σε συννεφάκι από προεπιλογή."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Κρατάει την προσοχή σας με μια κινούμενη συντόμευση προς αυτό το περιεχόμενο."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Εμφανίζεται επάνω στις συζητήσεις, προβάλλεται ως κιν. συννεφάκι, εμφανίζει τη φωτ. προφίλ στην οθ. κλειδ."</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Εμφανίζεται στο επάνω μέρος της ενότητας συζητήσεων, προβάλλεται ως κινούμενο συννεφάκι, εμφανίζει τη φωτογραφία προφίλ στην οθόνη κλειδώματος"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ρυθμίσεις"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Προτεραιότητα"</string> <string name="no_shortcut" msgid="8257177117568230126">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> δεν υποστηρίζει τις λειτουργίες συζήτησης"</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 1581c1538202..75410f275d09 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -92,7 +92,7 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"While recording, the Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Record audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Device audio"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sound from your device, like music, calls and ringtones"</string> @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Battery Saver is on"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 937bf1776fe7..fa6db235197c 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -92,7 +92,7 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"While recording, the Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Record audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Device audio"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sound from your device, like music, calls and ringtones"</string> @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Battery Saver is on"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 1581c1538202..75410f275d09 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -92,7 +92,7 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"While recording, the Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Record audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Device audio"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sound from your device, like music, calls and ringtones"</string> @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Battery Saver is on"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 1581c1538202..75410f275d09 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -92,7 +92,7 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Processing screen recording"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ongoing notification for a screen record session"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Start recording?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"While recording, the Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"While recording, Android System can capture any sensitive information that’s visible on your screen or played on your device. This includes passwords, payment info, photos, messages and audio."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Record audio"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Device audio"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sound from your device, like music, calls and ringtones"</string> @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Battery Saver is on"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduces performance and background data"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Turn off Battery Saver"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information, such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"The service providing this function will have access to all of the information that is visible on your screen or played from your device while recording or casting. This includes information such as passwords, payment details, photos, messages and audio that you play."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Start recording or casting?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Start recording or casting with <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 66aa3e749cf9..f9f50ec0fef3 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -248,7 +248,7 @@ <string name="accessibility_remove_notification" msgid="1641455251495815527">"Eliminar notificación"</string> <string name="accessibility_gps_enabled" msgid="4061313248217660858">"GPS habilitado"</string> <string name="accessibility_gps_acquiring" msgid="896207402196024040">"Adquisición de GPS"</string> - <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Teletipo habilitado"</string> + <string name="accessibility_tty_enabled" msgid="1123180388823381118">"TeleTypewriter habilitado"</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Timbre en vibración"</string> <string name="accessibility_ringer_silent" msgid="8994620163934249882">"Timbre en silencio"</string> <!-- no translation found for accessibility_casting (8708751252897282313) --> @@ -708,17 +708,17 @@ <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"Seguir recibiendo alertas"</string> <string name="inline_turn_off_notifications" msgid="8543989584403106071">"Desactivar notificaciones"</string> <string name="inline_keep_showing_app" msgid="4393429060390649757">"¿Quieres seguir viendo las notificaciones de esta app?"</string> - <string name="notification_silence_title" msgid="8608090968400832335">"Silenciada"</string> + <string name="notification_silence_title" msgid="8608090968400832335">"Silencio"</string> <string name="notification_alert_title" msgid="3656229781017543655">"Predeterminada"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Cuadro"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Sin sonido ni vibración"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"No suena ni vibra, y aparece en la parte inferior de la sección de conversaciones."</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Puede sonar o vibrar en función de la configuración del teléfono."</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"No suena ni vibra, y aparece en una parte inferior de la sección de conversaciones"</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Puede sonar o vibrar en función de la configuración del teléfono"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Puede sonar o vibrar en función de la configuración del teléfono. Conversaciones de la burbuja de <xliff:g id="APP_NAME">%1$s</xliff:g> de forma predeterminada."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Retiene tu atención con un acceso directo flotante a este contenido."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece en la parte superior de la sección de conversaciones, en forma de burbuja flotante, y muestra la foto de perfil en la pantalla de bloqueo."</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece en la parte superior de la sección de conversaciones, en forma de burbuja flotante, y muestra la foto de perfil en la pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> - <string name="notification_priority_title" msgid="2079708866333537093">"Prioritaria"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> no admite funciones de conversación"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"No hay burbujas recientes"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Las burbujas recientes y las que se descartaron aparecerán aquí"</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index dc15bdce0373..0ebc975ae01d 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -98,7 +98,7 @@ <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Sonido de tu dispositivo, como música, llamadas y tonos de llamada"</string> <string name="screenrecord_mic_label" msgid="2111264835791332350">"Micrófono"</string> <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Audio y micrófono del dispositivo"</string> - <string name="screenrecord_start" msgid="330991441575775004">"Iniciar"</string> + <string name="screenrecord_start" msgid="330991441575775004">"Empezar"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Grabando pantalla"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Grabando pantalla y audio"</string> <string name="screenrecord_taps_label" msgid="1595690528298857649">"Mostrar toques en la pantalla"</string> @@ -397,7 +397,7 @@ <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Conectado (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Conectando..."</string> <string name="quick_settings_tethering_label" msgid="5257299852322475780">"Compartir conexión"</string> - <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Punto de acceso"</string> + <string name="quick_settings_hotspot_label" msgid="1199196300038363424">"Zona Wi-Fi"</string> <string name="quick_settings_hotspot_secondary_label_transient" msgid="7585604088079160564">"Activando…"</string> <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Ahorro de datos activado"</string> <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976"> @@ -502,10 +502,10 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Ahorro de batería activado"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduce el rendimiento y los datos en segundo plano"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Desactivar Ahorro de batería"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tendrá acceso a toda la información que se muestre en la pantalla o se reproduzca en el dispositivo mientras grabas o envías contenido, incluyendo contraseñas, detalles de pagos, fotos, mensajes y audios que reproduzcas."</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"El servicio que ofrece esta función tendrá acceso a toda la información que se muestre en la pantalla o se reproduzca en el dispositivo mientras grabas o envías contenido, incluyendo contraseñas, detalles de pagos, fotos, mensajes y audios que reproduzcas."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tendrá acceso a toda la información que se muestre en pantalla o se reproduzca en el dispositivo mientras grabas o envías contenido, incluyendo contraseñas, detalles de pagos, fotos, mensajes y audios que reproduzcas."</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"El servicio que ofrece esta función tendrá acceso a toda la información que se muestre en pantalla o se reproduzca en el dispositivo mientras grabas o envías contenido, incluyendo contraseñas, detalles de pagos, fotos, mensajes y audios que reproduzcas."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"¿Empezar a grabar o enviar contenido?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"¿Iniciar grabación o el envío de contenido en <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"¿Quieres iniciar la grabación o el envío de contenido con <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"No volver a mostrar"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Gestionar"</string> @@ -662,7 +662,7 @@ <string name="alarm_template" msgid="2234991538018805736">"a las <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">"Ajustes rápidos, <xliff:g id="TITLE">%s</xliff:g>."</string> - <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Punto de acceso"</string> + <string name="accessibility_status_bar_hotspot" msgid="2888479317489131669">"Zona Wi-Fi"</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> <string name="tuner_warning" msgid="1861736288458481650">"El configurador de UI del sistema te ofrece otras formas de modificar y personalizar la interfaz de usuario de Android. Estas funciones experimentales pueden cambiar, fallar o desaparecer en futuras versiones. Te recomendamos que tengas cuidado."</string> @@ -712,11 +712,11 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Predeterminado"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Burbuja"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Sin sonido ni vibración"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Sin sonido ni vibración, y se muestra más abajo en la sección de conversaciones"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Sin sonido ni vibración y se muestra más abajo en la sección de conversaciones"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"Es posible que suene o vibre según los ajustes del teléfono"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Es posible que suene o vibre según los ajustes del teléfono. Las conversaciones de <xliff:g id="APP_NAME">%1$s</xliff:g> aparecen como burbujas de forma predeterminada."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Llama tu atención con un acceso directo flotante a este contenido."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se muestra arriba en la sección de conversaciones, como burbuja flotante, y la imagen de perfil aparece en la pantalla de bloqueo"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Se muestra arriba en la sección de conversaciones en forma de burbuja flotante, y la imagen de perfil aparece en la pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Ajustes"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridad"</string> <string name="no_shortcut" msgid="8257177117568230126">"No se pueden usar funciones de conversación con <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 050cb434b1b9..55a18223091d 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -554,7 +554,7 @@ <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta zaude eta hark sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"<xliff:g id="VPN_APP_0">%1$s</xliff:g> eta <xliff:g id="VPN_APP_1">%2$s</xliff:g> aplikazioetara konektatuta zaude, eta haiek sareko jarduerak gainbegira ditzakete, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora dago konektatuta laneko profila, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> - <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta daukazu profil pertsonala, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> + <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"<xliff:g id="VPN_APP">%1$s</xliff:g> aplikaziora konektatuta duzu profil pertsonala, eta aplikazio horrek sareko jarduerak gainbegira ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> <string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"<xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> aplikazioak kudeatzen du gailu hau."</string> <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> erakundeak <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> erabiltzen du gailua kudeatzeko."</string> <string name="monitoring_description_do_body" msgid="7700878065625769970">"Gailuko ezarpenak, enpresa-sarbidea, aplikazioak eta datuak gainbegira eta kudea ditzake administratzaileak, baita gailuaren kokapen-informazioa ere."</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 60ea12d314aa..6dde6e8f887c 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -144,7 +144,7 @@ <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"برای لغو راستیآزمایی ضربه بزنید"</string> <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"لطفاً دوباره امتحان کنید"</string> <string name="biometric_dialog_face_icon_description_authenticating" msgid="3401633342366146535">"درحال جستجوی چهره"</string> - <string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"چهره اصالتسنجی شد"</string> + <string name="biometric_dialog_face_icon_description_authenticated" msgid="2242167416140740920">"چهره احراز هویت شد"</string> <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"تأیید شد"</string> <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"برای تکمیل، روی تأیید ضربه بزنید"</string> <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"راستیآزماییشده"</string> @@ -248,7 +248,7 @@ <string name="accessibility_remove_notification" msgid="1641455251495815527">"پاک کردن اعلان"</string> <string name="accessibility_gps_enabled" msgid="4061313248217660858">"GPS فعال شد."</string> <string name="accessibility_gps_acquiring" msgid="896207402196024040">"دستیابی به GPS."</string> - <string name="accessibility_tty_enabled" msgid="1123180388823381118">"تلهتایپ فعال شد."</string> + <string name="accessibility_tty_enabled" msgid="1123180388823381118">"TeleTypewriter فعال شد."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"زنگ لرزشی."</string> <string name="accessibility_ringer_silent" msgid="8994620163934249882">"زنگ بیصدا."</string> <!-- no translation found for accessibility_casting (8708751252897282313) --> @@ -309,8 +309,8 @@ <string name="accessibility_quick_settings_work_mode_changed_on" msgid="1105258550138313384">"حالت کار روشن شد."</string> <string name="accessibility_quick_settings_data_saver_changed_off" msgid="4910847127871603832">"صرفهجویی داده خاموش شد."</string> <string name="accessibility_quick_settings_data_saver_changed_on" msgid="6370606590802623078">"صرفهجویی داده روشن شد."</string> - <string name="accessibility_quick_settings_sensor_privacy_changed_off" msgid="7608378211873807353">"«حریمخصوصی حسگر» خاموش است."</string> - <string name="accessibility_quick_settings_sensor_privacy_changed_on" msgid="4267393685085328801">"«حریمخصوصی حسگر» روشن است."</string> + <string name="accessibility_quick_settings_sensor_privacy_changed_off" msgid="7608378211873807353">"«حریم خصوصی حسگر» خاموش است."</string> + <string name="accessibility_quick_settings_sensor_privacy_changed_on" msgid="4267393685085328801">"«حریم خصوصی حسگر» روشن است."</string> <string name="accessibility_brightness" msgid="5391187016177823721">"روشنایی نمایشگر"</string> <string name="accessibility_ambient_display_charging" msgid="7725523068728128968">"درحال شارژ شدن"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5716594205739750015">"داده 2G-3G موقتاً متوقف شده است"</string> @@ -433,7 +433,7 @@ <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"شروع"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"توقف"</string> <string name="media_seamless_remote_device" msgid="177033467332920464">"دستگاه"</string> - <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"برای تغییر برنامهها، تند بهبالا بکشید"</string> + <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"برای تغییر برنامهها، تند به بالا بکشید"</string> <string name="recents_quick_scrub_onboarding" msgid="765934300283514912">"برای جابهجایی سریع میان برنامهها، به چپ بکشید"</string> <string name="quick_step_accessibility_toggle_overview" msgid="7908949976727578403">"تغییر وضعیت نمای کلی"</string> <string name="expanded_header_battery_charged" msgid="5307907517976548448">"شارژ کامل شد"</string> @@ -452,8 +452,8 @@ <string name="keyguard_more_overflow_text" msgid="5819512373606638727">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="7248696377626341060">"اعلانهای کمتر فوری در زیر"</string> <string name="notification_tap_again" msgid="4477318164947497249">"دوباره ضربه بزنید تا باز شود"</string> - <string name="keyguard_unlock" msgid="8031975796351361601">"برای باز کردن، انگشتتان را تند بهبالا بکشید"</string> - <string name="keyguard_retry" msgid="886802522584053523">"برای امتحان مجدد، انگشتتان را تند بهبالا بکشید"</string> + <string name="keyguard_unlock" msgid="8031975796351361601">"برای باز کردن، انگشتتان را تند به بالا بکشید"</string> + <string name="keyguard_retry" msgid="886802522584053523">"برای امتحان مجدد، انگشتتان را تند به بالا بکشید"</string> <string name="do_disclosure_generic" msgid="4896482821974707167">"این دستگاه به سازمان شما تعلق دارد"</string> <string name="do_disclosure_with_name" msgid="2091641464065004091">"این دستگاه به <xliff:g id="ORGANIZATION_NAME">%s</xliff:g> تعلق دارد"</string> <string name="phone_hint" msgid="6682125338461375925">"انگشتتان را از نماد تلفن تند بکشید"</string> @@ -606,7 +606,7 @@ <string name="screen_pinning_positive" msgid="3285785989665266984">"متوجه شدم"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"نه متشکرم"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"برنامه پین شد"</string> - <string name="screen_pinning_exit" msgid="4553787518387346893">"سنجاق از برنامه برداشته شد"</string> + <string name="screen_pinning_exit" msgid="4553787518387346893">"پین برنامه برداشته شد"</string> <string name="quick_settings_reset_confirmation_title" msgid="463533331480997595">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> مخفی شود؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2320586180785674186">"دفعه بعد که آن را روشن کنید، در تنظیمات نشان داده میشود."</string> <string name="quick_settings_reset_confirmation_button" msgid="3341477479055016776">"پنهان کردن"</string> @@ -802,7 +802,7 @@ <string name="keyboard_shortcut_group_system_back" msgid="1055709713218453863">"برگشت"</string> <string name="keyboard_shortcut_group_system_notifications" msgid="3615971650562485878">"اعلانها"</string> <string name="keyboard_shortcut_group_system_shortcuts_helper" msgid="4856808328618265589">"میانبرهای صفحهکلید"</string> - <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تغییر جانمایی صفحهکلید"</string> + <string name="keyboard_shortcut_group_system_switch_input" msgid="952555530383268166">"تغییر طرحبندی صفحهکلید"</string> <string name="keyboard_shortcut_group_applications" msgid="7386239431100651266">"برنامهها"</string> <string name="keyboard_shortcut_group_applications_assist" msgid="771606231466098742">"دستیار"</string> <string name="keyboard_shortcut_group_applications_browser" msgid="2776211137869809251">"مرورگر"</string> @@ -979,7 +979,7 @@ <string name="slice_permission_text_2" msgid="6758906940360746983">"- میتواند در <xliff:g id="APP">%1$s</xliff:g> اقدام انجام دهد"</string> <string name="slice_permission_checkbox" msgid="4242888137592298523">"به <xliff:g id="APP">%1$s</xliff:g> اجازه داده شود تکههایی از برنامهها نشان دهد"</string> <string name="slice_permission_allow" msgid="6340449521277951123">"مجاز"</string> - <string name="slice_permission_deny" msgid="6870256451658176895">"مجاز نبودن"</string> + <string name="slice_permission_deny" msgid="6870256451658176895">"رد کردن"</string> <string name="auto_saver_title" msgid="6873691178754086596">"برای زمانبندی «بهینهسازی باتری» ضربه بزنید"</string> <string name="auto_saver_text" msgid="3214960308353838764">"وقتی باتری روبهاتمام است، بهینهسازی باتری را روشن کنید"</string> <string name="no_auto_saver_action" msgid="7467924389609773835">"نه متشکرم"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 7573d29d79cb..1fe5ba2d7208 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -381,7 +381,7 @@ <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi on käytössä"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Ei Wi-Fi-verkkoja käytettävissä"</string> <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Otetaan käyttöön…"</string> - <string name="quick_settings_cast_title" msgid="2279220930629235211">"Näytön striimaus"</string> + <string name="quick_settings_cast_title" msgid="2279220930629235211">"Näytön suoratoisto"</string> <string name="quick_settings_casting" msgid="1435880708719268055">"Lähetetään"</string> <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Nimetön laite"</string> <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Valmis lähetystä varten"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index e87bafd0c7be..8fc4e2c3bde4 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Économiseur de pile activé"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Réduire les performances et de fond"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Désactiver la fonction Économiseur de pile"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aura accès à toute l\'information visible sur votre écran ou qui joue sur votre appareil durant l\'enregistrement ou la diffusion. Cela comprend des renseignements comme les mots de passe, les détails du paiement, les photos, les messages et le contenu audio que vous faites jouer."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aura accès à toute l\'information visible sur votre écran ou qui joue sur votre appareil durant l\'enregistrement ou la diffusion. Cela comprend des renseignements comme les mots de passe, les détails du paiement, les photos, les messages et l\'audio que vous faites jouer."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Le service offrant cette fonction aura accès à toute l\'information qui est visible sur votre écran ou sur ce qui joue sur votre appareil durant l\'enregistrement ou la diffusion. Cela comprend des renseignements comme les mots de passe, les détails du paiement, les photos, les messages et le contenu audio que vous faites jouer."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Commencer à enregistrer ou à diffuser?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Commencer à enregistrer ou à diffuser avec <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index d9ab397f70dc..cfd5a980102a 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Économiseur de batterie activé"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Limite les performances et les données en arrière-plan."</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Désactiver l\'économiseur de batterie"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aura accès à toutes les informations visibles sur votre écran ou lues depuis votre appareil pendant un enregistrement ou une diffusion de contenu. Il peut s\'agir de mots de passe, données de paiement, photos, messages ou encore contenus audio lus."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aura accès à toutes les informations visibles sur votre écran ou lues depuis votre appareil lors d\'un enregistrement ou d\'une diffusion de contenu. Par exemple, vos mots de passe, vos données de paiement, vos photos, vos messages ou encore vos contenus audio lus."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Le service qui fournit cette fonction aura accès à toutes les informations visibles sur votre écran ou lues depuis votre appareil lors d\'un enregistrement ou d\'une diffusion de contenu. Cela comprend, entre autres, vos mots de passe, vos données de paiement, vos photos, vos messages ou encore les contenus audio que vous lisez."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Démarrer l\'enregistrement ou la diffusion ?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Démarrer l\'enregistrement ou la diffusion avec <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ?"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 2c471209d5ac..bd7686f9d061 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -248,7 +248,7 @@ <string name="accessibility_remove_notification" msgid="1641455251495815527">"Eliminar notificación."</string> <string name="accessibility_gps_enabled" msgid="4061313248217660858">"GPS activado"</string> <string name="accessibility_gps_acquiring" msgid="896207402196024040">"Obtendo GPS."</string> - <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Teletipo activado"</string> + <string name="accessibility_tty_enabled" msgid="1123180388823381118">"TeleTypewriter activado"</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Timbre en vibración"</string> <string name="accessibility_ringer_silent" msgid="8994620163934249882">"Timbre silenciado"</string> <!-- no translation found for accessibility_casting (8708751252897282313) --> @@ -712,11 +712,11 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Configuración predeterminada"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Burbulla"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Sen son nin vibración"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Sen son nin vibración, e aparecen máis abaixo na sección de conversas"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Poderían soar ou vibrar en función da configuración do teléfono"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Non soa nin vibra, e aparece máis abaixo na sección de conversas"</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Podería soar ou vibrar en función da configuración do teléfono"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Podería soar ou vibrar en función da configuración do teléfono. Conversas desde a burbulla da aplicación <xliff:g id="APP_NAME">%1$s</xliff:g> de forma predeterminada."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantén a túa atención cun atallo flotante a este contido."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Móstranse na parte superior da sección de conversas en forma de burbulla flotante e aparece a imaxe do perfil na pantalla de bloqueo"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Móstrase na parte superior da sección de conversas en forma de burbulla flotante e aparece a imaxe do perfil na pantalla de bloqueo"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configuración"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non admite funcións de conversa"</string> @@ -786,7 +786,7 @@ <string name="keyboard_key_media_stop" msgid="1509943745250377699">"Deter"</string> <string name="keyboard_key_media_next" msgid="8502476691227914952">"Seguinte"</string> <string name="keyboard_key_media_previous" msgid="5637875709190955351">"Anterior"</string> - <string name="keyboard_key_media_rewind" msgid="3450387734224327577">"Retroceder"</string> + <string name="keyboard_key_media_rewind" msgid="3450387734224327577">"Rebobinar"</string> <string name="keyboard_key_media_fast_forward" msgid="3572444327046911822">"Avance rápido"</string> <string name="keyboard_key_page_up" msgid="173914303254199845">"Re Páx"</string> <string name="keyboard_key_page_down" msgid="9035902490071829731">"Av Páx"</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 6ab2a35fa311..53e0fc9f5e45 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -125,7 +125,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"ઍક્સેસિબિલિટી"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"સ્ક્રીન ફેરવો"</string> <string name="accessibility_recent" msgid="901641734769533575">"ઝલક"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"શોધ"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"શોધો"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"કૅમેરો"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ફોન"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"વૉઇસ સહાય"</string> @@ -332,10 +332,10 @@ <string name="notification_summary_message_format" msgid="5158219088501909966">"<xliff:g id="CONTACT_NAME">%1$s</xliff:g>: <xliff:g id="MESSAGE_CONTENT">%2$s</xliff:g>"</string> <string name="status_bar_notification_inspect_item_title" msgid="6818779631806163080">"સૂચનાઓની સેટિંગ્સ"</string> <string name="status_bar_notification_app_settings_title" msgid="5050006438806013903">"<xliff:g id="APP_NAME">%s</xliff:g> સેટિંગ"</string> - <string name="accessibility_rotation_lock_off" msgid="3880436123632448930">"સ્ક્રીન ઑટોમૅટિક રીતે ફરશે."</string> + <string name="accessibility_rotation_lock_off" msgid="3880436123632448930">"સ્ક્રીન આપમેળે ફરશે."</string> <string name="accessibility_rotation_lock_on_landscape" msgid="936972553861524360">"સ્ક્રીન લેન્ડસ્કેપ ઓરિએન્ટેશનમાં લૉક કરેલ છે."</string> <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"સ્ક્રીન પોટ્રેટ ઓરિએન્ટેશનમાં લૉક કરેલ છે."</string> - <string name="accessibility_rotation_lock_off_changed" msgid="5772498370935088261">"સ્ક્રીન હવે ઑટોમૅટિક રીતે ફરશે."</string> + <string name="accessibility_rotation_lock_off_changed" msgid="5772498370935088261">"સ્ક્રીન હવે આપમેળે ફરશે."</string> <string name="accessibility_rotation_lock_on_landscape_changed" msgid="5785739044300729592">"સ્ક્રીન હવે લેન્ડસ્કેપ ઓરિએન્ટેશનમાં લૉક કરેલ છે."</string> <string name="accessibility_rotation_lock_on_portrait_changed" msgid="5580170829728987989">"સ્ક્રીન હવે પોટ્રેટ ઓરિએન્ટેશનમાં લૉક કરેલ છે."</string> <string name="dessert_case" msgid="9104973640704357717">"ડેઝર્ટ કેસ"</string> @@ -586,7 +586,7 @@ <string name="accessibility_volume_settings" msgid="1458961116951564784">"સાઉન્ડ સેટિંગ"</string> <string name="accessibility_volume_expand" msgid="7653070939304433603">"વિસ્તૃત કરો"</string> <string name="accessibility_volume_collapse" msgid="2746845391013829996">"સંકુચિત કરો"</string> - <string name="volume_odi_captions_tip" msgid="8825655463280990941">"મીડિયામાં કૅપ્શન ઑટોમૅટિક રીતે ઉમેરો"</string> + <string name="volume_odi_captions_tip" msgid="8825655463280990941">"મીડિયામાં કૅપ્શન આપમેળે ઉમેરો"</string> <string name="accessibility_volume_close_odi_captions_tip" msgid="8924753283621160480">"કૅપ્શન ટિપ બંધ કરો"</string> <string name="volume_odi_captions_content_description" msgid="4172765742046013630">"કૅપ્શન ઓવરલે"</string> <string name="volume_odi_captions_hint_enable" msgid="2073091194012843195">"ચાલુ કરો"</string> @@ -859,7 +859,7 @@ <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"ટાઇલને ફરીથી ગોઠવવા માટે આંગળી દબાવીને ખેંચો"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"દૂર કરવા માટે અહીં ખેંચો"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"તમને ઓછામાં ઓછી <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> ટાઇલની જરૂર છે"</string> - <string name="qs_edit" msgid="5583565172803472437">"ફેરફાર કરો"</string> + <string name="qs_edit" msgid="5583565172803472437">"સંપાદિત કરો"</string> <string name="tuner_time" msgid="2450785840990529997">"સમય"</string> <string-array name="clock_options"> <item msgid="3986445361435142273">"કલાક, મિનિટ અને સેકન્ડ બતાવો"</item> @@ -923,10 +923,10 @@ <string name="accessibility_action_pip_resize" msgid="8237306972921160456">"કદ બદલો"</string> <string name="thermal_shutdown_title" msgid="2702966892682930264">"ફોન વધુ પડતી ગરમીને લીધે બંધ થઇ ગયો છે"</string> <string name="thermal_shutdown_message" msgid="7432744214105003895">"તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા ઑટોમૅટિક રીતે બંધ થઈ ગયો છે. તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઈ શકે છે, જો તમે:\n • એવી ઍપ વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વીડિયો, અથવા નેવિગેટ કરતી ઍપ)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string> + <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા આપમેળે બંધ થઇ ગયો છે. તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઇ શકે છે, જો તમે:\n • એવી ઍપ્લિકેશન વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વીડિઓ, અથવા નેવિગેટ કરતી ઍપ્લિકેશનો)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string> <string name="high_temp_title" msgid="2218333576838496100">"ફોન ગરમ થઈ રહ્યો છે"</string> <string name="high_temp_notif_message" msgid="163928048626045592">"ફોન ઠંડો થાય ત્યાં સુધી કેટલીક સુવિધાઓ મર્યાદિત હોય છે"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"તમારો ફોન ઑટોમૅટિક રીતે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nતમારો ફોન ઠંડો થઈ જવા પર, તે સામાન્ય રીતે ચાલશે."</string> + <string name="high_temp_dialog_message" msgid="3793606072661253968">"તમારો ફોન આપમેળે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nતમારો ફોન ઠંડો થઈ જવા પર, તે સામાન્ય રીતે ચાલશે."</string> <string name="high_temp_alarm_title" msgid="2359958549570161495">"ચાર્જરને અનપ્લગ કરો"</string> <string name="high_temp_alarm_notify_message" msgid="7186272817783835089">"આ ડિવાઇસને ચાર્જ કરવામાં કોઈ સમસ્યા છે. પાવર અડૅપ્ટર અનપ્લગ કરો અને કાળજી લેજો કદાચ કેબલ થોડો ગરમ થયો હોઈ શકે છે."</string> <string name="high_temp_alarm_help_care_steps" msgid="5017002218341329566">"સારસંભાળના પગલાં જુઓ"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index b48908864d7f..44c065672a6b 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -514,7 +514,7 @@ <string name="manage_notifications_history_text" msgid="57055985396576230">"इतिहास"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"नई सूचनाएं"</string> <string name="notification_section_header_gentle" msgid="6804099527336337197">"बिना आवाज़ किए मिलने वाली सूचनाएं"</string> - <string name="notification_section_header_alerting" msgid="5581175033680477651">"सूचनाएं"</string> + <string name="notification_section_header_alerting" msgid="5581175033680477651">"वाइब्रेशन या आवाज़ के साथ मिलने वाली सूचनाएं"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"बातचीत"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"बिना आवाज़ की सभी सूचनाएं हटाएं"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"\'परेशान न करें\' सुविधा के ज़रिए कुछ समय के लिए सूचनाएं दिखाना रोक दिया गया है"</string> @@ -714,11 +714,11 @@ <string name="notification_alert_title" msgid="3656229781017543655">"डिफ़ॉल्ट"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"बबल"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"किसी तरह की आवाज़ या वाइब्रेशन न हो"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"इससे किसी तरह की आवाज़ या वाइब्रेशन नहीं होता और बातचीत, सेक्शन में सबसे नीचे दिखती है"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"इससे किसी तरह की आवाज़ या वाइब्रेशन नहीं होता और \'बातचीत\', सेक्शन में सबसे नीचे दिखती है"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"फ़ोन की सेटिंग के आधार पर, सूचना आने पर घंटी बज सकती है या वाइब्रेशन हो सकता है. <xliff:g id="APP_NAME">%1$s</xliff:g> में होने वाली बातचीत, डिफ़ॉल्ट रूप से बबल के तौर पर दिखती है."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ़्लोट करने वाले शॉर्टकट की मदद से इस सामग्री पर आपका ध्यान बना रहता है."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"इससे बातचीत, सेक्शन में सबसे ऊपर और फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"इससे बातचीत की सुविधा, सेक्शन में सबसे ऊपर और फ़्लोटिंग बबल के तौर पर दिखती है. साथ ही, लॉक स्क्रीन पर प्रोफ़ाइल फ़ोटो दिखती है"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिंग"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> पर बातचीत की सुविधाएं काम नहीं करतीं"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 492b558d9537..0151eae63ded 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -505,10 +505,10 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Štednja baterije je uključena"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Smanjuje količinu rada i pozadinske podatke"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Isključite Štednju baterije"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> imat će pristup svim podacima koji su vidljivi na vašem zaslonu ili koji se reproduciraju s vašeg uređaja tijekom snimanja ili emitiranja. To uključuje podatke kao što su zaporke, podaci o plaćanju, fotografije, poruke i audiozapisi koje reproducirate."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> imat će pristup svim podacima koji su vidljivi na vašem zaslonu ili koji se reproduciraju s vašeg uređaja tijekom snimanja ili emitiranja. To uključuje podatke kao što su zaporke, podaci o plaćanju, fotografije, poruke i audiozapisi koje reproducirate."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Usluga koja pruža ovu funkcionalnost imat će pristup svim podacima koji su vidljivi na vašem zaslonu ili koji se reproduciraju s vašeg uređaja tijekom snimanja ili emitiranja. To uključuje podatke kao što su zaporke, podaci o plaćanju, fotografije, poruke i audiozapisi koje reproducirate."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Započeti snimanje ili emitiranje?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"Započeti snimanje ili emitiranje pomoću aplikacije <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"Započeti snimanje ili emitiranja pomoću aplikacije <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"Ne prikazuj ponovo"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Izbriši sve"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 7fb95acc5671..493e6527fea9 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -430,7 +430,7 @@ <string name="quick_settings_nfc_off" msgid="3465000058515424663">"Az NFC ki van kapcsolva"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"Az NFC be van kapcsolva"</string> <string name="quick_settings_screen_record_label" msgid="1594046461509776676">"Képernyő rögzítése"</string> - <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Indítás"</string> + <string name="quick_settings_screen_record_start" msgid="1574725369331638985">"Kezdés"</string> <string name="quick_settings_screen_record_stop" msgid="8087348522976412119">"Leállítás"</string> <string name="media_seamless_remote_device" msgid="177033467332920464">"Eszköz"</string> <string name="recents_swipe_up_onboarding" msgid="2820265886420993995">"Váltás az alkalmazások között felfelé csúsztatással"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 659100690a4c..329679915c4b 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -248,7 +248,7 @@ <string name="accessibility_remove_notification" msgid="1641455251495815527">"Մաքրել ծանուցումը:"</string> <string name="accessibility_gps_enabled" msgid="4061313248217660858">"GPS-ը միացված է:"</string> <string name="accessibility_gps_acquiring" msgid="896207402196024040">"GPS-ի ստացում:"</string> - <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Հեռատիպը միացված է:"</string> + <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Հեռամուտքագրիչը միացված է:"</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Թրթռազանգ:"</string> <string name="accessibility_ringer_silent" msgid="8994620163934249882">"Զանգակը լռեցված է:"</string> <!-- no translation found for accessibility_casting (8708751252897282313) --> @@ -337,7 +337,7 @@ <string name="accessibility_rotation_lock_on_portrait" msgid="2356633398683813837">"Էկրանը կողպված է ուղղաձիգ դիրքավորմամբ:"</string> <string name="accessibility_rotation_lock_off_changed" msgid="5772498370935088261">"Էկրանն այժմ ավտոմատ կպտտվի:"</string> <string name="accessibility_rotation_lock_on_landscape_changed" msgid="5785739044300729592">"Էկրանն այժմ կողպված է հորիզոնական դիրքում:"</string> - <string name="accessibility_rotation_lock_on_portrait_changed" msgid="5580170829728987989">"Էկրանն այժմ կողպված է ուղղաձիգ դիրքում:"</string> + <string name="accessibility_rotation_lock_on_portrait_changed" msgid="5580170829728987989">"Էկրանն այժմ կողպված է ուղղահայաց դիրքում:"</string> <string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string> <string name="start_dreams" msgid="9131802557946276718">"Էկրանապահ"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> @@ -513,7 +513,7 @@ <string name="notification_section_header_incoming" msgid="850925217908095197">"Նոր"</string> <string name="notification_section_header_gentle" msgid="6804099527336337197">"Անձայն"</string> <string name="notification_section_header_alerting" msgid="5581175033680477651">"Ծանուցումներ"</string> - <string name="notification_section_header_conversations" msgid="821834744538345661">"Զրույցներ"</string> + <string name="notification_section_header_conversations" msgid="821834744538345661">"Խոսակցություններ"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"Ջնջել բոլոր անձայն ծանուցումները"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"Ծանուցումները չեն ցուցադրվի «Չանհանգստացնել» ռեժիմում"</string> <string name="media_projection_action_text" msgid="3634906766918186440">"Սկսել հիմա"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index e4819bf74f9a..69d5714a54a6 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -599,7 +599,7 @@ <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Ringkasan untuk melepas pin."</string> <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh lama tombol Beranda untuk melepas pin."</string> <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Data pribadi dapat diakses (seperti kontak dan konten email)."</string> - <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Aplikasi yang disematkan dapat membuka aplikasi lain."</string> + <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Aplikasi yang dipasangi pin dapat membuka aplikasi lain."</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Ringkasan"</string> <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Untuk melepas pin aplikasi ini, sentuh & lama tombol Kembali dan Layar utama"</string> <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Untuk melepas pin aplikasi ini, geser ke atas & tahan"</string> @@ -847,7 +847,7 @@ </string-array> <string name="menu_ime" msgid="5677467548258017952">"Pengalih keyboard"</string> <string name="save" msgid="3392754183673848006">"Simpan"</string> - <string name="reset" msgid="8715144064608810383">"Reset"</string> + <string name="reset" msgid="8715144064608810383">"Setel ulang"</string> <string name="adjust_button_width" msgid="8313444823666482197">"Sesuaikan lebar tombol"</string> <string name="clipboard" msgid="8517342737534284617">"Papan klip"</string> <string name="accessibility_key" msgid="3471162841552818281">"Tombol navigasi khusus"</string> @@ -856,7 +856,7 @@ <string name="left_icon" msgid="5036278531966897006">"Ikon kiri"</string> <string name="right_icon" msgid="1103955040645237425">"Ikon kanan"</string> <string name="drag_to_add_tiles" msgid="8933270127508303672">"Tahan dan tarik untuk menambahkan kartu"</string> - <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Tahan dan tarik untuk menata ulang kartu"</string> + <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Tahan dan tarik untuk mengatur ulang kartu"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Tarik ke sini untuk menghapus"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Anda membutuhkan setidaknya <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> kartu"</string> <string name="qs_edit" msgid="5583565172803472437">"Edit"</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 507bdc9123af..dc541c876f39 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -855,10 +855,10 @@ <string name="right_keycode" msgid="2480715509844798438">"Lykiltákn til hægri"</string> <string name="left_icon" msgid="5036278531966897006">"Tákn til vinstri"</string> <string name="right_icon" msgid="1103955040645237425">"Tákn til hægri"</string> - <string name="drag_to_add_tiles" msgid="8933270127508303672">"Haltu inni og dragðu til að bæta við flísum"</string> + <string name="drag_to_add_tiles" msgid="8933270127508303672">"Haltu inni og dragðu til að bæta við reitum"</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Haltu og dragðu til að endurraða flísum"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Dragðu hingað til að fjarlægja"</string> - <string name="drag_to_remove_disabled" msgid="933046987838658850">"Flísarnar mega ekki vera færri en <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g>"</string> + <string name="drag_to_remove_disabled" msgid="933046987838658850">"Reitirnir mega ekki vera færri en <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g>"</string> <string name="qs_edit" msgid="5583565172803472437">"Breyta"</string> <string name="tuner_time" msgid="2450785840990529997">"Tími"</string> <string-array name="clock_options"> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 5a735aef75d3..7ed5f45b5dca 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Può suonare o vibrare in base alle impostazioni del telefono"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Può suonare o vibrare in base alle impostazioni del telefono. Conversazioni dalla bolla <xliff:g id="APP_NAME">%1$s</xliff:g> per impostazione predefinita."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantiene la tua attenzione con una scorciatoia mobile a questi contenuti."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Appare in cima alla sezione delle conversazioni e sotto forma di bolla mobile, mostra l\'immagine del profilo nella schermata di blocco"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Viene mostrata in cima alla sezione delle conversazioni, appare sotto forma di bolla mobile, mostra l\'immagine del profilo nella schermata di blocco"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Impostazioni"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Priorità"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> non supporta le funzionalità delle conversazioni"</string> @@ -987,7 +987,7 @@ <string name="auto_saver_enabled_text" msgid="7889491183116752719">"Il Risparmio energetico verrà attivato automaticamente quando la carica della batteria sarà inferiore a <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"Impostazioni"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"OK"</string> - <string name="heap_dump_tile_name" msgid="2464189856478823046">"Dump heap SysUI"</string> + <string name="heap_dump_tile_name" msgid="2464189856478823046">"Esegui dump heap SysUI"</string> <string name="sensor_privacy_mode" msgid="4462866919026513692">"Sensori disattivati"</string> <string name="device_services" msgid="1549944177856658705">"Servizi del dispositivo"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Senza titolo"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 1b7e1e81cd9d..61a5d5d2f829 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -508,7 +508,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"תכונת החיסכון בסוללה פועלת"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"מפחית את הביצועים ונתונים ברקע"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"כיבוי תכונת החיסכון בסוללה"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"לאפליקציית <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> תהיה גישה לכל המידע הגלוי במסך שלך ולכל תוכן שמופעל במכשיר שלך בזמן הקלטה או העברה (casting). המידע הזה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"לאפליקציה <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> תהיה גישה לכל הפרטים שגלויים במסך שלך או מופעלים מהמכשיר שלך בזמן הקלטה או העברה (cast). זה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"לשירות שמספק את הפונקציה הזו תהיה גישה לכל הפרטים שגלויים במסך שלך או מופעלים מהמכשיר שלך בזמן הקלטה או העברה (cast). זה כולל פרטים כמו סיסמאות, פרטי תשלום, תמונות, הודעות ואודיו שמושמע מהמכשיר."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"להתחיל להקליט או להעביר (cast)?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"להתחיל להקליט או להעביר (cast) באמצעות <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> @@ -522,7 +522,7 @@ <string name="notification_section_header_conversations" msgid="821834744538345661">"שיחות"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ניקוי כל ההתראות השקטות"</string> <string name="dnd_suppressing_shade_text" msgid="5588252250634464042">"התראות הושהו על ידי מצב \'נא לא להפריע\'"</string> - <string name="media_projection_action_text" msgid="3634906766918186440">"כן, אפשר להתחיל"</string> + <string name="media_projection_action_text" msgid="3634906766918186440">"התחל כעת"</string> <string name="empty_shade_text" msgid="8935967157319717412">"אין התראות"</string> <string name="profile_owned_footer" msgid="2756770645766113964">"ייתכן שהפרופיל נתון למעקב"</string> <string name="vpn_footer" msgid="3457155078010607471">"ייתכן שהרשת נמצאת במעקב"</string> @@ -960,7 +960,7 @@ <string name="notification_channel_general" msgid="4384774889645929705">"הודעות כלליות"</string> <string name="notification_channel_storage" msgid="2720725707628094977">"אחסון"</string> <string name="notification_channel_hints" msgid="7703783206000346876">"טיפים"</string> - <string name="instant_apps" msgid="8337185853050247304">"אפליקציות ללא התקנה"</string> + <string name="instant_apps" msgid="8337185853050247304">"אפליקציות אינסטנט"</string> <string name="instant_apps_title" msgid="8942706782103036910">"<xliff:g id="APP">%1$s</xliff:g> פועלת"</string> <string name="instant_apps_message" msgid="6112428971833011754">"האפליקציה נפתחת בלי התקנה."</string> <string name="instant_apps_message_with_help" msgid="1816952263531203932">"האפליקציה נפתחת בלי התקנה. אפשר להקיש כדי לקבל מידע נוסף."</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index ce1498b1467e..c94f4c7c3e2a 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -502,10 +502,10 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"バッテリー セーバー ON"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"パフォーマンスとバックグラウンドデータを制限します"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"バッテリー セーバーを OFF"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> は、録画中やキャスト中に画面に表示されたり、デバイスで再生されるすべての情報にアクセスできます。これには、パスワード、お支払いの詳細、写真、メッセージ、再生される音声などが含まれます。"</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"この機能を提供するサービスは、録画中やキャスト中に画面に表示されたり、デバイスで再生されるすべての情報にアクセスできます。これには、パスワード、お支払いの詳細、写真、メッセージ、再生される音声などが含まれます。"</string> - <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"録画やキャストを開始しますか?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> で録画やキャストを開始しますか?"</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>は、記録中やキャスト中に画面上に表示またはデバイスから再生されるすべての情報にアクセスできます。これには、パスワード、お支払いの詳細、写真、メッセージ、再生される音声などの情報が含まれます。"</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"この機能を提供するサービスは、記録中やキャスト中に画面上に表示またはデバイスから再生されるすべての情報にアクセスできます。これには、パスワード、お支払いの詳細、写真、メッセージ、再生される音声などの情報が含まれます。"</string> + <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"記録やキャストを開始しますか?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>で記録やキャストを開始しますか?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"次回から表示しない"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"すべて消去"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"管理"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index bf86881316ee..9f94f9bbf7dc 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"დარეკვა ან ვიბრაცია ტელეფონის პარამეტრების მიხედვით"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"დარეკვა ან ვიბრაცია ტელეფონის პარამეტრების მიხედვით. მიმოწერები <xliff:g id="APP_NAME">%1$s</xliff:g>-ის ბუშტიდან, ნაგულისხმევად."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"იპყრობს თქვენს ყურადღებას ამ კონტენტის მოლივლივე მალსახმობით."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"გამოჩნდება მიმოწერების ზედა ნაწილში ბუშტის სახით, აჩვენებს პროფილის სურათს ჩაკეტილ ეკრანზე"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"გამოჩნდება მიმოწერების სექციის ზედა ნაწილში მოლივლივე ბუშტის სახით, აჩვენებს პროფილის სურათს ჩაკეტილ ეკრანზე"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"პარამეტრები"</string> <string name="notification_priority_title" msgid="2079708866333537093">"პრიორიტეტი"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g>-ს არ აქვს მიმოწერის ფუნქციების მხარდაჭერა"</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 2232f3f0ddb2..3113995995c7 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -28,7 +28,7 @@ <string name="battery_low_percent_format" msgid="4276661262843170964">"<xliff:g id="PERCENTAGE">%s</xliff:g> қалды"</string> <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"Пайдалану барысына байланысты <xliff:g id="PERCENTAGE">%1$s</xliff:g> заряд, шамамен <xliff:g id="TIME">%2$s</xliff:g> қалды"</string> <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"<xliff:g id="PERCENTAGE">%1$s</xliff:g> заряд, шамамен <xliff:g id="TIME">%2$s</xliff:g> қалды"</string> - <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> қалды. Батареяны үнемдеу режимі қосулы."</string> + <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"<xliff:g id="PERCENTAGE">%s</xliff:g> қалды. Battery Saver қосулы."</string> <string name="invalid_charger" msgid="4370074072117767416">"USB арқылы зарядтау мүмкін емес. Құрылғымен бірге берілген зарядтау құралын пайдаланыңыз."</string> <string name="invalid_charger_title" msgid="938685362320735167">"USB арқылы зарядтау мүмкін емес"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"Құрылғымен бірге берілген зарядтау құралын пайдаланыңыз"</string> @@ -421,7 +421,7 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Қосылу уақыты: <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"<xliff:g id="TIME">%s</xliff:g> дейін"</string> <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"Қараңғы тақырып"</string> - <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Батареяны үнемдеу режимі"</string> + <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"Battery Saver"</string> <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"Күн батқанда қосу"</string> <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"Күн шыққанға дейін"</string> <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"Қосылу уақыты: <xliff:g id="TIME">%s</xliff:g>"</string> @@ -502,8 +502,8 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Battery saver қосулы"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Өнімділікті және фондық деректерді азайтады"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Battery saver функциясын өшіру"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> жазу не трансляциялау кезінде экранда көрсетілетін немесе дыбысталатын барлық ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және аудиоматериалдар кіреді."</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Осы функцияны ұсынатын қызмет жазу не трансляциялау кезінде экранда көрсетілетін немесе құрылғыда дыбысталатын ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және аудиоматериалдар кіреді."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранда көрсетілетін немесе жазу не трансляциялау кезінде құрылғыда ойнатылған барлық ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және ойнатылатын аудио сияқты ақпарат кіреді."</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Осы функцияны ұсынатын қызмет экранда көрсетілетін немесе жазу не трансляциялау кезінде құрылғыда ойнатылған барлық ақпаратты пайдалана алады. Бұған құпия сөздер, төлем туралы мәліметтер, суреттер, хабарлар және ойнатылатын аудио сияқты ақпарат кіреді."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Жазу немесе трансляциялау басталсын ба?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> арқылы жазу немесе трансляциялау басталсын ба?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"Қайта көрсетпеу"</string> @@ -712,13 +712,13 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Әдепкі"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Көпіршік"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Дыбыс не діріл қолданылмайды"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Дыбыс не діріл қолданылмайды, әңгімелер бөлімінің төмен жағында шығады"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Дыбыс не діріл қолданылмайды, төменде әңгімелер бөлімінде шығады"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"Телефон параметрлеріне байланысты шылдырлауы не дірілдеуі мүмкін"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Телефон параметрлеріне байланысты шылдырлауы не дірілдеуі мүмкін. <xliff:g id="APP_NAME">%1$s</xliff:g> чаттары әдепкісінше қалқымалы етіп көрсетіледі."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Осы мазмұнға бекітілген қалқымалы таңбашамен назарыңызды өзіне тартады."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Әңгімелер бөлімінің жоғарғы жағында тұрады, қалқыма хабар түрінде шығады, құлыптаулы экранда профиль суретін көрсетеді"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Параметрлер"</string> - <string name="notification_priority_title" msgid="2079708866333537093">"Маңызды"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"Маңыздылығы"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> әңгімелесу функцияларын қолдамайды."</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Жақындағы қалқыма хабарлар жоқ"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Соңғы және жабылған қалқыма хабарлар осы жерде көрсетіледі."</string> @@ -768,7 +768,7 @@ </plurals> <string name="battery_panel_title" msgid="5931157246673665963">"Батареяны пайдалану"</string> <string name="battery_detail_charging_summary" msgid="8821202155297559706">"Зарядтау кезінде Батарея үнемдегіш қол жетімді емес"</string> - <string name="battery_detail_switch_title" msgid="6940976502957380405">"Батареяны үнемдеу режимі"</string> + <string name="battery_detail_switch_title" msgid="6940976502957380405">"Battery Saver"</string> <string name="battery_detail_switch_summary" msgid="3668748557848025990">"Өнімділікті және фондық деректерді азайтады"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"<xliff:g id="NAME">%1$s</xliff:g> түймесі"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string> @@ -859,7 +859,7 @@ <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Элементтердің ретін өзгерту үшін оларды басып тұрып сүйреңіз"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Керексіздерін осы жерге сүйреңіз"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Кемінде <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> бөлшек қажет."</string> - <string name="qs_edit" msgid="5583565172803472437">"Өзгерту"</string> + <string name="qs_edit" msgid="5583565172803472437">"Өңдеу"</string> <string name="tuner_time" msgid="2450785840990529997">"Уақыт"</string> <string-array name="clock_options"> <item msgid="3986445361435142273">"Сағаттарды, минуттарды және секундтарды көрсету"</item> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 8901a6462814..37df4e8d0702 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -28,15 +28,15 @@ <string name="battery_low_percent_format" msgid="4276661262843170964">"នៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g>"</string> <string name="battery_low_percent_format_hybrid" msgid="3985614339605686167">"នៅសល់ <xliff:g id="PERCENTAGE">%1$s</xliff:g> អាចប្រើបានប្រហែល <xliff:g id="TIME">%2$s</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string> <string name="battery_low_percent_format_hybrid_short" msgid="5917433188456218857">"នៅសល់ <xliff:g id="PERCENTAGE">%1$s</xliff:g> អាចប្រើបានប្រហែល <xliff:g id="TIME">%2$s</xliff:g> ទៀត"</string> - <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"នៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g>។ មុខងារសន្សំថ្មត្រូវបានបើក។"</string> + <string name="battery_low_percent_format_saver_started" msgid="4968468824040940688">"នៅសល់ <xliff:g id="PERCENTAGE">%s</xliff:g> ។ កម្មវិធីសន្សំថ្មបានបើក។"</string> <string name="invalid_charger" msgid="4370074072117767416">"មិនអាចសាកតាម USB បានទេ។ សូមប្រើឆ្នាំងសាកដែលភ្ជាប់មកជាមួយឧបករណ៍របស់អ្នក។"</string> <string name="invalid_charger_title" msgid="938685362320735167">"មិនអាចសាកតាម USB បានទេ"</string> <string name="invalid_charger_text" msgid="2339310107232691577">"សូមប្រើឆ្នាំងសាកដែលភ្ជាប់មកជាមួយឧបករណ៍របស់អ្នក"</string> <string name="battery_low_why" msgid="2056750982959359863">"ការកំណត់"</string> - <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"បើកមុខងារសន្សំថ្ម?"</string> - <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"អំពីមុខងារសន្សំថ្ម"</string> + <string name="battery_saver_confirmation_title" msgid="1234998463717398453">"បើកកម្មវិធីសន្សំថ្ម?"</string> + <string name="battery_saver_confirmation_title_generic" msgid="2299231884234959849">"អំពីកម្មវិធីសន្សំថ្ម"</string> <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"បើក"</string> - <string name="battery_saver_start_action" msgid="4553256017945469937">"បើកមុខងារសន្សំថ្ម"</string> + <string name="battery_saver_start_action" msgid="4553256017945469937">"បើកកម្មវិធីសន្សំថ្ម"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"ការកំណត់"</string> <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"វ៉ាយហ្វាយ"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"បង្វិលអេក្រង់ស្វ័យប្រវត្តិ"</string> @@ -421,7 +421,7 @@ <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"បើកនៅម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"រហូតដល់ម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_ui_mode_night_label" msgid="1398928270610780470">"រចនាប័ទ្មងងឹត"</string> - <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"មុខងារសន្សំថ្ម"</string> + <string name="quick_settings_dark_mode_secondary_label_battery_saver" msgid="4990712734503013251">"កម្មវិធីសន្សំថ្ម"</string> <string name="quick_settings_dark_mode_secondary_label_on_at_sunset" msgid="6017379738102015710">"បើកនៅពេលថ្ងៃលិច"</string> <string name="quick_settings_dark_mode_secondary_label_until_sunrise" msgid="4404885070316716472">"រហូតដល់ពេលថ្ងៃរះ"</string> <string name="quick_settings_dark_mode_secondary_label_on_at" msgid="5128758823486361279">"បើកនៅម៉ោង <xliff:g id="TIME">%s</xliff:g>"</string> @@ -499,13 +499,13 @@ <string name="user_remove_user_title" msgid="9124124694835811874">"យកអ្នកប្រើចេញ?"</string> <string name="user_remove_user_message" msgid="6702834122128031833">"កម្មវិធី និងទិន្នន័យទាំងអស់របស់អ្នកប្រើនេះនឹងត្រូវបានលុប។"</string> <string name="user_remove_user_remove" msgid="8387386066949061256">"យកចេញ"</string> - <string name="battery_saver_notification_title" msgid="8419266546034372562">"មុខងារសន្សំថ្មបានបើក"</string> + <string name="battery_saver_notification_title" msgid="8419266546034372562">"កម្មវិធីសន្សំថ្មបានបើក"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"ការបន្ថយការប្រតិបត្តិ និងទិន្នន័យផ្ទៃខាងក្រោយ"</string> - <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"បិទមុខងារសន្សំថ្ម"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> នឹងមានសិទ្ធិចូលប្រើព័ត៌មានទាំងអស់ដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬដែលចាក់ពីឧបករណ៍របស់អ្នក នៅពេលកំពុងថត ឬភ្ជាប់។ ព័ត៌មាននេះមានដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ រូបថត សារ និងសំឡេងដែលអ្នកចាក់ជាដើម។"</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"សេវាកម្មដែលផ្ដល់មុខងារនេះនឹងមានសិទ្ធិចូលប្រើព័ត៌មានទាំងអស់ដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬដែលចាក់ពីឧបករណ៍របស់អ្នក នៅពេលកំពុងថត ឬភ្ជាប់។ ព័ត៌មាននេះមានដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ រូបថត សារ និងសំឡេងដែលអ្នកចាក់ជាដើម។"</string> + <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"បិទកម្មវិធីសន្សំថ្ម"</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> នឹងមានសិទ្ធិចូលប្រើព័ត៌មានទាំងអស់ដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬដែលចាក់ពីឧបករណ៍របស់អ្នក នៅពេលកំពុងថត ឬបញ្ជូន។ ព័ត៌មាននេះមានដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ រូបថត សារ និងសំឡេងដែលអ្នកចាក់ជាដើម។"</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"សេវាកម្មដែលផ្ដល់មុខងារនេះនឹងមានសិទ្ធិចូលប្រើព័ត៌មានទាំងអស់ដែលអាចមើលឃើញនៅលើអេក្រង់របស់អ្នក ឬដែលចាក់ពីឧបករណ៍របស់អ្នក នៅពេលកំពុងថត ឬបញ្ជូន។ ព័ត៌មាននេះមានដូចជា ពាក្យសម្ងាត់ ព័ត៌មានលម្អិតអំពីការទូទាត់ប្រាក់ រូបថត សារ និងសំឡេងដែលអ្នកចាក់ជាដើម។"</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ចាប់ផ្ដើមថត ឬបញ្ជូនមែនទេ?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"ចាប់ផ្ដើមថត ឬភ្ជាប់ដោយប្រើ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ឬ?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"ចាប់ផ្ដើមថត ឬបញ្ជូនដោយប្រើ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ឬ?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"កុំបង្ហាញម្ដងទៀត"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"សម្អាតទាំងអស់"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"គ្រប់គ្រង"</string> @@ -767,8 +767,8 @@ <item quantity="one">%d នាទី</item> </plurals> <string name="battery_panel_title" msgid="5931157246673665963">"ការប្រើប្រាស់ថ្ម"</string> - <string name="battery_detail_charging_summary" msgid="8821202155297559706">"មិនអាចប្រើមុខងារសន្សំថ្មបានទេក្នុងអំឡុងពេលសាកថ្ម"</string> - <string name="battery_detail_switch_title" msgid="6940976502957380405">"មុខងារសន្សំថ្ម"</string> + <string name="battery_detail_charging_summary" msgid="8821202155297559706">"កម្មវិធីសន្សំថ្មមិនអាចប្រើបានអំឡុងពេលសាកថ្មទេ"</string> + <string name="battery_detail_switch_title" msgid="6940976502957380405">"កម្មវិធីសន្សំថ្ម"</string> <string name="battery_detail_switch_summary" msgid="3668748557848025990">"កាត់បន្ថយប្រតិបត្តិការ និងទិន្នន័យផ្ទៃខាងក្រោយ"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"ប៊ូតុង <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Home"</string> @@ -980,11 +980,11 @@ <string name="slice_permission_checkbox" msgid="4242888137592298523">"អនុញ្ញាតឱ្យ <xliff:g id="APP">%1$s</xliff:g> បង្ហាញស្ថិតិប្រើប្រាស់ពីកម្មវិធីនានា"</string> <string name="slice_permission_allow" msgid="6340449521277951123">"អនុញ្ញាត"</string> <string name="slice_permission_deny" msgid="6870256451658176895">"បដិសេធ"</string> - <string name="auto_saver_title" msgid="6873691178754086596">"ចុចដើម្បីកំណត់កាលវិភាគមុខងារសន្សំថ្ម"</string> + <string name="auto_saver_title" msgid="6873691178754086596">"ចុចដើម្បីកំណត់កាលវិភាគកម្មវិធីសន្សំថ្ម"</string> <string name="auto_saver_text" msgid="3214960308353838764">"បើកនៅពេលថ្មទំនងជាអស់"</string> <string name="no_auto_saver_action" msgid="7467924389609773835">"ទេ អរគុណ"</string> - <string name="auto_saver_enabled_title" msgid="4294726198280286333">"កាលវិភាគមុខងារសន្សំថ្មបានបើកហើយ"</string> - <string name="auto_saver_enabled_text" msgid="7889491183116752719">"មុខងារសន្សំថ្មនឹងបើកដោយស្វ័យប្រវត្តិ នៅពេលថ្មនៅសល់តិចជាង <xliff:g id="PERCENTAGE">%d</xliff:g>%%។"</string> + <string name="auto_saver_enabled_title" msgid="4294726198280286333">"កាលវិភាគកម្មវិធីសន្សំថ្មបានបើកហើយ"</string> + <string name="auto_saver_enabled_text" msgid="7889491183116752719">"កម្មវិធីសន្សំថ្មនឹងបើកដោយស្វ័យប្រវត្តិ នៅពេលថ្មនៅសល់តិចជាង <xliff:g id="PERCENTAGE">%d</xliff:g>%% ។"</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"ការកំណត់"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"យល់ហើយ"</string> <string name="heap_dump_tile_name" msgid="2464189856478823046">"ចម្លង SysUI Heap"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 38926cbaca86..d545e3123f21 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -125,7 +125,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"ಪ್ರವೇಶಿಸುವಿಕೆ"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"ಪರದೆಯನ್ನು ತಿರುಗಿಸಿ"</string> <string name="accessibility_recent" msgid="901641734769533575">"ಸಮಗ್ರ ನೋಟ"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"Search"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"ಹುಡುಕಿ"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"ಕ್ಯಾಮರಾ"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ಫೋನ್"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ಧ್ವನಿ ಸಹಾಯಕ"</string> @@ -389,7 +389,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"ವೈ-ಫೈ ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"ಪ್ರಕಾಶಮಾನ"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"ಸ್ವಯಂ"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ಬಣ್ಣಗಳನ್ನು ಇನ್ವರ್ಟ್ ಮಾಡಿ"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"ಬಣ್ಣಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"ಬಣ್ಣ ತಿದ್ದುಪಡಿ ಮೋಡ್"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"ಹೆಚ್ಚಿನ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="quick_settings_done" msgid="2163641301648855793">"ಮುಗಿದಿದೆ"</string> @@ -441,7 +441,7 @@ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> ಪೂರ್ಣಗೊಳ್ಳುವವರೆಗೆ"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"ಚಾರ್ಜ್ ಆಗುತ್ತಿಲ್ಲ"</string> <string name="ssl_ca_cert_warning" msgid="8373011375250324005">"ನೆಟ್ವರ್ಕ್\n ವೀಕ್ಷಿಸಬಹುದಾಗಿರುತ್ತದೆ"</string> - <string name="description_target_search" msgid="3875069993128855865">"Search"</string> + <string name="description_target_search" msgid="3875069993128855865">"ಹುಡುಕಿ"</string> <string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಮೇಲಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string> <string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ಲೈಡ್ ಮಾಡಿ."</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"ಅಲಾರಾಂಗಳು, ಜ್ಞಾಪನೆಗಳು, ಈವೆಂಟ್ಗಳು ಹಾಗೂ ನೀವು ಸೂಚಿಸಿರುವ ಕರೆದಾರರನ್ನು ಹೊರತುಪಡಿಸಿ ಬೇರಾವುದೇ ಸದ್ದುಗಳು ಅಥವಾ ವೈಬ್ರೇಶನ್ಗಳು ನಿಮಗೆ ತೊಂದರೆ ನೀಡುವುದಿಲ್ಲ. ಹಾಗಿದ್ದರೂ, ನೀವು ಪ್ಲೇ ಮಾಡುವ ಸಂಗೀತ, ವೀಡಿಯೊಗಳು ಮತ್ತು ಆಟಗಳ ಆಡಿಯೊವನ್ನು ನೀವು ಕೇಳಿಸಿಕೊಳ್ಳುತ್ತೀರಿ."</string> @@ -502,10 +502,10 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆನ್ ಆಗಿದೆ"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"ಕಾರ್ಯಕ್ಷಮತೆ ಮತ್ತು ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆಫ್ ಮಾಡಿ"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಕಾಣಿಸುವ ಸಕಲ ಮಾಹಿತಿಗೂ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಪ್ರವೇಶ ಹೊಂದಿರುತ್ತದೆ. ಇದು ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೊ ಪ್ಲೇಬ್ಯಾಕ್ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಕೂಡ ಒಳಗೊಂಡಿರುತ್ತದೆ."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುವ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಆಗುವ ಎಲ್ಲಾ ಮಾಹಿತಿಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತವೆ. ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೊ ಪ್ಲೇಬ್ಯಾಕ್ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಇದು ಒಳಗೊಂಡಿದೆ."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ಈ ವೈಶಿಷ್ಟ್ಯವು ಒದಗಿಸುವ ಸೇವೆಗಳು, ಸ್ಕ್ರೀನ್ ಮೇಲೆ ಗೋಚರಿಸುವ ಅಥವಾ ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಾಗ ಸಾಧನದಲ್ಲಿ ಪ್ಲೇ ಆಗುವ ಎಲ್ಲಾ ಮಾಹಿತಿಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುತ್ತವೆ. ಪಾಸ್ವರ್ಡ್ಗಳು, ಪಾವತಿ ವಿವರಗಳು, ಫೋಟೋಗಳು, ಸಂದೇಶಗಳು ಮತ್ತು ಆಡಿಯೊ ಪ್ಲೇಬ್ಯಾಕ್ನಂತಹ ಮಾಹಿತಿಯನ್ನು ಇದು ಒಳಗೊಂಡಿದೆ."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವಿಕೆಯನ್ನು ಪ್ರಾರಂಭಿಸಬೇಕೆ?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಮೂಲಕ ರೆಕಾರ್ಡಿಂಗ್, ಬಿತ್ತರಿಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸುವುದೇ?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಬಳಸಿಕೊಂಡು ರೆಕಾರ್ಡಿಂಗ್ ಅಥವಾ ಬಿತ್ತರಿಸುವುದನ್ನು ಪ್ರಾರಂಭಿಸುವುದೇ?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"ಮತ್ತೊಮ್ಮೆ ತೋರಿಸದಿರು"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"ನಿರ್ವಹಿಸಿ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 959cbbc57a02..a858576bc4d2 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -373,7 +373,7 @@ <string name="quick_settings_time_label" msgid="3352680970557509303">"시간"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"나"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"사용자"</string> - <string name="quick_settings_user_new_user" msgid="3347905871336069666">"신규 사용자"</string> + <string name="quick_settings_user_new_user" msgid="3347905871336069666">"새 사용자"</string> <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"연결되어 있지 않음"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"네트워크가 연결되지 않음"</string> @@ -475,7 +475,7 @@ <string name="accessibility_multi_user_switch_inactive" msgid="383168614528618402">"현재 사용자: <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> <string name="accessibility_multi_user_switch_quick_contact" msgid="4504508915324898576">"프로필 표시"</string> <string name="user_add_user" msgid="4336657383006913022">"사용자 추가"</string> - <string name="user_new_user_name" msgid="2019166282704195789">"신규 사용자"</string> + <string name="user_new_user_name" msgid="2019166282704195789">"새 사용자"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"게스트를 삭제하시겠습니까?"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"이 세션에 있는 모든 앱과 데이터가 삭제됩니다."</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"삭제"</string> @@ -502,10 +502,10 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"절전 모드 사용 중"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"성능 및 백그라운드 데이터를 줄입니다."</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"절전 모드 사용 중지"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>이 녹화 또는 전송 중에 화면에 표시되거나 기기에서 재생되는 모든 정보에 액세스할 수 있습니다. 여기에는 비밀번호, 결제 세부정보, 사진, 메시지, 재생하는 오디오 같은 정보가 포함됩니다."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>이(가) 녹화 또는 전송 중에 화면에 표시되거나 기기에서 재생되는 모든 정보에 액세스할 수 있습니다. 여기에는 비밀번호, 결제 세부정보, 사진, 메시지, 재생하는 오디오 같은 정보가 포함됩니다."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"이 기능을 제공하는 서비스는 녹화 또는 전송 중에 화면에 표시되거나 기기에서 재생되는 모든 정보에 액세스할 수 있습니다. 여기에는 비밀번호, 결제 세부정보, 사진, 메시지, 재생하는 오디오 같은 정보가 포함됩니다."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"녹화 또는 전송을 시작하시겠습니까?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>으로 녹화 또는 전송을 시작하시겠습니까?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>(으)로 녹화 또는 전송을 시작하시겠습니까?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"다시 표시 안함"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"모두 지우기"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"관리"</string> @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있음"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"휴대전화 설정에 따라 벨소리나 진동이 울릴 수 있습니다. 기본적으로 <xliff:g id="APP_NAME">%1$s</xliff:g>의 대화는 대화창으로 표시됩니다."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"이 콘텐츠로 연결되는 플로팅 바로가기로 사용자의 주의를 끕니다."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 그리고 잠금 화면에 프로필 사진이 표시됨"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"대화 섹션 상단에 표시, 플로팅 대화창으로 표시, 그리고 잠금 화면에 프로필 사진이 표시됩니다."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"설정"</string> <string name="notification_priority_title" msgid="2079708866333537093">"우선순위"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> 앱은 대화 기능을 지원하지 않습니다."</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index e7c9789cd097..1d5e9ddde5d0 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -502,10 +502,10 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Батареяны үнөмдөгүч режими күйүк"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Иштин майнаптуулугун начарлатып, фондук дайын-даректерди чектейт"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Батареяны үнөмдөгүчтү өчүрүү"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"Жаздырып же тышкы экранга чыгарып жатканда, <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу экраныңыздагы бардык маалыматты же түзмөктө ойнолуп жаткан бардык нерселерди (сырсөздөрдү, төлөмдүн чоо-жайын, сүрөттөрдү, билдирүүлөрдү жана угуп жаткан аудиофайлдарды) көрө алат."</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Жаздырып же тышкы экранга чыгарып жатканда, бул колдонмо экраныңыздагы бардык маалыматты же түзмөктө ойнолуп жаткан бардык нерселерди (сырсөздөрдү, төлөмдүн чоо-жайын, сүрөттөрдү, билдирүүлөрдү жана угуп жаткан аудиофайлдарды) көрө алат."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"Бул функцияны аткарган <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> кызматы экраныңызда көрүнүп турган бардык маалыматты же жаздыруу жана тышкы экранга чыгаруу учурунда түзмөгүңүздө ойнотулган маалыматты колдоно алат. Буга сырсөздөр, төлөмдүн чоо-жайы, сүрөттөр, билдирүүлөр жана ойнотулган аудио кирет."</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Бул функцияны аткарган кызматка экраныңыздагы бардык маалымат же түзмөктө ойнотулуп жаткан нерсе, сырсөздөр, төлөмдөрдүн чоо-жайы, сүрөттөр, билдирүүлөр жана аудио файлдар жеткиликтүү болот."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Жаздырып же тышкы экранга чыгарып баштайсызбы?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> колдонмосу аркылуу жаздырып же тышкы экранга чыгарып баштайсызбы?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> менен жаздырылып же тышкы экранга чыгарылып башталсынбы?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"Экинчи көрүнбөсүн"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Баарын тазалап салуу"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Башкаруу"</string> @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Телефондун жөндөөлөрүнө жараша шыңгырап же дирилдеши мүмкүн. <xliff:g id="APP_NAME">%1$s</xliff:g> колдонмосундагы жазышуулар демейки жөндөө боюнча калкып чыкма билдирмелер түрүндө көрүнөт."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Калкыма ыкчам баскыч менен көңүлүңүздү бул мазмунга буруп турат."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Жазышуулар тизмесинин өйдө жагында калкып чыкма билдирме түрүндө көрүнүп, профиль сүрөтү кулпуланган экрандан чагылдырылат"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Жазышуу бөлүмүнүн жогорку жагында калкып чыкма билдирме түрүндө көрүнүп, профиль сүрөтү кулпуланган экрандан чагылдырылат"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Жөндөөлөр"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Маанилүүлүгү"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> жазышуу функцияларын колдоого албайт"</string> @@ -856,7 +856,7 @@ <string name="left_icon" msgid="5036278531966897006">"¨Солго¨ сүрөтчөсү"</string> <string name="right_icon" msgid="1103955040645237425">"¨Оңго¨ сүрөтчөсү"</string> <string name="drag_to_add_tiles" msgid="8933270127508303672">"Керектүү элементтерди сүйрөп келиңиз"</string> - <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Элементтердин иретин өзгөртүү үчүн кармап туруп, сүйрөңүз"</string> + <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Элементтердин иретин өзгөртүү үчүн, кармап туруп, сүйрөңүз"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Алып салуу үчүн бул жерге сүйрөңүз"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Сизге жок дегенде <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> мозаика керек"</string> <string name="qs_edit" msgid="5583565172803472437">"Түзөтүү"</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 24a68ab39474..83d01342898c 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -508,7 +508,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Akumuliatoriaus tausojimo priemonė įjungta"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Sumažinamas našumas ir foninių duomenų naudojimas"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Išjungti Akumuliatoriaus tausojimo priemonę"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> galės pasiekti visą informaciją, matomą ekrane ir leidžiamą iš įrenginio įrašant ar perduodant turinį. Tai apima įvairią informaciją, pvz., slaptažodžius, išsamią mokėjimo informaciją, nuotraukas, pranešimus ir leidžiamus garso įrašus."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"„<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“ galės pasiekti visą informaciją, matomą ekrane ir leidžiamą iš įrenginio įrašant ar perduodant turinį. Tai apima įvairią informaciją, pvz., slaptažodžius, išsamią mokėjimo informaciją, nuotraukas, pranešimus ir leidžiamus garso įrašus."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Šią funkcija teikianti paslauga galės pasiekti visą informaciją, matomą ekrane ir leidžiamą iš įrenginio įrašant ar perduodant turinį. Tai apima įvairią informaciją, pvz., slaptažodžius, išsamią mokėjimo informaciją, nuotraukas, pranešimus ir leidžiamus garso įrašus."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Pradėti įrašyti ar perduoti turinį?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Pradėti įrašyti ar perduoti turinį naudojant „<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“?"</string> @@ -778,7 +778,7 @@ </plurals> <string name="battery_panel_title" msgid="5931157246673665963">"Akum. energ. vartoj."</string> <string name="battery_detail_charging_summary" msgid="8821202155297559706">"Akumuliatoriaus tausojimo priemonė nepasiekiama įkraunant"</string> - <string name="battery_detail_switch_title" msgid="6940976502957380405">"Akum. taus. pr."</string> + <string name="battery_detail_switch_title" msgid="6940976502957380405">"Akumuliat. taus. pr."</string> <string name="battery_detail_switch_summary" msgid="3668748557848025990">"Sumažinamas našumas ir foninių duomenų naudojimas"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"Mygtukas <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="keyboard_key_home" msgid="3734400625170020657">"Pagrindinis"</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 5b53b0827e41..70250b2e94d4 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -715,7 +715,7 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Noklusējums"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Burbulis"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Nav skaņas signāla vai vibrācijas"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Nav skaņas signāla vai vibrācijas, kā arī atrodas tālāk sarunu sadaļā"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Nav skaņas signāla vai vibrācijas, kā arī atrodas zemāk sarunu sadaļā"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Atkarībā no tālruņa iestatījumiem var zvanīt vai vibrēt. Sarunas no lietotnes <xliff:g id="APP_NAME">%1$s</xliff:g> pēc noklusējuma tiek parādītas burbulī."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Piesaista jūsu uzmanību, rādot peldošu saīsni uz šo saturu."</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index d63f99c0c8fc..0ac73cf871f5 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -502,8 +502,8 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Штедачот на батерија е вклучен"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Ја намалува изведбата и податоците во заднина"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Исклучете го штедачот на батерија"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ќе има пристап до сите податоци што се видливи на екранот или пуштени од вашиот уред додека се снима или емитува. Ова вклучува податоци како лозинки, детали за плаќање, фотографии, пораки, аудио што го пуштате итн."</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Услугата што ја обезбедува функцијава ќе има пристап до сите податоци што се видливи на екранот или пуштени од вашиот уред додека се снима или емитува. Ова вклучува информации како лозинки, детали за плаќање, фотографии, пораки, аудио што го пуштате итн."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ќе има пристап до сите информации што се видливи на екранот или пуштени од вашиот уред додека се снима или емитува. Ова вклучува информации како, на пример, лозинки, детали на исплатата, фотографии, пораки и аудио што го пуштате."</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Услугата што ја обезбедува функцијава ќе има пристап до сите информации што се видливи на екранот или пуштени од вашиот уред додека се снима или емитува. Ова вклучува информации како, на пример, лозинки, детали на исплатата, фотографии, пораки и аудио што го пуштате."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Да почне снимање или емитување?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Да почне снимање или емитување со <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"Не покажувај повторно"</string> @@ -667,7 +667,7 @@ <string name="tuner_warning_title" msgid="7721976098452135267">"Забава за некои, но не за сите"</string> <string name="tuner_warning" msgid="1861736288458481650">"Адаптерот на УИ на системот ви дава дополнителни начини за дотерување и приспособување на корисничкиот интерфејс на Android. Овие експериментални функции можеби ќе се изменат, расипат или ќе исчезнат во следните изданија. Продолжете со претпазливост."</string> <string name="tuner_persistent_warning" msgid="230466285569307806">"Овие експериментални функции можеби ќе се изменат, расипат или ќе исчезнат во следните изданија. Продолжете со претпазливост."</string> - <string name="got_it" msgid="477119182261892069">"Сфатив"</string> + <string name="got_it" msgid="477119182261892069">"Разбрав"</string> <string name="tuner_toast" msgid="3812684836514766951">"Честито! Го додадовте Адаптерот на УИ на системот на Поставки"</string> <string name="remove_from_settings" msgid="633775561782209994">"Отстрани од поставки"</string> <string name="remove_from_settings_prompt" msgid="551565437265615426">"Да се отстрани Адаптерот на УИ на системот од Поставки и да престанат да се користат сите негови функции?"</string> @@ -712,13 +712,13 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Стандардно"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Балонче"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Без звук или вибрации"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Без звук или вибрации и се појавува подолу во делот со разговори"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Без звук или вибрации и се појавува под делот за разговор"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"Може да ѕвони или вибрира во зависност од поставките на телефонот"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Може да ѕвони или вибрира во зависност од поставките на телефонот Стандардно, разговорите од <xliff:g id="APP_NAME">%1$s</xliff:g> се во балончиња."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Ви го задржува вниманието со лебдечка кратенка на содржинава."</string> <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Се појавува на горниот дел од секцијата на разговорот во вид на лебдечко меурче, покажувајќи ја профилната слика на заклучениот екран"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Поставки"</string> - <string name="notification_priority_title" msgid="2079708866333537093">"Приоритетно"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> не поддржува функции за разговор"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Нема неодамнешни балончиња"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Неодамнешните и отфрлените балончиња ќе се појавуваат тука"</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index bf15091ad9b9..2a3ce7460f20 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -125,7 +125,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"ഉപയോഗസഹായി"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"സ്ക്രീൻ തിരിക്കുക"</string> <string name="accessibility_recent" msgid="901641734769533575">"അവലോകനം"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"Search"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"തിരയൽ"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"ക്യാമറ"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ഫോണ്"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"വോയ്സ് സഹായം"</string> @@ -389,7 +389,7 @@ <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"വൈഫൈ കണക്റ്റ് ചെയ്തിട്ടില്ല"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"തെളിച്ചം"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"യാന്ത്രികം"</string> - <string name="quick_settings_inversion_label" msgid="5078769633069667698">"നെഗറ്റീവ് ലുക്ക്"</string> + <string name="quick_settings_inversion_label" msgid="5078769633069667698">"നിറം മാറ്റുക"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"വർണ്ണം ശരിയാക്കൽ മോഡ്"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"കൂടുതൽ ക്രമീകരണങ്ങൾ"</string> <string name="quick_settings_done" msgid="2163641301648855793">"പൂർത്തിയാക്കി"</string> @@ -441,7 +441,7 @@ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"ഫുൾ ചാർജാകാൻ, <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"ചാർജ്ജുചെയ്യുന്നില്ല"</string> <string name="ssl_ca_cert_warning" msgid="8373011375250324005">"നെറ്റ്വർക്ക്\nനിരീക്ഷിക്കപ്പെടാം"</string> - <string name="description_target_search" msgid="3875069993128855865">"Search"</string> + <string name="description_target_search" msgid="3875069993128855865">"തിരയൽ"</string> <string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി മുകളിലേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string> <string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> എന്നതിനായി ഇടത്തേയ്ക്ക് സ്ലൈഡുചെയ്യുക."</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"നിങ്ങൾ സജ്ജീകരിച്ച അലാറങ്ങൾ, റിമൈൻഡറുകൾ, ഇവന്റുകൾ, കോളർമാർ എന്നിവയിൽ നിന്നുള്ള ശബ്ദങ്ങളും വൈബ്രേഷനുകളുമൊഴികെ മറ്റൊന്നും നിങ്ങളെ ശല്യപ്പെടുത്തുകയില്ല. സംഗീതം, വീഡിയോകൾ, ഗെയിമുകൾ എന്നിവയുൾപ്പെടെ പ്ലേ ചെയ്യുന്നതെന്തും നിങ്ങൾക്ക് തുടർന്നും കേൾക്കാൻ കഴിയും."</string> @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"ബാറ്ററി ലാഭിക്കൽ ഓണാണ്"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"പ്രവർത്തനവും പശ്ചാത്തല ഡാറ്റയും കുറയ്ക്കുന്നു"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ബാറ്ററി ലാഭിക്കൽ ഓഫാക്കുക"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>-ന് ആക്സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഒഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്മെന്റ് വിശദാംശങ്ങൾ, പാസ്വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> എന്നതിന് ആക്സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഒഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്മെന്റ് വിശദാംശങ്ങൾ, പാസ്വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"റെക്കോർഡ് ചെയ്യുമ്പോഴോ കാസ്റ്റ് ചെയ്യുമ്പോഴോ നിങ്ങളുടെ ഉപകരണത്തിൽ നിന്ന് പ്ലേ ചെയ്യുന്നതോ നിങ്ങളുടെ സ്ക്രീനിൽ ദൃശ്യമാകുന്നതോ ആയ എല്ലാ വിവരങ്ങളിലേക്കും ഈ ഫംഗ്ഷൻ ലഭ്യമാക്കുന്ന സേവനത്തിന് ആക്സസ് ഉണ്ടായിരിക്കും. നിങ്ങൾ പ്ലേ ചെയ്യുന്ന ഓഡിയോ, സന്ദേശങ്ങൾ, ഫോട്ടോകൾ, പേയ്മെന്റ് വിശദാംശങ്ങൾ, പാസ്വേഡുകൾ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ ഉൾപ്പെടുന്നു."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"റെക്കോർഡ് ചെയ്യൽ അല്ലെങ്കിൽ കാസ്റ്റ് ചെയ്യൽ ആരംഭിക്കണോ?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ഉപയോഗിച്ച് റെക്കോർഡ് ചെയ്യൽ അല്ലെങ്കിൽ കാസ്റ്റ് ചെയ്യൽ ആരംഭിക്കണോ?"</string> @@ -767,7 +767,7 @@ <item quantity="one">%d മിനിറ്റ്</item> </plurals> <string name="battery_panel_title" msgid="5931157246673665963">"ബാറ്ററി ഉപയോഗം"</string> - <string name="battery_detail_charging_summary" msgid="8821202155297559706">"ചാർജ് ചെയ്യുമ്പോൾ ബാറ്ററി ലാഭിക്കൽ സാധ്യമല്ല"</string> + <string name="battery_detail_charging_summary" msgid="8821202155297559706">"ചാർജുചെയ്യുന്ന സമയത്ത് ബാറ്ററി ലാഭിക്കൽ നടക്കില്ല"</string> <string name="battery_detail_switch_title" msgid="6940976502957380405">"ബാറ്ററി ലാഭിക്കൽ"</string> <string name="battery_detail_switch_summary" msgid="3668748557848025990">"പ്രവർത്തനവും പശ്ചാത്തല ഡാറ്റയും കുറയ്ക്കുന്നു"</string> <string name="keyboard_key_button_template" msgid="8005673627272051429">"ബട്ടൺ <xliff:g id="NAME">%1$s</xliff:g>"</string> @@ -984,7 +984,7 @@ <string name="auto_saver_text" msgid="3214960308353838764">"ബാറ്ററി ചാർജ് തീരാൻ സാധ്യതയുണ്ടെങ്കിൽ ഓണാക്കുക"</string> <string name="no_auto_saver_action" msgid="7467924389609773835">"വേണ്ട"</string> <string name="auto_saver_enabled_title" msgid="4294726198280286333">"ബാറ്ററി ലാഭിക്കൽ ഷെഡ്യൂൾ ഓണാക്കുക"</string> - <string name="auto_saver_enabled_text" msgid="7889491183116752719">"ബാറ്ററി <xliff:g id="PERCENTAGE">%d</xliff:g>%% ൽ താഴെയാകുമ്പോൾ, ബാറ്ററി ലാഭിക്കൽ സ്വയമേവ ഓണാകും."</string> + <string name="auto_saver_enabled_text" msgid="7889491183116752719">"ബാറ്ററി <xliff:g id="PERCENTAGE">%d</xliff:g>%% ൽ താഴെയാകുമ്പോൾ, ബാറ്ററി ലാഭിക്കൽ സ്വമേധയാ ഓണാകും."</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"ക്രമീകരണം"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"മനസ്സിലായി"</string> <string name="heap_dump_tile_name" msgid="2464189856478823046">"SysUI ഹീപ്പ് ഡമ്പ് ചെയ്യുക"</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index 717389e4a1c6..f27e885b1f17 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -551,29 +551,29 @@ <string name="monitoring_description_managed_profile_ca_certificate" msgid="7904323416598435647">"Таны байгууллага таны ажлын профайлд сертификатын зөвшөөрөл суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой."</string> <string name="monitoring_description_ca_certificate" msgid="448923057059097497">"Сертификатын зөвшөөрлийг энэ төхөөрөмжид суулгасан байна. Таны аюулгүй сүлжээний ачааллыг өөрчлөх эсвэл хянах боломжтой."</string> <string name="monitoring_description_management_network_logging" msgid="216983105036994771">"Таны админ төхөөрөмжийн ачааллыг хянадаг сүлжээний логийг асаасан байна."</string> - <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Та имэйл, апп, веб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна."</string> - <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Та имэйл, апп, веб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP_0">%1$s</xliff:g>, <xliff:g id="VPN_APP_1">%2$s</xliff:g>-д холбогдсон байна."</string> - <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Таны ажлын профайл <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна. Энэ нь таны имэйл, апп, веб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой."</string> - <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"Таны хувийн профайлыг имэйл, апп, веб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбосон байна."</string> + <string name="monitoring_description_named_vpn" msgid="5749932930634037027">"Та имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна."</string> + <string name="monitoring_description_two_named_vpns" msgid="3516830755681229463">"Та имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP_0">%1$s</xliff:g>, <xliff:g id="VPN_APP_1">%2$s</xliff:g>-д холбогдсон байна."</string> + <string name="monitoring_description_managed_profile_named_vpn" msgid="368812367182387320">"Таны ажлын профайл <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна. Энэ нь таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой."</string> + <string name="monitoring_description_personal_profile_named_vpn" msgid="8179722332380953673">"Таны хувийн профайлыг имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбосон байна."</string> <string name="monitoring_description_do_header_generic" msgid="6130190408164834986">"Таны төхөөрөмжийг <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g> удирддаг."</string> <string name="monitoring_description_do_header_with_name" msgid="2696255132542779511">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> таны төхөөрөмжийг удирдахын тулд <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g>-г ашигладаг."</string> <string name="monitoring_description_do_body" msgid="7700878065625769970">"Таны админ тохиргоо, байгууллагын хандалт, апп, төхөөрөмжтэй холбоотой өгөгдөл болон таны төхөөрөмжийн байршлын мэдээллийг хянах, удирдах боломжтой."</string> <string name="monitoring_description_do_learn_more_separator" msgid="1467280496376492558">" "</string> <string name="monitoring_description_do_learn_more" msgid="645149183455573790">"Дэлгэрэнгүй үзэх"</string> - <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"Таны имэйл, апп, веб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна."</string> + <string name="monitoring_description_do_body_vpn" msgid="7699280130070502303">"Таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="VPN_APP">%1$s</xliff:g>-д холбогдсон байна."</string> <string name="monitoring_description_vpn_settings_separator" msgid="8292589617720435430">" "</string> <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"VPN тохиргоог нээх"</string> <string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"Итгэмжлэгдсэн мандат үнэмлэхийг нээх"</string> <string name="monitoring_description_network_logging" msgid="577305979174002252">"Таны админ төхөөрөмжийн ачааллыг хянадаг сүлжээний логийг асаасан байна.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу."</string> - <string name="monitoring_description_vpn" msgid="1685428000684586870">"Та апп-д VPN холболт хийхийг зөвшөөрсөн байна.\n\nЭнэхүү апп нь таны имэйл, апп, вебсайт зэрэг төхөөрөмж болон сүлжээний үйл ажиллагааг хянах боломжтой."</string> - <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> таны ажлын профайлыг удирддаг.\n\nТаны админ имэйл, апп болон веб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу.\n\nТа сүлжээний үйл ажиллагааг хянах боломжтой VPN-д холбогдсон байна."</string> + <string name="monitoring_description_vpn" msgid="1685428000684586870">"Та апп-д VPN холболт хийхийг зөвшөөрсөн байна.\n\nЭнэхүү апп нь таны имэйл, апп, вэбсайт зэрэг төхөөрөмж болон сүлжээний үйл ажиллагааг хянах боломжтой."</string> + <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> таны ажлын профайлыг удирддаг.\n\nТаны админ имэйл, апп болон вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авах бол админтайгаа холбогдоно уу.\n\nТа сүлжээний үйл ажиллагааг хянах боломжтой VPN-д холбогдсон байна."</string> <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string> - <string name="monitoring_description_app" msgid="376868879287922929">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой."</string> - <string name="monitoring_description_app_personal" msgid="1970094872688265987">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вебсайт зэрэг сүлжээний хувийн үйл ажиллагааг хянах боломжтой."</string> - <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"Та имэйл, апп, веб хуудас зэрэг хувийн сүлжээнийхээ үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон байна."</string> - <string name="monitoring_description_app_work" msgid="3713084153786663662">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь таны имэйл, апп, веб хуудас зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION">%2$s</xliff:g>-д холбогдсон. \n\nДэлгэрэнгүй мэдээллийг авахын тулд админтай холбогдоно уу."</string> - <string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь таны имэйл, апп, веб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>-тай холбогдсон. \n\nМөн таны сүлжээний хувийн үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>-д холбогдсон байна."</string> + <string name="monitoring_description_app" msgid="376868879287922929">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вэбсайт зэрэг сүлжээний үйл ажиллагааг хянах боломжтой."</string> + <string name="monitoring_description_app_personal" msgid="1970094872688265987">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд энэ нь таны имэйл, апп, вэбсайт зэрэг сүлжээний хувийн үйл ажиллагааг хянах боломжтой."</string> + <string name="branded_monitoring_description_app_personal" msgid="1703511985892688885">"Та имэйл, апп, вэб хуудас зэрэг хувийн сүлжээнийхээ үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон байна."</string> + <string name="monitoring_description_app_work" msgid="3713084153786663662">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь таны имэйл, апп, вэб хуудас зэрэг ажлын сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION">%2$s</xliff:g>-д холбогдсон. \n\nДэлгэрэнгүй мэдээллийг авахын тулд админтай холбогдоно уу."</string> + <string name="monitoring_description_app_personal_work" msgid="6175816356939166101">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь таны имэйл, апп, вэб хуудас зэрэг сүлжээний үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>-тай холбогдсон. \n\nМөн таны сүлжээний хувийн үйл ажиллагааг хянах боломжтой <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>-д холбогдсон байна."</string> <string name="keyguard_indication_trust_unlocked" msgid="7395154975733744547">"TrustAgent-р түгжээгүй байлгасан"</string> <string name="keyguard_indication_trust_disabled" msgid="6820793704816727918">"Таныг гараар нээх хүртэл төхөөрөмж түгжээтэй байх болно"</string> <string name="keyguard_indication_trust_unlocked_plugged_in" msgid="2323452175329362855">"<xliff:g id="KEYGUARD_INDICATION">%1$s</xliff:g>\n<xliff:g id="POWER_INDICATION">%2$s</xliff:g>"</string> @@ -655,8 +655,8 @@ <string name="status_bar_alarm" msgid="87160847643623352">"Сэрүүлэг"</string> <string name="status_bar_work" msgid="5238641949837091056">"Ажлын профайл"</string> <string name="status_bar_airplane" msgid="4848702508684541009">"Нислэгийн горим"</string> - <string name="add_tile" msgid="6239678623873086686">"Вебсайтын цонх нэмэх"</string> - <string name="broadcast_tile" msgid="5224010633596487481">"Вебсайтын цонх дамжуулах"</string> + <string name="add_tile" msgid="6239678623873086686">"Вэбсайтын цонх нэмэх"</string> + <string name="broadcast_tile" msgid="5224010633596487481">"Вэбсайтын цонх дамжуулах"</string> <string name="zen_alarm_warning_indef" msgid="5252866591716504287">"Та өмнө нь унтраагаагүй тохиолдолд <xliff:g id="WHEN">%1$s</xliff:g>-т сэрүүлгээ сонсохгүй"</string> <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> @@ -712,7 +712,7 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Өгөгдмөл"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Бөмбөлөг"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Дуу эсвэл чичиргээ байхгүй"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Дуу эсвэл чичиргээ байхгүй бөгөөд харилцан ярианы хэсгийн доод талд харагдана"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Дуу эсвэл чичиргээ байхгүй бөгөөд харицан ярианы хэсгийн доод талд харагдана"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"Утасны тохиргоонд тулгуурлан хонх дуугаргах эсвэл чичирхийлж болзошгүй"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Утасны тохиргоонд тулгуурлан хонх дуугаргах эсвэл чичирхийлж болзошгүй. <xliff:g id="APP_NAME">%1$s</xliff:g>-н харилцан яриаг өгөгдмөл тохиргооны дагуу бөмбөлөг болгоно."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Энэ контентын хөвөн гарч ирэх товчлолтойгоор таны анхаарлыг татдаг."</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index f6bd5fa67531..850ef28a021f 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -115,17 +115,17 @@ <string name="screenrecord_delete_error" msgid="2870506119743013588">"स्क्रीन रेकॉर्डिंग हटवताना एरर आली"</string> <string name="screenrecord_permission_error" msgid="7856841237023137686">"परवानग्या मिळवता आल्या नाहीत"</string> <string name="screenrecord_start_error" msgid="2200660692479682368">"स्क्रीन रेकॉर्डिंग सुरू करताना एरर आली"</string> - <string name="usb_preference_title" msgid="1439924437558480718">"USB फाइल स्थानांतरण पर्याय"</string> + <string name="usb_preference_title" msgid="1439924437558480718">"USB फाईल स्थानांतरण पर्याय"</string> <string name="use_mtp_button_title" msgid="5036082897886518086">"मीडिया प्लेअर म्हणून माउंट करा (MTP)"</string> <string name="use_ptp_button_title" msgid="7676427598943446826">"कॅमेरा म्हणून माउंट करा (PTP)"</string> - <string name="installer_cd_button_title" msgid="5499998592841984743">"Mac साठी Android फाइल स्थानांतर अॅप इंस्टॉल करा"</string> + <string name="installer_cd_button_title" msgid="5499998592841984743">"Mac साठी Android फाईल स्थानांतर अॅप इंस्टॉल करा"</string> <string name="accessibility_back" msgid="6530104400086152611">"मागे"</string> <string name="accessibility_home" msgid="5430449841237966217">"होम"</string> <string name="accessibility_menu" msgid="2701163794470513040">"मेनू"</string> <string name="accessibility_accessibility_button" msgid="4089042473497107709">"अॅक्सेसिबिलिटी"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"स्क्रीन फिरवा"</string> <string name="accessibility_recent" msgid="901641734769533575">"अवलोकन"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"Search"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"शोधा"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"कॅमेरा"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"फोन"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"व्हॉइस सहाय्य"</string> @@ -267,7 +267,7 @@ <string name="accessibility_quick_settings_wifi" msgid="167707325133803052">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wifi बंद झाले."</string> <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wifi सुरू झाले."</string> - <string name="accessibility_quick_settings_mobile" msgid="1817825313718492906">"मोबाइल <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> + <string name="accessibility_quick_settings_mobile" msgid="1817825313718492906">"मोबाईल <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> <string name="accessibility_quick_settings_battery" msgid="533594896310663853">"बॅटरी <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_airplane_off" msgid="1275658769368793228">"विमान मोड बंद."</string> <string name="accessibility_quick_settings_airplane_on" msgid="8106176561295294255">"विमान मोड सुरू."</string> @@ -290,7 +290,7 @@ <string name="accessibility_quick_settings_location_changed_off" msgid="5132776369388699133">"स्थान अहवाल बंद केला."</string> <string name="accessibility_quick_settings_location_changed_on" msgid="7159115433070112154">"स्थान अहवाल सुरू केला."</string> <string name="accessibility_quick_settings_alarm" msgid="558094529584082090">"<xliff:g id="TIME">%s</xliff:g> साठी अलार्म सेट केला."</string> - <string name="accessibility_quick_settings_close" msgid="2974895537860082341">"पॅनल बंद करा."</string> + <string name="accessibility_quick_settings_close" msgid="2974895537860082341">"पॅनेल बंद करा."</string> <string name="accessibility_quick_settings_more_time" msgid="7646479831704665284">"अधिक वेळ."</string> <string name="accessibility_quick_settings_less_time" msgid="9110364286464977870">"कमी वेळ."</string> <string name="accessibility_quick_settings_flashlight_off" msgid="7606563260714825190">"फ्लॅशलाइट बंद."</string> @@ -300,8 +300,8 @@ <string name="accessibility_quick_settings_flashlight_changed_on" msgid="4747870681508334200">"फ्लॅशलाइट सुरू केला."</string> <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="7548045840282925393">"रंग उत्क्रमण बंद केले."</string> <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="4711141858364404084">"रंग उत्क्रमण सुरू केले."</string> - <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"मोबाइल हॉटस्पॉट बंद केला."</string> - <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाइल हॉटस्पॉट सुरू केला."</string> + <string name="accessibility_quick_settings_hotspot_changed_off" msgid="7002061268910095176">"मोबाईल हॉटस्पॉट बंद केला."</string> + <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2576895346762408840">"मोबाईल हॉटस्पॉट सुरू केला."</string> <string name="accessibility_casting_turned_off" msgid="1387906158563374962">"स्क्रीन कास्ट करणे थांबले."</string> <string name="accessibility_quick_settings_work_mode_off" msgid="562749867895549696">"कार्य मोड बंद."</string> <string name="accessibility_quick_settings_work_mode_on" msgid="2779253456042059110">"कार्य मोड सुरू."</string> @@ -441,7 +441,7 @@ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"<xliff:g id="CHARGING_TIME">%s</xliff:g> पूर्ण होईपर्यंत"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"चार्ज होत नाही"</string> <string name="ssl_ca_cert_warning" msgid="8373011375250324005">"नेटवर्कचे परीक्षण\nकेले जाऊ शकते"</string> - <string name="description_target_search" msgid="3875069993128855865">"Search"</string> + <string name="description_target_search" msgid="3875069993128855865">"शोध"</string> <string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी वर स्लाइड करा."</string> <string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> साठी डावीकडे स्लाइड करा."</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"अलार्म, रिमाइंडर, इव्हेंट आणि तुम्ही निश्चित केलेल्या कॉलर व्यतिरिक्त तुम्हाला कोणत्याही आवाज आणि कंपनांचा व्यत्त्यय आणला जाणार नाही. तरीही तुम्ही प्ले करायचे ठरवलेले कोणतेही संगीत, व्हिडिओ आणि गेमचे आवाज ऐकू शकतात."</string> @@ -504,8 +504,8 @@ <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"बॅटरी सेव्हर बंद करा"</string> <string name="media_projection_dialog_text" msgid="1755705274910034772">"तुमच्या स्क्रीनवर दृश्यमान असलेल्या किंवा रेकॉर्ड किंवा कास्ट करताना तुमच्या डिव्हाइसमधून प्ले केलेल्या सर्व माहितीचा अॅक्सेस <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ला असेल. यामध्ये पासवर्ड, पेमेंट तपशील, फोटो, मेसेज आणि तुम्ही प्ले केलेला ऑडिओ यासारख्या माहितीचा समावेश असतो."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"हे कार्य पुरवठा करणाऱ्या सेवेस तुमच्या स्क्रीनवर दृश्यमान असलेल्या किंवा रेकॉर्ड किंवा कास्ट करताना तुमच्या डिव्हाइसमधून प्ले केलेल्या सर्व माहितीचा अॅक्सेस असेल. यामध्ये पासवर्ड, पेमेंट तपशील, फोटो, मेसेज आणि तुम्ही प्ले केलेला ऑडिओ यासारख्या माहितीचा समावेश असतो."</string> - <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"रेकॉर्ड करणे किंवा कास्ट करणे सुरू करायचे का ?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ने रेकॉर्ड करणे किंवा कास्ट करणे सुरू करायचे का?"</string> + <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"रेकॉर्ड किंवा कास्ट करणे सुरू करायचे आहे का ?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ने रेकॉर्ड करणे किंवा कास्ट करणे सुरू करा?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"पुन्हा दर्शवू नका"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"सर्व साफ करा"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"व्यवस्थापित करा"</string> @@ -626,10 +626,10 @@ <string name="qs_status_phone_vibrate" msgid="7055409506885541979">"फोन व्हायब्रेटवर आहे"</string> <string name="qs_status_phone_muted" msgid="3763664791309544103">"फोन म्यूट केला"</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. सशब्द करण्यासाठी टॅप करा."</string> - <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. व्हायब्रेट सेट करण्यासाठी टॅप करा. प्रवेशयोग्यता सेवा म्यूट केल्या जाऊ शकतात."</string> - <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. म्यूट करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा म्यूट केल्या जाऊ शकतात."</string> + <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. व्हायब्रेट सेट करण्यासाठी टॅप करा. प्रवेशयोग्यता सेवा नि:शब्द केल्या जाऊ शकतात."</string> + <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. नि:शब्द करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा नि:शब्द केल्या जाऊ शकतात."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. व्हायब्रेट सेट करण्यासाठी टॅप करा."</string> - <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. म्यूट करण्यासाठी टॅप करा."</string> + <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. नि:शब्द करण्यासाठी टॅप करा."</string> <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"म्यूट करा"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"म्यूट काढून टाका"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"व्हायब्रेट करा"</string> @@ -723,7 +723,7 @@ <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"अलीकडील कोणतेही बबल नाहीत"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"अलीकडील बबल आणि डिसमिस केलेले बबल येथे दिसतील"</string> <string name="notification_unblockable_desc" msgid="2073030886006190804">"या सूचनांमध्ये सुधारणा केली जाऊ शकत नाही."</string> - <string name="notification_multichannel_desc" msgid="7414593090056236179">"या सूचनांचा संच येथे कॉंफिगर केला जाऊ शकत नाही"</string> + <string name="notification_multichannel_desc" msgid="7414593090056236179">"या सूचनांचा संच येथे कॉन्फिगर केला जाऊ शकत नाही"</string> <string name="notification_delegate_header" msgid="1264510071031479920">"प्रॉक्सी केलेल्या सूचना"</string> <string name="notification_channel_dialog_title" msgid="6856514143093200019">"सर्व <xliff:g id="APP_NAME">%1$s</xliff:g> वरील सूचना"</string> <string name="see_more_title" msgid="7409317011708185729">"आणखी पाहा"</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 84da74bd6fb2..4b467c32d5df 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -405,7 +405,7 @@ <item quantity="one">%d peranti</item> </plurals> <string name="quick_settings_notifications_label" msgid="3379631363952582758">"Pemberitahuan"</string> - <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lampu Suluh"</string> + <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"Lampu suluh"</string> <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"Kamera sedang digunakan"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"Data mudah alih"</string> <string name="quick_settings_cellular_detail_data_usage" msgid="6105969068871138427">"Penggunaan data"</string> @@ -987,7 +987,7 @@ <string name="auto_saver_enabled_text" msgid="7889491183116752719">"Penjimat Bateri akan dihidupkan secara automatik setelah kuasa bateri kurang daripada <xliff:g id="PERCENTAGE">%d</xliff:g>%%."</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"Tetapan"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"OK"</string> - <string name="heap_dump_tile_name" msgid="2464189856478823046">"DumpSys"</string> + <string name="heap_dump_tile_name" msgid="2464189856478823046">"Longgok Tmbunn SysUI"</string> <string name="sensor_privacy_mode" msgid="4462866919026513692">"Penderia dimatikan"</string> <string name="device_services" msgid="1549944177856658705">"Perkhidmatan Peranti"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"Tiada tajuk"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 75d05d4bf5d8..68e0f3e8f217 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -502,8 +502,8 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"ဘက်ထရီ အားထိန်းကို ဖွင့်ထားခြင်း"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"လုပ်ကိုင်မှုကို လျှော့ချလျက် နောက်ခံ ဒေတာကို ကန့်သတ်သည်"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ဘက်ထရီ အားထိန်းကို ပိတ်ရန်"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> သည် အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် သင့်ဖန်သားပြင်တွင် မြင်ရသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အချက်အလက်မှန်သမျှကို သုံးနိုင်နိုင်ပါမည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှုအသေးစိတ်များ၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် သင်ဖွင့်သည့်အသံကဲ့သို့သော အချက်အလက်များ ပါဝင်သည်။"</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ဤလုပ်ရပ်အတွက် ဝန်ဆောင်မှုသည် အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် သင့်ဖန်သားပြင်တွင် မြင်ရသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အချက်အလက်မှန်သမျှကို သုံးနိုင်ပြီး သင့်စက်မှ ဖွင့်နိုင်ပါမည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှုအသေးစိတ်များ၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် သင်ဖွင့်သည့်အသံကဲ့သို့သော အချက်အလက်များ ပါဝင်သည်။"</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> သည် အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် သင့်မျက်နှာပြင်တွင် မြင်ရသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အချက်အလက်မှန်သမျှကို သုံးနိုင်ပါမည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှုအသေးစိတ်များ၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် သင်ဖွင့်သည့်အသံကဲ့သို့သော အချက်အလက်များ ပါဝင်သည်။"</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"ဤလုပ်ရပ်အတွက် ဝန်ဆောင်မှုသည် အသံဖမ်းနေစဉ် (သို့) ကာစ်လုပ်နေစဉ် သင့်မျက်နှာပြင်တွင် မြင်ရသော (သို့) သင့်စက်တွင် ဖွင့်ထားသော အချက်အလက်မှန်သမျှကို သုံးနိုင်ပါမည်။ ၎င်းတွင် စကားဝှက်များ၊ ငွေပေးချေမှုအသေးစိတ်များ၊ ဓာတ်ပုံများ၊ မက်ဆေ့ဂျ်များနှင့် သင်ဖွင့်သည့်အသံကဲ့သို့သော အချက်အလက်များ ပါဝင်သည်။"</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"ဖမ်းယူခြင်း သို့မဟုတ် ကာစ်လုပ်ခြင်း စတင်မလား။"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> နှင့် ဖမ်းယူခြင်း သို့မဟုတ် ကာစ်လုပ်ခြင်း စတင်မလား။"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"နောက်ထပ် မပြပါနှင့်"</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index 758d2be444e3..daa5f365aadb 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -43,7 +43,7 @@ <string name="status_bar_settings_mute_label" msgid="914392730086057522">"म्युट गर्नुहोस्"</string> <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"स्वतः"</string> <string name="status_bar_settings_notifications" msgid="5285316949980621438">"सूचनाहरू"</string> - <string name="bluetooth_tethered" msgid="4171071193052799041">"ब्लुटुथ टेदर भयो"</string> + <string name="bluetooth_tethered" msgid="4171071193052799041">"ब्लुटुथ टेथर भयो"</string> <string name="status_bar_input_method_settings_configure_input_methods" msgid="2972273031043777851">"इनपुट विधिहरू सेटअप गर्नुहोस्"</string> <string name="status_bar_use_physical_keyboard" msgid="4849251850931213371">"वास्तविक किबोर्ड"</string> <string name="usb_device_permission_prompt" msgid="4414719028369181772">"<xliff:g id="APPLICATION">%1$s</xliff:g> लाई <xliff:g id="USB_DEVICE">%2$s</xliff:g> माथि पहुँच राख्ने अनुमति दिने हो?"</string> @@ -341,7 +341,7 @@ <string name="dessert_case" msgid="9104973640704357717">"Dessert Case"</string> <string name="start_dreams" msgid="9131802557946276718">"स्क्रिन सेभर"</string> <string name="ethernet_label" msgid="2203544727007463351">"Ethernet"</string> - <string name="quick_settings_header_onboarding_text" msgid="1918085351115504765">"थप विकल्पहरूका लागि आइकनहरूमा टच एण्ड होल्ड गर्नुहोस्"</string> + <string name="quick_settings_header_onboarding_text" msgid="1918085351115504765">"थप विकल्पहरूका लागि आइकनहरूमा छोइराख्नुहोस्"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"बाधा नपुऱ्याउनुहोस्"</string> <string name="quick_settings_dnd_priority_label" msgid="6251076422352664571">"प्राथमिकता मात्र"</string> <string name="quick_settings_dnd_alarms_label" msgid="1241780970469630835">"अलार्महरू मात्र"</string> @@ -368,7 +368,7 @@ <string name="quick_settings_location_off_label" msgid="7923929131443915919">"स्थान बन्द छ"</string> <string name="quick_settings_media_device_label" msgid="8034019242363789941">"मिडिया उपकरण"</string> <string name="quick_settings_rssi_label" msgid="3397615415140356701">"RSSI"</string> - <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"आपत्कालीन कल मात्र"</string> + <string name="quick_settings_rssi_emergency_only" msgid="7499207215265078598">"आपतकालीन कल मात्र"</string> <string name="quick_settings_settings_label" msgid="2214639529565474534">"सेटिङहरू"</string> <string name="quick_settings_time_label" msgid="3352680970557509303">"समय"</string> <string name="quick_settings_user_label" msgid="1253515509432672496">"मलाई"</string> @@ -502,8 +502,8 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"ब्याट्री सेभर अन छ"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"प्रदर्शन र पृष्ठभूमि डेटा घटाउँनुहोस्"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"ब्याट्री सेभर अफ गर्नुहोस्"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, फोटो, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"यो कार्य प्रदान गर्ने सेवाले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, फोटो, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, तस्बिर, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"यो कार्य प्रदान गर्ने सेवाले तपाईंको स्क्रिनमा देख्न सकिने सबै जानकारी अथवा रेकर्ड वा cast गर्दा तपाईंको यन्त्रबाट प्ले गरिएका कुरामाथि पहुँच राख्न सक्ने छ। यसअन्तर्गत पासवर्ड, भुक्तानीका विवरण, तस्बिर, सन्देश र तपाईंले प्ले गर्ने अडियो जस्ता जानकारी समावेश हुन्छन्।"</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"रेकर्ड गर्न वा cast गर्न थाल्ने हो?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> मार्फत रेकर्ड गर्न वा cast गर्न थाल्ने हो?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"फेरि नदेखाउनुहोस्"</string> @@ -593,16 +593,16 @@ <string name="volume_odi_captions_hint_disable" msgid="2518846326748183407">"असक्षम पार्नुहोस्"</string> <string name="accessibility_output_chooser" msgid="7807898688967194183">"आउटपुट यन्त्र बदल्नुहोस्"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"एप पिन गरिएको छ"</string> - <string name="screen_pinning_description" msgid="8699395373875667743">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई टच एण्ड होल्ड गर्नुहोस्।"</string> - <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई टच एण्ड होल्ड गर्नुहोस्।"</string> + <string name="screen_pinning_description" msgid="8699395373875667743">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> + <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई छोइराख्नुहोस्।"</string> <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"तपाईंले यो एप अनपिन नगरेसम्म यो एप यहाँ देखिइरहने छ। अनपिन गर्न माथितिर स्वाइप गरी होल्ड गर्नुहोस्।"</string> - <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई टच एण्ड होल्ड गर्नुहोस्।"</string> - <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न गृह नामक बटनलाई टच एण्ड होल्ड गर्नुहोस्।"</string> + <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न गृह नामक बटनलाई छोइराख्नुहोस्।"</string> <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"स्क्रिनमा व्यक्तिगत डेटा (जस्तै सम्पर्क ठेगाना र इमेलको सामग्री) देखिन सक्छ।"</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"पिन गरिएको एपले अन्य एप खोल्न सक्छ।"</string> - <string name="screen_pinning_toast" msgid="8177286912533744328">"यो एप अनपनि गर्न पछाडि र विवरण नामक बटनहरूलाई टच एण्ड होल्ड गर्नुहोस्"</string> - <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"यो एप अनपनि गर्न पछाडि र होम बटनलाई टच एण्ड होल्ड गर्नुहोस्"</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"यो एप अनपिन गर्न माथितिर स्वाइप गरी स्क्रिनमा टच एण्ड होल्ड गर्नुहोस्"</string> + <string name="screen_pinning_toast" msgid="8177286912533744328">"यो एप अनपनि गर्न पछाडि र विवरण नामक बटनहरूलाई छोइराख्नुहोस्"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"यो एप अनपनि गर्न पछाडि र होम बटनलाई छोइराख्नुहोस्"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"यो एप अनपिन गर्न माथितिर स्वाइप गरी स्क्रिनमा छोइराख्नुहोस्"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"बुझेँ"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"धन्यवाद पर्दैन"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"एप पिन गरियो"</string> @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"फोनको सेटिङका आधारमा घन्टी बज्न वा कम्पन हुन सक्छ। <xliff:g id="APP_NAME">%1$s</xliff:g> का वार्तालापहरू पूर्वनिर्धारित रूपमा बबलमा देखाइन्छन्।"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"फ्लोटिङ सर्टकटमार्फत यो सामग्रीतर्फ तपाईंको ध्यान आकर्षित गर्दछ।"</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल फोटो देखाइन्छ"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"वार्तालाप खण्डको सिरानमा देखा पर्छ, तैरने बबलका रूपमा देखा पर्छ, लक स्क्रिनमा प्रोफाइल तस्बिर देखाइन्छ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"सेटिङ"</string> <string name="notification_priority_title" msgid="2079708866333537093">"प्राथमिकता"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> मा वार्तालापसम्बन्धी सुविधा प्रयोग गर्न मिल्दैन"</string> @@ -729,11 +729,11 @@ <string name="see_more_title" msgid="7409317011708185729">"थप हेर्नुहोस्"</string> <string name="appops_camera" msgid="5215967620896725715">"यो अनुप्रयोगले क्यामेराको प्रयोग गर्दै छ।"</string> <string name="appops_microphone" msgid="8805468338613070149">"यो अनुप्रयोगले माइक्रोफोनको प्रयोग गर्दै छ।"</string> - <string name="appops_overlay" msgid="4822261562576558490">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्दै छ।"</string> + <string name="appops_overlay" msgid="4822261562576558490">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्दै छ।"</string> <string name="appops_camera_mic" msgid="7032239823944420431">"यो अनुप्रयोगले माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string> - <string name="appops_camera_overlay" msgid="6466845606058816484">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै क्यामेराको प्रयोग गर्दै छ।"</string> - <string name="appops_mic_overlay" msgid="4609326508944233061">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै माइक्रोफोनको प्रयोग गर्दै छ।"</string> - <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य एपमाथि प्रदर्शन गर्नुका साथै माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string> + <string name="appops_camera_overlay" msgid="6466845606058816484">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्नुका साथै क्यामेराको प्रयोग गर्दै छ।"</string> + <string name="appops_mic_overlay" msgid="4609326508944233061">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्नुका साथै माइक्रोफोनको प्रयोग गर्दै छ।"</string> + <string name="appops_camera_mic_overlay" msgid="5584311236445644095">"यो अनुप्रयोगले तपाईंको स्क्रिनका अन्य अनुप्रयोगहरूमाथि प्रदर्शन गर्नुका साथै माइक्रोफोन र क्यामेराको प्रयोग गर्दै छ।"</string> <string name="notification_appops_settings" msgid="5208974858340445174">"सेटिङहरू"</string> <string name="notification_appops_ok" msgid="2177609375872784124">"ठिक छ"</string> <string name="notification_channel_controls_opened_accessibility" msgid="6111817750774381094">"<xliff:g id="APP_NAME">%1$s</xliff:g> का सूचना सम्बन्धी नियन्त्रणहरूलाई खोलियो"</string> @@ -1017,7 +1017,7 @@ <string name="priority_onboarding_title" msgid="2893070698479227616">"वार्तालापको प्राथमिकता निर्धारण गरी \"महत्त्वपूर्ण\" बनाइयो"</string> <string name="priority_onboarding_behavior" msgid="5342816047020432929">"महत्वपूर्ण वार्तालापहरू:"</string> <string name="priority_onboarding_show_at_top_text" msgid="1678400241025513541">"वार्तालाप खण्डको सिरानमा देखिने छन्"</string> - <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लक स्क्रिनमा प्रोफाइल फोटो देखाउने छन्"</string> + <string name="priority_onboarding_show_avatar_text" msgid="5756291381124091508">"लक स्क्रिनमा प्रोफाइल तस्बिर देखाउने छन्"</string> <string name="priority_onboarding_appear_as_bubble_text" msgid="4227039772250263122">"एपहरूमाथि तैरिने बबलका रूपमा देखाइयोस्"</string> <string name="priority_onboarding_ignores_dnd_text" msgid="2918952762719600529">"बाधा नपुऱ्याउनुहोस् मोडलाई बेवास्ता गरियोस्"</string> <string name="priority_onboarding_done_button_title" msgid="4569550984286506007">"बुझेँ"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index a65794b839bd..4e30fc50a52b 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -354,7 +354,7 @@ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="780333390310051161">"Audio"</string> <string name="quick_settings_bluetooth_secondary_label_headset" msgid="2332093067553000852">"Headset"</string> <string name="quick_settings_bluetooth_secondary_label_input" msgid="3887552721233148132">"Invoer"</string> - <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"Hoortoestellen"</string> + <string name="quick_settings_bluetooth_secondary_label_hearing_aids" msgid="3003338571871392293">"Gehoorapparaten"</string> <string name="quick_settings_bluetooth_secondary_label_transient" msgid="3882884317600669650">"Inschakelen..."</string> <string name="quick_settings_brightness_label" msgid="680259653088849563">"Helderheid"</string> <string name="quick_settings_rotation_unlocked_label" msgid="2359922767950346112">"Automatisch draaien"</string> @@ -392,7 +392,7 @@ <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Kleuren omkeren"</string> <string name="quick_settings_color_space_label" msgid="537528291083575559">"Modus voor kleurcorrectie"</string> <string name="quick_settings_more_settings" msgid="2878235926753776694">"Meer instellingen"</string> - <string name="quick_settings_done" msgid="2163641301648855793">"Klaar"</string> + <string name="quick_settings_done" msgid="2163641301648855793">"Gereed"</string> <string name="quick_settings_connected" msgid="3873605509184830379">"Verbonden"</string> <string name="quick_settings_connected_battery_level" msgid="1322075669498906959">"Verbonden, batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> <string name="quick_settings_connecting" msgid="2381969772953268809">"Verbinding maken…"</string> @@ -694,7 +694,7 @@ <string name="notification_channel_silenced" msgid="1995937493874511359">"Deze meldingen worden zonder geluid weergegeven"</string> <string name="notification_channel_unsilenced" msgid="94878840742161152">"Deze meldingen stellen je op de hoogte"</string> <string name="inline_blocking_helper" msgid="2891486013649543452">"Meestal sluit je deze meldingen. \nWil je ze blijven weergeven?"</string> - <string name="inline_done_button" msgid="6043094985588909584">"Klaar"</string> + <string name="inline_done_button" msgid="6043094985588909584">"Gereed"</string> <string name="inline_ok_button" msgid="603075490581280343">"Toepassen"</string> <string name="inline_keep_showing" msgid="8736001253507073497">"Deze meldingen blijven weergeven?"</string> <string name="inline_stop_button" msgid="2453460935438696090">"Meldingen stoppen"</string> @@ -712,11 +712,11 @@ <string name="notification_alert_title" msgid="3656229781017543655">"Standaard"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"Bubbel"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Geen geluid of trilling"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Geen geluid of trilling en wordt lager in het gedeelte met gesprekken weergegeven"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"Geen geluid of trilling en wordt op een lagere positie in het gedeelte met gesprekken weergegeven"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"Kan overgaan of trillen op basis van de telefooninstellingen"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Kan overgaan of trillen op basis van de telefooninstellingen. Gesprekken uit <xliff:g id="APP_NAME">%1$s</xliff:g> worden standaard als bubbels weergegeven."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Trekt de aandacht met een zwevende snelkoppeling naar deze content."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wordt bovenaan het gespreksgedeelte weergegeven, verschijnt als zwevende bubbel, geeft profielfoto weer op vergrendelscherm"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Wordt bovenaan het gedeelte met gesprekken weergegeven, verschijnt als zwevende bubbel, geeft de profielfoto weer op het vergrendelscherm"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Instellingen"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioriteit"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ondersteunt geen gespreksfuncties"</string> @@ -741,7 +741,7 @@ <string name="notification_channel_switch_accessibility" msgid="8979885820432540252">"Meldingen van dit kanaal toestaan"</string> <string name="notification_more_settings" msgid="4936228656989201793">"Meer instellingen"</string> <string name="notification_app_settings" msgid="8963648463858039377">"Aanpassen"</string> - <string name="notification_done" msgid="6215117625922713976">"Klaar"</string> + <string name="notification_done" msgid="6215117625922713976">"Gereed"</string> <string name="inline_undo" msgid="9026953267645116526">"Ongedaan maken"</string> <string name="demote" msgid="6225813324237153980">"Deze melding markeren als geen gesprek"</string> <string name="notification_conversation_favorite" msgid="1905240206975921907">"Belangrijk gesprek"</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 9527c3fab912..c35b22a8c175 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -125,7 +125,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"ଆକ୍ସେସିବିଲିଟୀ"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"ସ୍କ୍ରୀନ୍କୁ ଘୁରାନ୍ତୁ"</string> <string name="accessibility_recent" msgid="901641734769533575">"ଓଭରଭିଉ"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"Search"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"କ୍ୟାମେରା"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ଫୋନ୍"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"ଭଏସ୍ ସହାୟକ"</string> @@ -441,7 +441,7 @@ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବାକୁ ଆଉ <xliff:g id="CHARGING_TIME">%s</xliff:g> ଅଛି"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"ଚାର୍ଜ ହେଉନାହିଁ"</string> <string name="ssl_ca_cert_warning" msgid="8373011375250324005">"ନେଟ୍ୱର୍କ\nମନିଟର୍ କରାଯାଇପାରେ"</string> - <string name="description_target_search" msgid="3875069993128855865">"Search"</string> + <string name="description_target_search" msgid="3875069993128855865">"ସର୍ଚ୍ଚ"</string> <string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ଉପରକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ।"</string> <string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ବାମକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ"</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"ଆଲାର୍ମ, ରିମାଇଣ୍ଡର୍, ଇଭେଣ୍ଟ ଏବଂ ଆପଣ ନିର୍ଦ୍ଦିଷ୍ଟ କରିଥିବା କଲର୍ଙ୍କ ବ୍ୟତୀତ ଆପଣଙ୍କ ଧ୍ୟାନ ଅନ୍ୟ କୌଣସି ଧ୍ୱନୀ ଏବଂ ଭାଇବ୍ରେଶନ୍ରେ ଆକର୍ଷଣ କରାଯିବନାହିଁ। ମ୍ୟୁଜିକ୍, ଭିଡିଓ ଏବଂ ଗେମ୍ ସମେତ ନିଜେ ଚଲାଇବାକୁ ବାଛିଥିବା ଅନ୍ୟ ସବୁକିଛି ଆପଣ ଶୁଣିପାରିବେ।"</string> @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"ଫୋନ୍ ସେଟିଂସ୍ ଆଧାରରେ ରିଙ୍ଗ କିମ୍ବା ଭାଇବ୍ରେଟ୍ ହୋଇପାରେ"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"ଫୋନ୍ ସେଟିଂସ୍ ଆଧାରରେ ରିଙ୍ଗ କିମ୍ବା ଭାଇବ୍ରେଟ୍ ହୋଇପାରେ। <xliff:g id="APP_NAME">%1$s</xliff:g>ରୁ ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ ଡିଫଲ୍ଟ ଭାବରେ ବବଲ୍ ହୁଏ।"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"ଏହି ବିଷୟବସ୍ତୁ ପାଇଁ ଏକ ଭାସମାନ ସର୍ଟକଟ୍ ସହ ଆପଣଙ୍କର ଧ୍ୟାନ ଦିଅନ୍ତୁ।"</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାଏ, ଫ୍ଲୋଟିଂ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଡିସପ୍ଲେ କରେ"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"ବାର୍ତ୍ତାଳାପ ବିଭାଗର ଶୀର୍ଷରେ ଦେଖାଏ, ଭାସମାନ ବବଲ୍ ଭାବେ ଦେଖାଯାଏ, ଲକ୍ ସ୍କ୍ରିନରେ ପ୍ରୋଫାଇଲ୍ ଛବି ଡିସପ୍ଲେ କରେ"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"ସେଟିଂସ୍"</string> <string name="notification_priority_title" msgid="2079708866333537093">"ପ୍ରାଥମିକତା"</string> <string name="no_shortcut" msgid="8257177117568230126">"<xliff:g id="APP_NAME">%1$s</xliff:g> ବାର୍ତ୍ତାଳାପ ଫିଚରଗୁଡ଼ିକୁ ସମର୍ଥନ କରେ ନାହିଁ"</string> @@ -855,7 +855,7 @@ <string name="right_keycode" msgid="2480715509844798438">"ଡାହାଣ କୀ\'କୋଡ୍"</string> <string name="left_icon" msgid="5036278531966897006">"ବାମ ଆଇକନ୍"</string> <string name="right_icon" msgid="1103955040645237425">"ଡାହାଣ ଆଇକନ୍"</string> - <string name="drag_to_add_tiles" msgid="8933270127508303672">"ଟାଇଲ୍ ଯୋଗ କରିବା ପାଇଁ ଦାବିଧରି ଟାଣନ୍ତୁ"</string> + <string name="drag_to_add_tiles" msgid="8933270127508303672">"ଟାଇଲ୍ ଯୋଡ଼ିବା ପାଇଁ ଦାବିଧରି ଟାଣନ୍ତୁ"</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"ଟାଇଲ୍ ପୁଣି ସଜାଇବାକୁ ଦାବିଧରି ଟାଣନ୍ତୁ"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"ବାହାର କରିବାକୁ ଏଠାକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"ଆପଣଙ୍କର ଅତିକମ୍ରେ <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g>ଟି ଟାଇଲ୍ ଆବଶ୍ୟକ"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index badaf47e778d..4449ca730245 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -1014,7 +1014,7 @@ <string name="bubble_accessibility_action_move_bottom_left" msgid="6339015902495504715">"Przenieś w lewy dolny róg"</string> <string name="bubble_accessibility_action_move_bottom_right" msgid="7471571700628346212">"Przenieś w prawy dolny róg"</string> <string name="bubble_dismiss_text" msgid="1314082410868930066">"Zamknij dymek"</string> - <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"Nie wyświetlaj rozmowy jako dymka"</string> + <string name="bubbles_dont_bubble_conversation" msgid="1033040343437428822">"Nie wyświetlaj rozmowy jako dymku"</string> <string name="bubbles_user_education_title" msgid="5547017089271445797">"Czatuj, korzystając z dymków"</string> <string name="bubbles_user_education_description" msgid="1160281719576715211">"Nowe rozmowy będą wyświetlane jako pływające ikony lub dymki. Kliknij, by otworzyć dymek. Przeciągnij, by go przenieść."</string> <string name="bubbles_user_education_manage_title" msgid="2848511858160342320">"Zarządzaj dymkami w dowolnym momencie"</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index aa92135056a3..b0c8e76d3284 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Economia de bateria ativada"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduz o desempenho e os dados em segundo plano"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Desativar a Economia de bateria"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"O app <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> terá acesso a todas as informações visíveis na tela ou tocadas no dispositivo, como gravação ou transmissão. Isso inclui informações como senhas, detalhes de pagamento, fotos, mensagens e o áudio que você tocar."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"O app <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> terá acesso a todas as informações visíveis na tela ou tocadas no dispositivo, como gravação ou transmissão Isso inclui informações como senhas, detalhes de pagamento, fotos, mensagens e áudio que você toca."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"O serviço que oferece essa função terá acesso a todas as informações visíveis na tela ou reproduzidas durante uma gravação ou transmissão. Isso inclui senhas, detalhes de pagamento, fotos, mensagens e áudio."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Iniciar gravação ou transmissão?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Iniciar gravação ou transmissão com o app <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> @@ -713,12 +713,12 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"Bolha"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Som e vibração desativados"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"O som e a vibração estão desativados, e o balão aparece na parte inferior da seção de conversa"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Podem vibrar ou tocar com base nas configurações do smartphone"</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Pode vibrar ou tocar com base nas configurações do smartphone"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Pode vibrar ou tocar com base nas configurações do smartphone. As conversas do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem em balões por padrão."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparecem na parte superior de uma seção de conversa, em forma de balões, mostrando a foto do perfil na tela de bloqueio"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior de uma seção de conversa, em forma de balão, mostrando a foto do perfil na tela de bloqueio"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string> - <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 8ea6d4553a17..fcd12c6f28d1 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Pode tocar ou vibrar com base nas definições do telemóvel."</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Pode tocar ou vibrar com base nas definições do telemóvel. As conversas da app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem como um balão por predefinição."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém a sua atenção com um atalho flutuante para este conteúdo."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece no topo da secção de conversas, surge como balão flutuante e apresenta a imagem do perfil no ecrã de bloqueio."</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior da secção de conversas, surge como um balão flutuante e apresenta a imagem do perfil no ecrã de bloqueio."</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Definições"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> <string name="no_shortcut" msgid="8257177117568230126">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> não suporta funcionalidades de conversa."</string> @@ -855,7 +855,7 @@ <string name="right_keycode" msgid="2480715509844798438">"Código de tecla direito"</string> <string name="left_icon" msgid="5036278531966897006">"Ícone esquerdo"</string> <string name="right_icon" msgid="1103955040645237425">"Ícone direito"</string> - <string name="drag_to_add_tiles" msgid="8933270127508303672">"Tocar sem soltar e arrastar para adicionar mosaicos"</string> + <string name="drag_to_add_tiles" msgid="8933270127508303672">"Toque sem soltar e arraste para adicionar mosaicos."</string> <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"Tocar sem soltar e arrastar para reorganizar os mosaicos"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"Arrastar para aqui para remover"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"Necessita de, pelo menos, <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> cartões"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index aa92135056a3..b0c8e76d3284 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Economia de bateria ativada"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Reduz o desempenho e os dados em segundo plano"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Desativar a Economia de bateria"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"O app <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> terá acesso a todas as informações visíveis na tela ou tocadas no dispositivo, como gravação ou transmissão. Isso inclui informações como senhas, detalhes de pagamento, fotos, mensagens e o áudio que você tocar."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"O app <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> terá acesso a todas as informações visíveis na tela ou tocadas no dispositivo, como gravação ou transmissão Isso inclui informações como senhas, detalhes de pagamento, fotos, mensagens e áudio que você toca."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"O serviço que oferece essa função terá acesso a todas as informações visíveis na tela ou reproduzidas durante uma gravação ou transmissão. Isso inclui senhas, detalhes de pagamento, fotos, mensagens e áudio."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Iniciar gravação ou transmissão?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Iniciar gravação ou transmissão com o app <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> @@ -713,12 +713,12 @@ <string name="notification_bubble_title" msgid="8330481035191903164">"Bolha"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"Som e vibração desativados"</string> <string name="notification_conversation_summary_low" msgid="1734433426085468009">"O som e a vibração estão desativados, e o balão aparece na parte inferior da seção de conversa"</string> - <string name="notification_channel_summary_default" msgid="3282930979307248890">"Podem vibrar ou tocar com base nas configurações do smartphone"</string> + <string name="notification_channel_summary_default" msgid="3282930979307248890">"Pode vibrar ou tocar com base nas configurações do smartphone"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Pode vibrar ou tocar com base nas configurações do smartphone. As conversas do app <xliff:g id="APP_NAME">%1$s</xliff:g> aparecem em balões por padrão."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Mantém sua atenção com um atalho flutuante para esse conteúdo."</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparecem na parte superior de uma seção de conversa, em forma de balões, mostrando a foto do perfil na tela de bloqueio"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Aparece na parte superior de uma seção de conversa, em forma de balão, mostrando a foto do perfil na tela de bloqueio"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Configurações"</string> - <string name="notification_priority_title" msgid="2079708866333537093">"Prioritárias"</string> + <string name="notification_priority_title" msgid="2079708866333537093">"Prioridade"</string> <string name="no_shortcut" msgid="8257177117568230126">"O app <xliff:g id="APP_NAME">%1$s</xliff:g> não é compatível com recursos de conversa"</string> <string name="bubble_overflow_empty_title" msgid="3120029421991510842">"Nenhum balão recente"</string> <string name="bubble_overflow_empty_subtitle" msgid="2030874469510497397">"Os balões recentes e dispensados aparecerão aqui"</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index d2e888668c69..0a345004aa9d 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -722,7 +722,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"Звонок или вибрация в зависимости от настроек телефона"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"Звонок или вибрация в зависимости от настроек телефона. Разговоры из приложения \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" по умолчанию появляются в виде всплывающего чата."</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"Привлекает ваше внимание к контенту с помощью плавающего ярлыка"</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Появляется в верхней части списка разговоров и как всплывающий чат, фото профиля показывается на заблок. экране"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"Появляется в верхней части списка разговоров и как всплывающий чат, а также показывает фото профиля на заблокированном экране"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"Настройки"</string> <string name="notification_priority_title" msgid="2079708866333537093">"Приоритет"</string> <string name="no_shortcut" msgid="8257177117568230126">"Приложение \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" не поддерживает функции разговоров."</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index e1f6fc7bdd14..2d01f930af15 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -95,7 +95,7 @@ <string name="screenrecord_description" msgid="1123231719680353736">"Med snemanjem lahko sistem Android zajame morebitne občutljive podatke, ki so prikazani na zaslonu ali se predvajajo v napravi. To vključuje gesla, podatke za plačilo, fotografije, sporočila in zvok."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Snemanje zvoka"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Zvok v napravi"</string> - <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvoki v napravi, kot so glasba, klici in toni zvonjenja"</string> + <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Zvok v napravi, kot so glasba, klici in toni zvonjenja"</string> <string name="screenrecord_mic_label" msgid="2111264835791332350">"Mikrofon"</string> <string name="screenrecord_device_audio_and_mic_label" msgid="1831323771978646841">"Zvok v napravi in mikrofon"</string> <string name="screenrecord_start" msgid="330991441575775004">"Začni"</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 1f4b7cd0788d..6a877939e9e4 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -116,7 +116,7 @@ <string name="screenrecord_permission_error" msgid="7856841237023137686">"Marrja e lejeve dështoi"</string> <string name="screenrecord_start_error" msgid="2200660692479682368">"Gabim gjatë nisjes së regjistrimit të ekranit"</string> <string name="usb_preference_title" msgid="1439924437558480718">"Opsionet e transferimit të dosjeve të USB-së"</string> - <string name="use_mtp_button_title" msgid="5036082897886518086">"Lidh si një luajtës të medias (MTP)"</string> + <string name="use_mtp_button_title" msgid="5036082897886518086">"Lidh si një lexues \"media\" (MTP)"</string> <string name="use_ptp_button_title" msgid="7676427598943446826">"Montoje si kamerë (PTP)"</string> <string name="installer_cd_button_title" msgid="5499998592841984743">"Instalo \"Transferimi i skedarëve të Android\" për Mac"</string> <string name="accessibility_back" msgid="6530104400086152611">"Prapa"</string> @@ -248,7 +248,7 @@ <string name="accessibility_remove_notification" msgid="1641455251495815527">"Pastro njoftimin."</string> <string name="accessibility_gps_enabled" msgid="4061313248217660858">"GPS-ja është e aktivizuar."</string> <string name="accessibility_gps_acquiring" msgid="896207402196024040">"Po siguron GPS-në."</string> - <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Teletajpi është i aktivizuar."</string> + <string name="accessibility_tty_enabled" msgid="1123180388823381118">"Teleprinteri është i aktivizuar."</string> <string name="accessibility_ringer_vibrate" msgid="6261841170896561364">"Zile me dridhje."</string> <string name="accessibility_ringer_silent" msgid="8994620163934249882">"Zilja është heshtur."</string> <!-- no translation found for accessibility_casting (8708751252897282313) --> @@ -482,7 +482,7 @@ <string name="guest_wipe_session_title" msgid="7147965814683990944">"Mirë se erdhe, i ftuar!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"Dëshiron ta vazhdosh sesionin tënd?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Fillo nga e para"</string> - <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Po, vazhdo"</string> + <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Po, vazhdo!"</string> <string name="guest_notification_title" msgid="4434456703930764167">"Përdorues vizitor"</string> <string name="guest_notification_text" msgid="4202692942089571351">"Për të fshirë aplikacionet dhe të dhënat, hiqe përdoruesin vizitor"</string> <string name="guest_notification_remove_action" msgid="4153019027696868099">"HIQ VIZITORIN"</string> @@ -502,8 +502,8 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"\"Kursyesi i baterisë\" është i aktivizuar"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Pakëson veprimtarinë dhe të dhënat në sfond"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Çaktivizo \"Kursyesin e baterisë\""</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> do të ketë qasje te të gjitha informacionet që janë të dukshme në ekran ose që luhen nga pajisja jote gjatë regjistrimit ose transmetimit. Kjo përfshin informacione, si p.sh.: fjalëkalimet, detajet e pagesave, fotografitë, mesazhet dhe audion që luan ti."</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Shërbimi që e ofron këtë funksion do të ketë qasje te të gjitha informacionet që janë të dukshme në ekran ose që luhen nga pajisja jote gjatë regjistrimit ose transmetimit. Kjo përfshin informacione, si p.sh.: fjalëkalimet, detajet e pagesave, fotografitë, mesazhet dhe audion që luan ti."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> do të ketë qasje te të gjitha informacionet që janë të dukshme në ekran ose që luhen nga pajisja jote gjatë regjistrimit ose transmetimit. Kjo përfshin informacione si p.sh. fjalëkalimet, detajet e pagesave, fotografitë, mesazhet dhe audion që luan ti."</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Shërbimi që e ofron këtë funksion do të ketë qasje te të gjitha informacionet që janë të dukshme në ekran ose që luhen nga pajisja jote gjatë regjistrimit ose transmetimit. Kjo përfshin informacione si p.sh. fjalëkalimet, detajet e pagesave, fotografitë, mesazhet dhe audion që luan ti."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Do të fillosh regjistrimin ose transmetimin?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Fillo regjistrimin ose transmetimin me <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"Mos e shfaq sërish"</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 61a230323f89..7091fe9d1d00 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -38,7 +38,7 @@ <string name="battery_saver_confirmation_ok" msgid="5042136476802816494">"Укључи"</string> <string name="battery_saver_start_action" msgid="4553256017945469937">"Укључи Уштеду батерије"</string> <string name="status_bar_settings_settings_button" msgid="534331565185171556">"Подешавања"</string> - <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"WiFi"</string> + <string name="status_bar_settings_wifi_button" msgid="7243072479837270946">"Wi-Fi"</string> <string name="status_bar_settings_auto_rotation" msgid="8329080442278431708">"Аутоматско ротирање екрана"</string> <string name="status_bar_settings_mute_label" msgid="914392730086057522">"УГАСИ"</string> <string name="status_bar_settings_auto_brightness_label" msgid="2151934479226017725">"АУТОM."</string> @@ -226,7 +226,7 @@ <string name="data_connection_cdma" msgid="7678457855627313518">"1X"</string> <string name="data_connection_roaming" msgid="375650836665414797">"Роминг"</string> <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string> - <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"WiFi"</string> + <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string> <string name="accessibility_no_sim" msgid="1140839832913084973">"Нема SIM картице."</string> <string name="accessibility_cell_data" msgid="172950885786007392">"Мобилни подаци"</string> <string name="accessibility_cell_data_on" msgid="691666434519443162">"Мобилни подаци су укључени"</string> @@ -265,8 +265,8 @@ <string name="accessibility_desc_work_lock" msgid="4355620395354680575">"Закључан екран за посао"</string> <string name="accessibility_desc_close" msgid="8293708213442107755">"Затвори"</string> <string name="accessibility_quick_settings_wifi" msgid="167707325133803052">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> - <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"WiFi је искључен."</string> - <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"WiFi је укључен."</string> + <string name="accessibility_quick_settings_wifi_changed_off" msgid="2230487165558877262">"Wi-Fi је искључен."</string> + <string name="accessibility_quick_settings_wifi_changed_on" msgid="1490362586009027611">"Wi-Fi је укључен."</string> <string name="accessibility_quick_settings_mobile" msgid="1817825313718492906">"Мобилна мрежа: <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> <string name="accessibility_quick_settings_battery" msgid="533594896310663853">"Батерија: <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_airplane_off" msgid="1275658769368793228">"Режим рада у авиону је искључен."</string> @@ -375,19 +375,19 @@ <string name="quick_settings_user_label" msgid="1253515509432672496">"Ја"</string> <string name="quick_settings_user_title" msgid="8673045967216204537">"Корисник"</string> <string name="quick_settings_user_new_user" msgid="3347905871336069666">"Нови корисник"</string> - <string name="quick_settings_wifi_label" msgid="2879507532983487244">"WiFi"</string> + <string name="quick_settings_wifi_label" msgid="2879507532983487244">"Wi-Fi"</string> <string name="quick_settings_wifi_not_connected" msgid="4071097522427039160">"Веза није успостављена"</string> <string name="quick_settings_wifi_no_network" msgid="6003178398713839313">"Нема мреже"</string> - <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"WiFi је искључен"</string> - <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"WiFi је укључен"</string> - <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Није доступна ниједна WiFi мрежа"</string> + <string name="quick_settings_wifi_off_label" msgid="4003379736176547594">"Wi-Fi је искључен"</string> + <string name="quick_settings_wifi_on_label" msgid="2489928193654318511">"Wi-Fi је укључен"</string> + <string name="quick_settings_wifi_detail_empty_text" msgid="483130889414601732">"Није доступна ниједна Wi-Fi мрежа"</string> <string name="quick_settings_wifi_secondary_label_transient" msgid="7501659015509357887">"Укључује се..."</string> <string name="quick_settings_cast_title" msgid="2279220930629235211">"Пребацивање екрана"</string> <string name="quick_settings_casting" msgid="1435880708719268055">"Пребацивање"</string> <string name="quick_settings_cast_device_default_name" msgid="6988469571141331700">"Неименовани уређај"</string> <string name="quick_settings_cast_device_default_description" msgid="2580520859212250265">"Спремно за пребацивање"</string> <string name="quick_settings_cast_detail_empty_text" msgid="2846282280014617785">"Није доступан ниједан уређај"</string> - <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"WiFi није повезан"</string> + <string name="quick_settings_cast_no_wifi" msgid="6980194769795014875">"Wi-Fi није повезан"</string> <string name="quick_settings_brightness_dialog_title" msgid="4980669966716685588">"Осветљеност"</string> <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="2325362583903258677">"АУТОМАТСКА"</string> <string name="quick_settings_inversion_label" msgid="5078769633069667698">"Обрни боје"</string> @@ -643,8 +643,8 @@ <string name="output_none_found" msgid="5488087293120982770">"Није пронађен ниједан уређај"</string> <string name="output_none_found_service_off" msgid="935667567681386368">"Није пронађен ниједан уређај. Пробајте да укључите услугу <xliff:g id="SERVICE">%1$s</xliff:g>"</string> <string name="output_service_bt" msgid="4315362133973911687">"Bluetooth"</string> - <string name="output_service_wifi" msgid="9003667810868222134">"WiFi"</string> - <string name="output_service_bt_wifi" msgid="7186882540475524124">"Bluetooth и WiFi"</string> + <string name="output_service_wifi" msgid="9003667810868222134">"Wi-Fi"</string> + <string name="output_service_bt_wifi" msgid="7186882540475524124">"Bluetooth и Wi-Fi"</string> <string name="system_ui_tuner" msgid="1471348823289954729">"Тјунер за кориснички интерфејс система"</string> <string name="show_battery_percentage" msgid="6235377891802910455">"Приказуј уграђени проценат батерије"</string> <string name="show_battery_percentage_summary" msgid="9053024758304102915">"Приказивање нивоа напуњености батерије у процентима унутар иконе на статусној траци када се батерија не пуни"</string> @@ -964,7 +964,7 @@ <string name="mobile_data" msgid="4564407557775397216">"Мобилни подаци"</string> <string name="mobile_data_text_format" msgid="6806501540022589786">"<xliff:g id="ID_1">%1$s</xliff:g> – <xliff:g id="ID_2">%2$s</xliff:g>"</string> <string name="mobile_carrier_text_format" msgid="8912204177152950766">"<xliff:g id="CARRIER_NAME">%1$s</xliff:g>, <xliff:g id="MOBILE_DATA_TYPE">%2$s</xliff:g>"</string> - <string name="wifi_is_off" msgid="5389597396308001471">"WiFi је искључен"</string> + <string name="wifi_is_off" msgid="5389597396308001471">"Wi-Fi је искључен"</string> <string name="bt_is_off" msgid="7436344904889461591">"Bluetooth је искључен"</string> <string name="dnd_is_off" msgid="3185706903793094463">"Режим Не узнемиравај је искључен"</string> <string name="qs_dnd_prompt_auto_rule" msgid="3535469468310002616">"Аутоматско правило (<xliff:g id="ID_1">%s</xliff:g>) је укључило режим Не узнемиравај."</string> @@ -976,7 +976,7 @@ <string name="running_foreground_services_title" msgid="5137313173431186685">"Апликације покренуте у позадини"</string> <string name="running_foreground_services_msg" msgid="3009459259222695385">"Додирните за детаље о батерији и потрошњи података"</string> <string name="mobile_data_disable_title" msgid="5366476131671617790">"Желите да искључите мобилне податке?"</string> - <string name="mobile_data_disable_message" msgid="8604966027899770415">"Нећете имати приступ подацима или интернету преко мобилног оператера <xliff:g id="CARRIER">%s</xliff:g>. Интернет ће бити доступан само преко WiFi везе."</string> + <string name="mobile_data_disable_message" msgid="8604966027899770415">"Нећете имати приступ подацима или интернету преко мобилног оператера <xliff:g id="CARRIER">%s</xliff:g>. Интернет ће бити доступан само преко Wi-Fi везе."</string> <string name="mobile_data_disable_message_default_carrier" msgid="6496033312431658238">"мобилни оператер"</string> <string name="touch_filtered_warning" msgid="8119511393338714836">"Подешавања не могу да верификују ваш одговор јер апликација скрива захтев за дозволу."</string> <string name="slice_permission_title" msgid="3262615140094151017">"Желите ли да дозволите апликацији <xliff:g id="APP_0">%1$s</xliff:g> да приказује исечке из апликације <xliff:g id="APP_2">%2$s</xliff:g>?"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index f972a687b40f..addc1b432e86 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -125,7 +125,7 @@ <string name="accessibility_accessibility_button" msgid="4089042473497107709">"యాక్సెస్ సామర్థ్యం"</string> <string name="accessibility_rotate_button" msgid="1238584767612362586">"స్క్రీన్ను తిప్పండి"</string> <string name="accessibility_recent" msgid="901641734769533575">"ఓవర్వ్యూ"</string> - <string name="accessibility_search_light" msgid="524741790416076988">"సెర్చ్"</string> + <string name="accessibility_search_light" msgid="524741790416076988">"వెతుకు"</string> <string name="accessibility_camera_button" msgid="2938898391716647247">"కెమెరా"</string> <string name="accessibility_phone_button" msgid="4256353121703100427">"ఫోన్"</string> <string name="accessibility_voice_assist_button" msgid="6497706615649754510">"వాయిస్ అసిస్టెంట్"</string> @@ -441,7 +441,7 @@ <string name="expanded_header_battery_charging_with_time" msgid="757991461445765011">"పూర్తిగా నిండటానికి <xliff:g id="CHARGING_TIME">%s</xliff:g>"</string> <string name="expanded_header_battery_not_charging" msgid="809409140358955848">"ఛార్జ్ కావడం లేదు"</string> <string name="ssl_ca_cert_warning" msgid="8373011375250324005">"నెట్వర్క్\nపర్యవేక్షించబడవచ్చు"</string> - <string name="description_target_search" msgid="3875069993128855865">"సెర్చ్"</string> + <string name="description_target_search" msgid="3875069993128855865">"శోధించండి"</string> <string name="description_direction_up" msgid="3632251507574121434">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం పైకి స్లైడ్ చేయండి."</string> <string name="description_direction_left" msgid="4762708739096907741">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> కోసం ఎడమవైపుకు స్లైడ్ చేయండి."</string> <string name="zen_priority_introduction" msgid="3159291973383796646">"మీరు పేర్కొనే అలారాలు, రిమైండర్లు, ఈవెంట్లు మరియు కాలర్ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు. మీరు ఇప్పటికీ సంగీతం, వీడియోలు మరియు గేమ్లతో సహా మీరు ప్లే చేయడానికి ఎంచుకున్నవి ఏవైనా వింటారు."</string> @@ -695,7 +695,7 @@ <string name="notification_channel_unsilenced" msgid="94878840742161152">"ఈ నోటిఫికేషన్లు మిమ్మల్ని హెచ్చరిస్తాయి"</string> <string name="inline_blocking_helper" msgid="2891486013649543452">"మీరు సాధారణంగా ఈ నోటిఫికేషన్లను విస్మరిస్తారు. \nవాటి ప్రదర్శనను కొనసాగించాలా?"</string> <string name="inline_done_button" msgid="6043094985588909584">"పూర్తయింది"</string> - <string name="inline_ok_button" msgid="603075490581280343">"అప్లయి చేయి"</string> + <string name="inline_ok_button" msgid="603075490581280343">"అప్లై చేయి"</string> <string name="inline_keep_showing" msgid="8736001253507073497">"ఈ నోటిఫికేషన్లను చూపిస్తూ ఉండాలా?"</string> <string name="inline_stop_button" msgid="2453460935438696090">"నోటిఫికేషన్లను ఆపివేయి"</string> <string name="inline_deliver_silently_button" msgid="2714314213321223286">"నిశ్శబ్దంగా బట్వాడా చేయండి"</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index a1c740ef8e8c..71679bedd209 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -92,7 +92,7 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"กำลังประมวลผลการอัดหน้าจอ"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"การแจ้งเตือนต่อเนื่องสำหรับเซสชันการบันทึกหน้าจอ"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"เริ่มบันทึกเลยไหม"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"ขณะบันทึก ระบบ Android อาจบันทึกข้อมูลที่ละเอียดอ่อนซึ่งปรากฏบนหน้าจอหรือเล่นในอุปกรณ์ได้ ซึ่งรวมถึงรหัสผ่าน ข้อมูลการชำระเงิน รูปภาพ ข้อความ และเสียง"</string> + <string name="screenrecord_description" msgid="1123231719680353736">"ขณะบันทึก ระบบ Android อาจบันทึกข้อมูลที่ละเอียดอ่อนที่ปรากฏบนหน้าจอหรือเล่นในอุปกรณ์ได้ ซึ่งรวมถึงรหัสผ่าน ข้อมูลการชำระเงิน รูปภาพ ข้อความ และเสียง"</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"บันทึกเสียง"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"เสียงจากอุปกรณ์"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"เสียงจากอุปกรณ์ เช่น เพลง การโทร และเสียงเรียกเข้า"</string> @@ -339,7 +339,7 @@ <string name="accessibility_rotation_lock_on_landscape_changed" msgid="5785739044300729592">"ขณะนี้หน้าจอล็อกอยู่ในแนวนอน"</string> <string name="accessibility_rotation_lock_on_portrait_changed" msgid="5580170829728987989">"ขณะนี้หน้าจอล็อกอยู่ในแนวตั้ง"</string> <string name="dessert_case" msgid="9104973640704357717">"ชั้นแสดงของหวาน"</string> - <string name="start_dreams" msgid="9131802557946276718">"โปรแกรมรักษาจอภาพ"</string> + <string name="start_dreams" msgid="9131802557946276718">"โปรแกรมรักษาหน้าจอ"</string> <string name="ethernet_label" msgid="2203544727007463351">"อีเทอร์เน็ต"</string> <string name="quick_settings_header_onboarding_text" msgid="1918085351115504765">"แตะไอคอนค้างไว้เพื่อดูตัวเลือกอื่นๆ"</string> <string name="quick_settings_dnd_label" msgid="7728690179108024338">"ห้ามรบกวน"</string> @@ -511,7 +511,7 @@ <string name="manage_notifications_text" msgid="6885645344647733116">"จัดการ"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"ประวัติ"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"ใหม่"</string> - <string name="notification_section_header_gentle" msgid="6804099527336337197">"ปิดเสียง"</string> + <string name="notification_section_header_gentle" msgid="6804099527336337197">"เงียบ"</string> <string name="notification_section_header_alerting" msgid="5581175033680477651">"การแจ้งเตือน"</string> <string name="notification_section_header_conversations" msgid="821834744538345661">"การสนทนา"</string> <string name="accessibility_notification_section_header_gentle_clear_all" msgid="6490207897764933919">"ล้างการแจ้งเตือนแบบไม่มีเสียงทั้งหมด"</string> @@ -708,7 +708,7 @@ <string name="inline_silent_button_keep_alerting" msgid="6577845442184724992">"แจ้งเตือนต่อไป"</string> <string name="inline_turn_off_notifications" msgid="8543989584403106071">"ปิดการแจ้งเตือน"</string> <string name="inline_keep_showing_app" msgid="4393429060390649757">"แสดงการแจ้งเตือนจากแอปนี้ต่อไปไหม"</string> - <string name="notification_silence_title" msgid="8608090968400832335">"ปิดเสียง"</string> + <string name="notification_silence_title" msgid="8608090968400832335">"เงียบ"</string> <string name="notification_alert_title" msgid="3656229781017543655">"ค่าเริ่มต้น"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"บับเบิล"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"ไม่มีเสียงหรือการสั่น"</string> @@ -856,7 +856,7 @@ <string name="left_icon" msgid="5036278531966897006">"ไอคอนทางซ้าย"</string> <string name="right_icon" msgid="1103955040645237425">"ไอคอนทางขวา"</string> <string name="drag_to_add_tiles" msgid="8933270127508303672">"กดค้างแล้วลากเพื่อเพิ่มการ์ด"</string> - <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"กดค้างแล้วลากเพื่อจัดเรียงการ์ดใหม่"</string> + <string name="drag_to_rearrange_tiles" msgid="2143204300089638620">"กดการ์ดค้างไว้แล้วลากเพื่อจัดเรียงใหม่"</string> <string name="drag_to_remove_tiles" msgid="4682194717573850385">"ลากมาที่นี่เพื่อนำออก"</string> <string name="drag_to_remove_disabled" msgid="933046987838658850">"คุณต้องมีการ์ดอย่างน้อย <xliff:g id="MIN_NUM_TILES">%1$d</xliff:g> รายการ"</string> <string name="qs_edit" msgid="5583565172803472437">"แก้ไข"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 18891da5626d..4e3c42b68239 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -227,7 +227,7 @@ <string name="data_connection_roaming" msgid="375650836665414797">"Rouming"</string> <string name="data_connection_edge" msgid="6316755666481405762">"EDGE"</string> <string name="accessibility_data_connection_wifi" msgid="4422160347472742434">"Wi-Fi"</string> - <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM kartasiz."</string> + <string name="accessibility_no_sim" msgid="1140839832913084973">"SIM karta solinmagan."</string> <string name="accessibility_cell_data" msgid="172950885786007392">"Mobil internet"</string> <string name="accessibility_cell_data_on" msgid="691666434519443162">"Mobil internet yoniq"</string> <string name="cell_data_off_content_description" msgid="9165555931499878044">"Mobil internet yoqilmagan"</string> @@ -362,7 +362,7 @@ <string name="accessibility_quick_settings_rotation_value" msgid="2916484894750819251">"<xliff:g id="ID_1">%s</xliff:g> rejimi"</string> <string name="quick_settings_rotation_locked_label" msgid="4420863550666310319">"Aylanmaydigan qilingan"</string> <string name="quick_settings_rotation_locked_portrait_label" msgid="1194988975270484482">"Tik holat"</string> - <string name="quick_settings_rotation_locked_landscape_label" msgid="2000295772687238645">"Yotiq"</string> + <string name="quick_settings_rotation_locked_landscape_label" msgid="2000295772687238645">"Eniga"</string> <string name="quick_settings_ime_label" msgid="3351174938144332051">"Kiritish usuli"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"Joylashuv"</string> <string name="quick_settings_location_off_label" msgid="7923929131443915919">"Joylashuvni aniqlash xizmati yoqilmagan"</string> @@ -505,7 +505,7 @@ <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ekranda chiqqan yoki yozib olish va translatsiya vaqtida ijro etilgan barcha axborotlarga ruxsat oladi. Bu axborotlar parollar, toʻlov tafsilotlari, rasmlar, xabarlar va ijro etilgan audiolardan iborat boʻlishi mumkin."</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Bu funksiyani taʼminlovchi xizmat ekranda chiqqan yoki yozib olish va translatsiya vaqtida ijro etilgan barcha axborotlarga ruxsat oladi. Bu axborotlar parollar, toʻlov tafsilotlari, rasmlar, xabarlar va ijro etilgan audiolardan iborat boʻlishi mumkin."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Yozib olish yoki translatsiya boshlansinmi?"</string> - <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> orqali yozib olish yoki translatsiya boshlansinmi?"</string> + <string name="media_projection_dialog_title" msgid="3316063622495360646">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bilan yozib olinsin yoki translatsiya qilinsinmi?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"Boshqa ko‘rsatilmasin"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Hammasini tozalash"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Boshqarish"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 768bf980fa21..13fad5aa899a 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -502,8 +502,8 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"Trình tiết kiệm pin đang bật"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"Giảm hiệu suất và dữ liệu nền"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"Tắt trình tiết kiệm pin"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ có quyền truy cập vào tất cả các thông tin hiển thị trên màn hình của bạn hoặc phát trên thiết bị của bạn trong khi ghi âm/ghi hình hoặc truyền, bao gồm cả thông tin như mật khẩu, chi tiết thanh toán, ảnh, tin nhắn và âm thanh mà bạn phát."</string> - <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Dịch vụ cung cấp chức năng này có quyền truy cập vào tất cả các thông tin hiển thị trên màn hình của bạn hoặc phát trên thiết bị của bạn trong khi ghi âm/ghi hình hoặc truyền, bao gồm cả thông tin như mật khẩu, chi tiết thanh toán, ảnh, tin nhắn và âm thanh mà bạn phát."</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ có quyền truy cập vào tất cả các thông tin hiển thị trên màn hình của bạn hoặc phát từ thiết bị trong khi ghi âm/ghi hình hoặc truyền, bao gồm cả thông tin như mật khẩu, chi tiết thanh toán, ảnh, tin nhắn và âm thanh mà bạn phát."</string> + <string name="media_projection_dialog_service_text" msgid="958000992162214611">"Dịch vụ cung cấp chức năng này có quyền truy cập vào tất cả các thông tin hiển thị trên màn hình của bạn hoặc phát từ thiết bị trong khi ghi âm/ghi hình hoặc truyền, bao gồm cả thông tin như mật khẩu, chi tiết thanh toán, ảnh, tin nhắn và âm thanh mà bạn phát."</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"Bắt đầu ghi âm/ghi hình hoặc truyền?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"Bắt đầu ghi âm/ghi hình hoặc truyền bằng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>?"</string> <string name="media_projection_remember_text" msgid="6896767327140422951">"Không hiển thị lại"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index e1d398de89ce..dc59e7818749 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -716,7 +716,7 @@ <string name="notification_channel_summary_default" msgid="3282930979307248890">"可能會根據手機設定發出鈴聲或震動"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能會根據手機設定發出鈴聲或震動。「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會預設以對話氣泡顯示。"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"為此內容建立浮動捷徑以保持注意力。"</string> - <string name="notification_channel_summary_priority" msgid="7952654515769021553">"以浮動對話泡顯示在對話部分的頂部,並在上鎖畫面顯示個人檔案相片"</string> + <string name="notification_channel_summary_priority" msgid="7952654515769021553">"在對話部分的頂部以浮動對話氣泡顯示,並在上鎖畫面顯示個人檔案相片"</string> <string name="notification_conversation_channel_settings" msgid="2409977688430606835">"設定"</string> <string name="notification_priority_title" msgid="2079708866333537093">"重要"</string> <string name="no_shortcut" msgid="8257177117568230126">"「<xliff:g id="APP_NAME">%1$s</xliff:g>」不支援對話功能"</string> @@ -987,7 +987,7 @@ <string name="auto_saver_enabled_text" msgid="7889491183116752719">"省電模式將會在電量低於 <xliff:g id="PERCENTAGE">%d</xliff:g>%% 時自動開啟。"</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"設定"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"知道了"</string> - <string name="heap_dump_tile_name" msgid="2464189856478823046">"Dump SysUI Heap"</string> + <string name="heap_dump_tile_name" msgid="2464189856478823046">"轉儲 SysUI 堆"</string> <string name="sensor_privacy_mode" msgid="4462866919026513692">"感應器已關閉"</string> <string name="device_services" msgid="1549944177856658705">"裝置服務"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 7ecb7d231d35..79300ee29a67 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -502,7 +502,7 @@ <string name="battery_saver_notification_title" msgid="8419266546034372562">"省電模式已開啟"</string> <string name="battery_saver_notification_text" msgid="2617841636449016951">"降低效能並限制背景數據傳輸"</string> <string name="battery_saver_notification_action_text" msgid="6022091913807026887">"關閉省電模式"</string> - <string name="media_projection_dialog_text" msgid="1755705274910034772">"在錄製或投放內容時,<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>可存取畫面上顯示的任何資訊或裝置播放的任何內容,包括密碼、付款詳情、相片、訊息和你播放的音訊。"</string> + <string name="media_projection_dialog_text" msgid="1755705274910034772">"在錄製或投放內容時,「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」可存取畫面上顯示的任何資訊或裝置播放的任何內容,包括密碼、付款詳情、相片、訊息和你播放的音訊。"</string> <string name="media_projection_dialog_service_text" msgid="958000992162214611">"在錄製或投放內容時,提供這項功能的服務可存取畫面上顯示的任何資訊或裝置播放的任何內容,包括密碼、付款詳情、相片、訊息和你播放的音訊。"</string> <string name="media_projection_dialog_service_title" msgid="2888507074107884040">"要開始錄製或投放內容嗎?"</string> <string name="media_projection_dialog_title" msgid="3316063622495360646">"要使用「<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>」開始錄製或投放內容嗎?"</string> @@ -712,7 +712,7 @@ <string name="notification_alert_title" msgid="3656229781017543655">"預設"</string> <string name="notification_bubble_title" msgid="8330481035191903164">"泡泡"</string> <string name="notification_channel_summary_low" msgid="4860617986908931158">"不震動或發出聲音"</string> - <string name="notification_conversation_summary_low" msgid="1734433426085468009">"不震動或發出聲音,並調整排序到其他對話下方"</string> + <string name="notification_conversation_summary_low" msgid="1734433426085468009">"不震動或發出聲音,並顯示在對話部分的下方"</string> <string name="notification_channel_summary_default" msgid="3282930979307248890">"根據手機的設定響鈴或震動"</string> <string name="notification_channel_summary_default_with_bubbles" msgid="1782419896613644568">"可能會根據手機的設定響鈴或震動。根據預設,來自「<xliff:g id="APP_NAME">%1$s</xliff:g>」的對話會以對話框形式顯示。"</string> <string name="notification_channel_summary_bubble" msgid="7235935211580860537">"利用浮動式捷徑快速存取這項內容。"</string> @@ -987,7 +987,7 @@ <string name="auto_saver_enabled_text" msgid="7889491183116752719">"省電模式會在電量低於 <xliff:g id="PERCENTAGE">%d</xliff:g>%% 時自動開啟。"</string> <string name="open_saver_setting_action" msgid="2111461909782935190">"設定"</string> <string name="auto_saver_okay_action" msgid="7815925750741935386">"我知道了"</string> - <string name="heap_dump_tile_name" msgid="2464189856478823046">"Dump SysUI Heap"</string> + <string name="heap_dump_tile_name" msgid="2464189856478823046">"傾印 SysUI 記憶體快照"</string> <string name="sensor_privacy_mode" msgid="4462866919026513692">"已關閉感應器"</string> <string name="device_services" msgid="1549944177856658705">"裝置服務"</string> <string name="music_controls_no_title" msgid="4166497066552290938">"無標題"</string> diff --git a/packages/Tethering/Android.bp b/packages/Tethering/Android.bp deleted file mode 100644 index 12daa6142d5c..000000000000 --- a/packages/Tethering/Android.bp +++ /dev/null @@ -1,134 +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. -// - -java_defaults { - name: "TetheringAndroidLibraryDefaults", - sdk_version: "module_current", - srcs: [ - "src/**/*.java", - ":framework-tethering-shared-srcs", - ":tethering-module-utils-srcs", - ":services-tethering-shared-srcs", - ], - static_libs: [ - "androidx.annotation_annotation", - "netd_aidl_interface-java", - "netlink-client", - "networkstack-aidl-interfaces-java", - "android.hardware.tetheroffload.config-V1.0-java", - "android.hardware.tetheroffload.control-V1.0-java", - "net-utils-framework-common", - ], - libs: [ - "framework-statsd.stubs.module_lib", - "framework-tethering.impl", - "framework-wifi", - "unsupportedappusage", - ], - plugins: ["java_api_finder"], - manifest: "AndroidManifestBase.xml", -} - -// Build tethering static library, used to compile both variants of the tethering. -android_library { - name: "TetheringApiCurrentLib", - defaults: ["TetheringAndroidLibraryDefaults"], -} - -// Due to b/143733063, APK can't access a jni lib that is in APEX (but not in the APK). -cc_library { - name: "libtetherutilsjni", - sdk_version: "current", - apex_available: [ - "//apex_available:platform", // Used by InProcessTethering - "com.android.tethering", - ], - min_sdk_version: "current", - srcs: [ - "jni/android_net_util_TetheringUtils.cpp", - ], - shared_libs: [ - "liblog", - "libnativehelper_compat_libc++", - ], - - // We cannot use plain "libc++" here to link libc++ dynamically because it results in: - // java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found - // even if "libc++" is added into jni_libs below. Adding "libc++_shared" into jni_libs doesn't - // build because soong complains of: - // module Tethering missing dependencies: libc++_shared - // - // So, link libc++ statically. This means that we also need to ensure that all the C++ libraries - // we depend on do not dynamically link libc++. This is currently the case, because liblog is - // C-only and libnativehelper_compat_libc also uses stl: "c++_static". - stl: "c++_static", - - cflags: [ - "-Wall", - "-Werror", - "-Wno-unused-parameter", - "-Wthread-safety", - ], - - ldflags: ["-Wl,--exclude-libs=ALL,-error-limit=0"], -} - -// Common defaults for compiling the actual APK. -java_defaults { - name: "TetheringAppDefaults", - sdk_version: "module_current", - privileged: true, - jni_libs: [ - "libtetherutilsjni", - ], - resource_dirs: [ - "res", - ], - libs: [ - "framework-tethering", - ], - jarjar_rules: "jarjar-rules.txt", - optimize: { - proguard_flags_files: ["proguard.flags"], - }, -} - -// Non-updatable tethering running in the system server process for devices not using the module -android_app { - name: "InProcessTethering", - defaults: ["TetheringAppDefaults"], - static_libs: ["TetheringApiCurrentLib"], - certificate: "platform", - manifest: "AndroidManifest_InProcess.xml", - // InProcessTethering is a replacement for Tethering - overrides: ["Tethering"], - apex_available: ["com.android.tethering"], - min_sdk_version: "current", -} - -// Updatable tethering packaged as an application -android_app { - name: "Tethering", - defaults: ["TetheringAppDefaults"], - static_libs: ["TetheringApiCurrentLib"], - certificate: "networkstack", - manifest: "AndroidManifest.xml", - use_embedded_native_libs: true, - // The permission configuration *must* be included to ensure security of the device - required: ["NetworkPermissionConfig"], - apex_available: ["com.android.tethering"], - min_sdk_version: "current", -} diff --git a/packages/Tethering/AndroidManifest.xml b/packages/Tethering/AndroidManifest.xml deleted file mode 100644 index 2b2fe4534c3e..000000000000 --- a/packages/Tethering/AndroidManifest.xml +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.networkstack.tethering" - android:sharedUserId="android.uid.networkstack"> - <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> - - <!-- Permissions must be defined here, and not in the base manifest, as the tethering - running in the system server process does not need any permission, and having - privileged permissions added would cause crashes on startup unless they are also - added to the privileged permissions whitelist for that package. --> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - <uses-permission android:name="android.permission.BLUETOOTH" /> - <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" /> - <uses-permission android:name="android.permission.BROADCAST_STICKY" /> - <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> - <uses-permission android:name="android.permission.MANAGE_USB" /> - <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" /> - <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> - <uses-permission android:name="android.permission.READ_NETWORK_USAGE_HISTORY" /> - <uses-permission android:name="android.permission.READ_PHONE_STATE"/> - <uses-permission android:name="android.permission.TETHER_PRIVILEGED" /> - <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" /> - <uses-permission android:name="android.permission.UPDATE_DEVICE_STATS" /> - <uses-permission android:name="android.permission.WRITE_SETTINGS" /> - - <protected-broadcast android:name="com.android.server.connectivity.tethering.DISABLE_TETHERING" /> - - <application - android:process="com.android.networkstack.process" - android:extractNativeLibs="false" - android:persistent="true"> - <service android:name="com.android.networkstack.tethering.TetheringService" - android:permission="android.permission.MAINLINE_NETWORK_STACK" - android:exported="true"> - <intent-filter> - <action android:name="android.net.ITetheringConnector"/> - </intent-filter> - </service> - </application> -</manifest> diff --git a/packages/Tethering/AndroidManifestBase.xml b/packages/Tethering/AndroidManifestBase.xml deleted file mode 100644 index fa85f66489d7..000000000000 --- a/packages/Tethering/AndroidManifestBase.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.networkstack.tethering" - android:versionCode="1" - android:versionName="R-initial"> - <application - android:label="Tethering" - android:defaultToDeviceProtectedStorage="true" - android:directBootAware="true"> - </application> -</manifest> diff --git a/packages/Tethering/AndroidManifest_InProcess.xml b/packages/Tethering/AndroidManifest_InProcess.xml deleted file mode 100644 index b1f124097c79..000000000000 --- a/packages/Tethering/AndroidManifest_InProcess.xml +++ /dev/null @@ -1,34 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -/* - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ ---> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.networkstack.tethering.inprocess" - android:sharedUserId="android.uid.system" - android:process="system"> - <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> - <application> - <service android:name="com.android.networkstack.tethering.TetheringService" - android:process="system" - android:permission="android.permission.MAINLINE_NETWORK_STACK" - android:exported="true"> - <intent-filter> - <action android:name="android.net.ITetheringConnector.InProcess"/> - </intent-filter> - </service> - </application> -</manifest> diff --git a/packages/Tethering/OWNERS b/packages/Tethering/OWNERS deleted file mode 100644 index 5b42d490411e..000000000000 --- a/packages/Tethering/OWNERS +++ /dev/null @@ -1,2 +0,0 @@ -include platform/packages/modules/NetworkStack/:/OWNERS -markchien@google.com diff --git a/packages/Tethering/TEST_MAPPING b/packages/Tethering/TEST_MAPPING deleted file mode 100644 index 5617b0c13c1c..000000000000 --- a/packages/Tethering/TEST_MAPPING +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presubmit": [ - { - "name": "TetheringTests" - } - ], - "postsubmit": [ - { - "name": "TetheringIntegrationTests" - } - ] -} diff --git a/packages/Tethering/apex/Android.bp b/packages/Tethering/apex/Android.bp deleted file mode 100644 index 67097a79e5c0..000000000000 --- a/packages/Tethering/apex/Android.bp +++ /dev/null @@ -1,47 +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. -// - -apex { - name: "com.android.tethering", - updatable: true, - min_sdk_version: "current", - java_libs: ["framework-tethering"], - apps: ["Tethering"], - manifest: "manifest.json", - key: "com.android.tethering.key", - - androidManifest: "AndroidManifest.xml", -} - -apex_key { - name: "com.android.tethering.key", - public_key: "com.android.tethering.avbpubkey", - private_key: "com.android.tethering.pem", -} - -android_app_certificate { - name: "com.android.tethering.certificate", - certificate: "com.android.tethering", -} - -override_apex { - name: "com.android.tethering.inprocess", - base: "com.android.tethering", - package_name: "com.android.tethering.inprocess", - apps: [ - "InProcessTethering", - ], -} diff --git a/packages/Tethering/apex/AndroidManifest.xml b/packages/Tethering/apex/AndroidManifest.xml deleted file mode 100644 index 4aae3cc3000d..000000000000 --- a/packages/Tethering/apex/AndroidManifest.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - * Copyright (C) 2019 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - --> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.tethering"> - <!-- APEX does not have classes.dex --> - <application android:hasCode="false" /> - <!-- b/145383354: Current minSdk is locked to Q for development cycle, lock it to next version - before ship. --> - <!-- TODO: Uncomment this when the R API level is fixed. b/148281152 --> - <!--uses-sdk - android:minSdkVersion="29" - android:targetSdkVersion="29" - /> - --> -</manifest> diff --git a/packages/Tethering/apex/com.android.tethering.avbpubkey b/packages/Tethering/apex/com.android.tethering.avbpubkey Binary files differdeleted file mode 100644 index 9a2c0174e496..000000000000 --- a/packages/Tethering/apex/com.android.tethering.avbpubkey +++ /dev/null diff --git a/packages/Tethering/apex/com.android.tethering.pem b/packages/Tethering/apex/com.android.tethering.pem deleted file mode 100644 index d4f39abd3bb2..000000000000 --- a/packages/Tethering/apex/com.android.tethering.pem +++ /dev/null @@ -1,51 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIJKgIBAAKCAgEA+AWTp03PBRMGt4mVNLt5PDoFFSfmFOVTM7jt5AJXnQMIDsAM -1cyWGWRridGIpoHAaCALVgW5aRySgi8yV5xP4w0YHcKbfh9M6I9oz4RUo4GQBZfX -+lFIGaLjb6I3tEJxPuxps4sW26Io63ihwTnKeGyADHdHGWDUs9WU0Ml+QTvKrdjy -qC03M0dehYXILGiA9m+UXwKoKxhWgfDUhWLhDBUtLJLPL4WeqKc9sG9h+zzVqE+8 -LzJsfrodKhTTrLpWOXi6YLRTk8dzsuPz/Nu98sJd1w3fHd20DrmkqsxVhgN1h+nk -zcPpxyGYIP6qYVZCmIXCwZZNtPeb7y/tOs967VHoZ4Qj7p2tE0CAWFMZFGjA/pcZ -7fi6CsIuMOYBbj4+wRlJwpG1g5zSJBCjzhv7dZp8S5oXmLShNYOMYEdsPfaZbm08 -3pVY+k8DVf7idcANXNw1lM+sPbE2hp5VuEuVpK+ca5x8hIMpTqJ84wDAjnC1kCwm -X2xfNvYPKNF58SvqlNCPN8X7hQjoeaEb7w24vCdZMRqeGBmu1GNQvCyzbBO0huQm -f5CQPrZjPcnoImlP879VPxY4YB6tAjsA/ZLiub9VdT108lCjb5r8criMzpMAA/AQ -NqQLWFI3M43xPemGBTiIguTYgpRgGcdRZf7XuTgTY5qzQZZuZMVuwaqSD2cCAwEA -AQKCAgEA0jMvw3BPTrakT7Lb8JgelKt7mUV6WyVMUZ6eh0pw5JIoJxAfEKfWYmjY -NzKNRMjcv6LA2MP7MplTld/YI6ZHkl+Lm9VOISL39HVuV8mIThbFb+gT1INEvu1t -IjRyT2SsQ67rmo377mLNmVtgg7mt3kfecjI44MpPGqad/CF4zmKVUKd4aI4BpYUM -F8+dKf3bpoBEWA2RZwy2bGQmSXHW132vDoLR8y2knL04rCqJ+PrC/WWuULXEe9bS -VtLV3yMBZq3qD4Fk/+7fILLPGvNFVdPi4htQiChYrM4rP9HzfaO63VieYMF0hR70 -pqoOznXj9Q4QVC9FZmUgFCQjQ1+KhqJw3OldIo0SnvpsLdTO/inKkhQWKC5HlPyh -/rqvro2j3pTHWPAziuBr+oQPcdVCOlCBZ+B99L1tO7aGktVPEIVQG7G7jlFMBiJ1 -j/kRGk2RTX8RaPQJTnwUqp8mWUV2fwxHiXNadjejA5ZU3eQT2eAOhXl1w6Lv2jEl -0wMOwPMJGcF77CcqnnWHON8fkxCbAfyy5Uo6Pm9g/Zzecn+ji2sabG7Ge5t0gzdL -LKRcGoyakN2CrbQ8pxlCTgE4HX5oPY+VuqOf8L3AIWIJBsyLbXHVkL1mqQ/Ed2uz -zaaSFYUZw81+m/5bl8JLPaIFNPyikZrXTD0YRer3V06XiyP/kYECggEBAP033xeF -OhgRwkRTjd68hwRJpyHsZDWxHiUqQf6l6yFv5mEE355G2IGI7cZmR2+tUDjQdxLv -tAZIszTK4PFCdVTeWfGVFbVF84eNWLB124pHDMM79GN/AMcuHnQPR756a8IO1hIy -4KxIUE1a1PKN5b9IgE5Lu4TZM96HDpFcUAmCT5urdYDmg3++IWT9PYQlGS7Hhiar -r+Hh646waM8Qx619CwXBqy+Y37+WHVbYqJClr6AcpVMrGA+6cgpskFpZAPLsoy7G -RSsVfyV8pH2JKm/hzk7XCwIpczxeWQSfpJWZ+oOPFHu+zM60Cdj2UrQyKrNHwew8 -+WYe9eCA+MiNBcECggEBAPq/F1vdqROiLv9uzhKb8ybgdL7CmREELiqwK+MvNE9t -W7lQz7lcWzav+b2n0M+VJBxUWB3XClgoIvA/AllgTgsYXfKAxNakhKLSBoMmvKCW -HtWcGr/D3RcmacK+DTMWlVS/LuueAFLuH6UmBIUFKc+qA5x7oQecAFALBFupE3G4 -LtAspLBI6P8gRtRav5p2whs9H8qjYcyf2f6liWpkmFITcXvPvAxFHicR6ZJdwZ/S -PiX2LJQnOpT7L3+2PWnYwzFStb4MkMGlFKcscU9CvS53JcP/J4Asjk0I4zDB2gri -xzFHPlVzCr2IVVGptKCQ3sdYiMIzQKzEXQHCU8h37ycCggEBAJu8aC48Fz3Edlm1 -ldS+2L9vWSaJEBzhoSu0cMBgZVu8SdGzwKDE69XHVI4oS5lI28UFmaaA3JTc07MN -cAmSGT2oP2NQkPhbXGsrKLfm1K6YAiZ1Ulp7OwxFth8lYreo7Wt92nV46yuqkhDx -Y3UGhp39xkPhWiRbvgYHxJLsVqFyjumsK2mq3IeNdVZ6VgJXGsTlnAFeqJ7hZxHs -N5natSRjeosA0PtGJ57agZLvT8Ue0gREef3LzFGoFwmIOcQHZ4kAt2BGOzZDU17H -6Rb4bKxBEbT1l2St/5zKXi90zDHicOvG7Q8qiyY6HrBc1wLSs+ZtpLxZx/3h3tFE -IT6fVUECggEBAMSAQm8Ey76OJ+SXUjk1K50442SnHcs/Cmr7urkEQitImUwl71Pk -87pst/uP6szypOTqmE9yOTIS6iZ6Sn3+QcriIqWrkhZfwW3Tx7S6A7KZUrq15iSH -+thsiw9JXxC9TvOmC8AsBzb2U6hZncsc28JZCxFztSNAduJDb/vhCVLiMxWDFuDr -kmR1R+yc3XDQRpeQFDz6QudYEj9EPOc6xD/16sZLaqP2+oVFvVSt0tJLsdaQECle -gMNGAdhE2eX8MCOUHMc+E6cdlozYAEhMFfO2/cqWR79jq3TlVR3dnOFRDScqHMhc -KnuTvsELjHkUbvGsCSiff7yk+fop7vy4OJsCggEAPemJdItO2rhib8EofrZdY72I -oifX1jhPZ1BWD2GKgcx+eVyJGbONBbJVexvvskTfZBvCcAegmgp+sngP6MO6yZkr -cHMfAJeApYZnshsgXksHGMDtSB50/w1JLrc/nqpxdpy/aTazt0Eu1pLWpze1HFZ/ -Xyu4PcmrU+4P1vN7c396slHMktEvly6QqOn4nfBbGDJ17Ow6X1XFvGjAxQPIDTB+ -6loV14AHymwmqwMrGn84O72rzqyw+41GxW5+oXhOZ4MeXF3u89TBLWvXDpPy/YQU -EiKpodN0YeEn6Ghzplan8rUha+7TP7AYnS5pCszsCHKd03Py0lMLkF+uAfVsDA== ------END RSA PRIVATE KEY----- diff --git a/packages/Tethering/apex/com.android.tethering.pk8 b/packages/Tethering/apex/com.android.tethering.pk8 Binary files differdeleted file mode 100644 index 3b94405945cb..000000000000 --- a/packages/Tethering/apex/com.android.tethering.pk8 +++ /dev/null diff --git a/packages/Tethering/apex/com.android.tethering.x509.pem b/packages/Tethering/apex/com.android.tethering.x509.pem deleted file mode 100644 index a1786e35e854..000000000000 --- a/packages/Tethering/apex/com.android.tethering.x509.pem +++ /dev/null @@ -1,35 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIGKTCCBBGgAwIBAgIUNiSs5EMqxCZ31gWWCcRJVp9HffAwDQYJKoZIhvcNAQEL -BQAwgaIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH -DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy -b2lkMR4wHAYDVQQDDBVjb20uYW5kcm9pZC50ZXRoZXJpbmcxIjAgBgkqhkiG9w0B -CQEWE2FuZHJvaWRAYW5kcm9pZC5jb20wIBcNMTkxMjE4MDcwMDQ4WhgPNDc1NzEx -MTMwNzAwNDhaMIGiMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEW -MBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UE -CwwHQW5kcm9pZDEeMBwGA1UEAwwVY29tLmFuZHJvaWQudGV0aGVyaW5nMSIwIAYJ -KoZIhvcNAQkBFhNhbmRyb2lkQGFuZHJvaWQuY29tMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEAxvTUA4seblYjZLfTVNwZuJH914QVNFTj+vD94pWmt5Aq -sH1DVTpBvpXXegc/P5HI2XF/71poSBib1WaQSuXG0fU5K75T18bOGL0qF+fhMtBO -wUyvulcjO0h4XE/xf0txY54exUjAA4JS9ERGJOgb4GOwSbPyzekfmzIyCZ2Yawwu -+oGwD2ZNzZRaPOoWxjwohBWQ6mySuvF9RRRb300qmxxUGFM9Ki3aqrWlYlHEOwOC -M+gIXxYFO7S+yUzf6/gMZLOz2YqfcTOup4hAxtExR7niutxJSsRLPBL237exAJoz -OupoXjtWAlPK4ZwZ/Nl1jdTWauJ+Kv3WqzhHGEb2gn3ZpeO3IdOjJhDgFJ6m1OT/ -kjRbW1LCuKGrKaoqsEDT2X3a7Izfripn65hSNTfR5gNLtgELaI3/vXi8Fmzw1AfH -+qi6ulElZvSwx0qm+S0QiPyGFlxrsdnHoGJl1tzjJW8KdNZRvzRLUQtbphPp+VkL -5i0bNKum+AwbfdUkLkNLfw9XdbujgBkZTZDQbZGsNjgrvyXcPO2KiJee0hVCZRs0 -rhDi5Pfm7BnN/I2vaTRz/W4mdct9H2RWMuqlSH90JvmKtWcND8ahmOJ3sggrvzfO -QNs3k4JTRecamMzqIkylhlnEC4FjWc6Bx4wsEpwBMZOkF/tGGMZYf2C09a8tpP0C -AwEAAaNTMFEwHQYDVR0OBBYEFNP5gIpNWmq0xa411M1GaRPbEijvMB8GA1UdIwQY -MBaAFNP5gIpNWmq0xa411M1GaRPbEijvMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI -hvcNAQELBQADggIBADJGmU3QP4EGbt6eBhVPeo/efsqrHsuB2fvFzvIobJbfkSob -cmvjbzIikOlPAgFWj8lT5SDcIWRorFf1u2JylClJ0nSDcqJMHVKmT7wseV/KtX// -1yUyJFRQVzmjC89dp8OIc00GmItivKLer3NbJdkR3rTUjg7+bNUO27Qp3AFREmiJ -P+M7ouvcQRvByUWbp/LOrJpMdJLysRBO562RwrtwTjltdvufyYswbBZOKEiUh1Jc -Ged+3+SJdhwq3Wy+R3Uj7YE7mUMu1QNbANIMrwF8W93EA53eoL2+cKmuaVU6ZURL -xgSJaY6TrunnSI9XTROLtjsFlJorYWy2tvG7Q5Hw3OkO2Xdz/mm85VTkiusg9DMB -WWTv607YtsIO0FhKmcV4bp3q/EkRj3t/zLvL9uFJrWDGkuShZq6fQvqbCvaokOPY -+M0ZRIwgwa9UpEE0BMklVWqR6BGyap614gOgcOjYM70WRNl59Qne+g128ZN7g9nz -61F70i7kUngV0ZUz1/Fu/NCG+6wGF85ZbFmQl60YHPDw1FtjVUuKyBblaDzdJunx -yQr2t9RUokzFBFK0lGW3+yf0WDQ5fqTMs5h8bz1FCq8/HzWmpdOfqePLe4zsld3b -1nFuSohaIfbn/HDdTNtTBGQPgz8ZswQ6ejJJqTLz9D/odbqn9LeIhDZXcQTf ------END CERTIFICATE----- diff --git a/packages/Tethering/apex/manifest.json b/packages/Tethering/apex/manifest.json deleted file mode 100644 index 538ffb3ad6e4..000000000000 --- a/packages/Tethering/apex/manifest.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "com.android.tethering", - "version": 300000000 -} diff --git a/packages/Tethering/common/TetheringLib/Android.bp b/packages/Tethering/common/TetheringLib/Android.bp deleted file mode 100644 index c8becce7be82..000000000000 --- a/packages/Tethering/common/TetheringLib/Android.bp +++ /dev/null @@ -1,57 +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. - -java_sdk_library { - name: "framework-tethering", - defaults: ["framework-module-defaults"], - - // Allow access to the stubs from anywhere. - visibility: ["//visibility:public"], - - // Restrict access to implementation library. - impl_library_visibility: [ - "//visibility:override", // Ignore the visibility property. - "//frameworks/base/packages/Tethering:__subpackages__", - ], - - srcs: [ - ":framework-tethering-srcs", - ], - - jarjar_rules: "jarjar-rules.txt", - installable: true, - - hostdex: true, // for hiddenapi check - apex_available: ["com.android.tethering"], - permitted_packages: ["android.net"], -} - -filegroup { - name: "framework-tethering-srcs", - srcs: [ - "src/android/net/TetheredClient.aidl", - "src/android/net/TetheredClient.java", - "src/android/net/TetheringManager.java", - "src/android/net/TetheringConstants.java", - "src/android/net/IIntResultListener.aidl", - "src/android/net/ITetheringEventCallback.aidl", - "src/android/net/ITetheringConnector.aidl", - "src/android/net/TetheringCallbackStartedParcel.aidl", - "src/android/net/TetheringConfigurationParcel.aidl", - "src/android/net/TetheringRequestParcel.aidl", - "src/android/net/TetherStatesParcel.aidl", - ], - path: "src" -} diff --git a/packages/Tethering/common/TetheringLib/api/current.txt b/packages/Tethering/common/TetheringLib/api/current.txt deleted file mode 100644 index d802177e249b..000000000000 --- a/packages/Tethering/common/TetheringLib/api/current.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/packages/Tethering/common/TetheringLib/api/module-lib-current.txt b/packages/Tethering/common/TetheringLib/api/module-lib-current.txt deleted file mode 100644 index 754584e70fad..000000000000 --- a/packages/Tethering/common/TetheringLib/api/module-lib-current.txt +++ /dev/null @@ -1,129 +0,0 @@ -// Signature format: 2.0 -package android.net { - - public final class TetheredClient implements android.os.Parcelable { - ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int); - method public int describeContents(); - method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses(); - method @NonNull public android.net.MacAddress getMacAddress(); - method public int getTetheringType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR; - } - - public static final class TetheredClient.AddressInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.net.LinkAddress getAddress(); - method @Nullable public String getHostname(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR; - } - - public final class TetheringConstants { - field public static final String EXTRA_ADD_TETHER_TYPE = "extraAddTetherType"; - field public static final String EXTRA_PROVISION_CALLBACK = "extraProvisionCallback"; - field public static final String EXTRA_REM_TETHER_TYPE = "extraRemTetherType"; - field public static final String EXTRA_RUN_PROVISION = "extraRunProvision"; - field public static final String EXTRA_SET_ALARM = "extraSetAlarm"; - } - - public class TetheringManager { - ctor public TetheringManager(@NonNull android.content.Context, @NonNull java.util.function.Supplier<android.os.IBinder>); - method public int getLastTetherError(@NonNull String); - method @NonNull public String[] getTetherableBluetoothRegexs(); - method @NonNull public String[] getTetherableIfaces(); - method @NonNull public String[] getTetherableUsbRegexs(); - method @NonNull public String[] getTetherableWifiRegexs(); - method @NonNull public String[] getTetheredIfaces(); - method @NonNull public String[] getTetheringErroredIfaces(); - method public boolean isTetheringSupported(); - method public boolean isTetheringSupported(@NonNull String); - method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener); - method public void requestLatestTetheringEntitlementResult(int, @NonNull android.os.ResultReceiver, boolean); - method @Deprecated public int setUsbTethering(boolean); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(int, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering(); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int); - method @Deprecated public int tether(@NonNull String); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback); - method @Deprecated public int untether(@NonNull String); - field public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; - field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY"; - field public static final String EXTRA_ACTIVE_TETHER = "tetherArray"; - field public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; - field public static final String EXTRA_ERRORED_TETHER = "erroredArray"; - field public static final int TETHERING_BLUETOOTH = 2; // 0x2 - field public static final int TETHERING_ETHERNET = 5; // 0x5 - field public static final int TETHERING_INVALID = -1; // 0xffffffff - field public static final int TETHERING_NCM = 4; // 0x4 - field public static final int TETHERING_USB = 1; // 0x1 - field public static final int TETHERING_WIFI = 0; // 0x0 - field public static final int TETHERING_WIFI_P2P = 3; // 0x3 - field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc - field public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; // 0x9 - field public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; // 0x8 - field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd - field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa - field public static final int TETHER_ERROR_INTERNAL_ERROR = 5; // 0x5 - field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf - field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe - field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0 - field public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; // 0xb - field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2 - field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6 - field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4 - field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1 - field public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; // 0x10 - field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3 - field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7 - field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2 - field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1 - field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0 - } - - public static interface TetheringManager.OnTetheringEntitlementResultListener { - method public void onTetheringEntitlementResult(int); - } - - public static interface TetheringManager.StartTetheringCallback { - method public default void onTetheringFailed(int); - method public default void onTetheringStarted(); - } - - public static interface TetheringManager.TetheringEventCallback { - method public default void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>); - method public default void onError(@NonNull String, int); - method public default void onOffloadStatusChanged(int); - method public default void onTetherableInterfaceRegexpsChanged(@NonNull android.net.TetheringManager.TetheringInterfaceRegexps); - method public default void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheringSupported(boolean); - method public default void onUpstreamChanged(@Nullable android.net.Network); - } - - public static class TetheringManager.TetheringInterfaceRegexps { - method @NonNull public java.util.List<java.lang.String> getTetherableBluetoothRegexs(); - method @NonNull public java.util.List<java.lang.String> getTetherableUsbRegexs(); - method @NonNull public java.util.List<java.lang.String> getTetherableWifiRegexs(); - } - - public static class TetheringManager.TetheringRequest { - method @Nullable public android.net.LinkAddress getClientStaticIpv4Address(); - method @Nullable public android.net.LinkAddress getLocalIpv4Address(); - method public boolean getShouldShowEntitlementUi(); - method public int getTetheringType(); - method public boolean isExemptFromEntitlementCheck(); - } - - public static class TetheringManager.TetheringRequest.Builder { - ctor public TetheringManager.TetheringRequest.Builder(int); - method @NonNull public android.net.TetheringManager.TetheringRequest build(); - method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean); - method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean); - method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress); - } - -} - diff --git a/packages/Tethering/common/TetheringLib/api/module-lib-removed.txt b/packages/Tethering/common/TetheringLib/api/module-lib-removed.txt deleted file mode 100644 index d802177e249b..000000000000 --- a/packages/Tethering/common/TetheringLib/api/module-lib-removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/packages/Tethering/common/TetheringLib/api/removed.txt b/packages/Tethering/common/TetheringLib/api/removed.txt deleted file mode 100644 index d802177e249b..000000000000 --- a/packages/Tethering/common/TetheringLib/api/removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/packages/Tethering/common/TetheringLib/api/system-current.txt b/packages/Tethering/common/TetheringLib/api/system-current.txt deleted file mode 100644 index edd1ebb5f751..000000000000 --- a/packages/Tethering/common/TetheringLib/api/system-current.txt +++ /dev/null @@ -1,99 +0,0 @@ -// Signature format: 2.0 -package android.net { - - public final class TetheredClient implements android.os.Parcelable { - ctor public TetheredClient(@NonNull android.net.MacAddress, @NonNull java.util.Collection<android.net.TetheredClient.AddressInfo>, int); - method public int describeContents(); - method @NonNull public java.util.List<android.net.TetheredClient.AddressInfo> getAddresses(); - method @NonNull public android.net.MacAddress getMacAddress(); - method public int getTetheringType(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient> CREATOR; - } - - public static final class TetheredClient.AddressInfo implements android.os.Parcelable { - method public int describeContents(); - method @NonNull public android.net.LinkAddress getAddress(); - method @Nullable public String getHostname(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator<android.net.TetheredClient.AddressInfo> CREATOR; - } - - public class TetheringManager { - method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public void registerTetheringEventCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.TetheringEventCallback); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void requestLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.OnTetheringEntitlementResultListener); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void startTethering(@NonNull android.net.TetheringManager.TetheringRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.TetheringManager.StartTetheringCallback); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopAllTethering(); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public void stopTethering(int); - method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.ACCESS_NETWORK_STATE}) public void unregisterTetheringEventCallback(@NonNull android.net.TetheringManager.TetheringEventCallback); - field public static final String ACTION_TETHER_STATE_CHANGED = "android.net.conn.TETHER_STATE_CHANGED"; - field public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY"; - field public static final String EXTRA_ACTIVE_TETHER = "tetherArray"; - field public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; - field public static final String EXTRA_ERRORED_TETHER = "erroredArray"; - field public static final int TETHERING_BLUETOOTH = 2; // 0x2 - field public static final int TETHERING_ETHERNET = 5; // 0x5 - field public static final int TETHERING_INVALID = -1; // 0xffffffff - field public static final int TETHERING_NCM = 4; // 0x4 - field public static final int TETHERING_USB = 1; // 0x1 - field public static final int TETHERING_WIFI = 0; // 0x0 - field public static final int TETHERING_WIFI_P2P = 3; // 0x3 - field public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; // 0xc - field public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; // 0x9 - field public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; // 0x8 - field public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; // 0xd - field public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; // 0xa - field public static final int TETHER_ERROR_INTERNAL_ERROR = 5; // 0x5 - field public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; // 0xf - field public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; // 0xe - field public static final int TETHER_ERROR_NO_ERROR = 0; // 0x0 - field public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; // 0xb - field public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; // 0x2 - field public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; // 0x6 - field public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; // 0x4 - field public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; // 0x1 - field public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; // 0x10 - field public static final int TETHER_ERROR_UNSUPPORTED = 3; // 0x3 - field public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; // 0x7 - field public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; // 0x2 - field public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; // 0x1 - field public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; // 0x0 - } - - public static interface TetheringManager.OnTetheringEntitlementResultListener { - method public void onTetheringEntitlementResult(int); - } - - public static interface TetheringManager.StartTetheringCallback { - method public default void onTetheringFailed(int); - method public default void onTetheringStarted(); - } - - public static interface TetheringManager.TetheringEventCallback { - method public default void onClientsChanged(@NonNull java.util.Collection<android.net.TetheredClient>); - method public default void onError(@NonNull String, int); - method public default void onOffloadStatusChanged(int); - method public default void onTetherableInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheredInterfacesChanged(@NonNull java.util.List<java.lang.String>); - method public default void onTetheringSupported(boolean); - method public default void onUpstreamChanged(@Nullable android.net.Network); - } - - public static class TetheringManager.TetheringRequest { - method @Nullable public android.net.LinkAddress getClientStaticIpv4Address(); - method @Nullable public android.net.LinkAddress getLocalIpv4Address(); - method public boolean getShouldShowEntitlementUi(); - method public int getTetheringType(); - method public boolean isExemptFromEntitlementCheck(); - } - - public static class TetheringManager.TetheringRequest.Builder { - ctor public TetheringManager.TetheringRequest.Builder(int); - method @NonNull public android.net.TetheringManager.TetheringRequest build(); - method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setExemptFromEntitlementCheck(boolean); - method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setShouldShowEntitlementUi(boolean); - method @NonNull @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public android.net.TetheringManager.TetheringRequest.Builder setStaticIpv4Addresses(@NonNull android.net.LinkAddress, @NonNull android.net.LinkAddress); - } - -} - diff --git a/packages/Tethering/common/TetheringLib/api/system-removed.txt b/packages/Tethering/common/TetheringLib/api/system-removed.txt deleted file mode 100644 index d802177e249b..000000000000 --- a/packages/Tethering/common/TetheringLib/api/system-removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/packages/Tethering/common/TetheringLib/jarjar-rules.txt b/packages/Tethering/common/TetheringLib/jarjar-rules.txt deleted file mode 100644 index e459fad54993..000000000000 --- a/packages/Tethering/common/TetheringLib/jarjar-rules.txt +++ /dev/null @@ -1 +0,0 @@ -# jarjar rules for the bootclasspath tethering framework library here
\ No newline at end of file diff --git a/packages/Tethering/common/TetheringLib/src/android/net/IIntResultListener.aidl b/packages/Tethering/common/TetheringLib/src/android/net/IIntResultListener.aidl deleted file mode 100644 index c3d66ee14526..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/IIntResultListener.aidl +++ /dev/null @@ -1,25 +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.net; - -/** - * Listener interface allowing objects to listen to various module event. - * {@hide} - */ -oneway interface IIntResultListener { - void onResult(int resultCode); -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/ITetheringConnector.aidl b/packages/Tethering/common/TetheringLib/src/android/net/ITetheringConnector.aidl deleted file mode 100644 index 8be79645bde3..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/ITetheringConnector.aidl +++ /dev/null @@ -1,46 +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.net; - -import android.net.IIntResultListener; -import android.net.ITetheringEventCallback; -import android.net.TetheringRequestParcel; -import android.os.ResultReceiver; - -/** @hide */ -oneway interface ITetheringConnector { - void tether(String iface, String callerPkg, IIntResultListener receiver); - - void untether(String iface, String callerPkg, IIntResultListener receiver); - - void setUsbTethering(boolean enable, String callerPkg, IIntResultListener receiver); - - void startTethering(in TetheringRequestParcel request, String callerPkg, - IIntResultListener receiver); - - void stopTethering(int type, String callerPkg, IIntResultListener receiver); - - void requestLatestTetheringEntitlementResult(int type, in ResultReceiver receiver, - boolean showEntitlementUi, String callerPkg); - - void registerTetheringEventCallback(ITetheringEventCallback callback, String callerPkg); - - void unregisterTetheringEventCallback(ITetheringEventCallback callback, String callerPkg); - - void isTetheringSupported(String callerPkg, IIntResultListener receiver); - - void stopAllTethering(String callerPkg, IIntResultListener receiver); -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/ITetheringEventCallback.aidl b/packages/Tethering/common/TetheringLib/src/android/net/ITetheringEventCallback.aidl deleted file mode 100644 index b4e3ba46791c..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/ITetheringEventCallback.aidl +++ /dev/null @@ -1,39 +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.net; - -import android.net.Network; -import android.net.TetheredClient; -import android.net.TetheringConfigurationParcel; -import android.net.TetheringCallbackStartedParcel; -import android.net.TetherStatesParcel; - -/** - * Callback class for receiving tethering changed events. - * @hide - */ -oneway interface ITetheringEventCallback -{ - /** Called immediately after the callbacks are registered */ - void onCallbackStarted(in TetheringCallbackStartedParcel parcel); - void onCallbackStopped(int errorCode); - void onUpstreamChanged(in Network network); - void onConfigurationChanged(in TetheringConfigurationParcel config); - void onTetherStatesChanged(in TetherStatesParcel states); - void onTetherClientsChanged(in List<TetheredClient> clients); - void onOffloadStatusChanged(int status); -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetherStatesParcel.aidl b/packages/Tethering/common/TetheringLib/src/android/net/TetherStatesParcel.aidl deleted file mode 100644 index 3d842b337428..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetherStatesParcel.aidl +++ /dev/null @@ -1,31 +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.net; - -/** - * Status details for tethering downstream interfaces. - * {@hide} - */ -parcelable TetherStatesParcel { - String[] availableList; - String[] tetheredList; - String[] localOnlyList; - String[] erroredIfaceList; - // List of Last error code corresponding to each errored iface in erroredIfaceList. */ - // TODO: Improve this as b/143122247. - int[] lastErrorList; -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheredClient.aidl b/packages/Tethering/common/TetheringLib/src/android/net/TetheredClient.aidl deleted file mode 100644 index 0b279b882367..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheredClient.aidl +++ /dev/null @@ -1,18 +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.net; - -@JavaOnlyStableParcelable parcelable TetheredClient;
\ No newline at end of file diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheredClient.java b/packages/Tethering/common/TetheringLib/src/android/net/TetheredClient.java deleted file mode 100644 index 48be0d96425c..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheredClient.java +++ /dev/null @@ -1,244 +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.net; - -import static android.annotation.SystemApi.Client.MODULE_LIBRARIES; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SystemApi; -import android.annotation.TestApi; -import android.os.Parcel; -import android.os.Parcelable; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; - -/** - * Information on a tethered downstream client. - * @hide - */ -@SystemApi -@SystemApi(client = MODULE_LIBRARIES) -@TestApi -public final class TetheredClient implements Parcelable { - @NonNull - private final MacAddress mMacAddress; - @NonNull - private final List<AddressInfo> mAddresses; - // TODO: use an @IntDef here - private final int mTetheringType; - - public TetheredClient(@NonNull MacAddress macAddress, - @NonNull Collection<AddressInfo> addresses, int tetheringType) { - mMacAddress = macAddress; - mAddresses = new ArrayList<>(addresses); - mTetheringType = tetheringType; - } - - private TetheredClient(@NonNull Parcel in) { - this(in.readParcelable(null), in.createTypedArrayList(AddressInfo.CREATOR), in.readInt()); - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeParcelable(mMacAddress, flags); - dest.writeTypedList(mAddresses); - dest.writeInt(mTetheringType); - } - - /** - * Get the MAC address used to identify the client. - */ - @NonNull - public MacAddress getMacAddress() { - return mMacAddress; - } - - /** - * Get information on the list of addresses that are associated with the client. - */ - @NonNull - public List<AddressInfo> getAddresses() { - return new ArrayList<>(mAddresses); - } - - /** - * Get the type of tethering used by the client. - * @return one of the {@code TetheringManager#TETHERING_*} constants. - */ - public int getTetheringType() { - return mTetheringType; - } - - /** - * Return a new {@link TetheredClient} that has all the attributes of this instance, plus the - * {@link AddressInfo} of the provided {@link TetheredClient}. - * - * <p>Duplicate addresses are removed. - * @hide - */ - public TetheredClient addAddresses(@NonNull TetheredClient other) { - final LinkedHashSet<AddressInfo> newAddresses = new LinkedHashSet<>( - mAddresses.size() + other.mAddresses.size()); - newAddresses.addAll(mAddresses); - newAddresses.addAll(other.mAddresses); - return new TetheredClient(mMacAddress, newAddresses, mTetheringType); - } - - @Override - public int hashCode() { - return Objects.hash(mMacAddress, mAddresses, mTetheringType); - } - - @Override - public boolean equals(@Nullable Object obj) { - if (!(obj instanceof TetheredClient)) return false; - final TetheredClient other = (TetheredClient) obj; - return mMacAddress.equals(other.mMacAddress) - && mAddresses.equals(other.mAddresses) - && mTetheringType == other.mTetheringType; - } - - /** - * Information on an lease assigned to a tethered client. - */ - public static final class AddressInfo implements Parcelable { - @NonNull - private final LinkAddress mAddress; - @Nullable - private final String mHostname; - - /** @hide */ - public AddressInfo(@NonNull LinkAddress address, @Nullable String hostname) { - this.mAddress = address; - this.mHostname = hostname; - } - - private AddressInfo(Parcel in) { - this(in.readParcelable(null), in.readString()); - } - - @Override - public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeParcelable(mAddress, flags); - dest.writeString(mHostname); - } - - /** - * Get the link address (including prefix length and lifetime) used by the client. - * - * This may be an IPv4 or IPv6 address. - */ - @NonNull - public LinkAddress getAddress() { - return mAddress; - } - - /** - * Get the hostname that was advertised by the client when obtaining its address, if any. - */ - @Nullable - public String getHostname() { - return mHostname; - } - - /** - * Get the expiration time of the address assigned to the client. - * @hide - */ - public long getExpirationTime() { - return mAddress.getExpirationTime(); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public int hashCode() { - return Objects.hash(mAddress, mHostname); - } - - @Override - public boolean equals(@Nullable Object obj) { - if (!(obj instanceof AddressInfo)) return false; - final AddressInfo other = (AddressInfo) obj; - // Use .equals() for addresses as all changes, including address expiry changes, - // should be included. - return other.mAddress.equals(mAddress) - && Objects.equals(mHostname, other.mHostname); - } - - @NonNull - public static final Creator<AddressInfo> CREATOR = new Creator<AddressInfo>() { - @NonNull - @Override - public AddressInfo createFromParcel(@NonNull Parcel in) { - return new AddressInfo(in); - } - - @NonNull - @Override - public AddressInfo[] newArray(int size) { - return new AddressInfo[size]; - } - }; - - @NonNull - @Override - public String toString() { - return "AddressInfo {" - + mAddress - + (mHostname != null ? ", hostname " + mHostname : "") - + "}"; - } - } - - @Override - public int describeContents() { - return 0; - } - - @NonNull - public static final Creator<TetheredClient> CREATOR = new Creator<TetheredClient>() { - @NonNull - @Override - public TetheredClient createFromParcel(@NonNull Parcel in) { - return new TetheredClient(in); - } - - @NonNull - @Override - public TetheredClient[] newArray(int size) { - return new TetheredClient[size]; - } - }; - - @NonNull - @Override - public String toString() { - return "TetheredClient {hwAddr " + mMacAddress - + ", addresses " + mAddresses - + ", tetheringType " + mTetheringType - + "}"; - } -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheringCallbackStartedParcel.aidl b/packages/Tethering/common/TetheringLib/src/android/net/TetheringCallbackStartedParcel.aidl deleted file mode 100644 index 253eacbd23e7..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheringCallbackStartedParcel.aidl +++ /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 android.net; - -import android.net.Network; -import android.net.TetheredClient; -import android.net.TetheringConfigurationParcel; -import android.net.TetherStatesParcel; - -/** - * Initial information reported by tethering upon callback registration. - * @hide - */ -parcelable TetheringCallbackStartedParcel { - boolean tetheringSupported; - Network upstreamNetwork; - TetheringConfigurationParcel config; - TetherStatesParcel states; - List<TetheredClient> tetheredClients; - int offloadStatus; -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheringConfigurationParcel.aidl b/packages/Tethering/common/TetheringLib/src/android/net/TetheringConfigurationParcel.aidl deleted file mode 100644 index 89f38132ffad..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheringConfigurationParcel.aidl +++ /dev/null @@ -1,37 +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.net; - -/** - * Configuration details for tethering. - * @hide - */ -parcelable TetheringConfigurationParcel { - int subId; - String[] tetherableUsbRegexs; - String[] tetherableWifiRegexs; - String[] tetherableBluetoothRegexs; - boolean isDunRequired; - boolean chooseUpstreamAutomatically; - int[] preferredUpstreamIfaceTypes; - String[] legacyDhcpRanges; - String[] defaultIPv4DNS; - boolean enableLegacyDhcpServer; - String[] provisioningApp; - String provisioningAppNoUi; - int provisioningCheckPeriod; -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheringConstants.java b/packages/Tethering/common/TetheringLib/src/android/net/TetheringConstants.java deleted file mode 100644 index f14def6a3a02..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheringConstants.java +++ /dev/null @@ -1,93 +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.net; - -import static android.annotation.SystemApi.Client.MODULE_LIBRARIES; - -import android.annotation.SystemApi; -import android.os.ResultReceiver; - -/** - * Collections of constants for internal tethering usage. - * - * <p>These hidden constants are not in TetheringManager as they are not part of the API stubs - * generated for TetheringManager, which prevents the tethering module from linking them at - * build time. - * TODO: investigate changing the tethering build rules so that Tethering can reference hidden - * symbols from framework-tethering even when they are in a non-hidden class. - * @hide - */ -@SystemApi(client = MODULE_LIBRARIES) -public final class TetheringConstants { - /** An explicit private class to avoid exposing constructor.*/ - private TetheringConstants() { } - - /** - * Extra used for communicating with the TetherService and TetherProvisioningActivity. - * Includes the type of tethering to enable if any. - */ - public static final String EXTRA_ADD_TETHER_TYPE = "extraAddTetherType"; - /** - * Extra used for communicating with the TetherService. Includes the type of tethering for - * which to cancel provisioning. - */ - public static final String EXTRA_REM_TETHER_TYPE = "extraRemTetherType"; - /** - * Extra used for communicating with the TetherService. True to schedule a recheck of tether - * provisioning. - */ - public static final String EXTRA_SET_ALARM = "extraSetAlarm"; - /** - * Tells the TetherService to run a provision check now. - */ - public static final String EXTRA_RUN_PROVISION = "extraRunProvision"; - /** - * Extra used for communicating with the TetherService and TetherProvisioningActivity. - * Contains the {@link ResultReceiver} which will receive provisioning results. - * Can not be empty. - */ - public static final String EXTRA_PROVISION_CALLBACK = "extraProvisionCallback"; - - /** - * Extra used for communicating with the TetherService and TetherProvisioningActivity. - * Contains the subId of current active cellular upstream. - * @hide - */ - public static final String EXTRA_TETHER_SUBID = "android.net.extra.TETHER_SUBID"; - - /** - * Extra used for telling TetherProvisioningActivity the entitlement package name and class - * name to start UI entitlement check. - * @hide - */ - public static final String EXTRA_TETHER_UI_PROVISIONING_APP_NAME = - "android.net.extra.TETHER_UI_PROVISIONING_APP_NAME"; - - /** - * Extra used for telling TetherService the intent action to start silent entitlement check. - * @hide - */ - public static final String EXTRA_TETHER_SILENT_PROVISIONING_ACTION = - "android.net.extra.TETHER_SILENT_PROVISIONING_ACTION"; - - /** - * Extra used for TetherService to receive the response of provisioning check. - * @hide - */ - public static final String EXTRA_TETHER_PROVISIONING_RESPONSE = - "android.net.extra.TETHER_PROVISIONING_RESPONSE"; -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java b/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java deleted file mode 100644 index 4f053cb65c38..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheringManager.java +++ /dev/null @@ -1,1356 +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.net; - -import static android.annotation.SystemApi.Client.MODULE_LIBRARIES; - -import android.Manifest; -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.content.Context; -import android.os.Bundle; -import android.os.ConditionVariable; -import android.os.IBinder; -import android.os.RemoteException; -import android.os.ResultReceiver; -import android.util.ArrayMap; -import android.util.Log; - -import com.android.internal.annotations.GuardedBy; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.Executor; -import java.util.function.Supplier; - -/** - * This class provides the APIs to control the tethering service. - * <p> The primary responsibilities of this class are to provide the APIs for applications to - * start tethering, stop tethering, query configuration and query status. - * - * @hide - */ -@SystemApi -@SystemApi(client = MODULE_LIBRARIES) -@TestApi -public class TetheringManager { - private static final String TAG = TetheringManager.class.getSimpleName(); - private static final int DEFAULT_TIMEOUT_MS = 60_000; - private static final long CONNECTOR_POLL_INTERVAL_MILLIS = 200L; - - @GuardedBy("mConnectorWaitQueue") - @Nullable - private ITetheringConnector mConnector; - @GuardedBy("mConnectorWaitQueue") - @NonNull - private final List<ConnectorConsumer> mConnectorWaitQueue = new ArrayList<>(); - private final Supplier<IBinder> mConnectorSupplier; - - private final TetheringCallbackInternal mCallback; - private final Context mContext; - private final ArrayMap<TetheringEventCallback, ITetheringEventCallback> - mTetheringEventCallbacks = new ArrayMap<>(); - - private volatile TetheringConfigurationParcel mTetheringConfiguration; - private volatile TetherStatesParcel mTetherStatesParcel; - - /** - * Broadcast Action: A tetherable connection has come or gone. - * Uses {@code TetheringManager.EXTRA_AVAILABLE_TETHER}, - * {@code TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY}, - * {@code TetheringManager.EXTRA_ACTIVE_TETHER}, and - * {@code TetheringManager.EXTRA_ERRORED_TETHER} to indicate - * the current state of tethering. Each include a list of - * interface names in that state (may be empty). - */ - public static final String ACTION_TETHER_STATE_CHANGED = - "android.net.conn.TETHER_STATE_CHANGED"; - - /** - * gives a String[] listing all the interfaces configured for - * tethering and currently available for tethering. - */ - public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; - - /** - * gives a String[] listing all the interfaces currently in local-only - * mode (ie, has DHCPv4+IPv6-ULA support and no packet forwarding) - */ - public static final String EXTRA_ACTIVE_LOCAL_ONLY = "android.net.extra.ACTIVE_LOCAL_ONLY"; - - /** - * gives a String[] listing all the interfaces currently tethered - * (ie, has DHCPv4 support and packets potentially forwarded/NATed) - */ - public static final String EXTRA_ACTIVE_TETHER = "tetherArray"; - - /** - * gives a String[] listing all the interfaces we tried to tether and - * failed. Use {@link #getLastTetherError} to find the error code - * for any interfaces listed here. - */ - public static final String EXTRA_ERRORED_TETHER = "erroredArray"; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = false, value = { - TETHERING_WIFI, - TETHERING_USB, - TETHERING_BLUETOOTH, - TETHERING_WIFI_P2P, - TETHERING_NCM, - TETHERING_ETHERNET, - }) - public @interface TetheringType { - } - - /** - * Invalid tethering type. - * @see #startTethering. - */ - public static final int TETHERING_INVALID = -1; - - /** - * Wifi tethering type. - * @see #startTethering. - */ - public static final int TETHERING_WIFI = 0; - - /** - * USB tethering type. - * @see #startTethering. - */ - public static final int TETHERING_USB = 1; - - /** - * Bluetooth tethering type. - * @see #startTethering. - */ - public static final int TETHERING_BLUETOOTH = 2; - - /** - * Wifi P2p tethering type. - * Wifi P2p tethering is set through events automatically, and don't - * need to start from #startTethering. - */ - public static final int TETHERING_WIFI_P2P = 3; - - /** - * Ncm local tethering type. - * @see #startTethering(TetheringRequest, Executor, StartTetheringCallback) - */ - public static final int TETHERING_NCM = 4; - - /** - * Ethernet tethering type. - * @see #startTethering(TetheringRequest, Executor, StartTetheringCallback) - */ - public static final int TETHERING_ETHERNET = 5; - - /** - * WIGIG tethering type. Use a separate type to prevent - * conflicts with TETHERING_WIFI - * This type is only used internally by the tethering module - * @hide - */ - public static final int TETHERING_WIGIG = 6; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { - TETHER_ERROR_NO_ERROR, - TETHER_ERROR_PROVISIONING_FAILED, - TETHER_ERROR_ENTITLEMENT_UNKNOWN, - }) - public @interface EntitlementResult { - } - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { - TETHER_ERROR_NO_ERROR, - TETHER_ERROR_UNKNOWN_IFACE, - TETHER_ERROR_SERVICE_UNAVAIL, - TETHER_ERROR_INTERNAL_ERROR, - TETHER_ERROR_TETHER_IFACE_ERROR, - TETHER_ERROR_ENABLE_FORWARDING_ERROR, - TETHER_ERROR_DISABLE_FORWARDING_ERROR, - TETHER_ERROR_IFACE_CFG_ERROR, - TETHER_ERROR_DHCPSERVER_ERROR, - }) - public @interface TetheringIfaceError { - } - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { - TETHER_ERROR_SERVICE_UNAVAIL, - TETHER_ERROR_INTERNAL_ERROR, - TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION, - TETHER_ERROR_UNKNOWN_TYPE, - }) - public @interface StartTetheringError { - } - - public static final int TETHER_ERROR_NO_ERROR = 0; - public static final int TETHER_ERROR_UNKNOWN_IFACE = 1; - public static final int TETHER_ERROR_SERVICE_UNAVAIL = 2; - public static final int TETHER_ERROR_UNSUPPORTED = 3; - public static final int TETHER_ERROR_UNAVAIL_IFACE = 4; - public static final int TETHER_ERROR_INTERNAL_ERROR = 5; - public static final int TETHER_ERROR_TETHER_IFACE_ERROR = 6; - public static final int TETHER_ERROR_UNTETHER_IFACE_ERROR = 7; - public static final int TETHER_ERROR_ENABLE_FORWARDING_ERROR = 8; - public static final int TETHER_ERROR_DISABLE_FORWARDING_ERROR = 9; - public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; - public static final int TETHER_ERROR_PROVISIONING_FAILED = 11; - public static final int TETHER_ERROR_DHCPSERVER_ERROR = 12; - public static final int TETHER_ERROR_ENTITLEMENT_UNKNOWN = 13; - public static final int TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION = 14; - public static final int TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION = 15; - public static final int TETHER_ERROR_UNKNOWN_TYPE = 16; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = false, value = { - TETHER_HARDWARE_OFFLOAD_STOPPED, - TETHER_HARDWARE_OFFLOAD_STARTED, - TETHER_HARDWARE_OFFLOAD_FAILED, - }) - public @interface TetherOffloadStatus { - } - - /** Tethering offload status is stopped. */ - public static final int TETHER_HARDWARE_OFFLOAD_STOPPED = 0; - /** Tethering offload status is started. */ - public static final int TETHER_HARDWARE_OFFLOAD_STARTED = 1; - /** Fail to start tethering offload. */ - public static final int TETHER_HARDWARE_OFFLOAD_FAILED = 2; - - /** - * Create a TetheringManager object for interacting with the tethering service. - * - * @param context Context for the manager. - * @param connectorSupplier Supplier for the manager connector; may return null while the - * service is not connected. - * {@hide} - */ - @SystemApi(client = MODULE_LIBRARIES) - public TetheringManager(@NonNull final Context context, - @NonNull Supplier<IBinder> connectorSupplier) { - mContext = context; - mCallback = new TetheringCallbackInternal(); - mConnectorSupplier = connectorSupplier; - - final String pkgName = mContext.getOpPackageName(); - - final IBinder connector = mConnectorSupplier.get(); - // If the connector is available on start, do not start a polling thread. This introduces - // differences in the thread that sends the oneway binder calls to the service between the - // first few seconds after boot and later, but it avoids always having differences between - // the first usage of TetheringManager from a process and subsequent usages (so the - // difference is only on boot). On boot binder calls may be queued until the service comes - // up and be sent from a worker thread; later, they are always sent from the caller thread. - // Considering that it's just oneway binder calls, and ordering is preserved, this seems - // better than inconsistent behavior persisting after boot. - if (connector != null) { - mConnector = ITetheringConnector.Stub.asInterface(connector); - } else { - startPollingForConnector(); - } - - Log.i(TAG, "registerTetheringEventCallback:" + pkgName); - getConnector(c -> c.registerTetheringEventCallback(mCallback, pkgName)); - } - - private void startPollingForConnector() { - new Thread(() -> { - while (true) { - try { - Thread.sleep(CONNECTOR_POLL_INTERVAL_MILLIS); - } catch (InterruptedException e) { - // Not much to do here, the system needs to wait for the connector - } - - final IBinder connector = mConnectorSupplier.get(); - if (connector != null) { - onTetheringConnected(ITetheringConnector.Stub.asInterface(connector)); - return; - } - } - }).start(); - } - - private interface ConnectorConsumer { - void onConnectorAvailable(ITetheringConnector connector) throws RemoteException; - } - - private void onTetheringConnected(ITetheringConnector connector) { - // Process the connector wait queue in order, including any items that are added - // while processing. - // - // 1. Copy the queue to a local variable under lock. - // 2. Drain the local queue with the lock released (otherwise, enqueuing future commands - // would block on the lock). - // 3. Acquire the lock again. If any new tasks were queued during step 2, goto 1. - // If not, set mConnector to non-null so future tasks are run immediately, not queued. - // - // For this to work, all calls to the tethering service must use getConnector(), which - // ensures that tasks are added to the queue with the lock held. - // - // Once mConnector is set to non-null, it will never be null again. If the network stack - // process crashes, no recovery is possible. - // TODO: evaluate whether it is possible to recover from network stack process crashes - // (though in most cases the system will have crashed when the network stack process - // crashes). - do { - final List<ConnectorConsumer> localWaitQueue; - synchronized (mConnectorWaitQueue) { - localWaitQueue = new ArrayList<>(mConnectorWaitQueue); - mConnectorWaitQueue.clear(); - } - - // Allow more tasks to be added at the end without blocking while draining the queue. - for (ConnectorConsumer task : localWaitQueue) { - try { - task.onConnectorAvailable(connector); - } catch (RemoteException e) { - // Most likely the network stack process crashed, which is likely to crash the - // system. Keep processing other requests but report the error loudly. - Log.wtf(TAG, "Error processing request for the tethering connector", e); - } - } - - synchronized (mConnectorWaitQueue) { - if (mConnectorWaitQueue.size() == 0) { - mConnector = connector; - return; - } - } - } while (true); - } - - /** - * Asynchronously get the ITetheringConnector to execute some operation. - * - * <p>If the connector is already available, the operation will be executed on the caller's - * thread. Otherwise it will be queued and executed on a worker thread. The operation should be - * limited to performing oneway binder calls to minimize differences due to threading. - */ - private void getConnector(ConnectorConsumer consumer) { - final ITetheringConnector connector; - synchronized (mConnectorWaitQueue) { - connector = mConnector; - if (connector == null) { - mConnectorWaitQueue.add(consumer); - return; - } - } - - try { - consumer.onConnectorAvailable(connector); - } catch (RemoteException e) { - throw new IllegalStateException(e); - } - } - - private interface RequestHelper { - void runRequest(ITetheringConnector connector, IIntResultListener listener); - } - - // Used to dispatch legacy ConnectivityManager methods that expect tethering to be able to - // return results and perform operations synchronously. - // TODO: remove once there are no callers of these legacy methods. - private class RequestDispatcher { - private final ConditionVariable mWaiting; - public volatile int mRemoteResult; - - private final IIntResultListener mListener = new IIntResultListener.Stub() { - @Override - public void onResult(final int resultCode) { - mRemoteResult = resultCode; - mWaiting.open(); - } - }; - - RequestDispatcher() { - mWaiting = new ConditionVariable(); - } - - int waitForResult(final RequestHelper request) { - getConnector(c -> request.runRequest(c, mListener)); - if (!mWaiting.block(DEFAULT_TIMEOUT_MS)) { - throw new IllegalStateException("Callback timeout"); - } - - throwIfPermissionFailure(mRemoteResult); - - return mRemoteResult; - } - } - - private void throwIfPermissionFailure(final int errorCode) { - switch (errorCode) { - case TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION: - throw new SecurityException("No android.permission.TETHER_PRIVILEGED" - + " or android.permission.WRITE_SETTINGS permission"); - case TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION: - throw new SecurityException( - "No android.permission.ACCESS_NETWORK_STATE permission"); - } - } - - private class TetheringCallbackInternal extends ITetheringEventCallback.Stub { - private volatile int mError = TETHER_ERROR_NO_ERROR; - private final ConditionVariable mWaitForCallback = new ConditionVariable(); - - @Override - public void onCallbackStarted(TetheringCallbackStartedParcel parcel) { - mTetheringConfiguration = parcel.config; - mTetherStatesParcel = parcel.states; - mWaitForCallback.open(); - } - - @Override - public void onCallbackStopped(int errorCode) { - mError = errorCode; - mWaitForCallback.open(); - } - - @Override - public void onUpstreamChanged(Network network) { } - - @Override - public void onConfigurationChanged(TetheringConfigurationParcel config) { - mTetheringConfiguration = config; - } - - @Override - public void onTetherStatesChanged(TetherStatesParcel states) { - mTetherStatesParcel = states; - } - - @Override - public void onTetherClientsChanged(List<TetheredClient> clients) { } - - @Override - public void onOffloadStatusChanged(int status) { } - - public void waitForStarted() { - mWaitForCallback.block(DEFAULT_TIMEOUT_MS); - throwIfPermissionFailure(mError); - } - } - - /** - * Attempt to tether the named interface. This will setup a dhcp server - * on the interface, forward and NAT IP v4 packets and forward DNS requests - * to the best active upstream network interface. Note that if no upstream - * IP network interface is available, dhcp will still run and traffic will be - * allowed between the tethered devices and this device, though upstream net - * access will of course fail until an upstream network interface becomes - * active. - * - * @deprecated The only usages is PanService. It uses this for legacy reasons - * and will migrate away as soon as possible. - * - * @param iface the interface name to tether. - * @return error a {@code TETHER_ERROR} value indicating success or failure type - * - * {@hide} - */ - @Deprecated - @SystemApi(client = MODULE_LIBRARIES) - public int tether(@NonNull final String iface) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "tether caller:" + callerPkg); - final RequestDispatcher dispatcher = new RequestDispatcher(); - - return dispatcher.waitForResult((connector, listener) -> { - try { - connector.tether(iface, callerPkg, listener); - } catch (RemoteException e) { - throw new IllegalStateException(e); - } - }); - } - - /** - * Stop tethering the named interface. - * - * @deprecated The only usages is PanService. It uses this for legacy reasons - * and will migrate away as soon as possible. - * - * {@hide} - */ - @Deprecated - @SystemApi(client = MODULE_LIBRARIES) - public int untether(@NonNull final String iface) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "untether caller:" + callerPkg); - - final RequestDispatcher dispatcher = new RequestDispatcher(); - - return dispatcher.waitForResult((connector, listener) -> { - try { - connector.untether(iface, callerPkg, listener); - } catch (RemoteException e) { - throw new IllegalStateException(e); - } - }); - } - - /** - * Attempt to both alter the mode of USB and Tethering of USB. - * - * @deprecated New client should not use this API anymore. All clients should use - * #startTethering or #stopTethering which encapsulate proper entitlement logic. If the API is - * used and an entitlement check is needed, downstream USB tethering will be enabled but will - * not have any upstream. - * - * {@hide} - */ - @Deprecated - @SystemApi(client = MODULE_LIBRARIES) - public int setUsbTethering(final boolean enable) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "setUsbTethering caller:" + callerPkg); - - final RequestDispatcher dispatcher = new RequestDispatcher(); - - return dispatcher.waitForResult((connector, listener) -> { - try { - connector.setUsbTethering(enable, callerPkg, listener); - } catch (RemoteException e) { - throw new IllegalStateException(e); - } - }); - } - - /** - * Use with {@link #startTethering} to specify additional parameters when starting tethering. - */ - public static class TetheringRequest { - /** A configuration set for TetheringRequest. */ - private final TetheringRequestParcel mRequestParcel; - - private TetheringRequest(final TetheringRequestParcel request) { - mRequestParcel = request; - } - - /** Builder used to create TetheringRequest. */ - public static class Builder { - private final TetheringRequestParcel mBuilderParcel; - - /** Default constructor of Builder. */ - public Builder(@TetheringType final int type) { - mBuilderParcel = new TetheringRequestParcel(); - mBuilderParcel.tetheringType = type; - mBuilderParcel.localIPv4Address = null; - mBuilderParcel.staticClientAddress = null; - mBuilderParcel.exemptFromEntitlementCheck = false; - mBuilderParcel.showProvisioningUi = true; - } - - /** - * Configure tethering with static IPv4 assignment. - * - * A DHCP server will be started, but will only be able to offer the client address. - * The two addresses must be in the same prefix. - * - * @param localIPv4Address The preferred local IPv4 link address to use. - * @param clientAddress The static client address. - */ - @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) - @NonNull - public Builder setStaticIpv4Addresses(@NonNull final LinkAddress localIPv4Address, - @NonNull final LinkAddress clientAddress) { - Objects.requireNonNull(localIPv4Address); - Objects.requireNonNull(clientAddress); - if (!checkStaticAddressConfiguration(localIPv4Address, clientAddress)) { - throw new IllegalArgumentException("Invalid server or client addresses"); - } - - mBuilderParcel.localIPv4Address = localIPv4Address; - mBuilderParcel.staticClientAddress = clientAddress; - return this; - } - - /** Start tethering without entitlement checks. */ - @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) - @NonNull - public Builder setExemptFromEntitlementCheck(boolean exempt) { - mBuilderParcel.exemptFromEntitlementCheck = exempt; - return this; - } - - /** - * If an entitlement check is needed, sets whether to show the entitlement UI or to - * perform a silent entitlement check. By default, the entitlement UI is shown. - */ - @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) - @NonNull - public Builder setShouldShowEntitlementUi(boolean showUi) { - mBuilderParcel.showProvisioningUi = showUi; - return this; - } - - /** Build {@link TetheringRequest] with the currently set configuration. */ - @NonNull - public TetheringRequest build() { - return new TetheringRequest(mBuilderParcel); - } - } - - /** - * Get the local IPv4 address, if one was configured with - * {@link Builder#setStaticIpv4Addresses}. - */ - @Nullable - public LinkAddress getLocalIpv4Address() { - return mRequestParcel.localIPv4Address; - } - - /** - * Get the static IPv4 address of the client, if one was configured with - * {@link Builder#setStaticIpv4Addresses}. - */ - @Nullable - public LinkAddress getClientStaticIpv4Address() { - return mRequestParcel.staticClientAddress; - } - - /** Get tethering type. */ - @TetheringType - public int getTetheringType() { - return mRequestParcel.tetheringType; - } - - /** Check if exempt from entitlement check. */ - public boolean isExemptFromEntitlementCheck() { - return mRequestParcel.exemptFromEntitlementCheck; - } - - /** Check if show entitlement ui. */ - public boolean getShouldShowEntitlementUi() { - return mRequestParcel.showProvisioningUi; - } - - /** - * Check whether the two addresses are ipv4 and in the same prefix. - * @hide - */ - public static boolean checkStaticAddressConfiguration( - @NonNull final LinkAddress localIPv4Address, - @NonNull final LinkAddress clientAddress) { - return localIPv4Address.getPrefixLength() == clientAddress.getPrefixLength() - && localIPv4Address.isIpv4() && clientAddress.isIpv4() - && new IpPrefix(localIPv4Address.toString()).equals( - new IpPrefix(clientAddress.toString())); - } - - /** - * Get a TetheringRequestParcel from the configuration - * @hide - */ - public TetheringRequestParcel getParcel() { - return mRequestParcel; - } - - /** String of TetheringRequest detail. */ - public String toString() { - return "TetheringRequest [ type= " + mRequestParcel.tetheringType - + ", localIPv4Address= " + mRequestParcel.localIPv4Address - + ", staticClientAddress= " + mRequestParcel.staticClientAddress - + ", exemptFromEntitlementCheck= " - + mRequestParcel.exemptFromEntitlementCheck + ", showProvisioningUi= " - + mRequestParcel.showProvisioningUi + " ]"; - } - } - - /** - * Callback for use with {@link #startTethering} to find out whether tethering succeeded. - */ - public interface StartTetheringCallback { - /** - * Called when tethering has been successfully started. - */ - default void onTetheringStarted() {} - - /** - * Called when starting tethering failed. - * - * @param error The error that caused the failure. - */ - default void onTetheringFailed(@StartTetheringError final int error) {} - } - - /** - * Starts tethering and runs tether provisioning for the given type if needed. If provisioning - * fails, stopTethering will be called automatically. - * - * <p>Without {@link android.Manifest.permission.TETHER_PRIVILEGED} permission, the call will - * fail if a tethering entitlement check is required. - * - * @param request a {@link TetheringRequest} which can specify the preferred configuration. - * @param executor {@link Executor} to specify the thread upon which the callback of - * TetheringRequest will be invoked. - * @param callback A callback that will be called to indicate the success status of the - * tethering start request. - */ - @RequiresPermission(anyOf = { - android.Manifest.permission.TETHER_PRIVILEGED, - android.Manifest.permission.WRITE_SETTINGS - }) - public void startTethering(@NonNull final TetheringRequest request, - @NonNull final Executor executor, @NonNull final StartTetheringCallback callback) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "startTethering caller:" + callerPkg); - - final IIntResultListener listener = new IIntResultListener.Stub() { - @Override - public void onResult(final int resultCode) { - executor.execute(() -> { - if (resultCode == TETHER_ERROR_NO_ERROR) { - callback.onTetheringStarted(); - } else { - callback.onTetheringFailed(resultCode); - } - }); - } - }; - getConnector(c -> c.startTethering(request.getParcel(), callerPkg, listener)); - } - - /** - * Starts tethering and runs tether provisioning for the given type if needed. If provisioning - * fails, stopTethering will be called automatically. - * - * <p>Without {@link android.Manifest.permission.TETHER_PRIVILEGED} permission, the call will - * fail if a tethering entitlement check is required. - * - * @param type The tethering type, on of the {@code TetheringManager#TETHERING_*} constants. - * @param executor {@link Executor} to specify the thread upon which the callback of - * TetheringRequest will be invoked. - * @hide - */ - @RequiresPermission(anyOf = { - android.Manifest.permission.TETHER_PRIVILEGED, - android.Manifest.permission.WRITE_SETTINGS - }) - @SystemApi(client = MODULE_LIBRARIES) - public void startTethering(int type, @NonNull final Executor executor, - @NonNull final StartTetheringCallback callback) { - startTethering(new TetheringRequest.Builder(type).build(), executor, callback); - } - - /** - * Stops tethering for the given type. Also cancels any provisioning rechecks for that type if - * applicable. - * - * <p>Without {@link android.Manifest.permission.TETHER_PRIVILEGED} permission, the call will - * fail if a tethering entitlement check is required. - */ - @RequiresPermission(anyOf = { - android.Manifest.permission.TETHER_PRIVILEGED, - android.Manifest.permission.WRITE_SETTINGS - }) - public void stopTethering(@TetheringType final int type) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "stopTethering caller:" + callerPkg); - - getConnector(c -> c.stopTethering(type, callerPkg, new IIntResultListener.Stub() { - @Override - public void onResult(int resultCode) { - // TODO: provide an API to obtain result - // This has never been possible as stopTethering has always been void and never - // taken a callback object. The only indication that callers have is if the call - // results in a TETHER_STATE_CHANGE broadcast. - } - })); - } - - /** - * Callback for use with {@link #getLatestTetheringEntitlementResult} to find out whether - * entitlement succeeded. - */ - public interface OnTetheringEntitlementResultListener { - /** - * Called to notify entitlement result. - * - * @param resultCode an int value of entitlement result. It may be one of - * {@link #TETHER_ERROR_NO_ERROR}, - * {@link #TETHER_ERROR_PROVISIONING_FAILED}, or - * {@link #TETHER_ERROR_ENTITLEMENT_UNKNOWN}. - */ - void onTetheringEntitlementResult(@EntitlementResult int result); - } - - /** - * Request the latest value of the tethering entitlement check. - * - * <p>This method will only return the latest entitlement result if it is available. If no - * cached entitlement result is available, and {@code showEntitlementUi} is false, - * {@link #TETHER_ERROR_ENTITLEMENT_UNKNOWN} will be returned. If {@code showEntitlementUi} is - * true, entitlement will be run. - * - * <p>Without {@link android.Manifest.permission.TETHER_PRIVILEGED} permission, the call will - * fail if a tethering entitlement check is required. - * - * @param type the downstream type of tethering. Must be one of {@code #TETHERING_*} constants. - * @param showEntitlementUi a boolean indicating whether to check result for the UI-based - * entitlement check or the silent entitlement check. - * @param executor the executor on which callback will be invoked. - * @param listener an {@link OnTetheringEntitlementResultListener} which will be called to - * notify the caller of the result of entitlement check. The listener may be called zero - * or one time. - */ - @RequiresPermission(anyOf = { - android.Manifest.permission.TETHER_PRIVILEGED, - android.Manifest.permission.WRITE_SETTINGS - }) - public void requestLatestTetheringEntitlementResult(@TetheringType int type, - boolean showEntitlementUi, - @NonNull Executor executor, - @NonNull final OnTetheringEntitlementResultListener listener) { - if (listener == null) { - throw new IllegalArgumentException( - "OnTetheringEntitlementResultListener cannot be null."); - } - - ResultReceiver wrappedListener = new ResultReceiver(null /* handler */) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - executor.execute(() -> { - listener.onTetheringEntitlementResult(resultCode); - }); - } - }; - - requestLatestTetheringEntitlementResult(type, wrappedListener, - showEntitlementUi); - } - - /** - * Helper function of #requestLatestTetheringEntitlementResult to remain backwards compatible - * with ConnectivityManager#getLatestTetheringEntitlementResult - * - * {@hide} - */ - // TODO: improve the usage of ResultReceiver, b/145096122 - @SystemApi(client = MODULE_LIBRARIES) - public void requestLatestTetheringEntitlementResult(@TetheringType final int type, - @NonNull final ResultReceiver receiver, final boolean showEntitlementUi) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "getLatestTetheringEntitlementResult caller:" + callerPkg); - - getConnector(c -> c.requestLatestTetheringEntitlementResult( - type, receiver, showEntitlementUi, callerPkg)); - } - - /** - * Callback for use with {@link registerTetheringEventCallback} to find out tethering - * upstream status. - */ - public interface TetheringEventCallback { - /** - * Called when tethering supported status changed. - * - * <p>This will be called immediately after the callback is registered, and may be called - * multiple times later upon changes. - * - * <p>Tethering may be disabled via system properties, device configuration, or device - * policy restrictions. - * - * @param supported The new supported status - */ - default void onTetheringSupported(boolean supported) {} - - /** - * Called when tethering upstream changed. - * - * <p>This will be called immediately after the callback is registered, and may be called - * multiple times later upon changes. - * - * @param network the {@link Network} of tethering upstream. Null means tethering doesn't - * have any upstream. - */ - default void onUpstreamChanged(@Nullable Network network) {} - - /** - * Called when there was a change in tethering interface regular expressions. - * - * <p>This will be called immediately after the callback is registered, and may be called - * multiple times later upon changes. - * @param reg The new regular expressions. - * - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - default void onTetherableInterfaceRegexpsChanged(@NonNull TetheringInterfaceRegexps reg) {} - - /** - * Called when there was a change in the list of tetherable interfaces. Tetherable - * interface means this interface is available and can be used for tethering. - * - * <p>This will be called immediately after the callback is registered, and may be called - * multiple times later upon changes. - * @param interfaces The list of tetherable interface names. - */ - default void onTetherableInterfacesChanged(@NonNull List<String> interfaces) {} - - /** - * Called when there was a change in the list of tethered interfaces. - * - * <p>This will be called immediately after the callback is registered, and may be called - * multiple times later upon changes. - * @param interfaces The list of 0 or more String of currently tethered interface names. - */ - default void onTetheredInterfacesChanged(@NonNull List<String> interfaces) {} - - /** - * Called when an error occurred configuring tethering. - * - * <p>This will be called immediately after the callback is registered if the latest status - * on the interface is an error, and may be called multiple times later upon changes. - * @param ifName Name of the interface. - * @param error One of {@code TetheringManager#TETHER_ERROR_*}. - */ - default void onError(@NonNull String ifName, @TetheringIfaceError int error) {} - - /** - * Called when the list of tethered clients changes. - * - * <p>This callback provides best-effort information on connected clients based on state - * known to the system, however the list cannot be completely accurate (and should not be - * used for security purposes). For example, clients behind a bridge and using static IP - * assignments are not visible to the tethering device; or even when using DHCP, such - * clients may still be reported by this callback after disconnection as the system cannot - * determine if they are still connected. - * @param clients The new set of tethered clients; the collection is not ordered. - */ - default void onClientsChanged(@NonNull Collection<TetheredClient> clients) {} - - /** - * Called when tethering offload status changes. - * - * <p>This will be called immediately after the callback is registered. - * @param status The offload status. - */ - default void onOffloadStatusChanged(@TetherOffloadStatus int status) {} - } - - /** - * Regular expressions used to identify tethering interfaces. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public static class TetheringInterfaceRegexps { - private final String[] mTetherableBluetoothRegexs; - private final String[] mTetherableUsbRegexs; - private final String[] mTetherableWifiRegexs; - - /** @hide */ - public TetheringInterfaceRegexps(@NonNull String[] tetherableBluetoothRegexs, - @NonNull String[] tetherableUsbRegexs, @NonNull String[] tetherableWifiRegexs) { - mTetherableBluetoothRegexs = tetherableBluetoothRegexs.clone(); - mTetherableUsbRegexs = tetherableUsbRegexs.clone(); - mTetherableWifiRegexs = tetherableWifiRegexs.clone(); - } - - @NonNull - public List<String> getTetherableBluetoothRegexs() { - return Collections.unmodifiableList(Arrays.asList(mTetherableBluetoothRegexs)); - } - - @NonNull - public List<String> getTetherableUsbRegexs() { - return Collections.unmodifiableList(Arrays.asList(mTetherableUsbRegexs)); - } - - @NonNull - public List<String> getTetherableWifiRegexs() { - return Collections.unmodifiableList(Arrays.asList(mTetherableWifiRegexs)); - } - - @Override - public int hashCode() { - return Objects.hash(mTetherableBluetoothRegexs, mTetherableUsbRegexs, - mTetherableWifiRegexs); - } - - @Override - public boolean equals(@Nullable Object obj) { - if (!(obj instanceof TetheringInterfaceRegexps)) return false; - final TetheringInterfaceRegexps other = (TetheringInterfaceRegexps) obj; - return Arrays.equals(mTetherableBluetoothRegexs, other.mTetherableBluetoothRegexs) - && Arrays.equals(mTetherableUsbRegexs, other.mTetherableUsbRegexs) - && Arrays.equals(mTetherableWifiRegexs, other.mTetherableWifiRegexs); - } - } - - /** - * Start listening to tethering change events. Any new added callback will receive the last - * tethering status right away. If callback is registered, - * {@link TetheringEventCallback#onUpstreamChanged} will immediately be called. If tethering - * has no upstream or disabled, the argument of callback will be null. The same callback object - * cannot be registered twice. - * - * @param executor the executor on which callback will be invoked. - * @param callback the callback to be called when tethering has change events. - */ - @RequiresPermission(Manifest.permission.ACCESS_NETWORK_STATE) - public void registerTetheringEventCallback(@NonNull Executor executor, - @NonNull TetheringEventCallback callback) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "registerTetheringEventCallback caller:" + callerPkg); - - synchronized (mTetheringEventCallbacks) { - if (mTetheringEventCallbacks.containsKey(callback)) { - throw new IllegalArgumentException("callback was already registered."); - } - final ITetheringEventCallback remoteCallback = new ITetheringEventCallback.Stub() { - // Only accessed with a lock on this object - private final HashMap<String, Integer> mErrorStates = new HashMap<>(); - private String[] mLastTetherableInterfaces = null; - private String[] mLastTetheredInterfaces = null; - - @Override - public void onUpstreamChanged(Network network) throws RemoteException { - executor.execute(() -> { - callback.onUpstreamChanged(network); - }); - } - - private synchronized void sendErrorCallbacks(final TetherStatesParcel newStates) { - for (int i = 0; i < newStates.erroredIfaceList.length; i++) { - final String iface = newStates.erroredIfaceList[i]; - final Integer lastError = mErrorStates.get(iface); - final int newError = newStates.lastErrorList[i]; - if (newError != TETHER_ERROR_NO_ERROR - && !Objects.equals(lastError, newError)) { - callback.onError(iface, newError); - } - mErrorStates.put(iface, newError); - } - } - - private synchronized void maybeSendTetherableIfacesChangedCallback( - final TetherStatesParcel newStates) { - if (Arrays.equals(mLastTetherableInterfaces, newStates.availableList)) return; - mLastTetherableInterfaces = newStates.availableList.clone(); - callback.onTetherableInterfacesChanged( - Collections.unmodifiableList(Arrays.asList(mLastTetherableInterfaces))); - } - - private synchronized void maybeSendTetheredIfacesChangedCallback( - final TetherStatesParcel newStates) { - if (Arrays.equals(mLastTetheredInterfaces, newStates.tetheredList)) return; - mLastTetheredInterfaces = newStates.tetheredList.clone(); - callback.onTetheredInterfacesChanged( - Collections.unmodifiableList(Arrays.asList(mLastTetheredInterfaces))); - } - - // Called immediately after the callbacks are registered. - @Override - public void onCallbackStarted(TetheringCallbackStartedParcel parcel) { - executor.execute(() -> { - callback.onTetheringSupported(parcel.tetheringSupported); - callback.onUpstreamChanged(parcel.upstreamNetwork); - sendErrorCallbacks(parcel.states); - sendRegexpsChanged(parcel.config); - maybeSendTetherableIfacesChangedCallback(parcel.states); - maybeSendTetheredIfacesChangedCallback(parcel.states); - callback.onClientsChanged(parcel.tetheredClients); - callback.onOffloadStatusChanged(parcel.offloadStatus); - }); - } - - @Override - public void onCallbackStopped(int errorCode) { - executor.execute(() -> { - throwIfPermissionFailure(errorCode); - }); - } - - private void sendRegexpsChanged(TetheringConfigurationParcel parcel) { - callback.onTetherableInterfaceRegexpsChanged(new TetheringInterfaceRegexps( - parcel.tetherableBluetoothRegexs, - parcel.tetherableUsbRegexs, - parcel.tetherableWifiRegexs)); - } - - @Override - public void onConfigurationChanged(TetheringConfigurationParcel config) { - executor.execute(() -> sendRegexpsChanged(config)); - } - - @Override - public void onTetherStatesChanged(TetherStatesParcel states) { - executor.execute(() -> { - sendErrorCallbacks(states); - maybeSendTetherableIfacesChangedCallback(states); - maybeSendTetheredIfacesChangedCallback(states); - }); - } - - @Override - public void onTetherClientsChanged(final List<TetheredClient> clients) { - executor.execute(() -> callback.onClientsChanged(clients)); - } - - @Override - public void onOffloadStatusChanged(final int status) { - executor.execute(() -> callback.onOffloadStatusChanged(status)); - } - }; - getConnector(c -> c.registerTetheringEventCallback(remoteCallback, callerPkg)); - mTetheringEventCallbacks.put(callback, remoteCallback); - } - } - - /** - * Remove tethering event callback previously registered with - * {@link #registerTetheringEventCallback}. - * - * @param callback previously registered callback. - */ - @RequiresPermission(anyOf = { - Manifest.permission.TETHER_PRIVILEGED, - Manifest.permission.ACCESS_NETWORK_STATE - }) - public void unregisterTetheringEventCallback(@NonNull final TetheringEventCallback callback) { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "unregisterTetheringEventCallback caller:" + callerPkg); - - synchronized (mTetheringEventCallbacks) { - ITetheringEventCallback remoteCallback = mTetheringEventCallbacks.remove(callback); - if (remoteCallback == null) { - throw new IllegalArgumentException("callback was not registered."); - } - - getConnector(c -> c.unregisterTetheringEventCallback(remoteCallback, callerPkg)); - } - } - - /** - * Get a more detailed error code after a Tethering or Untethering - * request asynchronously failed. - * - * @param iface The name of the interface of interest - * @return error The error code of the last error tethering or untethering the named - * interface - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public int getLastTetherError(@NonNull final String iface) { - mCallback.waitForStarted(); - if (mTetherStatesParcel == null) return TETHER_ERROR_NO_ERROR; - - int i = 0; - for (String errored : mTetherStatesParcel.erroredIfaceList) { - if (iface.equals(errored)) return mTetherStatesParcel.lastErrorList[i]; - - i++; - } - return TETHER_ERROR_NO_ERROR; - } - - /** - * Get the list of regular expressions that define any tetherable - * USB network interfaces. If USB tethering is not supported by the - * device, this list should be empty. - * - * @return an array of 0 or more regular expression Strings defining - * what interfaces are considered tetherable usb interfaces. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public @NonNull String[] getTetherableUsbRegexs() { - mCallback.waitForStarted(); - return mTetheringConfiguration.tetherableUsbRegexs; - } - - /** - * Get the list of regular expressions that define any tetherable - * Wifi network interfaces. If Wifi tethering is not supported by the - * device, this list should be empty. - * - * @return an array of 0 or more regular expression Strings defining - * what interfaces are considered tetherable wifi interfaces. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public @NonNull String[] getTetherableWifiRegexs() { - mCallback.waitForStarted(); - return mTetheringConfiguration.tetherableWifiRegexs; - } - - /** - * Get the list of regular expressions that define any tetherable - * Bluetooth network interfaces. If Bluetooth tethering is not supported by the - * device, this list should be empty. - * - * @return an array of 0 or more regular expression Strings defining - * what interfaces are considered tetherable bluetooth interfaces. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public @NonNull String[] getTetherableBluetoothRegexs() { - mCallback.waitForStarted(); - return mTetheringConfiguration.tetherableBluetoothRegexs; - } - - /** - * Get the set of tetherable, available interfaces. This list is limited by - * device configuration and current interface existence. - * - * @return an array of 0 or more Strings of tetherable interface names. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public @NonNull String[] getTetherableIfaces() { - mCallback.waitForStarted(); - if (mTetherStatesParcel == null) return new String[0]; - - return mTetherStatesParcel.availableList; - } - - /** - * Get the set of tethered interfaces. - * - * @return an array of 0 or more String of currently tethered interface names. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public @NonNull String[] getTetheredIfaces() { - mCallback.waitForStarted(); - if (mTetherStatesParcel == null) return new String[0]; - - return mTetherStatesParcel.tetheredList; - } - - /** - * Get the set of interface names which attempted to tether but - * failed. Re-attempting to tether may cause them to reset to the Tethered - * state. Alternatively, causing the interface to be destroyed and recreated - * may cause them to reset to the available state. - * {@link TetheringManager#getLastTetherError} can be used to get more - * information on the cause of the errors. - * - * @return an array of 0 or more String indicating the interface names - * which failed to tether. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public @NonNull String[] getTetheringErroredIfaces() { - mCallback.waitForStarted(); - if (mTetherStatesParcel == null) return new String[0]; - - return mTetherStatesParcel.erroredIfaceList; - } - - /** - * Get the set of tethered dhcp ranges. - * - * @deprecated This API just return the default value which is not used in DhcpServer. - * @hide - */ - @Deprecated - public @NonNull String[] getTetheredDhcpRanges() { - mCallback.waitForStarted(); - return mTetheringConfiguration.legacyDhcpRanges; - } - - /** - * Check if the device allows for tethering. It may be disabled via - * {@code ro.tether.denied} system property, Settings.TETHER_SUPPORTED or - * due to device configuration. - * - * @return a boolean - {@code true} indicating Tethering is supported. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public boolean isTetheringSupported() { - final String callerPkg = mContext.getOpPackageName(); - - return isTetheringSupported(callerPkg); - } - - /** - * Check if the device allows for tethering. It may be disabled via {@code ro.tether.denied} - * system property, Settings.TETHER_SUPPORTED or due to device configuration. This is useful - * for system components that query this API on behalf of an app. In particular, Bluetooth - * has @UnsupportedAppUsage calls that will let apps turn on bluetooth tethering if they have - * the right permissions, but such an app needs to know whether it can (permissions as well - * as support from the device) turn on tethering in the first place to show the appropriate UI. - * - * @param callerPkg The caller package name, if it is not matching the calling uid, - * SecurityException would be thrown. - * @return a boolean - {@code true} indicating Tethering is supported. - * @hide - */ - @SystemApi(client = MODULE_LIBRARIES) - public boolean isTetheringSupported(@NonNull final String callerPkg) { - - final RequestDispatcher dispatcher = new RequestDispatcher(); - final int ret = dispatcher.waitForResult((connector, listener) -> { - try { - connector.isTetheringSupported(callerPkg, listener); - } catch (RemoteException e) { - throw new IllegalStateException(e); - } - }); - - return ret == TETHER_ERROR_NO_ERROR; - } - - /** - * Stop all active tethering. - * - * <p>Without {@link android.Manifest.permission.TETHER_PRIVILEGED} permission, the call will - * fail if a tethering entitlement check is required. - */ - @RequiresPermission(anyOf = { - android.Manifest.permission.TETHER_PRIVILEGED, - android.Manifest.permission.WRITE_SETTINGS - }) - public void stopAllTethering() { - final String callerPkg = mContext.getOpPackageName(); - Log.i(TAG, "stopAllTethering caller:" + callerPkg); - - getConnector(c -> c.stopAllTethering(callerPkg, new IIntResultListener.Stub() { - @Override - public void onResult(int resultCode) { - // TODO: add an API parameter to send result to caller. - // This has never been possible as stopAllTethering has always been void and never - // taken a callback object. The only indication that callers have is if the call - // results in a TETHER_STATE_CHANGE broadcast. - } - })); - } -} diff --git a/packages/Tethering/common/TetheringLib/src/android/net/TetheringRequestParcel.aidl b/packages/Tethering/common/TetheringLib/src/android/net/TetheringRequestParcel.aidl deleted file mode 100644 index c0280d3dbfaf..000000000000 --- a/packages/Tethering/common/TetheringLib/src/android/net/TetheringRequestParcel.aidl +++ /dev/null @@ -1,31 +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.net; - -import android.net.LinkAddress; - -/** - * Configuration details for requesting tethering. - * @hide - */ -parcelable TetheringRequestParcel { - int tetheringType; - LinkAddress localIPv4Address; - LinkAddress staticClientAddress; - boolean exemptFromEntitlementCheck; - boolean showProvisioningUi; -} diff --git a/packages/Tethering/jarjar-rules.txt b/packages/Tethering/jarjar-rules.txt deleted file mode 100644 index 591861f5b837..000000000000 --- a/packages/Tethering/jarjar-rules.txt +++ /dev/null @@ -1,11 +0,0 @@ -# These must be kept in sync with the framework-tethering-shared-srcs filegroup. -# Classes from the framework-tethering-shared-srcs filegroup. -# If there are files in that filegroup that are not covered below, the classes in the -# module will be overwritten by the ones in the framework. -rule com.android.internal.util.** com.android.networkstack.tethering.util.@1 -rule android.util.LocalLog* com.android.networkstack.tethering.util.LocalLog@1 - -rule android.net.shared.Inet4AddressUtils* com.android.networkstack.tethering.shared.Inet4AddressUtils@1 - -# Classes from net-utils-framework-common -rule com.android.net.module.util.** com.android.networkstack.tethering.util.@1
\ No newline at end of file diff --git a/packages/Tethering/jni/android_net_util_TetheringUtils.cpp b/packages/Tethering/jni/android_net_util_TetheringUtils.cpp deleted file mode 100644 index 549344064405..000000000000 --- a/packages/Tethering/jni/android_net_util_TetheringUtils.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 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. - */ - -#include <errno.h> -#include <error.h> -#include <jni.h> -#include <nativehelper/JNIHelp.h> -#include <nativehelper/ScopedUtfChars.h> -#include <net/if.h> -#include <netinet/icmp6.h> -#include <sys/socket.h> - -#define LOG_TAG "TetheringUtils" -#include <android/log.h> - -namespace android { - -static void android_net_util_setupRaSocket(JNIEnv *env, jobject clazz, jobject javaFd, - jint ifIndex) -{ - static const int kLinkLocalHopLimit = 255; - - int fd = jniGetFDFromFileDescriptor(env, javaFd); - - // Set an ICMPv6 filter that only passes Router Solicitations. - struct icmp6_filter rs_only; - ICMP6_FILTER_SETBLOCKALL(&rs_only); - ICMP6_FILTER_SETPASS(ND_ROUTER_SOLICIT, &rs_only); - socklen_t len = sizeof(rs_only); - if (setsockopt(fd, IPPROTO_ICMPV6, ICMP6_FILTER, &rs_only, len) != 0) { - jniThrowExceptionFmt(env, "java/net/SocketException", - "setsockopt(ICMP6_FILTER): %s", strerror(errno)); - return; - } - - // Most/all of the rest of these options can be set via Java code, but - // because we're here on account of setting an icmp6_filter go ahead - // and do it all natively for now. - - // Set the multicast hoplimit to 255 (link-local only). - int hops = kLinkLocalHopLimit; - len = sizeof(hops); - if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, len) != 0) { - jniThrowExceptionFmt(env, "java/net/SocketException", - "setsockopt(IPV6_MULTICAST_HOPS): %s", strerror(errno)); - return; - } - - // Set the unicast hoplimit to 255 (link-local only). - hops = kLinkLocalHopLimit; - len = sizeof(hops); - if (setsockopt(fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops, len) != 0) { - jniThrowExceptionFmt(env, "java/net/SocketException", - "setsockopt(IPV6_UNICAST_HOPS): %s", strerror(errno)); - return; - } - - // Explicitly disable multicast loopback. - int off = 0; - len = sizeof(off); - if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &off, len) != 0) { - jniThrowExceptionFmt(env, "java/net/SocketException", - "setsockopt(IPV6_MULTICAST_LOOP): %s", strerror(errno)); - return; - } - - // Specify the IPv6 interface to use for outbound multicast. - len = sizeof(ifIndex); - if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifIndex, len) != 0) { - jniThrowExceptionFmt(env, "java/net/SocketException", - "setsockopt(IPV6_MULTICAST_IF): %s", strerror(errno)); - return; - } - - // Additional options to be considered: - // - IPV6_TCLASS - // - IPV6_RECVPKTINFO - // - IPV6_RECVHOPLIMIT - - // Bind to [::]. - const struct sockaddr_in6 sin6 = { - .sin6_family = AF_INET6, - .sin6_port = 0, - .sin6_flowinfo = 0, - .sin6_addr = IN6ADDR_ANY_INIT, - .sin6_scope_id = 0, - }; - auto sa = reinterpret_cast<const struct sockaddr *>(&sin6); - len = sizeof(sin6); - if (bind(fd, sa, len) != 0) { - jniThrowExceptionFmt(env, "java/net/SocketException", - "bind(IN6ADDR_ANY): %s", strerror(errno)); - return; - } - - // Join the all-routers multicast group, ff02::2%index. - struct ipv6_mreq all_rtrs = { - .ipv6mr_multiaddr = {{{0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2}}}, - .ipv6mr_interface = ifIndex, - }; - len = sizeof(all_rtrs); - if (setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &all_rtrs, len) != 0) { - jniThrowExceptionFmt(env, "java/net/SocketException", - "setsockopt(IPV6_JOIN_GROUP): %s", strerror(errno)); - return; - } -} - -/* - * JNI registration. - */ -static const JNINativeMethod gMethods[] = { - /* name, signature, funcPtr */ - { "setupRaSocket", "(Ljava/io/FileDescriptor;I)V", (void*) android_net_util_setupRaSocket }, -}; - -int register_android_net_util_TetheringUtils(JNIEnv* env) { - return jniRegisterNativeMethods(env, - "android/net/util/TetheringUtils", - gMethods, NELEM(gMethods)); -} - -extern "C" jint JNI_OnLoad(JavaVM* vm, void*) { - JNIEnv *env; - if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { - __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "ERROR: GetEnv failed"); - return JNI_ERR; - } - - if (register_android_net_util_TetheringUtils(env) < 0) { - return JNI_ERR; - } - - return JNI_VERSION_1_6; -} - -}; // namespace android diff --git a/packages/Tethering/proguard.flags b/packages/Tethering/proguard.flags deleted file mode 100644 index 051fbd19fc6c..000000000000 --- a/packages/Tethering/proguard.flags +++ /dev/null @@ -1,9 +0,0 @@ -# Keep class's integer static field for MessageUtils to parsing their name. --keep class com.android.networkstack.tethering.Tethering$TetherMasterSM { - static final int CMD_*; - static final int EVENT_*; -} - --keepclassmembers class android.net.ip.IpServer { - static final int CMD_*; -} diff --git a/packages/Tethering/res/drawable-hdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_bluetooth.png Binary files differdeleted file mode 100644 index 9451174d65d7..000000000000 --- a/packages/Tethering/res/drawable-hdpi/stat_sys_tether_bluetooth.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-hdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_general.png Binary files differdeleted file mode 100644 index 79d5756ae38e..000000000000 --- a/packages/Tethering/res/drawable-hdpi/stat_sys_tether_general.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-hdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-hdpi/stat_sys_tether_usb.png Binary files differdeleted file mode 100644 index cae1bd1b2574..000000000000 --- a/packages/Tethering/res/drawable-hdpi/stat_sys_tether_usb.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-ldpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_bluetooth.png Binary files differdeleted file mode 100644 index ffe8e8c98232..000000000000 --- a/packages/Tethering/res/drawable-ldpi/stat_sys_tether_bluetooth.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-ldpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_general.png Binary files differdeleted file mode 100644 index ca20f7352090..000000000000 --- a/packages/Tethering/res/drawable-ldpi/stat_sys_tether_general.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-ldpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-ldpi/stat_sys_tether_usb.png Binary files differdeleted file mode 100644 index 65e907565ec1..000000000000 --- a/packages/Tethering/res/drawable-ldpi/stat_sys_tether_usb.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-mdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_bluetooth.png Binary files differdeleted file mode 100644 index f42dae0fdcb9..000000000000 --- a/packages/Tethering/res/drawable-mdpi/stat_sys_tether_bluetooth.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-mdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_general.png Binary files differdeleted file mode 100644 index 065516185ad4..000000000000 --- a/packages/Tethering/res/drawable-mdpi/stat_sys_tether_general.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-mdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-mdpi/stat_sys_tether_usb.png Binary files differdeleted file mode 100644 index 2e2b8ca2e9cb..000000000000 --- a/packages/Tethering/res/drawable-mdpi/stat_sys_tether_usb.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_bluetooth.png Binary files differdeleted file mode 100644 index 3f57d1c76ccb..000000000000 --- a/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_bluetooth.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_general.png Binary files differdeleted file mode 100644 index 34b0cb36736a..000000000000 --- a/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_general.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_usb.png Binary files differdeleted file mode 100644 index 36afe485b5bb..000000000000 --- a/packages/Tethering/res/drawable-xhdpi/stat_sys_tether_usb.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png Binary files differdeleted file mode 100644 index 25acfbb01ba4..000000000000 --- a/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_bluetooth.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_general.png b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_general.png Binary files differdeleted file mode 100644 index 5c656012e615..000000000000 --- a/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_general.png +++ /dev/null diff --git a/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_usb.png b/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_usb.png Binary files differdeleted file mode 100644 index 28b4b5438e55..000000000000 --- a/packages/Tethering/res/drawable-xxhdpi/stat_sys_tether_usb.png +++ /dev/null diff --git a/packages/Tethering/res/values-af/strings.xml b/packages/Tethering/res/values-af/strings.xml deleted file mode 100644 index 056168b12e89..000000000000 --- a/packages/Tethering/res/values-af/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Verbinding of warmkol is aktief"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tik om op te stel."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Verbinding is gedeaktiveer"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontak jou administrateur vir besonderhede"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Warmkol- en verbindingstatus"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-am/strings.xml b/packages/Tethering/res/values-am/strings.xml deleted file mode 100644 index ac468dd14414..000000000000 --- a/packages/Tethering/res/values-am/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"እንደ ሞደም መሰካት ወይም መገናኛ ነጥብ ገባሪ"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"ለማዋቀር መታ ያድርጉ።"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"እንደ ሞደም መሰካት ተሰናክሏል"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"ለዝርዝሮች የእርስዎን አስተዳዳሪ ያነጋግሩ"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"መገናኛ ነጥብ እና እንደ ሞደም የመሰካት ሁኔታ"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ar/strings.xml b/packages/Tethering/res/values-ar/strings.xml deleted file mode 100644 index 7d5bad34da04..000000000000 --- a/packages/Tethering/res/values-ar/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"النطاق نشط أو نقطة الاتصال نشطة"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"انقر للإعداد."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"التوصيل متوقف."</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"تواصَل مع المشرف للحصول على التفاصيل."</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"حالة نقطة الاتصال والتوصيل"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-as/strings.xml b/packages/Tethering/res/values-as/strings.xml deleted file mode 100644 index 091350455ba0..000000000000 --- a/packages/Tethering/res/values-as/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"টে\'ডাৰিং অথবা হ\'টস্প\'ট সক্ৰিয় অৱস্থাত আছে"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"ছেট আপ কৰিবলৈ টিপক।"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"টে\'ডাৰিঙৰ সুবিধাটো অক্ষম কৰি থোৱা হৈছে"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"সবিশেষ জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"হ’টস্প\'ট আৰু টে\'ডাৰিঙৰ স্থিতি"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-az/strings.xml b/packages/Tethering/res/values-az/strings.xml deleted file mode 100644 index dce70da178f1..000000000000 --- a/packages/Tethering/res/values-az/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Birləşmə və ya hotspot aktivdir"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Ayarlamaq üçün toxunun."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Birləşmə deaktivdir"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Detallar üçün adminlə əlaqə saxlayın"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot & birləşmə statusu"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-b+sr+Latn/strings.xml b/packages/Tethering/res/values-b+sr+Latn/strings.xml deleted file mode 100644 index b0774ec9a840..000000000000 --- a/packages/Tethering/res/values-b+sr+Latn/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Privezivanje ili hotspot je aktivan"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da biste podesili."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Privezivanje je onemogućeno"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Potražite detalje od administratora"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status hotspota i privezivanja"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-be/strings.xml b/packages/Tethering/res/values-be/strings.xml deleted file mode 100644 index a8acebe2e992..000000000000 --- a/packages/Tethering/res/values-be/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Мадэм або хот-спот актыўныя"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Дакраніцеся, каб наладзіць."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Рэжым мадэма выключаны"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Звярніцеся да адміністратара па падрабязную інфармацыю"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Стан \"Хот-спот і мадэм\""</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-bg/strings.xml b/packages/Tethering/res/values-bg/strings.xml deleted file mode 100644 index 94fb2d8f176a..000000000000 --- a/packages/Tethering/res/values-bg/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Има активна споделена връзка или точка за достъп"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Докоснете, за да настроите."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Функцията за тетъринг е деактивирана"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Свържете се с администратора си за подробности"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Състояние на функцията за точка за достъп и тетъринг"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-bn/strings.xml b/packages/Tethering/res/values-bn/strings.xml deleted file mode 100644 index aea02b9ddff8..000000000000 --- a/packages/Tethering/res/values-bn/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"টিথারিং বা হটস্পট চালু আছে"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"সেট-আপ করতে ট্যাপ করুন।"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"টিথারিং বন্ধ করা আছে"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"বিশদে জানতে অ্যাডমিনের সাথে যোগাযোগ করুন"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"হটস্পট ও টিথারিং স্ট্যাটাস"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-bs/strings.xml b/packages/Tethering/res/values-bs/strings.xml deleted file mode 100644 index de232724c5d9..000000000000 --- a/packages/Tethering/res/values-bs/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Aktivno je povezivanje putem mobitela ili pristupna tačka"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da postavite."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Povezivanje putem mobitela je onemogućeno"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontaktirajte svog administratora za detalje"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status pristupne tačke i povezivanja putem mobitela"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ca/strings.xml b/packages/Tethering/res/values-ca/strings.xml deleted file mode 100644 index 88b795c1f8b2..000000000000 --- a/packages/Tethering/res/values-ca/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Compartició de xarxa o punt d\'accés Wi‑Fi actius"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Toca per configurar."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"La compartició de xarxa està desactivada"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacta amb el teu administrador per obtenir més informació"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estat del punt d\'accés Wi‑Fi i de la compartició de xarxa"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-cs/strings.xml b/packages/Tethering/res/values-cs/strings.xml deleted file mode 100644 index 8c1b83bf3ee3..000000000000 --- a/packages/Tethering/res/values-cs/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering nebo hotspot je aktivní"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Klepnutím zahájíte nastavení."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering je zakázán"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"O podrobnosti požádejte administrátora"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stav hotspotu a tetheringu"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-da/strings.xml b/packages/Tethering/res/values-da/strings.xml deleted file mode 100644 index f413e7054819..000000000000 --- a/packages/Tethering/res/values-da/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Netdeling eller hotspot er aktivt"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tryk for at konfigurere."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Netdeling er deaktiveret"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakt din administrator for at få oplysninger"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status for hotspot og netdeling"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-de/strings.xml b/packages/Tethering/res/values-de/strings.xml deleted file mode 100644 index f057d7824e81..000000000000 --- a/packages/Tethering/res/values-de/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering oder Hotspot aktiv"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Zum Einrichten tippen."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering ist deaktiviert"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Bitte wende dich für weitere Informationen an den Administrator"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot- und Tethering-Status"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-el/strings.xml b/packages/Tethering/res/values-el/strings.xml deleted file mode 100644 index b3c986bdafd6..000000000000 --- a/packages/Tethering/res/values-el/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Πρόσδεση ή σύνδεση σημείου πρόσβασης ενεργή"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Πατήστε για ρύθμιση."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Η σύνδεση είναι απενεργοποιημένη"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Επικοινωνήστε με τον διαχειριστή σας για λεπτομέρειες"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Κατάσταση σημείου πρόσβασης Wi-Fi και σύνδεσης"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-en-rAU/strings.xml b/packages/Tethering/res/values-en-rAU/strings.xml deleted file mode 100644 index 769e01208afc..000000000000 --- a/packages/Tethering/res/values-en-rAU/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-en-rCA/strings.xml b/packages/Tethering/res/values-en-rCA/strings.xml deleted file mode 100644 index 769e01208afc..000000000000 --- a/packages/Tethering/res/values-en-rCA/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-en-rGB/strings.xml b/packages/Tethering/res/values-en-rGB/strings.xml deleted file mode 100644 index 769e01208afc..000000000000 --- a/packages/Tethering/res/values-en-rGB/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-en-rIN/strings.xml b/packages/Tethering/res/values-en-rIN/strings.xml deleted file mode 100644 index 769e01208afc..000000000000 --- a/packages/Tethering/res/values-en-rIN/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot and tethering status"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-en-rXC/strings.xml b/packages/Tethering/res/values-en-rXC/strings.xml deleted file mode 100644 index f1674bed4eb7..000000000000 --- a/packages/Tethering/res/values-en-rXC/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering or hotspot active"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tap to set up."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is disabled"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contact your admin for details"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot & tethering status"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-es-rUS/strings.xml b/packages/Tethering/res/values-es-rUS/strings.xml deleted file mode 100644 index 63689f43997c..000000000000 --- a/packages/Tethering/res/values-es-rUS/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión a red o hotspot conectados"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Presiona para configurar esta opción."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Se inhabilitó la conexión mediante dispositivo portátil"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Para obtener más información, comunícate con el administrador"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado del hotspot y la conexión mediante dispositivo portátil"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-es/strings.xml b/packages/Tethering/res/values-es/strings.xml deleted file mode 100644 index 9a34ed5e388a..000000000000 --- a/packages/Tethering/res/values-es/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión compartida o punto de acceso activos"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Toca para configurar."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"La conexión compartida está inhabilitada"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Solicita más información a tu administrador"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado del punto de acceso y de la conexión compartida"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-et/strings.xml b/packages/Tethering/res/values-et/strings.xml deleted file mode 100644 index 0970341ab0cd..000000000000 --- a/packages/Tethering/res/values-et/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Jagamine või kuumkoht on aktiivne"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Puudutage seadistamiseks."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Jagamine on keelatud"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Lisateabe saamiseks võtke ühendust oma administraatoriga"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Kuumkoha ja jagamise olek"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-eu/strings.xml b/packages/Tethering/res/values-eu/strings.xml deleted file mode 100644 index 632019e2ef1b..000000000000 --- a/packages/Tethering/res/values-eu/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Konexioa partekatzea edo wifi-gunea aktibo dago"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Sakatu konfiguratzeko."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Desgaituta dago konexioa partekatzeko aukera"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Xehetasunak lortzeko, jarri administratzailearekin harremanetan"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Wifi-gunearen eta konexioa partekatzeko eginbidearen egoera"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-fa/strings.xml b/packages/Tethering/res/values-fa/strings.xml deleted file mode 100644 index 2e21c85fa179..000000000000 --- a/packages/Tethering/res/values-fa/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"اشتراکگذاری اینترنت یا نقطه اتصال فعال"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"برای راهاندازی ضربه بزنید."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"اشتراکگذاری اینترنت غیرفعال است"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"برای جزئیات، با سرپرستتان تماس بگیرید"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"وضعیت نقطه اتصال و اشتراکگذاری اینترنت"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-fi/strings.xml b/packages/Tethering/res/values-fi/strings.xml deleted file mode 100644 index 413db3f0f8c9..000000000000 --- a/packages/Tethering/res/values-fi/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Yhteyden jakaminen tai hotspot käytössä"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Ota käyttöön napauttamalla."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Yhteyden jakaminen on poistettu käytöstä"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Pyydä lisätietoja järjestelmänvalvojalta"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspotin ja yhteyden jakamisen tila"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-fr-rCA/strings.xml b/packages/Tethering/res/values-fr-rCA/strings.xml deleted file mode 100644 index eb2e4ba54000..000000000000 --- a/packages/Tethering/res/values-fr-rCA/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Partage de connexion ou point d\'accès sans fil activé"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Touchez pour configurer."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Le partage de connexion est désactivé"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Communiquez avec votre administrateur pour obtenir plus de détails"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Point d\'accès et partage de connexion"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-fr/strings.xml b/packages/Tethering/res/values-fr/strings.xml deleted file mode 100644 index 22259c52ab9e..000000000000 --- a/packages/Tethering/res/values-fr/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Partage de connexion ou point d\'accès activé"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Appuyez pour effectuer la configuration."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Le partage de connexion est désactivé"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Pour en savoir plus, contactez votre administrateur"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"État du point d\'accès et du partage de connexion"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-gl/strings.xml b/packages/Tethering/res/values-gl/strings.xml deleted file mode 100644 index ded82fcd54ad..000000000000 --- a/packages/Tethering/res/values-gl/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Conexión compartida ou zona wifi activada"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Toca para configurar."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"A conexión compartida está desactivada"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacta co administrador para obter información"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado da zona wifi e da conexión compartida"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-gu/strings.xml b/packages/Tethering/res/values-gu/strings.xml deleted file mode 100644 index 7cbbc2de3d91..000000000000 --- a/packages/Tethering/res/values-gu/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ઇન્ટરનેટ શેર કરવાની સુવિધા અથવા હૉટસ્પૉટ સક્રિય છે"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"સેટઅપ કરવા માટે ટૅપ કરો."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરી છે"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"વિગતો માટે તમારા વ્યવસ્થાપકનો સંપર્ક કરો"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"હૉટસ્પૉટ અને ઇન્ટરનેટ શેર કરવાની સુવિધાનું સ્ટેટસ"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-hi/strings.xml b/packages/Tethering/res/values-hi/strings.xml deleted file mode 100644 index 08af81b826b3..000000000000 --- a/packages/Tethering/res/values-hi/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिंग या हॉटस्पॉट चालू है"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"सेट अप करने के लिए टैप करें."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिंग बंद है"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"जानकारी के लिए अपने एडमिन से संपर्क करें"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हॉटस्पॉट और टेदरिंग की स्थिति"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-hr/strings.xml b/packages/Tethering/res/values-hr/strings.xml deleted file mode 100644 index 827c135f205d..000000000000 --- a/packages/Tethering/res/values-hr/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Modemsko povezivanje ili žarišna točka aktivni"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Dodirnite da biste postavili."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Modemsko je povezivanje onemogućeno"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Obratite se administratoru da biste saznali pojedinosti"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status žarišne točke i modemskog povezivanja"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-hu/strings.xml b/packages/Tethering/res/values-hu/strings.xml deleted file mode 100644 index eb68d6babf8f..000000000000 --- a/packages/Tethering/res/values-hu/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Megosztás vagy aktív hotspot"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Koppintson a beállításhoz."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Az internetmegosztás le van tiltva"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"A részletekért forduljon rendszergazdájához"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot és internetmegosztás állapota"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-hy/strings.xml b/packages/Tethering/res/values-hy/strings.xml deleted file mode 100644 index 912941e53835..000000000000 --- a/packages/Tethering/res/values-hy/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Մոդեմի ռեժիմը միացված է"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Հպեք՝ կարգավորելու համար։"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Մոդեմի ռեժիմն անջատված է"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Մանրամասների համար դիմեք ձեր ադմինիստրատորին"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Թեժ կետի և մոդեմի ռեժիմի կարգավիճակը"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-in/strings.xml b/packages/Tethering/res/values-in/strings.xml deleted file mode 100644 index a4e175a439e9..000000000000 --- a/packages/Tethering/res/values-in/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering atau hotspot aktif"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Ketuk untuk menyiapkan."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering dinonaktifkan"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hubungi admin untuk mengetahui detailnya"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status hotspot & tethering"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-is/strings.xml b/packages/Tethering/res/values-is/strings.xml deleted file mode 100644 index e9f6670bcd09..000000000000 --- a/packages/Tethering/res/values-is/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Kveikt á tjóðrun eða aðgangsstað"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Ýttu til að setja upp."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Slökkt er á tjóðrun"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hafðu samband við kerfisstjórann til að fá upplýsingar"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Staða heits reits og tjóðrunar"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-it/strings.xml b/packages/Tethering/res/values-it/strings.xml deleted file mode 100644 index ffb9196f5ee3..000000000000 --- a/packages/Tethering/res/values-it/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Hotspot o tethering attivo"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tocca per impostare."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering disattivato"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contatta il tuo amministratore per avere informazioni dettagliate"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stato hotspot e tethering"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-iw/strings.xml b/packages/Tethering/res/values-iw/strings.xml deleted file mode 100644 index 7adcb47350c1..000000000000 --- a/packages/Tethering/res/values-iw/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"נקודה לשיתוף אינטרנט או שיתוף אינטרנט בין מכשירים: בסטטוס פעיל"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"יש להקיש כדי להגדיר."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"שיתוף האינטרנט בין מכשירים מושבת"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"לפרטים, יש לפנות למנהל המערכת"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"סטטוס של נקודה לשיתוף אינטרנט ושיתוף אינטרנט בין מכשירים"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ja/strings.xml b/packages/Tethering/res/values-ja/strings.xml deleted file mode 100644 index f68a73010b36..000000000000 --- a/packages/Tethering/res/values-ja/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"テザリングまたはアクセス ポイントが有効です"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"タップしてセットアップします。"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"テザリングは無効に設定されています"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"詳しくは、管理者にお問い合わせください"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"アクセス ポイントとテザリングのステータス"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ka/strings.xml b/packages/Tethering/res/values-ka/strings.xml deleted file mode 100644 index 7c22e82bd370..000000000000 --- a/packages/Tethering/res/values-ka/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ტეტერინგი ან უსადენო ქსელი აქტიურია"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"შეეხეთ დასაყენებლად."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ტეტერინგი გათიშულია"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"დამატებითი ინფორმაციისთვის დაუკავშირდით თქვენს ადმინისტრატორს"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"უსადენო ქსელის და ტეტერინგის სტატუსი"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-kk/strings.xml b/packages/Tethering/res/values-kk/strings.xml deleted file mode 100644 index 0857d06de243..000000000000 --- a/packages/Tethering/res/values-kk/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Тетеринг немесе хотспот қосулы"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Реттеу үшін түртіңіз."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Тетеринг өшірілді."</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Мәліметтерді әкімшіден алыңыз."</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Хотспот және тетеринг күйі"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-km/strings.xml b/packages/Tethering/res/values-km/strings.xml deleted file mode 100644 index 536e3d1703b1..000000000000 --- a/packages/Tethering/res/values-km/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ការភ្ជាប់ ឬហតស្ប៉តកំពុងដំណើរការ"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"ចុចដើម្បីរៀបចំ។"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ការភ្ជាប់ត្រូវបានបិទ"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"ទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ស្ថានភាពនៃការភ្ជាប់ និងហតស្ប៉ត"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-kn/strings.xml b/packages/Tethering/res/values-kn/strings.xml deleted file mode 100644 index 32f54926f4bf..000000000000 --- a/packages/Tethering/res/values-kn/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ಟೆಥರಿಂಗ್ ಅಥವಾ ಹಾಟ್ಸ್ಪಾಟ್ ಸಕ್ರಿಯವಾಗಿದೆ"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"ಸೆಟಪ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ಟೆಥರಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ಹಾಟ್ಸ್ಪಾಟ್ ಮತ್ತು ಟೆಥರಿಂಗ್ ಸ್ಥಿತಿ"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ko/strings.xml b/packages/Tethering/res/values-ko/strings.xml deleted file mode 100644 index 156b24786db5..000000000000 --- a/packages/Tethering/res/values-ko/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"테더링 또는 핫스팟 사용"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"설정하려면 탭하세요."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"테더링이 사용 중지됨"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"자세한 정보는 관리자에게 문의하세요."</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"핫스팟 및 테더링 상태"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ky/strings.xml b/packages/Tethering/res/values-ky/strings.xml deleted file mode 100644 index 18ee5fd35718..000000000000 --- a/packages/Tethering/res/values-ky/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Модем режими күйүп турат"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Жөндөө үчүн таптап коюңуз."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Телефонду модем катары колдонууга болбойт"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Кеңири маалымат үчүн администраторуңузга кайрылыңыз"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Байланыш түйүнүнүн жана модем режиминин статусу"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-lo/strings.xml b/packages/Tethering/res/values-lo/strings.xml deleted file mode 100644 index b12767018c3a..000000000000 --- a/packages/Tethering/res/values-lo/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ເປີດການປ່ອຍສັນຍານ ຫຼື ຮັອດສະປອດແລ້ວ"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"ແຕະເພື່ອຕັ້ງຄ່າ."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ການປ່ອຍສັນຍານຖືກປິດໄວ້"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"ຕິດຕໍ່ຜູ້ເບິ່ງແຍງລະບົບສຳລັບລາຍລະອຽດ"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ສະຖານະຮັອດສະປອດ ແລະ ການປ່ອຍສັນຍານ"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-lt/strings.xml b/packages/Tethering/res/values-lt/strings.xml deleted file mode 100644 index 8427baf39f31..000000000000 --- a/packages/Tethering/res/values-lt/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Įrenginys naudojamas kaip modemas arba įjungtas viešosios interneto prieigos taškas"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Palieskite, kad nustatytumėte."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Įrenginio kaip modemo naudojimas išjungtas"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Jei reikia išsamios informacijos, susisiekite su administratoriumi"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Viešosios interneto prieigos taško ir įrenginio kaip modemo naudojimo būsena"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-lv/strings.xml b/packages/Tethering/res/values-lv/strings.xml deleted file mode 100644 index aa2d6990e04f..000000000000 --- a/packages/Tethering/res/values-lv/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Piesaiste vai tīklājs ir aktīvs."</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Pieskarieties, lai to iestatītu."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Piesaiste ir atspējota"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Lai iegūtu detalizētu informāciju, sazinieties ar savu administratoru."</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Tīklāja un piesaistes statuss"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-af/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-af/strings.xml deleted file mode 100644 index 19d659c6ce36..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-af/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Verbinding het nie internet nie"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Toestelle kan nie koppel nie"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Skakel verbinding af"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Warmkol of verbinding is aan"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Bykomende heffings kan geld terwyl jy swerf"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-am/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-am/strings.xml deleted file mode 100644 index 8995430b4f09..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-am/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ማስተሳሰር ምንም በይነመረብ የለውም"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"መሣሪያዎችን ማገናኘት አይቻልም"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ማስተሳሰርን አጥፋ"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"መገናኛ ነጥብ ወይም ማስተሳሰር በርቷል"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ar/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ar/strings.xml deleted file mode 100644 index 54f3b5389ae9..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ar/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ما مِن اتصال بالإنترنت خلال التوصيل"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"تعذّر اتصال الأجهزة"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"إيقاف التوصيل"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"نقطة الاتصال أو التوصيل مفعّلان"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"قد يتم تطبيق رسوم إضافية أثناء التجوال."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-as/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-as/strings.xml deleted file mode 100644 index e215141c9eb6..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-as/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"টে\'ডাৰিঙৰ ইণ্টাৰনেট নাই"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"টে\'ডাৰিং অফ কৰক"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"হটস্পট অথবা টে\'ডাৰিং অন আছে"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ৰ\'মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-az/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-az/strings.xml deleted file mode 100644 index 1fd8e4c963a7..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-az/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modemin internetə girişi yoxdur"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Cihazları qoşmaq mümkün deyil"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Modemi deaktiv edin"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot və ya modem aktivdir"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rouminq zamanı əlavə ödənişlər tətbiq edilə bilər"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml deleted file mode 100644 index 1abe4f3aa3c7..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-b+sr+Latn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Privezivanje nema pristup internetu"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Povezivanje uređaja nije uspelo"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključi privezivanje"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Uključen je hotspot ili privezivanje"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Možda važe dodatni troškovi u romingu"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-be/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-be/strings.xml deleted file mode 100644 index 38dbd1e3914f..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-be/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Не ўдалося падключыць прылады"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Выключыць рэжым мадэма"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Хот-спот або рэжым мадэма ўключаны"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-bg/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-bg/strings.xml deleted file mode 100644 index 04b44db5c1a4..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-bg/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Тетърингът няма връзка с интернет"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Устройствата не могат да установят връзка"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Изключване на тетъринга"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Точката за достъп или тетърингът са включени"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-bn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-bn/strings.xml deleted file mode 100644 index 579d1be1c1ea..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-bn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"টিথারিং করার জন্য কোনও ইন্টারনেট কানেকশন নেই"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ডিভাইস কানেক্ট করতে পারছে না"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"টিথারিং বন্ধ করুন"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"হটস্পট বা টিথারিং চালু আছে"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"রোমিংয়ের সময় অতিরিক্ত চার্জ করা হতে পারে"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-bs/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-bs/strings.xml deleted file mode 100644 index 9ce3efe6c39d..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-bs/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Povezivanje putem mobitela nema internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Uređaji se ne mogu povezati"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključi povezivanje putem mobitela"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Pristupna tačka ili povezivanje putem mobitela je uključeno"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Mogu nastati dodatni troškovi u romingu"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ca/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ca/strings.xml deleted file mode 100644 index 46d4c35b9b83..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ca/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"La compartició de xarxa no té accés a Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"No es poden connectar els dispositius"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactiva la compartició de xarxa"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"S\'ha activat el punt d\'accés Wi‑Fi o la compartició de xarxa"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"És possible que s\'apliquin costos addicionals en itinerància"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-cs/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-cs/strings.xml deleted file mode 100644 index cc13860b3da1..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-cs/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nemá připojení k internetu"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Zařízení se nemůžou připojit"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vypnout tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Je zapnutý hotspot nebo tethering"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Při roamingu mohou být účtovány dodatečné poplatky"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-da/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-da/strings.xml deleted file mode 100644 index 92c3ae11567d..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-da/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Netdeling har ingen internetforbindelse"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enheder kan ikke oprette forbindelse"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Deaktiver netdeling"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot eller netdeling er aktiveret"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Der opkræves muligvis yderligere gebyrer ved roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-de/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-de/strings.xml deleted file mode 100644 index 967eb4db2e77..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-de/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering hat keinen Internetzugriff"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Geräte können sich nicht verbinden"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering deaktivieren"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot oder Tethering ist aktiviert"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Für das Roaming können zusätzliche Gebühren anfallen"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-el/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-el/strings.xml deleted file mode 100644 index 5fb497451f6d..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-el/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Απενεργοποιήστε τη σύνδεση"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml deleted file mode 100644 index 45647f93f246..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-en-rAU/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml deleted file mode 100644 index 45647f93f246..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-en-rCA/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml deleted file mode 100644 index 45647f93f246..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-en-rGB/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml deleted file mode 100644 index 45647f93f246..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-en-rIN/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml deleted file mode 100644 index 7877074afc66..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-en-rXC/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering has no internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml deleted file mode 100644 index 08edd81a6b04..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-es-rUS/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"La conexión mediante dispositivo móvil no tiene Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"No se pueden conectar los dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión mediante dispositivo móvil"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Es posible que se apliquen cargos adicionales por roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-es/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-es/strings.xml deleted file mode 100644 index 79f51d00e2e8..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-es/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"La conexión no se puede compartir, porque no hay acceso a Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Los dispositivos no se pueden conectar"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión compartida"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Punto de acceso o conexión compartida activados"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Puede que se apliquen cargos adicionales en itinerancia"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-et/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-et/strings.xml deleted file mode 100644 index 2da5f8a6d62a..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-et/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Jagamisel puudub internetiühendus"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Seadmed ei saa ühendust luua"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Lülita jagamine välja"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Kuumkoht või jagamine on sisse lülitatud"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rändluse kasutamisega võivad kaasneda lisatasud"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-eu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-eu/strings.xml deleted file mode 100644 index 2073f2806c18..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-eu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Ezin dira konektatu gailuak"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desaktibatu konexioa partekatzeko aukera"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Baliteke kostu gehigarriak ordaindu behar izatea ibiltaritzan"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-fa/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fa/strings.xml deleted file mode 100644 index e21b2a0852c7..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-fa/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"«اشتراکگذاری اینترنت» به اینترنت دسترسی ندارد"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"دستگاهها متصل نمیشوند"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"خاموش کردن «اشتراکگذاری اینترنت»"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"«نقطه اتصال» یا «اشتراکگذاری اینترنت» روشن است"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ممکن است درحین فراگردی تغییرات دیگر اعمال شود"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-fi/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fi/strings.xml deleted file mode 100644 index 88b0b13eb4b5..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-fi/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ei jaettavaa internetyhteyttä"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Laitteet eivät voi muodostaa yhteyttä"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Laita yhteyden jakaminen pois päältä"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot tai yhteyden jakaminen on päällä"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Roaming voi aiheuttaa lisämaksuja"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml deleted file mode 100644 index 3b781bc8db31..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-fr-rCA/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Le partage de connexion n\'est pas connecté à Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossible de connecter les appareils"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Désactiver le partage de connexion"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Le point d\'accès ou le partage de connexion est activé"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-fr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-fr/strings.xml deleted file mode 100644 index 51d7203c3652..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-fr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Aucune connexion à Internet n\'est disponible pour le partage de connexion"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossible de connecter les appareils"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Désactiver le partage de connexion"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Le point d\'accès ou le partage de connexion est activé"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-gl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-gl/strings.xml deleted file mode 100644 index 008ccb475d66..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-gl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"A conexión compartida non ten Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Non se puideron conectar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desactivar conexión compartida"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Está activada a zona wifi ou a conexión compartida"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pódense aplicar cargos adicionais en itinerancia"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-gu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-gu/strings.xml deleted file mode 100644 index f2e3b4df782f..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-gu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"રોમિંગમાં વધારાના શુલ્ક લાગી શકે છે"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-hi/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hi/strings.xml deleted file mode 100644 index b11839d760c8..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-hi/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिंग से इंटरनेट नहीं चल रहा"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"डिवाइस कनेक्ट नहीं हो पा रहे"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिंग बंद करें"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हॉटस्पॉट या टेदरिंग चालू है"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिंग के दौरान अतिरिक्त शुल्क लग सकता है"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-hr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hr/strings.xml deleted file mode 100644 index 0a5aca25b1a9..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-hr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modemsko povezivanje nema internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Uređaji se ne mogu povezati"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Isključivanje modemskog povezivanja"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Uključena je žarišna točka ili modemsko povezivanje"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"U roamingu su mogući dodatni troškovi"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-hu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hu/strings.xml deleted file mode 100644 index 21c689a44ef8..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-hu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nincs internetkapcsolat az internet megosztásához"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Az eszközök nem tudnak csatlakozni"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Internetmegosztás kikapcsolása"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"A hotspot vagy az internetmegosztás be van kapcsolva"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Roaming során további díjak léphetnek fel"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-hy/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-hy/strings.xml deleted file mode 100644 index 689d92870e50..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-hy/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Մոդեմի ռեժիմի կապը բացակայում է"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Չհաջողվեց միացնել սարքը"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Անջատել մոդեմի ռեժիմը"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-in/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-in/strings.xml deleted file mode 100644 index a5f4d19abfe9..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-in/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tidak ada koneksi internet di tethering"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Perangkat tidak dapat terhubung"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Nonaktifkan tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot atau tethering aktif"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Biaya tambahan mungkin berlaku saat roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-is/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-is/strings.xml deleted file mode 100644 index fc7e8aaf4e42..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-is/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tjóðrun er ekki með internettengingu"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Tæki geta ekki tengst"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Slökkva á tjóðrun"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Kveikt er á heitum reit eða tjóðrun"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Viðbótargjöld kunna að eiga við í reiki"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-it/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-it/strings.xml deleted file mode 100644 index 6456dd1b806a..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-it/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nessuna connessione a Internet per il tethering"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Impossibile connettere i dispositivi"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Disattiva il tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot o tethering attivi"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-iw/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-iw/strings.xml deleted file mode 100644 index 46b24bd3c508..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-iw/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"למכשירים אין אפשרות להתחבר"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"השבתה של שיתוף האינטרנט בין מכשירים"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ייתכנו חיובים נוספים בעת נדידה"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ja/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ja/strings.xml deleted file mode 100644 index e6eb277b90dd..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ja/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"テザリングがインターネットに接続されていません"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"デバイスを接続できません"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"テザリングを OFF にする"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"アクセス ポイントまたはテザリングが ON です"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ローミング時に追加料金が発生することがあります"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ka/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ka/strings.xml deleted file mode 100644 index aeddd7101da0..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ka/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ტეტერინგის გამორთვა"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-kk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-kk/strings.xml deleted file mode 100644 index 255f0a276f95..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-kk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Тетеринг режимі интернет байланысынсыз пайдаланылуда"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Құрылғыларды байланыстыру мүмкін емес"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Тетерингіні өшіру"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Хотспот немесе тетеринг қосулы"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-km/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-km/strings.xml deleted file mode 100644 index 2bceb1cf7788..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-km/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ការភ្ជាប់មិនមានអ៊ីនធឺណិតទេ"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"មិនអាចភ្ជាប់ឧបករណ៍បានទេ"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"បិទការភ្ជាប់"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ហតស្ប៉ត ឬការភ្ជាប់ត្រូវបានបើក"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"អាចមានការគិតថ្លៃបន្ថែម នៅពេលរ៉ូមីង"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-kn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-kn/strings.xml deleted file mode 100644 index ed769305a679..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-kn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ಟೆಥರಿಂಗ್ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ಟೆಥರಿಂಗ್ ಆಫ್ ಮಾಡಿ"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ಹಾಟ್ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ರೋಮಿಂಗ್ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ko/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ko/strings.xml deleted file mode 100644 index 6e504941eb8b..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ko/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"테더링으로 인터넷을 사용할 수 없음"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"기기에서 연결할 수 없음"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"테더링 사용 중지"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"핫스팟 또는 테더링 켜짐"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"로밍 중에는 추가 요금이 발생할 수 있습니다."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ky/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ky/strings.xml deleted file mode 100644 index d68128b9a554..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ky/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Модем режими Интернети жок колдонулууда"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Түзмөктөр туташпай жатат"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Модем режимин өчүрүү"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Байланыш түйүнү же модем режими күйүк"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роумингде кошумча акы алынышы мүмкүн"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-lo/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-lo/strings.xml deleted file mode 100644 index 03e134a0fc79..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-lo/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ປິດການປ່ອຍສັນຍານ"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ເປີດໃຊ້ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານຢູ່"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ອາດມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-lt/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-lt/strings.xml deleted file mode 100644 index 652cedc6e6ae..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-lt/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Nepavyko susieti įrenginių"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Išjungti įrenginio kaip modemo naudojimą"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-lv/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-lv/strings.xml deleted file mode 100644 index 221972298c18..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-lv/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Piesaistei nav interneta savienojuma"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Nevar savienot ierīces"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Izslēgt piesaisti"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ir ieslēgts tīklājs vai piesaiste"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Viesabonēšanas laikā var tikt piemērota papildu samaksa"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-mk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-mk/strings.xml deleted file mode 100644 index 227f9e346651..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-mk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Нема интернет преку мобилен"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Уредите не може да се поврзат"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Исклучи интернет преку мобилен"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Точката на пристап или интернетот преку мобилен е вклучен"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"При роаминг може да се наплатат дополнителни трошоци"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ml/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ml/strings.xml deleted file mode 100644 index ec4388512645..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ml/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ടെതറിംഗ് ഓഫാക്കുക"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ഹോട്ട്സ്പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-mn/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-mn/strings.xml deleted file mode 100644 index e263573799ed..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-mn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Модемд интернэт алга байна"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Модем болгохыг унтраах"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Роумингийн үеэр нэмэлт төлбөр нэхэмжилж болзошгүй"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-mr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-mr/strings.xml deleted file mode 100644 index adf845d078bf..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-mr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिंगला इंटरनेट नाही"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिंग बंद करा"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिंगदरम्यान अतिरिक्त शुल्क लागू होऊ शकतात"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ms/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ms/strings.xml deleted file mode 100644 index f65c451e4c21..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ms/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Penambatan tiada Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Peranti tidak dapat disambungkan"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Matikan penambatan"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Tempat liputan atau penambatan dihidupkan"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Caj tambahan mungkin digunakan semasa perayauan"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-my/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-my/strings.xml deleted file mode 100644 index 4118e775cd84..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-my/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းတွင် အင်တာနက် မရှိပါ"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"စက်များ ချိတ်ဆက်၍ မရပါ"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ပိတ်ရန်"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ဟော့စပေါ့ (သို့) မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ဖွင့်ထားသည်"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်သည့်အခါ နောက်ထပ်ကျသင့်မှုများ ရှိနိုင်သည်"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-nb/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-nb/strings.xml deleted file mode 100644 index 36853583ce82..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-nb/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Internettdeling har ikke internettilgang"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enhetene kan ikke koble til"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Slå av internettdeling"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Wi-Fi-sone eller internettdeling er på"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ytterligere kostnader kan påløpe under roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml deleted file mode 100644 index d074f1569933..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ne/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"टेदरिङमार्फत इन्टरनेट कनेक्सन प्राप्त हुन सकेन"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"यन्त्रहरू कनेक्ट गर्न सकिएन"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"टेदरिङ निष्क्रिय पार्नुहोस्"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"हटस्पट वा टेदरिङ सक्रिय छ"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml deleted file mode 100644 index 1d888942f49b..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-nl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering heeft geen internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Apparaten kunnen niet worden verbonden"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering uitschakelen"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot of tethering is ingeschakeld"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Er kunnen extra kosten voor roaming in rekening worden gebracht."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-or/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-or/strings.xml deleted file mode 100644 index 8038815fe804..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-or/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ନାହିଁ"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ଡିଭାଇସଗୁଡ଼ିକ ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ଟିଥରିଂ ବନ୍ଦ କରନ୍ତୁ"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ହଟସ୍ପଟ୍ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ରୋମିଂରେ ଥିବା ସମୟରେ ଅତିରିକ୍ତ ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-pa/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pa/strings.xml deleted file mode 100644 index 819833eab07f..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-pa/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-pl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pl/strings.xml deleted file mode 100644 index 65e4380e3916..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-pl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nie ma internetu"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Urządzenia nie mogą się połączyć"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Wyłącz tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot lub tethering jest włączony"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml deleted file mode 100644 index d8866170c191..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-pt-rBR/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"O tethering não tem Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível conectar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar o tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ponto de acesso ou tethering ativado"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pode haver cobranças extras durante o roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml deleted file mode 100644 index bfd45ca0a3e1..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-pt-rPT/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"A ligação (à Internet) via telemóvel não tem Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível ligar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar ligação (à Internet) via telemóvel"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Podem aplicar-se custos adicionais em roaming."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-pt/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-pt/strings.xml deleted file mode 100644 index d8866170c191..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-pt/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"O tethering não tem Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Não é possível conectar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Desativar o tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Ponto de acesso ou tethering ativado"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Pode haver cobranças extras durante o roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ro/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ro/strings.xml deleted file mode 100644 index 8d87a9e516ad..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ro/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Procesul de tethering nu are internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Dispozitivele nu se pot conecta"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Dezactivați procesul de tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"S-a activat hotspotul sau tethering"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Se pot aplica taxe suplimentare pentru roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ru/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ru/strings.xml deleted file mode 100644 index dbdb9ebe4931..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ru/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Режим модема используется без доступа к Интернету"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Невозможно подключить устройства."</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Отключить режим модема"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Включены точка доступа или режим модема"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-si/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-si/strings.xml deleted file mode 100644 index d8301e41c2b2..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-si/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ටෙදරින් හට අන්තර්ජාලය නැත"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"උපාංගවලට සම්බන්ධ විය නොහැකිය"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ටෙදරින් ක්රියාවිරහිත කරන්න"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"හොට්ස්පොට් හෝ ටෙදරින් ක්රියාත්මකයි"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"රෝමිං අතරතුර අමතර ගාස්තු අදාළ විය හැකිය"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-sk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sk/strings.xml deleted file mode 100644 index bef71363f450..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-sk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering nemá internetové pripojenie"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Zariadenia sa nemôžu pripojiť"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vypnúť tethering"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Je zapnutý hotspot alebo tethering"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-sl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sl/strings.xml deleted file mode 100644 index 3202c62e8a3a..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-sl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Internetna povezava prek mobilnega telefona ni vzpostavljena"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Napravi se ne moreta povezati"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Izklopi internetno povezavo prek mobilnega telefona"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Dostopna točka ali internetna povezava prek mobilnega telefona je vklopljena"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Med gostovanjem lahko nastanejo dodatni stroški"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-sq/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sq/strings.xml deleted file mode 100644 index 37f6ad286880..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-sq/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ndarja e internetit nuk ka internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Pajisjet nuk mund të lidhen"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Çaktivizo ndarjen e internetit"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Mund të zbatohen tarifime shtesë kur je në roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-sr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sr/strings.xml deleted file mode 100644 index 5566d03ed13a..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-sr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Привезивање нема приступ интернету"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Повезивање уређаја није успело"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Искључи привезивање"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Укључен је хотспот или привезивање"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Можда важе додатни трошкови у ромингу"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-sv/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sv/strings.xml deleted file mode 100644 index 9765acd0cf46..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-sv/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Det finns ingen internetanslutning för internetdelningen"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Enheterna kan inte anslutas"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Inaktivera internetdelning"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Surfzon eller internetdelning har aktiverats"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Ytterligare avgifter kan tillkomma vid roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-sw/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-sw/strings.xml deleted file mode 100644 index cf850c9cd222..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-sw/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Kipengele cha kusambaza mtandao hakina intaneti"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Imeshindwa kuunganisha vifaa"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Zima kipengele cha kusambaza mtandao"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ta/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ta/strings.xml deleted file mode 100644 index f4b15aab19b7..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ta/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"இணைப்பு முறைக்கு இணைய இணைப்பு இல்லை"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"சாதனங்களால் இணைய முடியவில்லை"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"இணைப்பு முறையை ஆஃப் செய்"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ஹாட்ஸ்பாட் அல்லது இணைப்பு முறை ஆன் செய்யப்பட்டுள்ளது"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படக்கூடும்"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-te/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-te/strings.xml deleted file mode 100644 index 937d34d52027..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-te/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"టెథరింగ్ను ఆఫ్ చేయండి"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"హాట్స్పాట్ లేదా టెథరింగ్ ఆన్లో ఉంది"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"రోమింగ్లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-th/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-th/strings.xml deleted file mode 100644 index f781fae5252e..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-th/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือไม่มีอินเทอร์เน็ต"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"อุปกรณ์เชื่อมต่อไม่ได้"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-tl/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-tl/strings.xml deleted file mode 100644 index 8d5d46537334..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-tl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Walang internet ang pag-tether"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Hindi makakonekta ang mga device"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"I-off ang pag-tether"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Naka-on ang Hotspot o pag-tether"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-tr/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-tr/strings.xml deleted file mode 100644 index 80cab33ac05e..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-tr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Tethering\'in internet bağlantısı yok"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Cihazlar bağlanamıyor"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tethering\'i kapat"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot veya tethering açık"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Dolaşım sırasında ek ücretler uygulanabilir"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-uk/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-uk/strings.xml deleted file mode 100644 index c05932a5ae7f..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-uk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Телефон, який використовується як модем, не підключений до Інтернету"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Не вдається підключити пристрої"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Вимкнути використання телефона як модема"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Увімкнено точку доступу або використання телефона як модема"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"У роумінгу може стягуватися додаткова плата"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-ur/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-ur/strings.xml deleted file mode 100644 index d820eee8ba3c..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-ur/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"آلات منسلک نہیں ہو سکتے"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"ٹیدرنگ آف کریں"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-uz/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-uz/strings.xml deleted file mode 100644 index 726148aaee5a..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-uz/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Modem internetga ulanmagan"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Qurilmalar ulanmadi"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Modem rejimini faolsizlantirish"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Hotspot yoki modem rejimi yoniq"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-vi/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-vi/strings.xml deleted file mode 100644 index b7cb0456b673..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-vi/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Không có Internet để chia sẻ kết Internet"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Các thiết bị không thể kết nối"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Tắt tính năng chia sẻ Internet"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml deleted file mode 100644 index af91afff9a4c..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-zh-rCN/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"共享网络未连接到互联网"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"设备无法连接"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"关闭网络共享"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"热点或网络共享已开启"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"漫游时可能会产生额外的费用"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml deleted file mode 100644 index 28e6b80c01a9..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-zh-rHK/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過網絡共享連線至互聯網"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"裝置無法連接"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉網絡共享"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"熱點或網絡共享已開啟"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"漫遊時可能需要支付額外費用"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml deleted file mode 100644 index 528a1e52925c..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-zh-rTW/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"無法透過網路共用連上網際網路"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"裝置無法連線"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"關閉網路共用"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"無線基地台或網路共用已開啟"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"使用漫遊服務可能須支付額外費用"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004-zu/strings.xml b/packages/Tethering/res/values-mcc310-mnc004-zu/strings.xml deleted file mode 100644 index 11eb66621971..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004-zu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="5030042590486713460">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string> - <string name="no_upstream_notification_message" msgid="3843613362272973447">"Amadivayisi awakwazi ukuxhumeka"</string> - <string name="no_upstream_notification_disable_button" msgid="6385491461813507624">"Vala ukusebenzisa ifoni njengemodemu"</string> - <string name="upstream_roaming_notification_title" msgid="3015912166812283303">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string> - <string name="upstream_roaming_notification_message" msgid="6724434706748439902">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc310-mnc004/config.xml b/packages/Tethering/res/values-mcc310-mnc004/config.xml deleted file mode 100644 index 5c5be0466a36..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004/config.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources> - <!-- Delay(millisecond) to show no upstream notification after there's no Backhaul. Set delay to - "0" for disable this feature. --> - <integer name="delay_to_show_no_upstream_after_no_backhaul">5000</integer> - - <!-- Config for showing upstream roaming notification. --> - <bool name="config_upstream_roaming_notification">true</bool> -</resources>
\ No newline at end of file diff --git a/packages/Tethering/res/values-mcc310-mnc004/strings.xml b/packages/Tethering/res/values-mcc310-mnc004/strings.xml deleted file mode 100644 index ce9ff6080717..000000000000 --- a/packages/Tethering/res/values-mcc310-mnc004/strings.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources> - <!-- String for no upstream notification title [CHAR LIMIT=200] --> - <string name="no_upstream_notification_title">Tethering has no internet</string> - <!-- String for no upstream notification title [CHAR LIMIT=200] --> - <string name="no_upstream_notification_message">Devices can\u2019t connect</string> - <!-- String for no upstream notification disable button [CHAR LIMIT=200] --> - <string name="no_upstream_notification_disable_button">Turn off tethering</string> - - <!-- String for cellular roaming notification title [CHAR LIMIT=200] --> - <string name="upstream_roaming_notification_title">Hotspot or tethering is on</string> - <!-- String for cellular roaming notification message [CHAR LIMIT=500] --> - <string name="upstream_roaming_notification_message">Additional charges may apply while roaming</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-af/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-af/strings.xml deleted file mode 100644 index 9bfa5317a9e4..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-af/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Verbinding het nie internet nie"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Toestelle kan nie koppel nie"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Skakel verbinding af"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Warmkol of verbinding is aan"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Bykomende heffings kan geld terwyl jy swerf"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-am/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-am/strings.xml deleted file mode 100644 index 5949dfa776d7..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-am/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ማስተሳሰር ምንም በይነመረብ የለውም"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"መሣሪያዎችን ማገናኘት አይቻልም"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ማስተሳሰርን አጥፋ"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"መገናኛ ነጥብ ወይም ማስተሳሰር በርቷል"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"በሚያንዣብብበት ጊዜ ተጨማሪ ክፍያዎች ተፈጻሚ ሊሆኑ ይችላሉ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ar/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ar/strings.xml deleted file mode 100644 index 8467f9b1f5cf..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ar/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ما مِن اتصال بالإنترنت خلال التوصيل"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"تعذّر اتصال الأجهزة"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"إيقاف التوصيل"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"نقطة الاتصال أو التوصيل مفعّلان"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"قد يتم تطبيق رسوم إضافية أثناء التجوال."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-as/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-as/strings.xml deleted file mode 100644 index 9776bd89da48..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-as/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"টে\'ডাৰিঙৰ ইণ্টাৰনেট নাই"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ডিভাইচসমূহ সংযোগ কৰিব নোৱাৰি"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"টে\'ডাৰিং অফ কৰক"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"হটস্পট অথবা টে\'ডাৰিং অন আছে"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ৰ\'মিঙত থাকিলে অতিৰিক্ত মাচুল প্ৰযোজ্য হ’ব পাৰে"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-az/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-az/strings.xml deleted file mode 100644 index e6d3eaf9f07c..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-az/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Modemin internetə girişi yoxdur"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Cihazları qoşmaq mümkün deyil"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Modemi deaktiv edin"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot və ya modem aktivdir"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rouminq zamanı əlavə ödənişlər tətbiq edilə bilər"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml deleted file mode 100644 index 4c8a1df8eece..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-b+sr+Latn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Privezivanje nema pristup internetu"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Povezivanje uređaja nije uspelo"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključi privezivanje"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Uključen je hotspot ili privezivanje"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Možda važe dodatni troškovi u romingu"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-be/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-be/strings.xml deleted file mode 100644 index edfa41e1ffd3..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-be/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Рэжым мадэма выкарыстоўваецца без доступу да інтэрнэту"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Не ўдалося падключыць прылады"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Выключыць рэжым мадэма"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Хот-спот або рэжым мадэма ўключаны"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Пры выкарыстанні роўмінгу можа спаганяцца дадатковая плата"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-bg/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-bg/strings.xml deleted file mode 100644 index f56398196f51..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-bg/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Тетърингът няма връзка с интернет"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Устройствата не могат да установят връзка"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Изключване на тетъринга"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Точката за достъп или тетърингът са включени"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Възможно е да ви бъдат начислени допълнителни такси при роуминг"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-bn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-bn/strings.xml deleted file mode 100644 index d8ecd2e988f9..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-bn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"টিথারিং করার জন্য কোনও ইন্টারনেট কানেকশন নেই"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ডিভাইস কানেক্ট করতে পারছে না"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"টিথারিং বন্ধ করুন"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"হটস্পট বা টিথারিং চালু আছে"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"রোমিংয়ের সময় অতিরিক্ত চার্জ করা হতে পারে"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-bs/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-bs/strings.xml deleted file mode 100644 index b85fd5e28577..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-bs/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Povezivanje putem mobitela nema internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Uređaji se ne mogu povezati"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključi povezivanje putem mobitela"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Pristupna tačka ili povezivanje putem mobitela je uključeno"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Mogu nastati dodatni troškovi u romingu"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ca/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ca/strings.xml deleted file mode 100644 index a3572151be6b..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ca/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"La compartició de xarxa no té accés a Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"No es poden connectar els dispositius"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactiva la compartició de xarxa"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"S\'ha activat el punt d\'accés Wi‑Fi o la compartició de xarxa"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"És possible que s\'apliquin costos addicionals en itinerància"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-cs/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-cs/strings.xml deleted file mode 100644 index 91196be9e557..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-cs/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nemá připojení k internetu"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Zařízení se nemůžou připojit"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vypnout tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Je zapnutý hotspot nebo tethering"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Při roamingu mohou být účtovány dodatečné poplatky"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-da/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-da/strings.xml deleted file mode 100644 index 196890011d50..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-da/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Netdeling har ingen internetforbindelse"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enheder kan ikke oprette forbindelse"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Deaktiver netdeling"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot eller netdeling er aktiveret"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Der opkræves muligvis yderligere gebyrer ved roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-de/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-de/strings.xml deleted file mode 100644 index eb3f8c52c0c5..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-de/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering hat keinen Internetzugriff"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Geräte können sich nicht verbinden"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering deaktivieren"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot oder Tethering ist aktiviert"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Für das Roaming können zusätzliche Gebühren anfallen"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-el/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-el/strings.xml deleted file mode 100644 index 56c3d81b634e..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-el/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Η σύνδεση δεν έχει πρόσβαση στο διαδίκτυο"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Δεν είναι δυνατή η σύνδεση των συσκευών"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Απενεργοποιήστε τη σύνδεση"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ενεργό σημείο πρόσβασης Wi-Fi ή ενεργή σύνδεση"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ενδέχεται να ισχύουν επιπλέον χρεώσεις κατά την περιαγωγή."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml deleted file mode 100644 index dd1a1971cdd8..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-en-rAU/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml deleted file mode 100644 index dd1a1971cdd8..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-en-rCA/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml deleted file mode 100644 index dd1a1971cdd8..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-en-rGB/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml deleted file mode 100644 index dd1a1971cdd8..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-en-rIN/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml deleted file mode 100644 index d3347aae207d..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-en-rXC/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering has no internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Devices can’t connect"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Turn off tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot or tethering is on"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Additional charges may apply while roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml deleted file mode 100644 index 2f0504f07de7..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-es-rUS/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"La conexión mediante dispositivo móvil no tiene Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"No se pueden conectar los dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión mediante dispositivo móvil"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Se activó el hotspot o la conexión mediante dispositivo móvil"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Es posible que se apliquen cargos adicionales por roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-es/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-es/strings.xml deleted file mode 100644 index 2d8f88242502..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-es/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"La conexión no se puede compartir, porque no hay acceso a Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Los dispositivos no se pueden conectar"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión compartida"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Punto de acceso o conexión compartida activados"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Puede que se apliquen cargos adicionales en itinerancia"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-et/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-et/strings.xml deleted file mode 100644 index 8493c470710d..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-et/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Jagamisel puudub internetiühendus"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Seadmed ei saa ühendust luua"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Lülita jagamine välja"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Kuumkoht või jagamine on sisse lülitatud"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rändluse kasutamisega võivad kaasneda lisatasud"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-eu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-eu/strings.xml deleted file mode 100644 index 33bccab3e88c..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-eu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Konexioa partekatzeko aukerak ez du Interneteko konexiorik"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Ezin dira konektatu gailuak"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desaktibatu konexioa partekatzeko aukera"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Wifi-gunea edo konexioa partekatzeko aukera aktibatuta dago"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Baliteke kostu gehigarriak ordaindu behar izatea ibiltaritzan"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-fa/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fa/strings.xml deleted file mode 100644 index cf8a0cc27705..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-fa/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"«اشتراکگذاری اینترنت» به اینترنت دسترسی ندارد"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"دستگاهها متصل نمیشوند"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"خاموش کردن «اشتراکگذاری اینترنت»"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"«نقطه اتصال» یا «اشتراکگذاری اینترنت» روشن است"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ممکن است درحین فراگردی تغییرات دیگر اعمال شود"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-fi/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fi/strings.xml deleted file mode 100644 index 6a3ab806db98..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-fi/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Ei jaettavaa internetyhteyttä"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Laitteet eivät voi muodostaa yhteyttä"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Laita yhteyden jakaminen pois päältä"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot tai yhteyden jakaminen on päällä"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Roaming voi aiheuttaa lisämaksuja"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml deleted file mode 100644 index ffb9bf60472e..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-fr-rCA/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Le partage de connexion n\'est pas connecté à Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossible de connecter les appareils"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Désactiver le partage de connexion"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Le point d\'accès ou le partage de connexion est activé"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-fr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-fr/strings.xml deleted file mode 100644 index 768bce3f0ab1..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-fr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Aucune connexion à Internet n\'est disponible pour le partage de connexion"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossible de connecter les appareils"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Désactiver le partage de connexion"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Le point d\'accès ou le partage de connexion est activé"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"En itinérance, des frais supplémentaires peuvent s\'appliquer"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-gl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-gl/strings.xml deleted file mode 100644 index 0c4195a7caf3..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-gl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"A conexión compartida non ten Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Non se puideron conectar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desactivar conexión compartida"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Está activada a zona wifi ou a conexión compartida"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pódense aplicar cargos adicionais en itinerancia"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-gu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-gu/strings.xml deleted file mode 100644 index e9d33a7db259..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-gu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ઇન્ટરનેટ શેર કરવાની સુવિધામાં ઇન્ટરનેટ નથી"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ડિવાઇસ કનેક્ટ કરી શકાતા નથી"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ઇન્ટરનેટ શેર કરવાની સુવિધા બંધ કરો"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"હૉટસ્પૉટ અથવા ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ છે"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"રોમિંગમાં વધારાના શુલ્ક લાગી શકે છે"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-hi/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hi/strings.xml deleted file mode 100644 index aa418ac5d3bb..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-hi/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिंग से इंटरनेट नहीं चल रहा"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"डिवाइस कनेक्ट नहीं हो पा रहे"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिंग बंद करें"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हॉटस्पॉट या टेदरिंग चालू है"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिंग के दौरान अतिरिक्त शुल्क लग सकता है"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-hr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hr/strings.xml deleted file mode 100644 index 51c524afbc53..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-hr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Modemsko povezivanje nema internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Uređaji se ne mogu povezati"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Isključivanje modemskog povezivanja"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Uključena je žarišna točka ili modemsko povezivanje"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"U roamingu su mogući dodatni troškovi"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-hu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hu/strings.xml deleted file mode 100644 index 164e45edd142..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-hu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Nincs internetkapcsolat az internet megosztásához"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Az eszközök nem tudnak csatlakozni"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Internetmegosztás kikapcsolása"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"A hotspot vagy az internetmegosztás be van kapcsolva"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Roaming során további díjak léphetnek fel"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-hy/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-hy/strings.xml deleted file mode 100644 index e76c0a4c80d5..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-hy/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Մոդեմի ռեժիմի կապը բացակայում է"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Չհաջողվեց միացնել սարքը"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Անջատել մոդեմի ռեժիմը"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Թեժ կետը կամ մոդեմի ռեժիմը միացված է"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ռոումինգում կարող են լրացուցիչ վճարներ գանձվել"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-in/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-in/strings.xml deleted file mode 100644 index 2b817f8abd17..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-in/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tidak ada koneksi internet di tethering"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Perangkat tidak dapat terhubung"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Nonaktifkan tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot atau tethering aktif"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Biaya tambahan mungkin berlaku saat roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-is/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-is/strings.xml deleted file mode 100644 index a338d9c7cab8..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-is/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tjóðrun er ekki með internettengingu"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Tæki geta ekki tengst"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Slökkva á tjóðrun"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Kveikt er á heitum reit eða tjóðrun"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Viðbótargjöld kunna að eiga við í reiki"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-it/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-it/strings.xml deleted file mode 100644 index 77769c2ac56c..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-it/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Nessuna connessione a Internet per il tethering"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Impossibile connettere i dispositivi"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Disattiva il tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot o tethering attivi"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Potrebbero essere applicati costi aggiuntivi durante il roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-iw/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-iw/strings.xml deleted file mode 100644 index 5267b5126435..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-iw/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"אי אפשר להפעיל את תכונת שיתוף האינטרנט בין מכשירים כי אין חיבור לאינטרנט"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"למכשירים אין אפשרות להתחבר"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"השבתה של שיתוף האינטרנט בין מכשירים"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"תכונת הנקודה לשיתוף אינטרנט או תכונת שיתוף האינטרנט בין מכשירים פועלת"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ייתכנו חיובים נוספים בעת נדידה"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ja/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ja/strings.xml deleted file mode 100644 index 66a9a6dd35c2..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ja/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"テザリングがインターネットに接続されていません"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"デバイスを接続できません"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"テザリングを OFF にする"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"アクセス ポイントまたはテザリングが ON です"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ローミング時に追加料金が発生することがあります"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ka/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ka/strings.xml deleted file mode 100644 index d8ad8808498f..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ka/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ტეტერინგს არ აქვს ინტერნეტზე წვდომა"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"მოწყობილობები ვერ ახერხებენ დაკავშირებას"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ტეტერინგის გამორთვა"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ჩართულია უსადენო ქსელი ან ტეტერინგი"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"როუმინგის გამოყენებისას შეიძლება ჩამოგეჭრათ დამატებითი საფასური"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-kk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-kk/strings.xml deleted file mode 100644 index 1ddd6b419b57..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-kk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Тетеринг режимі интернет байланысынсыз пайдаланылуда"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Құрылғыларды байланыстыру мүмкін емес"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Тетерингіні өшіру"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Хотспот немесе тетеринг қосулы"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роуминг кезінде қосымша ақы алынуы мүмкін."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-km/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-km/strings.xml deleted file mode 100644 index cf5a1379ccc7..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-km/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ការភ្ជាប់មិនមានអ៊ីនធឺណិតទេ"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"មិនអាចភ្ជាប់ឧបករណ៍បានទេ"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"បិទការភ្ជាប់"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ហតស្ប៉ត ឬការភ្ជាប់ត្រូវបានបើក"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"អាចមានការគិតថ្លៃបន្ថែម នៅពេលរ៉ូមីង"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-kn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-kn/strings.xml deleted file mode 100644 index 68ae68bc1998..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-kn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ಟೆಥರಿಂಗ್ ಯಾವುದೇ ಇಂಟರ್ನೆಟ್ ಕನೆಕ್ಷನ್ ಹೊಂದಿಲ್ಲ"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ಸಾಧನಗಳನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ಟೆಥರಿಂಗ್ ಆಫ್ ಮಾಡಿ"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ಹಾಟ್ಸ್ಪಾಟ್ ಅಥವಾ ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ರೋಮಿಂಗ್ನಲ್ಲಿರುವಾಗ ಹೆಚ್ಚುವರಿ ಶುಲ್ಕಗಳು ಅನ್ವಯವಾಗಬಹುದು"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ko/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ko/strings.xml deleted file mode 100644 index 17185ba2d063..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ko/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"테더링으로 인터넷을 사용할 수 없음"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"기기에서 연결할 수 없음"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"테더링 사용 중지"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"핫스팟 또는 테더링 켜짐"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"로밍 중에는 추가 요금이 발생할 수 있습니다."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ky/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ky/strings.xml deleted file mode 100644 index 6a9fb9810cc6..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ky/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Модем режими Интернети жок колдонулууда"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Түзмөктөр туташпай жатат"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Модем режимин өчүрүү"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Байланыш түйүнү же модем режими күйүк"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роумингде кошумча акы алынышы мүмкүн"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-lo/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-lo/strings.xml deleted file mode 100644 index bcc4b5762678..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-lo/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ການປ່ອຍສັນຍານບໍ່ມີອິນເຕີເນັດ"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ອຸປະກອນບໍ່ສາມາດເຊື່ອມຕໍ່ໄດ້"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ປິດການປ່ອຍສັນຍານ"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ເປີດໃຊ້ຮັອດສະປອດ ຫຼື ການປ່ອຍສັນຍານຢູ່"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ອາດມີຄ່າໃຊ້ຈ່າຍເພີ່ມເຕີມໃນລະຫວ່າງການໂຣມມິງ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-lt/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-lt/strings.xml deleted file mode 100644 index 011c2c11fb88..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-lt/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Nėra įrenginio kaip modemo naudojimo interneto ryšio"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Nepavyko susieti įrenginių"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Išjungti įrenginio kaip modemo naudojimą"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Įjungtas viešosios interneto prieigos taškas arba įrenginio kaip modemo naudojimas"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Veikiant tarptinkliniam ryšiui gali būti taikomi papildomi mokesčiai"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-lv/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-lv/strings.xml deleted file mode 100644 index 5cb2f3b7aac8..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-lv/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Piesaistei nav interneta savienojuma"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Nevar savienot ierīces"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Izslēgt piesaisti"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ir ieslēgts tīklājs vai piesaiste"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Viesabonēšanas laikā var tikt piemērota papildu samaksa"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-mk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-mk/strings.xml deleted file mode 100644 index 4cbfd887c57e..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-mk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Нема интернет преку мобилен"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Уредите не може да се поврзат"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Исклучи интернет преку мобилен"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Точката на пристап или интернетот преку мобилен е вклучен"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"При роаминг може да се наплатат дополнителни трошоци"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ml/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ml/strings.xml deleted file mode 100644 index 9cf4eaf34a97..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ml/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ടെതറിംഗിന് ഇന്റർനെറ്റ് ഇല്ല"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ഉപകരണങ്ങൾ കണക്റ്റ് ചെയ്യാനാവില്ല"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ടെതറിംഗ് ഓഫാക്കുക"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ഹോട്ട്സ്പോട്ട് അല്ലെങ്കിൽ ടെതറിംഗ് ഓണാണ്"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"റോമിംഗ് ചെയ്യുമ്പോൾ അധിക നിരക്കുകൾ ബാധകമായേക്കാം"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-mn/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-mn/strings.xml deleted file mode 100644 index 47c82c14d9d6..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-mn/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Модемд интернэт алга байна"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Төхөөрөмжүүд холбогдох боломжгүй байна"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Модем болгохыг унтраах"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Сүлжээний цэг эсвэл модем болгох асаалттай байна"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Роумингийн үеэр нэмэлт төлбөр нэхэмжилж болзошгүй"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-mr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-mr/strings.xml deleted file mode 100644 index ad9e809ab27d..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-mr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिंगला इंटरनेट नाही"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"डिव्हाइस कनेक्ट होऊ शकत नाहीत"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिंग बंद करा"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हॉटस्पॉट किंवा टेदरिंग सुरू आहे"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिंगदरम्यान अतिरिक्त शुल्क लागू होऊ शकतात"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ms/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ms/strings.xml deleted file mode 100644 index e708cb8717b3..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ms/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Penambatan tiada Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Peranti tidak dapat disambungkan"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Matikan penambatan"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Tempat liputan atau penambatan dihidupkan"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Caj tambahan mungkin digunakan semasa perayauan"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-my/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-my/strings.xml deleted file mode 100644 index ba5462250b05..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-my/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းတွင် အင်တာနက် မရှိပါ"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"စက်များ ချိတ်ဆက်၍ မရပါ"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ပိတ်ရန်"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ဟော့စပေါ့ (သို့) မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း ဖွင့်ထားသည်"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ပြင်ပကွန်ရက်နှင့် ချိတ်ဆက်သည့်အခါ နောက်ထပ်ကျသင့်မှုများ ရှိနိုင်သည်"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-nb/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-nb/strings.xml deleted file mode 100644 index 57db484a2543..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-nb/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Internettdeling har ikke internettilgang"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enhetene kan ikke koble til"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Slå av internettdeling"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Wi-Fi-sone eller internettdeling er på"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ytterligere kostnader kan påløpe under roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml deleted file mode 100644 index 1503244f5000..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ne/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"टेदरिङमार्फत इन्टरनेट कनेक्सन प्राप्त हुन सकेन"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"यन्त्रहरू कनेक्ट गर्न सकिएन"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"टेदरिङ निष्क्रिय पार्नुहोस्"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"हटस्पट वा टेदरिङ सक्रिय छ"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"रोमिङ सेवा प्रयोग गर्दा अतिरिक्त शुल्क लाग्न सक्छ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-nl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-nl/strings.xml deleted file mode 100644 index b08133f4e592..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-nl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering heeft geen internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Apparaten kunnen niet worden verbonden"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering uitschakelen"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot of tethering is ingeschakeld"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Er kunnen extra kosten voor roaming in rekening worden gebracht."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-or/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-or/strings.xml deleted file mode 100644 index 1ad4ca354ad5..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-or/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ଟିଥରିଂ ପାଇଁ କୌଣସି ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ନାହିଁ"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ଡିଭାଇସଗୁଡ଼ିକ ସଂଯୋଗ କରାଯାଇପାରିବ ନାହିଁ"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ଟିଥରିଂ ବନ୍ଦ କରନ୍ତୁ"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ହଟସ୍ପଟ୍ କିମ୍ବା ଟିଥରିଂ ଚାଲୁ ଅଛି"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ରୋମିଂରେ ଥିବା ସମୟରେ ଅତିରିକ୍ତ ଶୁଳ୍କ ଲାଗୁ ହୋଇପାରେ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-pa/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pa/strings.xml deleted file mode 100644 index 88def563d85a..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-pa/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ਟੈਦਰਿੰਗ ਕੋਲ ਇੰਟਰਨੈੱਟ ਪਹੁੰਚ ਨਹੀਂ ਹੈ"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"ਡੀਵਾਈਸ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤੇ ਜਾ ਸਕਦੇ"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ਟੈਦਰਿੰਗ ਬੰਦ ਕਰੋ"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ਹੌਟਸਪੌਟ ਜਾਂ ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ਰੋਮਿੰਗ ਦੌਰਾਨ ਵਧੀਕ ਖਰਚੇ ਲਾਗੂ ਹੋ ਸਕਦੇ ਹਨ"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-pl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pl/strings.xml deleted file mode 100644 index f9890abdc26b..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-pl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nie ma internetu"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Urządzenia nie mogą się połączyć"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Wyłącz tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot lub tethering jest włączony"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Podczas korzystania z roamingu mogą zostać naliczone dodatkowe opłaty"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml deleted file mode 100644 index ce3b88479f09..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-pt-rBR/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"O tethering não tem Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível conectar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar o tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ponto de acesso ou tethering ativado"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pode haver cobranças extras durante o roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml deleted file mode 100644 index 7e883ea57682..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-pt-rPT/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"A ligação (à Internet) via telemóvel não tem Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível ligar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar ligação (à Internet) via telemóvel"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"A zona Wi-Fi ou a ligação (à Internet) via telemóvel está ativada"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Podem aplicar-se custos adicionais em roaming."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-pt/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-pt/strings.xml deleted file mode 100644 index ce3b88479f09..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-pt/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"O tethering não tem Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Não é possível conectar os dispositivos"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Desativar o tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Ponto de acesso ou tethering ativado"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Pode haver cobranças extras durante o roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ro/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ro/strings.xml deleted file mode 100644 index 1009417316ed..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ro/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Procesul de tethering nu are internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Dispozitivele nu se pot conecta"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Dezactivați procesul de tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"S-a activat hotspotul sau tethering"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Se pot aplica taxe suplimentare pentru roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ru/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ru/strings.xml deleted file mode 100644 index 88683bed95b8..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ru/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Режим модема используется без доступа к Интернету"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Невозможно подключить устройства."</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Отключить режим модема"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Включены точка доступа или режим модема"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"За использование услуг связи в роуминге может взиматься дополнительная плата."</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-si/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-si/strings.xml deleted file mode 100644 index 176bcdb797c6..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-si/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ටෙදරින් හට අන්තර්ජාලය නැත"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"උපාංගවලට සම්බන්ධ විය නොහැකිය"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ටෙදරින් ක්රියාවිරහිත කරන්න"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"හොට්ස්පොට් හෝ ටෙදරින් ක්රියාත්මකයි"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"රෝමිං අතරතුර අමතර ගාස්තු අදාළ විය හැකිය"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-sk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sk/strings.xml deleted file mode 100644 index b9e2127fa879..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-sk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering nemá internetové pripojenie"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Zariadenia sa nemôžu pripojiť"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vypnúť tethering"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Je zapnutý hotspot alebo tethering"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Počas roamingu vám môžu byť účtované ďalšie poplatky"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-sl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sl/strings.xml deleted file mode 100644 index e8140e686a0c..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-sl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Internetna povezava prek mobilnega telefona ni vzpostavljena"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Napravi se ne moreta povezati"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Izklopi internetno povezavo prek mobilnega telefona"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Dostopna točka ali internetna povezava prek mobilnega telefona je vklopljena"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Med gostovanjem lahko nastanejo dodatni stroški"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-sq/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sq/strings.xml deleted file mode 100644 index 61e698d6e8ab..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-sq/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Ndarja e internetit nuk ka internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Pajisjet nuk mund të lidhen"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Çaktivizo ndarjen e internetit"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Zona e qasjes për internet ose ndarja e internetit është aktive"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Mund të zbatohen tarifime shtesë kur je në roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-sr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sr/strings.xml deleted file mode 100644 index b4c411c35475..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-sr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Привезивање нема приступ интернету"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Повезивање уређаја није успело"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Искључи привезивање"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Укључен је хотспот или привезивање"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Можда важе додатни трошкови у ромингу"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-sv/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sv/strings.xml deleted file mode 100644 index 4f543e47b998..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-sv/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Det finns ingen internetanslutning för internetdelningen"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Enheterna kan inte anslutas"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Inaktivera internetdelning"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Surfzon eller internetdelning har aktiverats"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Ytterligare avgifter kan tillkomma vid roaming"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-sw/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-sw/strings.xml deleted file mode 100644 index ac347ab485e0..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-sw/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Kipengele cha kusambaza mtandao hakina intaneti"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Imeshindwa kuunganisha vifaa"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Zima kipengele cha kusambaza mtandao"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Umewasha kipengele cha kusambaza mtandao au mtandao pepe"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Huenda ukatozwa gharama za ziada ukitumia mitandao ya ng\'ambo"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ta/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ta/strings.xml deleted file mode 100644 index 2ea2467e5879..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ta/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"இணைப்பு முறைக்கு இணைய இணைப்பு இல்லை"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"சாதனங்களால் இணைய முடியவில்லை"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"இணைப்பு முறையை ஆஃப் செய்"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ஹாட்ஸ்பாட் அல்லது இணைப்பு முறை ஆன் செய்யப்பட்டுள்ளது"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"ரோமிங்கின்போது கூடுதல் கட்டணங்கள் விதிக்கப்படக்கூடும்"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-te/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-te/strings.xml deleted file mode 100644 index 9360297dd807..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-te/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"టెథరింగ్ చేయడానికి ఇంటర్నెట్ కనెక్షన్ లేదు"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"పరికరాలు కనెక్ట్ అవ్వడం లేదు"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"టెథరింగ్ను ఆఫ్ చేయండి"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"హాట్స్పాట్ లేదా టెథరింగ్ ఆన్లో ఉంది"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"రోమింగ్లో ఉన్నప్పుడు అదనపు ఛార్జీలు వర్తించవచ్చు"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-th/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-th/strings.xml deleted file mode 100644 index 9c4d7e08f2b6..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-th/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือไม่มีอินเทอร์เน็ต"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"อุปกรณ์เชื่อมต่อไม่ได้"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ปิดการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ฮอตสปอตหรือการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือเปิดอยู่"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"อาจมีค่าใช้จ่ายเพิ่มเติมขณะโรมมิ่ง"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-tl/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-tl/strings.xml deleted file mode 100644 index a7c78a593267..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-tl/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Walang internet ang pag-tether"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Hindi makakonekta ang mga device"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"I-off ang pag-tether"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Naka-on ang Hotspot o pag-tether"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Posibleng magkaroon ng mga karagdagang singil habang nagro-roam"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-tr/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-tr/strings.xml deleted file mode 100644 index 93da2c3f7981..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-tr/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Tethering\'in internet bağlantısı yok"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Cihazlar bağlanamıyor"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tethering\'i kapat"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot veya tethering açık"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Dolaşım sırasında ek ücretler uygulanabilir"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-uk/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-uk/strings.xml deleted file mode 100644 index ee0dcd2c4b6a..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-uk/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Телефон, який використовується як модем, не підключений до Інтернету"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Не вдається підключити пристрої"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Вимкнути використання телефона як модема"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Увімкнено точку доступу або використання телефона як модема"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"У роумінгу може стягуватися додаткова плата"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-ur/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-ur/strings.xml deleted file mode 100644 index 41cd28eef9bd..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-ur/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"ٹیدرنگ میں انٹرنیٹ نہیں ہے"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"آلات منسلک نہیں ہو سکتے"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"ٹیدرنگ آف کریں"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"ہاٹ اسپاٹ یا ٹیدرنگ آن ہے"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"رومنگ کے دوران اضافی چارجز لاگو ہو سکتے ہیں"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-uz/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-uz/strings.xml deleted file mode 100644 index c847bc943bd4..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-uz/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Modem internetga ulanmagan"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Qurilmalar ulanmadi"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Modem rejimini faolsizlantirish"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Hotspot yoki modem rejimi yoniq"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Rouming vaqtida qoʻshimcha haq olinishi mumkin"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-vi/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-vi/strings.xml deleted file mode 100644 index a74326f09ec5..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-vi/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Không có Internet để chia sẻ kết Internet"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Các thiết bị không thể kết nối"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Tắt tính năng chia sẻ Internet"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"Điểm phát sóng hoặc tính năng chia sẻ Internet đang bật"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Bạn có thể mất thêm phí dữ liệu khi chuyển vùng"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml deleted file mode 100644 index d7370036e351..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-zh-rCN/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"共享网络未连接到互联网"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"设备无法连接"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"关闭网络共享"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"热点或网络共享已开启"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"漫游时可能会产生额外的费用"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml deleted file mode 100644 index f378a9dc2cfb..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-zh-rHK/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過網絡共享連線至互聯網"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"裝置無法連接"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉網絡共享"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"熱點或網絡共享已開啟"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"漫遊時可能需要支付額外費用"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml deleted file mode 100644 index cd653df1dac6..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-zh-rTW/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"無法透過網路共用連上網際網路"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"裝置無法連線"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"關閉網路共用"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"無線基地台或網路共用已開啟"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"使用漫遊服務可能須支付額外費用"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480-zu/strings.xml b/packages/Tethering/res/values-mcc311-mnc480-zu/strings.xml deleted file mode 100644 index 32f6df56f154..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480-zu/strings.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="no_upstream_notification_title" msgid="611650570559011140">"Ukusebenzisa ifoni njengemodemu akunayo i-inthanethi"</string> - <string name="no_upstream_notification_message" msgid="6508394877641864863">"Amadivayisi awakwazi ukuxhumeka"</string> - <string name="no_upstream_notification_disable_button" msgid="7609346639290990508">"Vala ukusebenzisa ifoni njengemodemu"</string> - <string name="upstream_roaming_notification_title" msgid="6032901176124830787">"I-hotspot noma ukusebenzisa ifoni njengemodemu kuvuliwe"</string> - <string name="upstream_roaming_notification_message" msgid="7599056263326217523">"Kungaba nezinkokhelo ezengeziwe uma uzula"</string> -</resources> diff --git a/packages/Tethering/res/values-mcc311-mnc480/config.xml b/packages/Tethering/res/values-mcc311-mnc480/config.xml deleted file mode 100644 index 5c5be0466a36..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480/config.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources> - <!-- Delay(millisecond) to show no upstream notification after there's no Backhaul. Set delay to - "0" for disable this feature. --> - <integer name="delay_to_show_no_upstream_after_no_backhaul">5000</integer> - - <!-- Config for showing upstream roaming notification. --> - <bool name="config_upstream_roaming_notification">true</bool> -</resources>
\ No newline at end of file diff --git a/packages/Tethering/res/values-mcc311-mnc480/strings.xml b/packages/Tethering/res/values-mcc311-mnc480/strings.xml deleted file mode 100644 index ce9ff6080717..000000000000 --- a/packages/Tethering/res/values-mcc311-mnc480/strings.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources> - <!-- String for no upstream notification title [CHAR LIMIT=200] --> - <string name="no_upstream_notification_title">Tethering has no internet</string> - <!-- String for no upstream notification title [CHAR LIMIT=200] --> - <string name="no_upstream_notification_message">Devices can\u2019t connect</string> - <!-- String for no upstream notification disable button [CHAR LIMIT=200] --> - <string name="no_upstream_notification_disable_button">Turn off tethering</string> - - <!-- String for cellular roaming notification title [CHAR LIMIT=200] --> - <string name="upstream_roaming_notification_title">Hotspot or tethering is on</string> - <!-- String for cellular roaming notification message [CHAR LIMIT=500] --> - <string name="upstream_roaming_notification_message">Additional charges may apply while roaming</string> -</resources> diff --git a/packages/Tethering/res/values-mk/strings.xml b/packages/Tethering/res/values-mk/strings.xml deleted file mode 100644 index 9ad9b9a58935..000000000000 --- a/packages/Tethering/res/values-mk/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Активно е врзување или точка на пристап"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Допрете за поставување."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Врзувањето е оневозможено"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Контактирајте со администраторот за детали"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус на точката на пристап и врзувањето"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ml/strings.xml b/packages/Tethering/res/values-ml/strings.xml deleted file mode 100644 index 9db79ce220a4..000000000000 --- a/packages/Tethering/res/values-ml/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ടെതറിംഗ് അല്ലെങ്കിൽ ഹോട്ട്സ്പോട്ട് സജീവമാണ്"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"സജ്ജീകരിക്കാൻ ടാപ്പ് ചെയ്യുക."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ടെതറിംഗ് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"വിശദാംശങ്ങൾക്ക് നിങ്ങളുടെ അഡ്മിനെ ബന്ധപ്പെടുക"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ഹോട്ട്സ്പോട്ടിന്റെയും ടെതറിംഗിന്റെയും നില"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-mn/strings.xml b/packages/Tethering/res/values-mn/strings.xml deleted file mode 100644 index 42d1edbaceb9..000000000000 --- a/packages/Tethering/res/values-mn/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Модем болгох эсвэл сүлжээний цэг идэвхтэй байна"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Тохируулахын тулд товшино уу."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Модем болгохыг идэвхгүй болгосон"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Дэлгэрэнгүй мэдээлэл авахын тулд админтайгаа холбогдоно уу"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Сүлжээний цэг болон модем болгох төлөв"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-mr/strings.xml b/packages/Tethering/res/values-mr/strings.xml deleted file mode 100644 index 13995b6b8aa5..000000000000 --- a/packages/Tethering/res/values-mr/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिंग किंवा हॉटस्पॉट अॅक्टिव्ह आहे"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"सेट करण्यासाठी टॅप करा."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिंग बंद केले आहे"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"तपशीलांसाठी तुमच्या ॲडमिनशी संपर्क साधा"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हॉटस्पॉट आणि टेदरिंगची स्थिती"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ms/strings.xml b/packages/Tethering/res/values-ms/strings.xml deleted file mode 100644 index d6a67f37b1de..000000000000 --- a/packages/Tethering/res/values-ms/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Penambatan atau tempat liputan aktif"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Ketik untuk membuat persediaan."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Penambatan dilumpuhkan"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hubungi pentadbir anda untuk mendapatkan maklumat lanjut"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status tempat liputan & penambatan"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-my/strings.xml b/packages/Tethering/res/values-my/strings.xml deleted file mode 100644 index 49f6b88a7514..000000000000 --- a/packages/Tethering/res/values-my/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း သို့မဟုတ် ဟော့စပေါ့ ဖွင့်ထားသည်"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"စနစ်ထည့်သွင်းရန် တို့ပါ။"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်းကို ပိတ်ထားသည်"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"အသေးစိတ်အတွက် သင့်စီမံခန့်ခွဲသူကို ဆက်သွယ်ပါ"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ဟော့စပေါ့နှင့် မိုဘိုင်းဖုန်းသုံး ချိတ်ဆက်မျှဝေခြင်း အခြေအနေ"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-nb/strings.xml b/packages/Tethering/res/values-nb/strings.xml deleted file mode 100644 index 9594e0a70a69..000000000000 --- a/packages/Tethering/res/values-nb/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Internettdeling eller Wi-Fi-sone er aktiv"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Trykk for å konfigurere."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Internettdeling er slått av"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Ta kontakt med administratoren din for å få mer informasjon"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status for Wi-Fi-sone og internettdeling"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ne/strings.xml b/packages/Tethering/res/values-ne/strings.xml deleted file mode 100644 index 72ae3a80a928..000000000000 --- a/packages/Tethering/res/values-ne/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"टेदरिङ वा हटस्पट सक्रिय छ"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"सेटअप गर्न ट्याप गर्नुहोस्।"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"टेदरिङ सुविधा असक्षम पारिएको छ"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"विवरणहरूका लागि आफ्ना प्रशासकलाई सम्पर्क गर्नुहोस्"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"हटस्पट तथा टेदरिङको स्थिति"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-nl/strings.xml b/packages/Tethering/res/values-nl/strings.xml deleted file mode 100644 index 18b2bbfc7670..000000000000 --- a/packages/Tethering/res/values-nl/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering of hotspot actief"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tik om in te stellen."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering is uitgeschakeld"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Neem contact op met je beheerder voor meer informatie"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status van hotspot en tethering"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-or/strings.xml b/packages/Tethering/res/values-or/strings.xml deleted file mode 100644 index a15a6db42af6..000000000000 --- a/packages/Tethering/res/values-or/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ଟିଥେରିଂ କିମ୍ୱା ହଟସ୍ପଟ୍ ସକ୍ରିୟ ଅଛି"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"ସେଟ୍ ଅପ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ଟିଥେରିଂ ଅକ୍ଷମ କରାଯାଇଛି"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"ବିବରଣୀଗୁଡ଼ିକ ପାଇଁ ଆପଣଙ୍କ ଆଡମିନଙ୍କ ସହ ଯୋଗାଯୋଗ କରନ୍ତୁ"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ହଟସ୍ପଟ୍ ଓ ଟିଥେରିଂ ସ୍ଥିତି"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-pa/strings.xml b/packages/Tethering/res/values-pa/strings.xml deleted file mode 100644 index a8235e423e47..000000000000 --- a/packages/Tethering/res/values-pa/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ਟੈਦਰਿੰਗ ਜਾਂ ਹੌਟਸਪੌਟ ਕਿਰਿਆਸ਼ੀਲ"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"ਸੈੱਟਅੱਪ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ਟੈਦਰਿੰਗ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"ਵੇਰਵਿਆਂ ਲਈ ਆਪਣੇ ਪ੍ਰਸ਼ਾਸਕ ਨਾਲ ਸੰਪਰਕ ਕਰੋ"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ਹੌਟਸਪੌਟ ਅਤੇ ਟੈਦਰਿੰਗ ਦੀ ਸਥਿਤੀ"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-pl/strings.xml b/packages/Tethering/res/values-pl/strings.xml deleted file mode 100644 index ccb017d43fa8..000000000000 --- a/packages/Tethering/res/values-pl/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Aktywny tethering lub punkt dostępu"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Kliknij, by skonfigurować"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering został wyłączony"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Aby uzyskać szczegółowe informacje, skontaktuj się z administratorem"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot i tethering – stan"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-pt-rBR/strings.xml b/packages/Tethering/res/values-pt-rBR/strings.xml deleted file mode 100644 index a0a4745f9394..000000000000 --- a/packages/Tethering/res/values-pt-rBR/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Ponto de acesso ou tethering ativo"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering desativado"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Fale com seu administrador para saber detalhes"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status de ponto de acesso e tethering"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-pt-rPT/strings.xml b/packages/Tethering/res/values-pt-rPT/strings.xml deleted file mode 100644 index e3f03fcc6934..000000000000 --- a/packages/Tethering/res/values-pt-rPT/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Ligação (à Internet) via telemóvel ou zona Wi-Fi ativas"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"A ligação (à Internet) via telemóvel está desativada."</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contacte o administrador para obter detalhes."</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Estado da zona Wi-Fi e da ligação (à Internet) via telemóvel"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-pt/strings.xml b/packages/Tethering/res/values-pt/strings.xml deleted file mode 100644 index a0a4745f9394..000000000000 --- a/packages/Tethering/res/values-pt/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Ponto de acesso ou tethering ativo"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Toque para configurar."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering desativado"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Fale com seu administrador para saber detalhes"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status de ponto de acesso e tethering"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ro/strings.xml b/packages/Tethering/res/values-ro/strings.xml deleted file mode 100644 index 5706a4a69c79..000000000000 --- a/packages/Tethering/res/values-ro/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering sau hotspot activ"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Atingeți ca să configurați."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tetheringul este dezactivat"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Contactați administratorul pentru detalii"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Starea hotspotului și a tetheringului"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ru/strings.xml b/packages/Tethering/res/values-ru/strings.xml deleted file mode 100644 index 7cb6f7db3fc8..000000000000 --- a/packages/Tethering/res/values-ru/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Включен режим модема или точка доступа"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Нажмите, чтобы настроить."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Использование телефона в качестве модема запрещено"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Чтобы узнать подробности, обратитесь к администратору."</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус хот-спота и режима модема"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-si/strings.xml b/packages/Tethering/res/values-si/strings.xml deleted file mode 100644 index ec34c22de750..000000000000 --- a/packages/Tethering/res/values-si/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ටෙදරින් හෝ හොට්ස්පොට් සක්රීයයි"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"පිහිටුවීමට තට්ටු කරන්න."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ටෙදරින් අබල කර ඇත"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"විස්තර සඳහා ඔබගේ පරිපාලක අමතන්න"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"හොට්ස්පොට් & ටෙදරින් තත්ත්වය"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-sk/strings.xml b/packages/Tethering/res/values-sk/strings.xml deleted file mode 100644 index 43e787c84f87..000000000000 --- a/packages/Tethering/res/values-sk/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering alebo prístupový bod je aktívny"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Klepnutím prejdete na nastavenie."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering je deaktivovaný"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"O podrobnosti požiadajte svojho správcu"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stav hotspotu a tetheringu"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-sl/strings.xml b/packages/Tethering/res/values-sl/strings.xml deleted file mode 100644 index 59433626a115..000000000000 --- a/packages/Tethering/res/values-sl/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Povezava z internetom prek mobilnega telefona ali dostopna točka je aktivna"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Dotaknite se, če želite nastaviti."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Povezava z internetom prek mobilnega telefona je onemogočena"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Za podrobnosti se obrnite na skrbnika"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Stanje dostopne točke in povezave z internetom prek mobilnega telefona"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-sq/strings.xml b/packages/Tethering/res/values-sq/strings.xml deleted file mode 100644 index 21e11558bb0b..000000000000 --- a/packages/Tethering/res/values-sq/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Ndarja e internetit ose zona e qasjes së internetit është aktive"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Trokit për ta konfiguruar."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Ndarja e internetit është çaktivizuar"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakto me administratorin për detaje"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Statusi i zonës së qasjes dhe ndarjes së internetit"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-sr/strings.xml b/packages/Tethering/res/values-sr/strings.xml deleted file mode 100644 index e2e4dc6361d4..000000000000 --- a/packages/Tethering/res/values-sr/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Привезивање или хотспот је активан"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Додирните да бисте подесили."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Привезивање је онемогућено"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Потражите детаље од администратора"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус хотспота и привезивања"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-sv/strings.xml b/packages/Tethering/res/values-sv/strings.xml deleted file mode 100644 index 72702c28587d..000000000000 --- a/packages/Tethering/res/values-sv/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Internetdelning eller surfzon har aktiverats"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Tryck om du vill konfigurera."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Internetdelning har inaktiverats"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Kontakta administratören om du vill veta mer"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Trådlös surfzon och internetdelning har inaktiverats"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-sw/strings.xml b/packages/Tethering/res/values-sw/strings.xml deleted file mode 100644 index 65e4aa8cebb0..000000000000 --- a/packages/Tethering/res/values-sw/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Kusambaza mtandao au mtandaopepe umewashwa"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Gusa ili uweke mipangilio."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Umezima kipengele cha kusambaza mtandao"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Wasiliana na msimamizi wako ili upate maelezo zaidi"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Mtandaopepe na hali ya kusambaza mtandao"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ta/strings.xml b/packages/Tethering/res/values-ta/strings.xml deleted file mode 100644 index 4aba62d4ab46..000000000000 --- a/packages/Tethering/res/values-ta/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"டெதெரிங் அல்லது ஹாட்ஸ்பாட் இயங்குகிறது"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"அமைக்க, தட்டவும்."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"டெதெரிங் முடக்கப்பட்டுள்ளது"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"விவரங்களுக்கு உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும்"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ஹாட்ஸ்பாட் & டெதெரிங் நிலை"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-te/strings.xml b/packages/Tethering/res/values-te/strings.xml deleted file mode 100644 index 1f917913416f..000000000000 --- a/packages/Tethering/res/values-te/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"టెథరింగ్ లేదా హాట్స్పాట్ యాక్టివ్గా ఉంది"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"సెటప్ చేయడానికి ట్యాప్ చేయండి."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"టెథరింగ్ డిజేబుల్ చేయబడింది"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"వివరాల కోసం మీ అడ్మిన్ని సంప్రదించండి"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"హాట్స్పాట్ & టెథరింగ్ స్థితి"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-th/strings.xml b/packages/Tethering/res/values-th/strings.xml deleted file mode 100644 index 44171c0db82f..000000000000 --- a/packages/Tethering/res/values-th/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือหรือฮอตสปอตทำงานอยู่"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"แตะเพื่อตั้งค่า"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ปิดใช้การเชื่อมต่ออินเทอร์เน็ตผ่านมือถือแล้ว"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"ติดต่อผู้ดูแลระบบเพื่อขอรายละเอียด"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"สถานะฮอตสปอตและการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-tl/strings.xml b/packages/Tethering/res/values-tl/strings.xml deleted file mode 100644 index 7347dd3e6254..000000000000 --- a/packages/Tethering/res/values-tl/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Aktibo ang pag-tether o hotspot"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"I-tap para i-set up."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Naka-disable ang pag-tether"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Makipag-ugnayan sa iyong admin para sa mga detalye"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Status ng hotspot at pag-tether"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-tr/strings.xml b/packages/Tethering/res/values-tr/strings.xml deleted file mode 100644 index 32030f176574..000000000000 --- a/packages/Tethering/res/values-tr/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tethering veya hotspot etkin"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Ayarlamak için dokunun."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Tethering devre dışı bırakıldı"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Ayrıntılı bilgi için yöneticinize başvurun"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot ve tethering durumu"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-uk/strings.xml b/packages/Tethering/res/values-uk/strings.xml deleted file mode 100644 index 1ca89b3f7813..000000000000 --- a/packages/Tethering/res/values-uk/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Модем чи точка доступу активні"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Натисніть, щоб налаштувати."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Використання телефона як модема вимкнено"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Щоб дізнатися більше, зв\'яжіться з адміністратором"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Статус точки доступу та модема"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-ur/strings.xml b/packages/Tethering/res/values-ur/strings.xml deleted file mode 100644 index d72c7d419577..000000000000 --- a/packages/Tethering/res/values-ur/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"ٹیدرنگ یا ہاٹ اسپاٹ فعال"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"سیٹ اپ کرنے کیلئے تھپتھپائیں۔"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"ٹیدرنگ غیر فعال ہے"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"تفصیلات کے لئے اپنے منتظم سے رابطہ کریں"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"ہاٹ اسپاٹ اور ٹیتھرنگ کا اسٹیٹس"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-uz/strings.xml b/packages/Tethering/res/values-uz/strings.xml deleted file mode 100644 index af3b2ebb3500..000000000000 --- a/packages/Tethering/res/values-uz/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Modem rejimi yoki hotspot yoniq"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Sozlash uchun bosing."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Modem rejimi faolsizlantirildi"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Tafsilotlari uchun administratoringizga murojaat qiling"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Hotspot va modem rejimi holati"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-vi/strings.xml b/packages/Tethering/res/values-vi/strings.xml deleted file mode 100644 index 21a0735922c3..000000000000 --- a/packages/Tethering/res/values-vi/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Tính năng chia sẻ Internet hoặc điểm phát sóng đang hoạt động"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Hãy nhấn để thiết lập."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Đã tắt tính năng chia sẻ Internet"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Hãy liên hệ với quản trị viên của bạn để biết chi tiết"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"Trạng thái điểm phát sóng và chia sẻ Internet"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-zh-rCN/strings.xml b/packages/Tethering/res/values-zh-rCN/strings.xml deleted file mode 100644 index 98e3b4b46fdb..000000000000 --- a/packages/Tethering/res/values-zh-rCN/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"网络共享或热点已启用"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"点按即可设置。"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"网络共享已停用"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"如需了解详情,请与您的管理员联系"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"热点和网络共享状态"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-zh-rHK/strings.xml b/packages/Tethering/res/values-zh-rHK/strings.xml deleted file mode 100644 index 9cafd42dd43f..000000000000 --- a/packages/Tethering/res/values-zh-rHK/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"網絡共享或熱點已啟用"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"輕按即可設定。"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"網絡共享已停用"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"請聯絡您的管理員以瞭解詳情"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"熱點和網絡共享狀態"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-zh-rTW/strings.xml b/packages/Tethering/res/values-zh-rTW/strings.xml deleted file mode 100644 index 50a50bf7a996..000000000000 --- a/packages/Tethering/res/values-zh-rTW/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"網路共用或無線基地台已啟用"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"輕觸即可進行設定。"</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"網路共用已停用"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"詳情請洽你的管理員"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"無線基地台與網路共用狀態"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values-zu/strings.xml b/packages/Tethering/res/values-zu/strings.xml deleted file mode 100644 index f210f8726ee5..000000000000 --- a/packages/Tethering/res/values-zu/strings.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<resources xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="tethered_notification_title" msgid="6426563586025792944">"Ukusebenzisa njengemodemu noma i-hotspot ephathekayo kuvuliwe"</string> - <string name="tethered_notification_message" msgid="64800879503420696">"Thepha ukuze usethe."</string> - <string name="disable_tether_notification_title" msgid="3004509127903564191">"Ukusebenzisa ifoni njengemodemu kukhutshaziwe"</string> - <string name="disable_tether_notification_message" msgid="6717523799293901476">"Xhumana nomphathi wakho ukuze uthole imininingwane"</string> - <string name="notification_channel_tethering_status" msgid="2663463891530932727">"I-Hotspot nesimo sokusebenzisa ifoni njengemodemu"</string> - <string name="no_upstream_notification_title" msgid="1204601824631788482"></string> - <string name="no_upstream_notification_message" msgid="8586582938243032621"></string> - <string name="no_upstream_notification_disable_button" msgid="8800919436924640822"></string> - <string name="upstream_roaming_notification_title" msgid="4772373823198997030"></string> - <string name="upstream_roaming_notification_message" msgid="3985577843181551650"></string> -</resources> diff --git a/packages/Tethering/res/values/config.xml b/packages/Tethering/res/values/config.xml deleted file mode 100644 index 9b9dcde910e7..000000000000 --- a/packages/Tethering/res/values/config.xml +++ /dev/null @@ -1,191 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources> - <!-- - OEMs that wish to change the below settings must do so via a runtime resource overlay package - and *NOT* by changing this file. This file is part of the tethering mainline module. - TODO: define two resources for each config item: a default_* resource and a config_* resource, - config_* is empty by default but may be overridden by RROs. - --> - <!-- List of regexpressions describing the interface (if any) that represent tetherable - USB interfaces. If the device doesn't want to support tethering over USB this should - be empty. An example would be "usb.*" --> - <string-array translatable="false" name="config_tether_usb_regexs"> - <item>"usb\\d"</item> - <item>"rndis\\d"</item> - </string-array> - - <!-- List of regexpressions describing the interface (if any) that represent tetherable - NCM interfaces. If the device doesn't want to support tethering over NCM this should - be empty. --> - <string-array translatable="false" name="config_tether_ncm_regexs"> - </string-array> - - <!-- List of regexpressions describing the interface (if any) that represent tetherable - Wifi interfaces. If the device doesn't want to support tethering over Wifi this - should be empty. An example would be "softap.*" --> - <string-array translatable="false" name="config_tether_wifi_regexs"> - <item>"wlan\\d"</item> - <item>"softap\\d"</item> - </string-array> - - <!-- List of regexpressions describing the interface (if any) that represent tetherable - WiGig interfaces. If the device doesn't want to support tethering over WiGig this - should be empty. An example would be "wigig\\d" --> - <string-array translatable="false" name="config_tether_wigig_regexs"> - <item>"wigig\\d"</item> - </string-array> - - <!-- List of regexpressions describing the interface (if any) that represent tetherable - Wifi P2P interfaces. If the device doesn't want to support tethering over Wifi P2p this - should be empty. An example would be "p2p-p2p\\d-.*" --> - <string-array translatable="false" name="config_tether_wifi_p2p_regexs"> - <item>"p2p-p2p\\d-.*"</item> - <item>"p2p\\d"</item> - </string-array> - - <!-- List of regexpressions describing the interface (if any) that represent tetherable - bluetooth interfaces. If the device doesn't want to support tethering over bluetooth this - should be empty. --> - <string-array translatable="false" name="config_tether_bluetooth_regexs"> - <item>"bt-pan"</item> - </string-array> - - <!-- Use the BPF offload for tethering when the kernel has support. True by default. - If the device doesn't want to support tether BPF offload, this should be false. - Note that this setting could be overridden by device config. - --> - <bool translatable="false" name="config_tether_enable_bpf_offload">true</bool> - - <!-- Use the old dnsmasq DHCP server for tethering instead of the framework implementation. --> - <bool translatable="false" name="config_tether_enable_legacy_dhcp_server">false</bool> - - <!-- Dhcp range (min, max) to use for tethering purposes --> - <string-array translatable="false" name="config_tether_dhcp_range"> - </string-array> - - <!-- Used to config periodic polls tether offload stats from tethering offload HAL to make the - data warnings work. 5000(ms) by default. If the device doesn't want to poll tether - offload stats, this should be -1. Note that this setting could be override by - runtime resource overlays. - --> - <integer translatable="false" name="config_tether_offload_poll_interval">5000</integer> - - <!-- Array of ConnectivityManager.TYPE_{BLUETOOTH, ETHERNET, MOBILE, MOBILE_DUN, MOBILE_HIPRI, - WIFI} values allowable for tethering. - - Common options are [1, 4] for TYPE_WIFI and TYPE_MOBILE_DUN or - [1,7,0] for TYPE_WIFI, TYPE_BLUETOOTH, and TYPE_MOBILE. - - This list is also modified by code within the framework, including: - - - TYPE_ETHERNET (9) is prepended to this list, and - - - the return value of TelephonyManager.isTetheringApnRequired() - determines how the array is further modified: - - * TRUE (DUN REQUIRED). - TYPE_MOBILE is removed (if present). - TYPE_MOBILE_HIPRI is removed (if present). - TYPE_MOBILE_DUN is appended (if not already present). - - * FALSE (DUN NOT REQUIRED). - TYPE_MOBILE_DUN is removed (if present). - If both of TYPE_MOBILE{,_HIPRI} are not present: - TYPE_MOBILE is appended. - TYPE_MOBILE_HIPRI is appended. - - For other changes applied to this list, now and in the future, see - com.android.networkstack.tethering.TetheringConfiguration. - - Note also: the order of this is important. The first upstream type - for which a satisfying network exists is used. - --> - <integer-array translatable="false" name="config_tether_upstream_types"> - </integer-array> - - <!-- When true, the tethering upstream network follows the current default - Internet network (except when the current default network is mobile, - in which case a DUN network will be used if required). - - When true, overrides the config_tether_upstream_types setting above. - --> - <bool translatable="false" name="config_tether_upstream_automatic">true</bool> - - - <!-- If the mobile hotspot feature requires provisioning, a package name and class name - can be provided to launch a supported application that provisions the devices. - EntitlementManager will send an intent to Settings with the specified package name and - class name in extras to launch provision app. - TODO: note what extras here. - - See EntitlementManager#runUiTetherProvisioning and - packages/apps/Settings/src/com/android/settings/network/TetherProvisioningActivity.java - for more details. - - For ui-less/periodic recheck support see config_mobile_hotspot_provision_app_no_ui - --> - <!-- The first element is the package name and the second element is the class name - of the provisioning app --> - <string-array translatable="false" name="config_mobile_hotspot_provision_app"> - <!-- - <item>com.example.provisioning</item> - <item>com.example.provisioning.Activity</item> - --> - </string-array> - - <!-- If the mobile hotspot feature requires provisioning, an action can be provided - that will be broadcast in non-ui cases for checking the provisioning status. - EntitlementManager will pass the specified name to Settings and Settings would - launch provisioning app by sending an intent with the package name. - - A second broadcast, action defined by config_mobile_hotspot_provision_response, - will be sent back to notify if provisioning succeeded or not. The response will - match that of the activity in config_mobile_hotspot_provision_app, but instead - contained within the int extra "EntitlementResult". - TODO: provide the system api for "EntitlementResult" extra and note it here. - - See EntitlementManager#runSilentTetherProvisioning and - packages/apps/Settings/src/com/android/settings/wifi/tether/TetherService.java for more - details. - --> - <string translatable="false" name="config_mobile_hotspot_provision_app_no_ui"></string> - - <!-- Sent in response to a provisioning check. The caller must hold the - permission android.permission.TETHER_PRIVILEGED for Settings to - receive this response. - - See config_mobile_hotspot_provision_response - --> - <string translatable="false" name="config_mobile_hotspot_provision_response"></string> - - <!-- Number of hours between each background provisioning call --> - <integer translatable="false" name="config_mobile_hotspot_provision_check_period">24</integer> - - <!-- ComponentName of the service used to run no ui tether provisioning. --> - <string translatable="false" name="config_wifi_tether_enable">com.android.settings/.wifi.tether.TetherService</string> - - <!-- No upstream notification is shown when there is a downstream but no upstream that is able - to do the tethering. --> - <!-- Delay(millisecond) to show no upstream notification after there's no Backhaul. Set delay to - "-1" for disable this feature. --> - <integer name="delay_to_show_no_upstream_after_no_backhaul">-1</integer> - - <!-- Cellular roaming notification is shown when upstream is cellular network and in roaming - state. --> - <!-- Config for showing upstream roaming notification. --> - <bool name="config_upstream_roaming_notification">false</bool> -</resources> diff --git a/packages/Tethering/res/values/overlayable.xml b/packages/Tethering/res/values/overlayable.xml deleted file mode 100644 index 6a33d55cb0de..000000000000 --- a/packages/Tethering/res/values/overlayable.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources xmlns:android="http://schemas.android.com/apk/res/android"> - <overlayable name="TetheringConfig"> - <policy type="product|system|vendor"> - <!-- Params from config.xml that can be overlaid --> - <item type="array" name="config_tether_usb_regexs"/> - <item type="array" name="config_tether_ncm_regexs" /> - <item type="array" name="config_tether_wifi_regexs"/> - <item type="array" name="config_tether_wigig_regexs"/> - <item type="array" name="config_tether_wifi_p2p_regexs"/> - <item type="array" name="config_tether_bluetooth_regexs"/> - <item type="array" name="config_tether_dhcp_range"/> - <!-- Use the BPF offload for tethering when the kernel has support. True by default. - If the device doesn't want to support tether BPF offload, this should be false. - Note that this setting could be overridden by device config. - --> - <item type="bool" name="config_tether_enable_bpf_offload"/> - <item type="bool" name="config_tether_enable_legacy_dhcp_server"/> - <item type="integer" name="config_tether_offload_poll_interval"/> - <item type="array" name="config_tether_upstream_types"/> - <item type="bool" name="config_tether_upstream_automatic"/> - <!-- Configuration values for tethering entitlement check --> - <item type="array" name="config_mobile_hotspot_provision_app"/> - <item type="string" name="config_mobile_hotspot_provision_app_no_ui"/> - <item type="string" name="config_mobile_hotspot_provision_response"/> - <item type="integer" name="config_mobile_hotspot_provision_check_period"/> - <item type="string" name="config_wifi_tether_enable"/> - <!-- Params from config.xml that can be overlaid --> - </policy> - </overlayable> -</resources> diff --git a/packages/Tethering/res/values/strings.xml b/packages/Tethering/res/values/strings.xml deleted file mode 100644 index d63c7c5063cc..000000000000 --- a/packages/Tethering/res/values/strings.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <!-- Shown when the device is tethered --> - <!-- String for tethered notification title [CHAR LIMIT=200] --> - <string name="tethered_notification_title">Tethering or hotspot active</string> - <!-- String for tethered notification message [CHAR LIMIT=200] --> - <string name="tethered_notification_message">Tap to set up.</string> - - <!-- This notification is shown when tethering has been disabled on a user's device. - The device is managed by the user's employer. Tethering can't be turned on unless the - IT administrator allows it. The noun "admin" is another reference for "IT administrator." --> - <!-- String for tether disabling notification title [CHAR LIMIT=200] --> - <string name="disable_tether_notification_title">Tethering is disabled</string> - <!-- String for tether disabling notification message [CHAR LIMIT=200] --> - <string name="disable_tether_notification_message">Contact your admin for details</string> - - <!-- This string should be consistent with the "Hotspot & tethering" text in the "Network and - Internet" settings page. That is currently the tether_settings_title_all string. --> - <!-- String for tether notification channel name [CHAR LIMIT=200] --> - <string name="notification_channel_tethering_status">Hotspot & tethering status</string> - - <!-- String for no upstream notification title [CHAR LIMIT=200] --> - <string name="no_upstream_notification_title"></string> - <!-- String for no upstream notification message [CHAR LIMIT=200] --> - <string name="no_upstream_notification_message"></string> - <!-- String for no upstream notification disable button [CHAR LIMIT=200] --> - <string name="no_upstream_notification_disable_button"></string> - - <!-- String for cellular roaming notification title [CHAR LIMIT=200] --> - <string name="upstream_roaming_notification_title"></string> - <!-- String for cellular roaming notification message [CHAR LIMIT=500] --> - <string name="upstream_roaming_notification_message"></string> -</resources> diff --git a/packages/Tethering/src/android/net/dhcp/DhcpServerCallbacks.java b/packages/Tethering/src/android/net/dhcp/DhcpServerCallbacks.java deleted file mode 100644 index 9fda1257b4c9..000000000000 --- a/packages/Tethering/src/android/net/dhcp/DhcpServerCallbacks.java +++ /dev/null @@ -1,36 +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.net.dhcp; - -/** - * Convenience wrapper around IDhcpServerCallbacks.Stub that implements getInterfaceVersion(). - * @hide - */ -public abstract class DhcpServerCallbacks extends IDhcpServerCallbacks.Stub { - /** - * Get the version of the aidl interface implemented by the callbacks. - */ - @Override - public int getInterfaceVersion() { - return IDhcpServerCallbacks.VERSION; - } - - @Override - public String getInterfaceHash() { - return IDhcpServerCallbacks.HASH; - } -} diff --git a/packages/Tethering/src/android/net/dhcp/DhcpServingParamsParcelExt.java b/packages/Tethering/src/android/net/dhcp/DhcpServingParamsParcelExt.java deleted file mode 100644 index aaaec17bf922..000000000000 --- a/packages/Tethering/src/android/net/dhcp/DhcpServingParamsParcelExt.java +++ /dev/null @@ -1,203 +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.net.dhcp; - -import static com.android.net.module.util.Inet4AddressUtils.inet4AddressToIntHTH; - -import android.net.LinkAddress; -import android.util.ArraySet; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import java.net.Inet4Address; -import java.util.Collection; -import java.util.Collections; -import java.util.Set; - -/** - * Subclass of {@link DhcpServingParamsParcel} with additional utility methods for building. - * - * <p>This utility class does not check for validity of the parameters: invalid parameters are - * reported by the receiving module when unparceling the parcel. - * - * @see DhcpServingParams - * @hide - */ -public class DhcpServingParamsParcelExt extends DhcpServingParamsParcel { - public static final int MTU_UNSET = 0; - - /** - * Set the server address and served prefix for the DHCP server. - * - * <p>This parameter is required. - */ - public DhcpServingParamsParcelExt setServerAddr(@NonNull LinkAddress serverAddr) { - this.serverAddr = inet4AddressToIntHTH((Inet4Address) serverAddr.getAddress()); - this.serverAddrPrefixLength = serverAddr.getPrefixLength(); - return this; - } - - /** - * Set the default routers to be advertised to DHCP clients. - * - * <p>Each router must be inside the served prefix. This may be an empty set, but it must - * always be set explicitly. - */ - public DhcpServingParamsParcelExt setDefaultRouters(@NonNull Set<Inet4Address> defaultRouters) { - this.defaultRouters = toIntArray(defaultRouters); - return this; - } - - /** - * Set the default routers to be advertised to DHCP clients. - * - * <p>Each router must be inside the served prefix. This may be an empty list of routers, - * but it must always be set explicitly. - */ - public DhcpServingParamsParcelExt setDefaultRouters(@NonNull Inet4Address... defaultRouters) { - return setDefaultRouters(newArraySet(defaultRouters)); - } - - /** - * Convenience method to build the parameters with no default router. - * - * <p>Equivalent to calling {@link #setDefaultRouters(Inet4Address...)} with no address. - */ - public DhcpServingParamsParcelExt setNoDefaultRouter() { - return setDefaultRouters(); - } - - /** - * Set the DNS servers to be advertised to DHCP clients. - * - * <p>This may be an empty set, but it must always be set explicitly. - */ - public DhcpServingParamsParcelExt setDnsServers(@NonNull Set<Inet4Address> dnsServers) { - this.dnsServers = toIntArray(dnsServers); - return this; - } - - /** - * Set the DNS servers to be advertised to DHCP clients. - * - * <p>This may be an empty list of servers, but it must always be set explicitly. - */ - public DhcpServingParamsParcelExt setDnsServers(@NonNull Inet4Address... dnsServers) { - return setDnsServers(newArraySet(dnsServers)); - } - - /** - * Convenience method to build the parameters with no DNS server. - * - * <p>Equivalent to calling {@link #setDnsServers(Inet4Address...)} with no address. - */ - public DhcpServingParamsParcelExt setNoDnsServer() { - return setDnsServers(); - } - - /** - * Set excluded addresses that the DHCP server is not allowed to assign to clients. - * - * <p>This parameter is optional. DNS servers and default routers are always excluded - * and do not need to be set here. - */ - public DhcpServingParamsParcelExt setExcludedAddrs(@NonNull Set<Inet4Address> excludedAddrs) { - this.excludedAddrs = toIntArray(excludedAddrs); - return this; - } - - /** - * Set excluded addresses that the DHCP server is not allowed to assign to clients. - * - * <p>This parameter is optional. DNS servers and default routers are always excluded - * and do not need to be set here. - */ - public DhcpServingParamsParcelExt setExcludedAddrs(@NonNull Inet4Address... excludedAddrs) { - return setExcludedAddrs(newArraySet(excludedAddrs)); - } - - /** - * Set the lease time for leases assigned by the DHCP server. - * - * <p>This parameter is required. - */ - public DhcpServingParamsParcelExt setDhcpLeaseTimeSecs(long dhcpLeaseTimeSecs) { - this.dhcpLeaseTimeSecs = dhcpLeaseTimeSecs; - return this; - } - - /** - * Set the link MTU to be advertised to DHCP clients. - * - * <p>If set to {@link #MTU_UNSET}, no MTU will be advertised to clients. This parameter - * is optional and defaults to {@link #MTU_UNSET}. - */ - public DhcpServingParamsParcelExt setLinkMtu(int linkMtu) { - this.linkMtu = linkMtu; - return this; - } - - /** - * Set whether the DHCP server should send the ANDROID_METERED vendor-specific option. - * - * <p>If not set, the default value is false. - */ - public DhcpServingParamsParcelExt setMetered(boolean metered) { - this.metered = metered; - return this; - } - - /** - * Set the client address to tell DHCP server only offer this address. - * The client's prefix length is the same as server's. - * - * <p>If not set, the default value is null. - */ - public DhcpServingParamsParcelExt setSingleClientAddr(@Nullable Inet4Address clientAddr) { - this.singleClientAddr = clientAddr == null ? 0 : inet4AddressToIntHTH(clientAddr); - return this; - } - - /** - * Set whether the DHCP server should request a new prefix from IpServer when receiving - * DHCPDECLINE message in certain particular link (e.g. there is only one downstream USB - * tethering client). If it's false, process DHCPDECLINE message as RFC2131#4.3.3 suggests. - * - * <p>If not set, the default value is false. - */ - public DhcpServingParamsParcelExt setChangePrefixOnDecline(boolean changePrefixOnDecline) { - this.changePrefixOnDecline = changePrefixOnDecline; - return this; - } - - private static int[] toIntArray(@NonNull Collection<Inet4Address> addrs) { - int[] res = new int[addrs.size()]; - int i = 0; - for (Inet4Address addr : addrs) { - res[i] = inet4AddressToIntHTH(addr); - i++; - } - return res; - } - - private static ArraySet<Inet4Address> newArraySet(Inet4Address... addrs) { - ArraySet<Inet4Address> addrSet = new ArraySet<>(addrs.length); - Collections.addAll(addrSet, addrs); - return addrSet; - } -} diff --git a/packages/Tethering/src/android/net/ip/IpServer.java b/packages/Tethering/src/android/net/ip/IpServer.java deleted file mode 100644 index 8af1797a9dd7..000000000000 --- a/packages/Tethering/src/android/net/ip/IpServer.java +++ /dev/null @@ -1,1385 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.ip; - -import static android.net.RouteInfo.RTN_UNICAST; -import static android.net.TetheringManager.TetheringRequest.checkStaticAddressConfiguration; -import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS; -import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH; -import static android.net.util.NetworkConstants.asByte; -import static android.net.util.PrefixUtils.asIpPrefix; -import static android.net.util.TetheringMessageBase.BASE_IPSERVER; -import static android.system.OsConstants.RT_SCOPE_UNIVERSE; - -import static com.android.net.module.util.Inet4AddressUtils.intToInet4AddressHTH; - -import android.net.INetd; -import android.net.INetworkStackStatusCallback; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.MacAddress; -import android.net.RouteInfo; -import android.net.TetheredClient; -import android.net.TetheringManager; -import android.net.TetheringRequestParcel; -import android.net.dhcp.DhcpLeaseParcelable; -import android.net.dhcp.DhcpServerCallbacks; -import android.net.dhcp.DhcpServingParamsParcel; -import android.net.dhcp.DhcpServingParamsParcelExt; -import android.net.dhcp.IDhcpEventCallbacks; -import android.net.dhcp.IDhcpServer; -import android.net.ip.IpNeighborMonitor.NeighborEvent; -import android.net.ip.RouterAdvertisementDaemon.RaParams; -import android.net.shared.NetdUtils; -import android.net.shared.RouteUtils; -import android.net.util.InterfaceParams; -import android.net.util.InterfaceSet; -import android.net.util.PrefixUtils; -import android.net.util.SharedLog; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.RemoteException; -import android.os.ServiceSpecificException; -import android.util.Log; -import android.util.SparseArray; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.internal.util.MessageUtils; -import com.android.internal.util.State; -import com.android.internal.util.StateMachine; -import com.android.networkstack.tethering.BpfCoordinator; -import com.android.networkstack.tethering.BpfCoordinator.Ipv6ForwardingRule; -import com.android.networkstack.tethering.PrivateAddressCoordinator; - -import java.io.IOException; -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.NetworkInterface; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; -import java.util.Random; -import java.util.Set; - -/** - * Provides the interface to IP-layer serving functionality for a given network - * interface, e.g. for tethering or "local-only hotspot" mode. - * - * @hide - */ -public class IpServer extends StateMachine { - public static final int STATE_UNAVAILABLE = 0; - public static final int STATE_AVAILABLE = 1; - public static final int STATE_TETHERED = 2; - public static final int STATE_LOCAL_ONLY = 3; - - /** Get string name of |state|.*/ - public static String getStateString(int state) { - switch (state) { - case STATE_UNAVAILABLE: return "UNAVAILABLE"; - case STATE_AVAILABLE: return "AVAILABLE"; - case STATE_TETHERED: return "TETHERED"; - case STATE_LOCAL_ONLY: return "LOCAL_ONLY"; - } - return "UNKNOWN: " + state; - } - - private static final byte DOUG_ADAMS = (byte) 42; - - // TODO: have PanService use some visible version of this constant - private static final String BLUETOOTH_IFACE_ADDR = "192.168.44.1/24"; - - // TODO: have this configurable - private static final int DHCP_LEASE_TIME_SECS = 3600; - - private static final MacAddress NULL_MAC_ADDRESS = MacAddress.fromString("00:00:00:00:00:00"); - - private static final String TAG = "IpServer"; - private static final boolean DBG = false; - private static final boolean VDBG = false; - private static final Class[] sMessageClasses = { - IpServer.class - }; - private static final SparseArray<String> sMagicDecoderRing = - MessageUtils.findMessageNames(sMessageClasses); - - /** IpServer callback. */ - public static class Callback { - /** - * Notify that |who| has changed its tethering state. - * - * @param who the calling instance of IpServer - * @param state one of STATE_* - * @param lastError one of TetheringManager.TETHER_ERROR_* - */ - public void updateInterfaceState(IpServer who, int state, int lastError) { } - - /** - * Notify that |who| has new LinkProperties. - * - * @param who the calling instance of IpServer - * @param newLp the new LinkProperties to report - */ - public void updateLinkProperties(IpServer who, LinkProperties newLp) { } - - /** - * Notify that the DHCP leases changed in one of the IpServers. - */ - public void dhcpLeasesChanged() { } - - /** - * Request Tethering change. - * - * @param tetheringType the downstream type of this IpServer. - * @param enabled enable or disable tethering. - */ - public void requestEnableTethering(int tetheringType, boolean enabled) { } - } - - /** Capture IpServer dependencies, for injection. */ - public abstract static class Dependencies { - /** Create an IpNeighborMonitor to be used by this IpServer */ - public IpNeighborMonitor getIpNeighborMonitor(Handler handler, SharedLog log, - IpNeighborMonitor.NeighborEventConsumer consumer) { - return new IpNeighborMonitor(handler, log, consumer); - } - - /** Create a RouterAdvertisementDaemon instance to be used by IpServer.*/ - public RouterAdvertisementDaemon getRouterAdvertisementDaemon(InterfaceParams ifParams) { - return new RouterAdvertisementDaemon(ifParams); - } - - /** Get |ifName|'s interface information.*/ - public InterfaceParams getInterfaceParams(String ifName) { - return InterfaceParams.getByName(ifName); - } - - /** Get |ifName|'s interface index. */ - public int getIfindex(String ifName) { - try { - return NetworkInterface.getByName(ifName).getIndex(); - } catch (IOException | NullPointerException e) { - Log.e(TAG, "Can't determine interface index for interface " + ifName); - return 0; - } - } - - /** Create a DhcpServer instance to be used by IpServer. */ - public abstract void makeDhcpServer(String ifName, DhcpServingParamsParcel params, - DhcpServerCallbacks cb); - } - - // request from the user that it wants to tether - public static final int CMD_TETHER_REQUESTED = BASE_IPSERVER + 1; - // request from the user that it wants to untether - public static final int CMD_TETHER_UNREQUESTED = BASE_IPSERVER + 2; - // notification that this interface is down - public static final int CMD_INTERFACE_DOWN = BASE_IPSERVER + 3; - // notification from the master SM that it had trouble enabling IP Forwarding - public static final int CMD_IP_FORWARDING_ENABLE_ERROR = BASE_IPSERVER + 4; - // notification from the master SM that it had trouble disabling IP Forwarding - public static final int CMD_IP_FORWARDING_DISABLE_ERROR = BASE_IPSERVER + 5; - // notification from the master SM that it had trouble starting tethering - public static final int CMD_START_TETHERING_ERROR = BASE_IPSERVER + 6; - // notification from the master SM that it had trouble stopping tethering - public static final int CMD_STOP_TETHERING_ERROR = BASE_IPSERVER + 7; - // notification from the master SM that it had trouble setting the DNS forwarders - public static final int CMD_SET_DNS_FORWARDERS_ERROR = BASE_IPSERVER + 8; - // the upstream connection has changed - public static final int CMD_TETHER_CONNECTION_CHANGED = BASE_IPSERVER + 9; - // new IPv6 tethering parameters need to be processed - public static final int CMD_IPV6_TETHER_UPDATE = BASE_IPSERVER + 10; - // new neighbor cache entry on our interface - public static final int CMD_NEIGHBOR_EVENT = BASE_IPSERVER + 11; - // request from DHCP server that it wants to have a new prefix - public static final int CMD_NEW_PREFIX_REQUEST = BASE_IPSERVER + 12; - // request from PrivateAddressCoordinator to restart tethering. - public static final int CMD_NOTIFY_PREFIX_CONFLICT = BASE_IPSERVER + 13; - - private final State mInitialState; - private final State mLocalHotspotState; - private final State mTetheredState; - private final State mUnavailableState; - private final State mWaitingForRestartState; - - private final SharedLog mLog; - private final INetd mNetd; - @NonNull - private final BpfCoordinator mBpfCoordinator; - private final Callback mCallback; - private final InterfaceController mInterfaceCtrl; - private final PrivateAddressCoordinator mPrivateAddressCoordinator; - - private final String mIfaceName; - private final int mInterfaceType; - private final LinkProperties mLinkProperties; - private final boolean mUsingLegacyDhcp; - private final boolean mUsingBpfOffload; - - private final Dependencies mDeps; - - private int mLastError; - private int mServingMode; - private InterfaceSet mUpstreamIfaceSet; // may change over time - private InterfaceParams mInterfaceParams; - // TODO: De-duplicate this with mLinkProperties above. Currently, these link - // properties are those selected by the IPv6TetheringCoordinator and relayed - // to us. By comparison, mLinkProperties contains the addresses and directly - // connected routes that have been formed from these properties iff. we have - // succeeded in configuring them and are able to announce them within Router - // Advertisements (otherwise, we do not add them to mLinkProperties at all). - private LinkProperties mLastIPv6LinkProperties; - private RouterAdvertisementDaemon mRaDaemon; - - // To be accessed only on the handler thread - private int mDhcpServerStartIndex = 0; - private IDhcpServer mDhcpServer; - private RaParams mLastRaParams; - - private LinkAddress mStaticIpv4ServerAddr; - private LinkAddress mStaticIpv4ClientAddr; - - @NonNull - private List<TetheredClient> mDhcpLeases = Collections.emptyList(); - - private int mLastIPv6UpstreamIfindex = 0; - - private class MyNeighborEventConsumer implements IpNeighborMonitor.NeighborEventConsumer { - public void accept(NeighborEvent e) { - sendMessage(CMD_NEIGHBOR_EVENT, e); - } - } - - private final IpNeighborMonitor mIpNeighborMonitor; - - private LinkAddress mIpv4Address; - - // TODO: Add a dependency object to pass the data members or variables from the tethering - // object. It helps to reduce the arguments of the constructor. - public IpServer( - String ifaceName, Looper looper, int interfaceType, SharedLog log, - INetd netd, @NonNull BpfCoordinator coordinator, Callback callback, - boolean usingLegacyDhcp, boolean usingBpfOffload, - PrivateAddressCoordinator addressCoordinator, Dependencies deps) { - super(ifaceName, looper); - mLog = log.forSubComponent(ifaceName); - mNetd = netd; - mBpfCoordinator = coordinator; - mCallback = callback; - mInterfaceCtrl = new InterfaceController(ifaceName, mNetd, mLog); - mIfaceName = ifaceName; - mInterfaceType = interfaceType; - mLinkProperties = new LinkProperties(); - mUsingLegacyDhcp = usingLegacyDhcp; - mUsingBpfOffload = usingBpfOffload; - mPrivateAddressCoordinator = addressCoordinator; - mDeps = deps; - resetLinkProperties(); - mLastError = TetheringManager.TETHER_ERROR_NO_ERROR; - mServingMode = STATE_AVAILABLE; - - mIpNeighborMonitor = mDeps.getIpNeighborMonitor(getHandler(), mLog, - new MyNeighborEventConsumer()); - - // IP neighbor monitor monitors the neighbor events for adding/removing offload - // forwarding rules per client. If BPF offload is not supported, don't start listening - // for neighbor events. See updateIpv6ForwardingRules, addIpv6ForwardingRule, - // removeIpv6ForwardingRule. - if (mUsingBpfOffload && !mIpNeighborMonitor.start()) { - mLog.e("Failed to create IpNeighborMonitor on " + mIfaceName); - } - - mInitialState = new InitialState(); - mLocalHotspotState = new LocalHotspotState(); - mTetheredState = new TetheredState(); - mUnavailableState = new UnavailableState(); - mWaitingForRestartState = new WaitingForRestartState(); - addState(mInitialState); - addState(mLocalHotspotState); - addState(mTetheredState); - addState(mWaitingForRestartState, mTetheredState); - addState(mUnavailableState); - - setInitialState(mInitialState); - } - - /** Interface name which IpServer served.*/ - public String interfaceName() { - return mIfaceName; - } - - /** - * Tethering downstream type. It would be one of TetheringManager#TETHERING_*. - */ - public int interfaceType() { - return mInterfaceType; - } - - /** Last error from this IpServer. */ - public int lastError() { - return mLastError; - } - - /** Serving mode is the current state of IpServer state machine. */ - public int servingMode() { - return mServingMode; - } - - /** The properties of the network link which IpServer is serving. */ - public LinkProperties linkProperties() { - return new LinkProperties(mLinkProperties); - } - - /** The address which IpServer is using. */ - public LinkAddress getAddress() { - return mIpv4Address; - } - - /** - * Get the latest list of DHCP leases that was reported. Must be called on the IpServer looper - * thread. - */ - public List<TetheredClient> getAllLeases() { - return Collections.unmodifiableList(mDhcpLeases); - } - - /** Stop this IpServer. After this is called this IpServer should not be used any more. */ - public void stop() { - sendMessage(CMD_INTERFACE_DOWN); - } - - /** - * Tethering is canceled. IpServer state machine will be available and wait for - * next tethering request. - */ - public void unwanted() { - sendMessage(CMD_TETHER_UNREQUESTED); - } - - /** Internals. */ - - private boolean startIPv4() { - return configureIPv4(true); - } - - /** - * Convenience wrapper around INetworkStackStatusCallback to run callbacks on the IpServer - * handler. - * - * <p>Different instances of this class can be created for each call to IDhcpServer methods, - * with different implementations of the callback, to differentiate handling of success/error in - * each call. - */ - private abstract class OnHandlerStatusCallback extends INetworkStackStatusCallback.Stub { - @Override - public void onStatusAvailable(int statusCode) { - getHandler().post(() -> callback(statusCode)); - } - - public abstract void callback(int statusCode); - - @Override - public int getInterfaceVersion() { - return this.VERSION; - } - - @Override - public String getInterfaceHash() { - return this.HASH; - } - } - - private class DhcpServerCallbacksImpl extends DhcpServerCallbacks { - private final int mStartIndex; - - private DhcpServerCallbacksImpl(int startIndex) { - mStartIndex = startIndex; - } - - @Override - public void onDhcpServerCreated(int statusCode, IDhcpServer server) throws RemoteException { - getHandler().post(() -> { - // We are on the handler thread: mDhcpServerStartIndex can be read safely. - if (mStartIndex != mDhcpServerStartIndex) { - // This start request is obsolete. When the |server| binder token goes out of - // scope, the garbage collector will finalize it, which causes the network stack - // process garbage collector to collect the server itself. - return; - } - - if (statusCode != STATUS_SUCCESS) { - mLog.e("Error obtaining DHCP server: " + statusCode); - handleError(); - return; - } - - mDhcpServer = server; - try { - mDhcpServer.startWithCallbacks(new OnHandlerStatusCallback() { - @Override - public void callback(int startStatusCode) { - if (startStatusCode != STATUS_SUCCESS) { - mLog.e("Error starting DHCP server: " + startStatusCode); - handleError(); - } - } - }, new DhcpEventCallback()); - } catch (RemoteException e) { - throw new IllegalStateException(e); - } - }); - } - - private void handleError() { - mLastError = TetheringManager.TETHER_ERROR_DHCPSERVER_ERROR; - transitionTo(mInitialState); - } - } - - private class DhcpEventCallback extends IDhcpEventCallbacks.Stub { - @Override - public void onLeasesChanged(List<DhcpLeaseParcelable> leaseParcelables) { - final ArrayList<TetheredClient> leases = new ArrayList<>(); - for (DhcpLeaseParcelable lease : leaseParcelables) { - final LinkAddress address = new LinkAddress( - intToInet4AddressHTH(lease.netAddr), lease.prefixLength, - 0 /* flags */, RT_SCOPE_UNIVERSE /* as per RFC6724#3.2 */, - lease.expTime /* deprecationTime */, lease.expTime /* expirationTime */); - - final MacAddress macAddress; - try { - macAddress = MacAddress.fromBytes(lease.hwAddr); - } catch (IllegalArgumentException e) { - Log.wtf(TAG, "Invalid address received from DhcpServer: " - + Arrays.toString(lease.hwAddr)); - return; - } - - final TetheredClient.AddressInfo addressInfo = new TetheredClient.AddressInfo( - address, lease.hostname); - leases.add(new TetheredClient( - macAddress, - Collections.singletonList(addressInfo), - mInterfaceType)); - } - - getHandler().post(() -> { - mDhcpLeases = leases; - mCallback.dhcpLeasesChanged(); - }); - } - - @Override - public void onNewPrefixRequest(@NonNull final IpPrefix currentPrefix) { - Objects.requireNonNull(currentPrefix); - sendMessage(CMD_NEW_PREFIX_REQUEST, currentPrefix); - } - - @Override - public int getInterfaceVersion() { - return this.VERSION; - } - - @Override - public String getInterfaceHash() throws RemoteException { - return this.HASH; - } - } - - private RouteInfo getDirectConnectedRoute(@NonNull final LinkAddress ipv4Address) { - Objects.requireNonNull(ipv4Address); - return new RouteInfo(PrefixUtils.asIpPrefix(ipv4Address), null, mIfaceName, RTN_UNICAST); - } - - private DhcpServingParamsParcel makeServingParams(@NonNull final Inet4Address defaultRouter, - @NonNull final Inet4Address dnsServer, @NonNull LinkAddress serverAddr, - @Nullable Inet4Address clientAddr) { - final boolean changePrefixOnDecline = - (mInterfaceType == TetheringManager.TETHERING_NCM && clientAddr == null); - return new DhcpServingParamsParcelExt() - .setDefaultRouters(defaultRouter) - .setDhcpLeaseTimeSecs(DHCP_LEASE_TIME_SECS) - .setDnsServers(dnsServer) - .setServerAddr(serverAddr) - .setMetered(true) - .setSingleClientAddr(clientAddr) - .setChangePrefixOnDecline(changePrefixOnDecline); - // TODO: also advertise link MTU - } - - private boolean startDhcp(final LinkAddress serverLinkAddr, final LinkAddress clientLinkAddr) { - if (mUsingLegacyDhcp) { - return true; - } - - final Inet4Address addr = (Inet4Address) serverLinkAddr.getAddress(); - final Inet4Address clientAddr = clientLinkAddr == null ? null : - (Inet4Address) clientLinkAddr.getAddress(); - - final DhcpServingParamsParcel params = makeServingParams(addr /* defaultRouter */, - addr /* dnsServer */, serverLinkAddr, clientAddr); - mDhcpServerStartIndex++; - mDeps.makeDhcpServer( - mIfaceName, params, new DhcpServerCallbacksImpl(mDhcpServerStartIndex)); - return true; - } - - private void stopDhcp() { - // Make all previous start requests obsolete so servers are not started later - mDhcpServerStartIndex++; - - if (mDhcpServer != null) { - try { - mDhcpServer.stop(new OnHandlerStatusCallback() { - @Override - public void callback(int statusCode) { - if (statusCode != STATUS_SUCCESS) { - mLog.e("Error stopping DHCP server: " + statusCode); - mLastError = TetheringManager.TETHER_ERROR_DHCPSERVER_ERROR; - // Not much more we can do here - } - mDhcpLeases.clear(); - getHandler().post(mCallback::dhcpLeasesChanged); - } - }); - mDhcpServer = null; - } catch (RemoteException e) { - mLog.e("Error stopping DHCP server", e); - // Not much more we can do here - } - } - } - - private boolean configureDhcp(boolean enable, final LinkAddress serverAddr, - final LinkAddress clientAddr) { - if (enable) { - return startDhcp(serverAddr, clientAddr); - } else { - stopDhcp(); - return true; - } - } - - private void stopIPv4() { - configureIPv4(false); - // NOTE: All of configureIPv4() will be refactored out of existence - // into calls to InterfaceController, shared with startIPv4(). - mInterfaceCtrl.clearIPv4Address(); - mPrivateAddressCoordinator.releaseDownstream(this); - mIpv4Address = null; - mStaticIpv4ServerAddr = null; - mStaticIpv4ClientAddr = null; - } - - private boolean configureIPv4(boolean enabled) { - if (VDBG) Log.d(TAG, "configureIPv4(" + enabled + ")"); - - if (enabled) { - mIpv4Address = requestIpv4Address(); - } - - if (mIpv4Address == null) { - mLog.e("No available ipv4 address"); - return false; - } - - if (mInterfaceType == TetheringManager.TETHERING_BLUETOOTH) { - // BT configures the interface elsewhere: only start DHCP. - // TODO: make all tethering types behave the same way, and delete the bluetooth - // code that calls into NetworkManagementService directly. - return configureDhcp(enabled, mIpv4Address, null /* clientAddress */); - } - - final IpPrefix ipv4Prefix = asIpPrefix(mIpv4Address); - - final Boolean setIfaceUp; - if (mInterfaceType == TetheringManager.TETHERING_WIFI - || mInterfaceType == TetheringManager.TETHERING_WIFI_P2P - || mInterfaceType == TetheringManager.TETHERING_ETHERNET - || mInterfaceType == TetheringManager.TETHERING_WIGIG) { - // The WiFi and Ethernet stack has ownership of the interface up/down state. - // It is unclear whether the Bluetooth or USB stacks will manage their own - // state. - setIfaceUp = null; - } else { - setIfaceUp = enabled; - } - if (!mInterfaceCtrl.setInterfaceConfiguration(mIpv4Address, setIfaceUp)) { - mLog.e("Error configuring interface"); - if (!enabled) stopDhcp(); - return false; - } - - if (enabled) { - mLinkProperties.addLinkAddress(mIpv4Address); - mLinkProperties.addRoute(getDirectConnectedRoute(mIpv4Address)); - } else { - mLinkProperties.removeLinkAddress(mIpv4Address); - mLinkProperties.removeRoute(getDirectConnectedRoute(mIpv4Address)); - } - return configureDhcp(enabled, mIpv4Address, mStaticIpv4ClientAddr); - } - - private LinkAddress requestIpv4Address() { - if (mStaticIpv4ServerAddr != null) return mStaticIpv4ServerAddr; - - if (mInterfaceType == TetheringManager.TETHERING_BLUETOOTH) { - return new LinkAddress(BLUETOOTH_IFACE_ADDR); - } - - return mPrivateAddressCoordinator.requestDownstreamAddress(this); - } - - private boolean startIPv6() { - mInterfaceParams = mDeps.getInterfaceParams(mIfaceName); - if (mInterfaceParams == null) { - mLog.e("Failed to find InterfaceParams"); - stopIPv6(); - return false; - } - - mRaDaemon = mDeps.getRouterAdvertisementDaemon(mInterfaceParams); - if (!mRaDaemon.start()) { - stopIPv6(); - return false; - } - - return true; - } - - private void stopIPv6() { - mInterfaceParams = null; - setRaParams(null); - - if (mRaDaemon != null) { - mRaDaemon.stop(); - mRaDaemon = null; - } - } - - // IPv6TetheringCoordinator sends updates with carefully curated IPv6-only - // LinkProperties. These have extraneous data filtered out and only the - // necessary prefixes included (per its prefix distribution policy). - // - // TODO: Evaluate using a data structure than is more directly suited to - // communicating only the relevant information. - private void updateUpstreamIPv6LinkProperties(LinkProperties v6only, int ttlAdjustment) { - if (mRaDaemon == null) return; - - // Avoid unnecessary work on spurious updates. - if (Objects.equals(mLastIPv6LinkProperties, v6only)) { - return; - } - - RaParams params = null; - int upstreamIfindex = 0; - - if (v6only != null) { - final String upstreamIface = v6only.getInterfaceName(); - - params = new RaParams(); - params.mtu = v6only.getMtu(); - params.hasDefaultRoute = v6only.hasIpv6DefaultRoute(); - - if (params.hasDefaultRoute) params.hopLimit = getHopLimit(upstreamIface, ttlAdjustment); - - for (LinkAddress linkAddr : v6only.getLinkAddresses()) { - if (linkAddr.getPrefixLength() != RFC7421_PREFIX_LENGTH) continue; - - final IpPrefix prefix = new IpPrefix( - linkAddr.getAddress(), linkAddr.getPrefixLength()); - params.prefixes.add(prefix); - - final Inet6Address dnsServer = getLocalDnsIpFor(prefix); - if (dnsServer != null) { - params.dnses.add(dnsServer); - } - } - - upstreamIfindex = mDeps.getIfindex(upstreamIface); - - // Add upstream index to name mapping for the tether stats usage in the coordinator. - // Although this mapping could be added by both class Tethering and IpServer, adding - // mapping from IpServer guarantees that the mapping is added before the adding - // forwarding rules. That is because there are different state machines in both - // classes. It is hard to guarantee the link property update order between multiple - // state machines. - mBpfCoordinator.addUpstreamNameToLookupTable(upstreamIfindex, upstreamIface); - } - - // If v6only is null, we pass in null to setRaParams(), which handles - // deprecation of any existing RA data. - - setRaParams(params); - mLastIPv6LinkProperties = v6only; - - updateIpv6ForwardingRules(mLastIPv6UpstreamIfindex, upstreamIfindex, null); - mLastIPv6UpstreamIfindex = upstreamIfindex; - } - - private void removeRoutesFromLocalNetwork(@NonNull final List<RouteInfo> toBeRemoved) { - final int removalFailures = RouteUtils.removeRoutesFromLocalNetwork( - mNetd, toBeRemoved); - if (removalFailures > 0) { - mLog.e(String.format("Failed to remove %d IPv6 routes from local table.", - removalFailures)); - } - - for (RouteInfo route : toBeRemoved) mLinkProperties.removeRoute(route); - } - - private void addRoutesToLocalNetwork(@NonNull final List<RouteInfo> toBeAdded) { - try { - // It's safe to call networkAddInterface() even if - // the interface is already in the local_network. - mNetd.networkAddInterface(INetd.LOCAL_NET_ID, mIfaceName); - try { - // Add routes from local network. Note that adding routes that - // already exist does not cause an error (EEXIST is silently ignored). - RouteUtils.addRoutesToLocalNetwork(mNetd, mIfaceName, toBeAdded); - } catch (IllegalStateException e) { - mLog.e("Failed to add IPv4/v6 routes to local table: " + e); - return; - } - } catch (ServiceSpecificException | RemoteException e) { - mLog.e("Failed to add " + mIfaceName + " to local table: ", e); - return; - } - - for (RouteInfo route : toBeAdded) mLinkProperties.addRoute(route); - } - - private void configureLocalIPv6Routes( - HashSet<IpPrefix> deprecatedPrefixes, HashSet<IpPrefix> newPrefixes) { - // [1] Remove the routes that are deprecated. - if (!deprecatedPrefixes.isEmpty()) { - removeRoutesFromLocalNetwork(getLocalRoutesFor(mIfaceName, deprecatedPrefixes)); - } - - // [2] Add only the routes that have not previously been added. - if (newPrefixes != null && !newPrefixes.isEmpty()) { - HashSet<IpPrefix> addedPrefixes = (HashSet) newPrefixes.clone(); - if (mLastRaParams != null) { - addedPrefixes.removeAll(mLastRaParams.prefixes); - } - - if (!addedPrefixes.isEmpty()) { - addRoutesToLocalNetwork(getLocalRoutesFor(mIfaceName, addedPrefixes)); - } - } - } - - private void configureLocalIPv6Dns( - HashSet<Inet6Address> deprecatedDnses, HashSet<Inet6Address> newDnses) { - // TODO: Is this really necessary? Can we not fail earlier if INetd cannot be located? - if (mNetd == null) { - if (newDnses != null) newDnses.clear(); - mLog.e("No netd service instance available; not setting local IPv6 addresses"); - return; - } - - // [1] Remove deprecated local DNS IP addresses. - if (!deprecatedDnses.isEmpty()) { - for (Inet6Address dns : deprecatedDnses) { - if (!mInterfaceCtrl.removeAddress(dns, RFC7421_PREFIX_LENGTH)) { - mLog.e("Failed to remove local dns IP " + dns); - } - - mLinkProperties.removeLinkAddress(new LinkAddress(dns, RFC7421_PREFIX_LENGTH)); - } - } - - // [2] Add only the local DNS IP addresses that have not previously been added. - if (newDnses != null && !newDnses.isEmpty()) { - final HashSet<Inet6Address> addedDnses = (HashSet) newDnses.clone(); - if (mLastRaParams != null) { - addedDnses.removeAll(mLastRaParams.dnses); - } - - for (Inet6Address dns : addedDnses) { - if (!mInterfaceCtrl.addAddress(dns, RFC7421_PREFIX_LENGTH)) { - mLog.e("Failed to add local dns IP " + dns); - newDnses.remove(dns); - } - - mLinkProperties.addLinkAddress(new LinkAddress(dns, RFC7421_PREFIX_LENGTH)); - } - } - - try { - mNetd.tetherApplyDnsInterfaces(); - } catch (ServiceSpecificException | RemoteException e) { - mLog.e("Failed to update local DNS caching server"); - if (newDnses != null) newDnses.clear(); - } - } - - private void addIpv6ForwardingRule(Ipv6ForwardingRule rule) { - // Theoretically, we don't need this check because IP neighbor monitor doesn't start if BPF - // offload is disabled. Add this check just in case. - // TODO: Perhaps remove this protection check. - if (!mUsingBpfOffload) return; - - mBpfCoordinator.tetherOffloadRuleAdd(this, rule); - } - - private void removeIpv6ForwardingRule(Ipv6ForwardingRule rule) { - // TODO: Perhaps remove this protection check. - // See the related comment in #addIpv6ForwardingRule. - if (!mUsingBpfOffload) return; - - mBpfCoordinator.tetherOffloadRuleRemove(this, rule); - } - - private void clearIpv6ForwardingRules() { - if (!mUsingBpfOffload) return; - - mBpfCoordinator.tetherOffloadRuleClear(this); - } - - private void updateIpv6ForwardingRule(int newIfindex) { - // TODO: Perhaps remove this protection check. - // See the related comment in #addIpv6ForwardingRule. - if (!mUsingBpfOffload) return; - - mBpfCoordinator.tetherOffloadRuleUpdate(this, newIfindex); - } - - // Handles all updates to IPv6 forwarding rules. These can currently change only if the upstream - // changes or if a neighbor event is received. - private void updateIpv6ForwardingRules(int prevUpstreamIfindex, int upstreamIfindex, - NeighborEvent e) { - // If we no longer have an upstream, clear forwarding rules and do nothing else. - if (upstreamIfindex == 0) { - clearIpv6ForwardingRules(); - return; - } - - // If the upstream interface has changed, remove all rules and re-add them with the new - // upstream interface. - if (prevUpstreamIfindex != upstreamIfindex) { - updateIpv6ForwardingRule(upstreamIfindex); - } - - // If we're here to process a NeighborEvent, do so now. - // mInterfaceParams must be non-null or the event would not have arrived. - if (e == null) return; - if (!(e.ip instanceof Inet6Address) || e.ip.isMulticastAddress() - || e.ip.isLoopbackAddress() || e.ip.isLinkLocalAddress()) { - return; - } - - // When deleting rules, we still need to pass a non-null MAC, even though it's ignored. - // Do this here instead of in the Ipv6ForwardingRule constructor to ensure that we never - // add rules with a null MAC, only delete them. - MacAddress dstMac = e.isValid() ? e.macAddr : NULL_MAC_ADDRESS; - Ipv6ForwardingRule rule = new Ipv6ForwardingRule(upstreamIfindex, - mInterfaceParams.index, (Inet6Address) e.ip, mInterfaceParams.macAddr, dstMac); - if (e.isValid()) { - addIpv6ForwardingRule(rule); - } else { - removeIpv6ForwardingRule(rule); - } - } - - private void handleNeighborEvent(NeighborEvent e) { - if (mInterfaceParams != null - && mInterfaceParams.index == e.ifindex - && mInterfaceParams.hasMacAddress) { - updateIpv6ForwardingRules(mLastIPv6UpstreamIfindex, mLastIPv6UpstreamIfindex, e); - } - } - - private void handleNewPrefixRequest(@NonNull final IpPrefix currentPrefix) { - if (!currentPrefix.contains(mIpv4Address.getAddress()) - || currentPrefix.getPrefixLength() != mIpv4Address.getPrefixLength()) { - Log.e(TAG, "Invalid prefix: " + currentPrefix); - return; - } - - final LinkAddress deprecatedLinkAddress = mIpv4Address; - mIpv4Address = requestIpv4Address(); - if (mIpv4Address == null) { - mLog.e("Fail to request a new downstream prefix"); - return; - } - final Inet4Address srvAddr = (Inet4Address) mIpv4Address.getAddress(); - - // Add new IPv4 address on the interface. - if (!mInterfaceCtrl.addAddress(srvAddr, currentPrefix.getPrefixLength())) { - mLog.e("Failed to add new IP " + srvAddr); - return; - } - - // Remove deprecated routes from local network. - removeRoutesFromLocalNetwork( - Collections.singletonList(getDirectConnectedRoute(deprecatedLinkAddress))); - mLinkProperties.removeLinkAddress(deprecatedLinkAddress); - - // Add new routes to local network. - addRoutesToLocalNetwork( - Collections.singletonList(getDirectConnectedRoute(mIpv4Address))); - mLinkProperties.addLinkAddress(mIpv4Address); - - // Update local DNS caching server with new IPv4 address, otherwise, dnsmasq doesn't - // listen on the interface configured with new IPv4 address, that results DNS validation - // failure of downstream client even if appropriate routes have been configured. - try { - mNetd.tetherApplyDnsInterfaces(); - } catch (ServiceSpecificException | RemoteException e) { - mLog.e("Failed to update local DNS caching server"); - return; - } - sendLinkProperties(); - - // Notify DHCP server that new prefix/route has been applied on IpServer. - final Inet4Address clientAddr = mStaticIpv4ClientAddr == null ? null : - (Inet4Address) mStaticIpv4ClientAddr.getAddress(); - final DhcpServingParamsParcel params = makeServingParams(srvAddr /* defaultRouter */, - srvAddr /* dnsServer */, mIpv4Address /* serverLinkAddress */, clientAddr); - try { - mDhcpServer.updateParams(params, new OnHandlerStatusCallback() { - @Override - public void callback(int statusCode) { - if (statusCode != STATUS_SUCCESS) { - mLog.e("Error updating DHCP serving params: " + statusCode); - } - } - }); - } catch (RemoteException e) { - mLog.e("Error updating DHCP serving params", e); - } - } - - private byte getHopLimit(String upstreamIface, int adjustTTL) { - try { - int upstreamHopLimit = Integer.parseUnsignedInt( - mNetd.getProcSysNet(INetd.IPV6, INetd.CONF, upstreamIface, "hop_limit")); - upstreamHopLimit = upstreamHopLimit + adjustTTL; - // Cap the hop limit to 255. - return (byte) Integer.min(upstreamHopLimit, 255); - } catch (Exception e) { - mLog.e("Failed to find upstream interface hop limit", e); - } - return RaParams.DEFAULT_HOPLIMIT; - } - - private void setRaParams(RaParams newParams) { - if (mRaDaemon != null) { - final RaParams deprecatedParams = - RaParams.getDeprecatedRaParams(mLastRaParams, newParams); - - configureLocalIPv6Routes(deprecatedParams.prefixes, - (newParams != null) ? newParams.prefixes : null); - - configureLocalIPv6Dns(deprecatedParams.dnses, - (newParams != null) ? newParams.dnses : null); - - mRaDaemon.buildNewRa(deprecatedParams, newParams); - } - - mLastRaParams = newParams; - } - - private void logMessage(State state, int what) { - mLog.log(state.getName() + " got " + sMagicDecoderRing.get(what, Integer.toString(what))); - } - - private void sendInterfaceState(int newInterfaceState) { - mServingMode = newInterfaceState; - mCallback.updateInterfaceState(this, newInterfaceState, mLastError); - sendLinkProperties(); - } - - private void sendLinkProperties() { - mCallback.updateLinkProperties(this, new LinkProperties(mLinkProperties)); - } - - private void resetLinkProperties() { - mLinkProperties.clear(); - mLinkProperties.setInterfaceName(mIfaceName); - } - - private void maybeConfigureStaticIp(final TetheringRequestParcel request) { - // Ignore static address configuration if they are invalid or null. In theory, static - // addresses should not be invalid here because TetheringManager do not allow caller to - // specify invalid static address configuration. - if (request == null || request.localIPv4Address == null - || request.staticClientAddress == null || !checkStaticAddressConfiguration( - request.localIPv4Address, request.staticClientAddress)) { - return; - } - - mStaticIpv4ServerAddr = request.localIPv4Address; - mStaticIpv4ClientAddr = request.staticClientAddress; - } - - class InitialState extends State { - @Override - public void enter() { - sendInterfaceState(STATE_AVAILABLE); - } - - @Override - public boolean processMessage(Message message) { - logMessage(this, message.what); - switch (message.what) { - case CMD_TETHER_REQUESTED: - mLastError = TetheringManager.TETHER_ERROR_NO_ERROR; - switch (message.arg1) { - case STATE_LOCAL_ONLY: - maybeConfigureStaticIp((TetheringRequestParcel) message.obj); - transitionTo(mLocalHotspotState); - break; - case STATE_TETHERED: - maybeConfigureStaticIp((TetheringRequestParcel) message.obj); - transitionTo(mTetheredState); - break; - default: - mLog.e("Invalid tethering interface serving state specified."); - } - break; - case CMD_INTERFACE_DOWN: - transitionTo(mUnavailableState); - break; - case CMD_IPV6_TETHER_UPDATE: - updateUpstreamIPv6LinkProperties((LinkProperties) message.obj, message.arg1); - break; - default: - return NOT_HANDLED; - } - return HANDLED; - } - } - - class BaseServingState extends State { - @Override - public void enter() { - if (!startIPv4()) { - mLastError = TetheringManager.TETHER_ERROR_IFACE_CFG_ERROR; - return; - } - - try { - NetdUtils.tetherInterface(mNetd, mIfaceName, asIpPrefix(mIpv4Address)); - } catch (RemoteException | ServiceSpecificException | IllegalStateException e) { - mLog.e("Error Tethering", e); - mLastError = TetheringManager.TETHER_ERROR_TETHER_IFACE_ERROR; - return; - } - - if (!startIPv6()) { - mLog.e("Failed to startIPv6"); - // TODO: Make this a fatal error once Bluetooth IPv6 is sorted. - return; - } - } - - @Override - public void exit() { - // Note that at this point, we're leaving the tethered state. We can fail any - // of these operations, but it doesn't really change that we have to try them - // all in sequence. - stopIPv6(); - - try { - NetdUtils.untetherInterface(mNetd, mIfaceName); - } catch (RemoteException | ServiceSpecificException e) { - mLastError = TetheringManager.TETHER_ERROR_UNTETHER_IFACE_ERROR; - mLog.e("Failed to untether interface: " + e); - } - - stopIPv4(); - - resetLinkProperties(); - } - - @Override - public boolean processMessage(Message message) { - logMessage(this, message.what); - switch (message.what) { - case CMD_TETHER_UNREQUESTED: - transitionTo(mInitialState); - if (DBG) Log.d(TAG, "Untethered (unrequested)" + mIfaceName); - break; - case CMD_INTERFACE_DOWN: - transitionTo(mUnavailableState); - if (DBG) Log.d(TAG, "Untethered (ifdown)" + mIfaceName); - break; - case CMD_IPV6_TETHER_UPDATE: - updateUpstreamIPv6LinkProperties((LinkProperties) message.obj, message.arg1); - sendLinkProperties(); - break; - case CMD_IP_FORWARDING_ENABLE_ERROR: - case CMD_IP_FORWARDING_DISABLE_ERROR: - case CMD_START_TETHERING_ERROR: - case CMD_STOP_TETHERING_ERROR: - case CMD_SET_DNS_FORWARDERS_ERROR: - mLastError = TetheringManager.TETHER_ERROR_INTERNAL_ERROR; - transitionTo(mInitialState); - break; - case CMD_NEW_PREFIX_REQUEST: - handleNewPrefixRequest((IpPrefix) message.obj); - break; - case CMD_NOTIFY_PREFIX_CONFLICT: - mLog.i("restart tethering: " + mInterfaceType); - mCallback.requestEnableTethering(mInterfaceType, false /* enabled */); - transitionTo(mWaitingForRestartState); - break; - default: - return false; - } - return true; - } - } - - // Handling errors in BaseServingState.enter() by transitioning is - // problematic because transitioning during a multi-state jump yields - // a Log.wtf(). Ultimately, there should be only one ServingState, - // and forwarding and NAT rules should be handled by a coordinating - // functional element outside of IpServer. - class LocalHotspotState extends BaseServingState { - @Override - public void enter() { - super.enter(); - if (mLastError != TetheringManager.TETHER_ERROR_NO_ERROR) { - transitionTo(mInitialState); - } - - if (DBG) Log.d(TAG, "Local hotspot " + mIfaceName); - sendInterfaceState(STATE_LOCAL_ONLY); - } - - @Override - public boolean processMessage(Message message) { - if (super.processMessage(message)) return true; - - logMessage(this, message.what); - switch (message.what) { - case CMD_TETHER_REQUESTED: - mLog.e("CMD_TETHER_REQUESTED while in local-only hotspot mode."); - break; - case CMD_TETHER_CONNECTION_CHANGED: - // Ignored in local hotspot state. - break; - default: - return false; - } - return true; - } - } - - // Handling errors in BaseServingState.enter() by transitioning is - // problematic because transitioning during a multi-state jump yields - // a Log.wtf(). Ultimately, there should be only one ServingState, - // and forwarding and NAT rules should be handled by a coordinating - // functional element outside of IpServer. - class TetheredState extends BaseServingState { - @Override - public void enter() { - super.enter(); - if (mLastError != TetheringManager.TETHER_ERROR_NO_ERROR) { - transitionTo(mInitialState); - } - - if (DBG) Log.d(TAG, "Tethered " + mIfaceName); - sendInterfaceState(STATE_TETHERED); - } - - @Override - public void exit() { - cleanupUpstream(); - super.exit(); - } - - private void cleanupUpstream() { - if (mUpstreamIfaceSet == null) return; - - for (String ifname : mUpstreamIfaceSet.ifnames) cleanupUpstreamInterface(ifname); - mUpstreamIfaceSet = null; - clearIpv6ForwardingRules(); - } - - private void cleanupUpstreamInterface(String upstreamIface) { - // Note that we don't care about errors here. - // Sometimes interfaces are gone before we get - // to remove their rules, which generates errors. - // Just do the best we can. - try { - mNetd.ipfwdRemoveInterfaceForward(mIfaceName, upstreamIface); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e("Exception in ipfwdRemoveInterfaceForward: " + e.toString()); - } - try { - mNetd.tetherRemoveForward(mIfaceName, upstreamIface); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e("Exception in disableNat: " + e.toString()); - } - } - - @Override - public boolean processMessage(Message message) { - if (super.processMessage(message)) return true; - - logMessage(this, message.what); - switch (message.what) { - case CMD_TETHER_REQUESTED: - mLog.e("CMD_TETHER_REQUESTED while already tethering."); - break; - case CMD_TETHER_CONNECTION_CHANGED: - final InterfaceSet newUpstreamIfaceSet = (InterfaceSet) message.obj; - if (noChangeInUpstreamIfaceSet(newUpstreamIfaceSet)) { - if (VDBG) Log.d(TAG, "Connection changed noop - dropping"); - break; - } - - if (newUpstreamIfaceSet == null) { - cleanupUpstream(); - break; - } - - for (String removed : upstreamInterfacesRemoved(newUpstreamIfaceSet)) { - cleanupUpstreamInterface(removed); - } - - final Set<String> added = upstreamInterfacesAdd(newUpstreamIfaceSet); - // This makes the call to cleanupUpstream() in the error - // path for any interface neatly cleanup all the interfaces. - mUpstreamIfaceSet = newUpstreamIfaceSet; - - for (String ifname : added) { - try { - mNetd.tetherAddForward(mIfaceName, ifname); - mNetd.ipfwdAddInterfaceForward(mIfaceName, ifname); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e("Exception enabling NAT: " + e.toString()); - cleanupUpstream(); - mLastError = TetheringManager.TETHER_ERROR_ENABLE_FORWARDING_ERROR; - transitionTo(mInitialState); - return true; - } - } - break; - case CMD_NEIGHBOR_EVENT: - handleNeighborEvent((NeighborEvent) message.obj); - break; - default: - return false; - } - return true; - } - - private boolean noChangeInUpstreamIfaceSet(InterfaceSet newIfaces) { - if (mUpstreamIfaceSet == null && newIfaces == null) return true; - if (mUpstreamIfaceSet != null && newIfaces != null) { - return mUpstreamIfaceSet.equals(newIfaces); - } - return false; - } - - private Set<String> upstreamInterfacesRemoved(InterfaceSet newIfaces) { - if (mUpstreamIfaceSet == null) return new HashSet<>(); - - final HashSet<String> removed = new HashSet<>(mUpstreamIfaceSet.ifnames); - removed.removeAll(newIfaces.ifnames); - return removed; - } - - private Set<String> upstreamInterfacesAdd(InterfaceSet newIfaces) { - final HashSet<String> added = new HashSet<>(newIfaces.ifnames); - if (mUpstreamIfaceSet != null) added.removeAll(mUpstreamIfaceSet.ifnames); - return added; - } - } - - /** - * This state is terminal for the per interface state machine. At this - * point, the master state machine should have removed this interface - * specific state machine from its list of possible recipients of - * tethering requests. The state machine itself will hang around until - * the garbage collector finds it. - */ - class UnavailableState extends State { - @Override - public void enter() { - mIpNeighborMonitor.stop(); - mLastError = TetheringManager.TETHER_ERROR_NO_ERROR; - sendInterfaceState(STATE_UNAVAILABLE); - } - } - - class WaitingForRestartState extends State { - @Override - public boolean processMessage(Message message) { - logMessage(this, message.what); - switch (message.what) { - case CMD_TETHER_UNREQUESTED: - transitionTo(mInitialState); - mLog.i("Untethered (unrequested) and restarting " + mIfaceName); - mCallback.requestEnableTethering(mInterfaceType, true /* enabled */); - break; - case CMD_INTERFACE_DOWN: - transitionTo(mUnavailableState); - mLog.i("Untethered (interface down) and restarting" + mIfaceName); - mCallback.requestEnableTethering(mInterfaceType, true /* enabled */); - break; - default: - return false; - } - return true; - } - } - - // Accumulate routes representing "prefixes to be assigned to the local - // interface", for subsequent modification of local_network routing. - private static ArrayList<RouteInfo> getLocalRoutesFor( - String ifname, HashSet<IpPrefix> prefixes) { - final ArrayList<RouteInfo> localRoutes = new ArrayList<RouteInfo>(); - for (IpPrefix ipp : prefixes) { - localRoutes.add(new RouteInfo(ipp, null, ifname, RTN_UNICAST)); - } - return localRoutes; - } - - // Given a prefix like 2001:db8::/64 return an address like 2001:db8::1. - private static Inet6Address getLocalDnsIpFor(IpPrefix localPrefix) { - final byte[] dnsBytes = localPrefix.getRawAddress(); - dnsBytes[dnsBytes.length - 1] = getRandomSanitizedByte(DOUG_ADAMS, asByte(0), asByte(1)); - try { - return Inet6Address.getByAddress(null, dnsBytes, 0); - } catch (UnknownHostException e) { - Log.wtf(TAG, "Failed to construct Inet6Address from: " + localPrefix); - return null; - } - } - - private static byte getRandomSanitizedByte(byte dflt, byte... excluded) { - final byte random = (byte) (new Random()).nextInt(); - for (int value : excluded) { - if (random == value) return dflt; - } - return random; - } -} diff --git a/packages/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java b/packages/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java deleted file mode 100644 index 6f017dcb623f..000000000000 --- a/packages/Tethering/src/android/net/ip/RouterAdvertisementDaemon.java +++ /dev/null @@ -1,758 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.ip; - -import static android.net.util.NetworkConstants.IPV6_MIN_MTU; -import static android.net.util.NetworkConstants.RFC7421_PREFIX_LENGTH; -import static android.system.OsConstants.AF_INET6; -import static android.system.OsConstants.IPPROTO_ICMPV6; -import static android.system.OsConstants.SOCK_RAW; -import static android.system.OsConstants.SOL_SOCKET; -import static android.system.OsConstants.SO_SNDTIMEO; - -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.TrafficStats; -import android.net.util.InterfaceParams; -import android.net.util.SocketUtils; -import android.net.util.TetheringUtils; -import android.system.ErrnoException; -import android.system.Os; -import android.system.StructTimeval; -import android.util.Log; - -import com.android.internal.annotations.GuardedBy; -import com.android.internal.util.TrafficStatsConstants; - -import java.io.FileDescriptor; -import java.io.IOException; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.nio.BufferOverflowException; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; - - -/** - * Basic IPv6 Router Advertisement Daemon. - * - * TODO: - * - * - Rewrite using Handler (and friends) so that AlarmManager can deliver - * "kick" messages when it's time to send a multicast RA. - * - * @hide - */ -public class RouterAdvertisementDaemon { - private static final String TAG = RouterAdvertisementDaemon.class.getSimpleName(); - private static final byte ICMPV6_ND_ROUTER_SOLICIT = asByte(133); - private static final byte ICMPV6_ND_ROUTER_ADVERT = asByte(134); - private static final int MIN_RA_HEADER_SIZE = 16; - - // Summary of various timers and lifetimes. - private static final int MIN_RTR_ADV_INTERVAL_SEC = 300; - private static final int MAX_RTR_ADV_INTERVAL_SEC = 600; - // In general, router, prefix, and DNS lifetimes are all advised to be - // greater than or equal to 3 * MAX_RTR_ADV_INTERVAL. Here, we double - // that to allow for multicast packet loss. - // - // This MAX_RTR_ADV_INTERVAL_SEC and DEFAULT_LIFETIME are also consistent - // with the https://tools.ietf.org/html/rfc7772#section-4 discussion of - // "approximately 7 RAs per hour". - private static final int DEFAULT_LIFETIME = 6 * MAX_RTR_ADV_INTERVAL_SEC; - // From https://tools.ietf.org/html/rfc4861#section-10 . - private static final int MIN_DELAY_BETWEEN_RAS_SEC = 3; - // Both initial and final RAs, but also for changes in RA contents. - // From https://tools.ietf.org/html/rfc4861#section-10 . - private static final int MAX_URGENT_RTR_ADVERTISEMENTS = 5; - - private static final int DAY_IN_SECONDS = 86_400; - - private static final byte[] ALL_NODES = new byte[] { - (byte) 0xff, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 - }; - - private final InterfaceParams mInterface; - private final InetSocketAddress mAllNodes; - - // This lock is to protect the RA from being updated while being - // transmitted on another thread (multicast or unicast). - // - // TODO: This should be handled with a more RCU-like approach. - private final Object mLock = new Object(); - @GuardedBy("mLock") - private final byte[] mRA = new byte[IPV6_MIN_MTU]; - @GuardedBy("mLock") - private int mRaLength; - @GuardedBy("mLock") - private final DeprecatedInfoTracker mDeprecatedInfoTracker; - @GuardedBy("mLock") - private RaParams mRaParams; - - private volatile FileDescriptor mSocket; - private volatile MulticastTransmitter mMulticastTransmitter; - private volatile UnicastResponder mUnicastResponder; - - /** Encapsulate the RA parameters for RouterAdvertisementDaemon.*/ - public static class RaParams { - // Tethered traffic will have the hop limit properly decremented. - // Consequently, set the hoplimit greater by one than the upstream - // unicast hop limit. - // - // TODO: Dynamically pass down the IPV6_UNICAST_HOPS value from the - // upstream interface for more correct behaviour. - static final byte DEFAULT_HOPLIMIT = 65; - - public boolean hasDefaultRoute; - public byte hopLimit; - public int mtu; - public HashSet<IpPrefix> prefixes; - public HashSet<Inet6Address> dnses; - - public RaParams() { - hasDefaultRoute = false; - hopLimit = DEFAULT_HOPLIMIT; - mtu = IPV6_MIN_MTU; - prefixes = new HashSet<IpPrefix>(); - dnses = new HashSet<Inet6Address>(); - } - - public RaParams(RaParams other) { - hasDefaultRoute = other.hasDefaultRoute; - hopLimit = other.hopLimit; - mtu = other.mtu; - prefixes = (HashSet) other.prefixes.clone(); - dnses = (HashSet) other.dnses.clone(); - } - - /** - * Returns the subset of RA parameters that become deprecated when - * moving from announcing oldRa to announcing newRa. - * - * Currently only tracks differences in |prefixes| and |dnses|. - */ - public static RaParams getDeprecatedRaParams(RaParams oldRa, RaParams newRa) { - RaParams newlyDeprecated = new RaParams(); - - if (oldRa != null) { - for (IpPrefix ipp : oldRa.prefixes) { - if (newRa == null || !newRa.prefixes.contains(ipp)) { - newlyDeprecated.prefixes.add(ipp); - } - } - - for (Inet6Address dns : oldRa.dnses) { - if (newRa == null || !newRa.dnses.contains(dns)) { - newlyDeprecated.dnses.add(dns); - } - } - } - - return newlyDeprecated; - } - } - - private static class DeprecatedInfoTracker { - private final HashMap<IpPrefix, Integer> mPrefixes = new HashMap<>(); - private final HashMap<Inet6Address, Integer> mDnses = new HashMap<>(); - - Set<IpPrefix> getPrefixes() { - return mPrefixes.keySet(); - } - - void putPrefixes(Set<IpPrefix> prefixes) { - for (IpPrefix ipp : prefixes) { - mPrefixes.put(ipp, MAX_URGENT_RTR_ADVERTISEMENTS); - } - } - - void removePrefixes(Set<IpPrefix> prefixes) { - for (IpPrefix ipp : prefixes) { - mPrefixes.remove(ipp); - } - } - - Set<Inet6Address> getDnses() { - return mDnses.keySet(); - } - - void putDnses(Set<Inet6Address> dnses) { - for (Inet6Address dns : dnses) { - mDnses.put(dns, MAX_URGENT_RTR_ADVERTISEMENTS); - } - } - - void removeDnses(Set<Inet6Address> dnses) { - for (Inet6Address dns : dnses) { - mDnses.remove(dns); - } - } - - boolean isEmpty() { - return mPrefixes.isEmpty() && mDnses.isEmpty(); - } - - private boolean decrementCounters() { - boolean removed = decrementCounter(mPrefixes); - removed |= decrementCounter(mDnses); - return removed; - } - - private <T> boolean decrementCounter(HashMap<T, Integer> map) { - boolean removed = false; - - for (Iterator<Map.Entry<T, Integer>> it = map.entrySet().iterator(); - it.hasNext();) { - Map.Entry<T, Integer> kv = it.next(); - if (kv.getValue() == 0) { - it.remove(); - removed = true; - } else { - kv.setValue(kv.getValue() - 1); - } - } - - return removed; - } - } - - - public RouterAdvertisementDaemon(InterfaceParams ifParams) { - mInterface = ifParams; - mAllNodes = new InetSocketAddress(getAllNodesForScopeId(mInterface.index), 0); - mDeprecatedInfoTracker = new DeprecatedInfoTracker(); - } - - /** Build new RA.*/ - public void buildNewRa(RaParams deprecatedParams, RaParams newParams) { - synchronized (mLock) { - if (deprecatedParams != null) { - mDeprecatedInfoTracker.putPrefixes(deprecatedParams.prefixes); - mDeprecatedInfoTracker.putDnses(deprecatedParams.dnses); - } - - if (newParams != null) { - // Process information that is no longer deprecated. - mDeprecatedInfoTracker.removePrefixes(newParams.prefixes); - mDeprecatedInfoTracker.removeDnses(newParams.dnses); - } - - mRaParams = newParams; - assembleRaLocked(); - } - - maybeNotifyMulticastTransmitter(); - } - - /** Start router advertisement daemon. */ - public boolean start() { - if (!createSocket()) { - return false; - } - - mMulticastTransmitter = new MulticastTransmitter(); - mMulticastTransmitter.start(); - - mUnicastResponder = new UnicastResponder(); - mUnicastResponder.start(); - - return true; - } - - /** Stop router advertisement daemon. */ - public void stop() { - closeSocket(); - // Wake up mMulticastTransmitter thread to interrupt a potential 1 day sleep before - // the thread's termination. - maybeNotifyMulticastTransmitter(); - mMulticastTransmitter = null; - mUnicastResponder = null; - } - - @GuardedBy("mLock") - private void assembleRaLocked() { - final ByteBuffer ra = ByteBuffer.wrap(mRA); - ra.order(ByteOrder.BIG_ENDIAN); - - final boolean haveRaParams = (mRaParams != null); - boolean shouldSendRA = false; - - try { - putHeader(ra, haveRaParams && mRaParams.hasDefaultRoute, - haveRaParams ? mRaParams.hopLimit : RaParams.DEFAULT_HOPLIMIT); - putSlla(ra, mInterface.macAddr.toByteArray()); - mRaLength = ra.position(); - - // https://tools.ietf.org/html/rfc5175#section-4 says: - // - // "MUST NOT be added to a Router Advertisement message - // if no flags in the option are set." - // - // putExpandedFlagsOption(ra); - - if (haveRaParams) { - putMtu(ra, mRaParams.mtu); - mRaLength = ra.position(); - - for (IpPrefix ipp : mRaParams.prefixes) { - putPio(ra, ipp, DEFAULT_LIFETIME, DEFAULT_LIFETIME); - mRaLength = ra.position(); - shouldSendRA = true; - } - - if (mRaParams.dnses.size() > 0) { - putRdnss(ra, mRaParams.dnses, DEFAULT_LIFETIME); - mRaLength = ra.position(); - shouldSendRA = true; - } - } - - for (IpPrefix ipp : mDeprecatedInfoTracker.getPrefixes()) { - putPio(ra, ipp, 0, 0); - mRaLength = ra.position(); - shouldSendRA = true; - } - - final Set<Inet6Address> deprecatedDnses = mDeprecatedInfoTracker.getDnses(); - if (!deprecatedDnses.isEmpty()) { - putRdnss(ra, deprecatedDnses, 0); - mRaLength = ra.position(); - shouldSendRA = true; - } - } catch (BufferOverflowException e) { - // The packet up to mRaLength is valid, since it has been updated - // progressively as the RA was built. Log an error, and continue - // on as best as possible. - Log.e(TAG, "Could not construct new RA: " + e); - } - - // We have nothing worth announcing; indicate as much to maybeSendRA(). - if (!shouldSendRA) { - mRaLength = 0; - } - } - - private void maybeNotifyMulticastTransmitter() { - final MulticastTransmitter m = mMulticastTransmitter; - if (m != null) { - m.hup(); - } - } - - private static Inet6Address getAllNodesForScopeId(int scopeId) { - try { - return Inet6Address.getByAddress("ff02::1", ALL_NODES, scopeId); - } catch (UnknownHostException uhe) { - Log.wtf(TAG, "Failed to construct ff02::1 InetAddress: " + uhe); - return null; - } - } - - private static byte asByte(int value) { - return (byte) value; - } - private static short asShort(int value) { - return (short) value; - } - - private static void putHeader(ByteBuffer ra, boolean hasDefaultRoute, byte hopLimit) { - /** - Router Advertisement Message Format - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Type | Code | Checksum | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Cur Hop Limit |M|O|H|Prf|P|R|R| Router Lifetime | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Reachable Time | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Retrans Timer | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Options ... - +-+-+-+-+-+-+-+-+-+-+-+- - */ - ra.put(ICMPV6_ND_ROUTER_ADVERT) - .put(asByte(0)) - .putShort(asShort(0)) - .put(hopLimit) - // RFC 4191 "high" preference, iff. advertising a default route. - .put(hasDefaultRoute ? asByte(0x08) : asByte(0)) - .putShort(hasDefaultRoute ? asShort(DEFAULT_LIFETIME) : asShort(0)) - .putInt(0) - .putInt(0); - } - - private static void putSlla(ByteBuffer ra, byte[] slla) { - /** - Source/Target Link-layer Address - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Type | Length | Link-Layer Address ... - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - if (slla == null || slla.length != 6) { - // Only IEEE 802.3 6-byte addresses are supported. - return; - } - - final byte nd_option_slla = 1; - final byte slla_num_8octets = 1; - ra.put(nd_option_slla) - .put(slla_num_8octets) - .put(slla); - } - - private static void putExpandedFlagsOption(ByteBuffer ra) { - /** - Router Advertisement Expanded Flags Option - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Type | Length | Bit fields available .. - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - ... for assignment | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - - final byte nd_option__efo = 26; - final byte efo_num_8octets = 1; - - ra.put(nd_option__efo) - .put(efo_num_8octets) - .putShort(asShort(0)) - .putInt(0); - } - - private static void putMtu(ByteBuffer ra, int mtu) { - /** - MTU - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Type | Length | Reserved | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | MTU | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - final byte nd_option_mtu = 5; - final byte mtu_num_8octs = 1; - ra.put(nd_option_mtu) - .put(mtu_num_8octs) - .putShort(asShort(0)) - .putInt((mtu < IPV6_MIN_MTU) ? IPV6_MIN_MTU : mtu); - } - - private static void putPio(ByteBuffer ra, IpPrefix ipp, - int validTime, int preferredTime) { - /** - Prefix Information - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Type | Length | Prefix Length |L|A| Reserved1 | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Valid Lifetime | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Preferred Lifetime | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Reserved2 | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - + + - | | - + Prefix + - | | - + + - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - final int prefixLength = ipp.getPrefixLength(); - if (prefixLength != 64) { - return; - } - final byte nd_option_pio = 3; - final byte pio_num_8octets = 4; - - if (validTime < 0) validTime = 0; - if (preferredTime < 0) preferredTime = 0; - if (preferredTime > validTime) preferredTime = validTime; - - final byte[] addr = ipp.getAddress().getAddress(); - ra.put(nd_option_pio) - .put(pio_num_8octets) - .put(asByte(prefixLength)) - .put(asByte(0xc0)) /* L & A set */ - .putInt(validTime) - .putInt(preferredTime) - .putInt(0) - .put(addr); - } - - private static void putRio(ByteBuffer ra, IpPrefix ipp) { - /** - Route Information Option - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Type | Length | Prefix Length |Resvd|Prf|Resvd| - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Route Lifetime | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Prefix (Variable Length) | - . . - . . - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - final int prefixLength = ipp.getPrefixLength(); - if (prefixLength > 64) { - return; - } - final byte nd_option_rio = 24; - final byte rio_num_8octets = asByte( - (prefixLength == 0) ? 1 : (prefixLength <= 8) ? 2 : 3); - - final byte[] addr = ipp.getAddress().getAddress(); - ra.put(nd_option_rio) - .put(rio_num_8octets) - .put(asByte(prefixLength)) - .put(asByte(0x18)) - .putInt(DEFAULT_LIFETIME); - - // Rely upon an IpPrefix's address being properly zeroed. - if (prefixLength > 0) { - ra.put(addr, 0, (prefixLength <= 64) ? 8 : 16); - } - } - - private static void putRdnss(ByteBuffer ra, Set<Inet6Address> dnses, int lifetime) { - /** - Recursive DNS Server (RDNSS) Option - - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Type | Length | Reserved | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | Lifetime | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | | - : Addresses of IPv6 Recursive DNS Servers : - | | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - */ - - final HashSet<Inet6Address> filteredDnses = new HashSet<>(); - for (Inet6Address dns : dnses) { - if ((new LinkAddress(dns, RFC7421_PREFIX_LENGTH)).isGlobalPreferred()) { - filteredDnses.add(dns); - } - } - if (filteredDnses.isEmpty()) return; - - final byte nd_option_rdnss = 25; - final byte rdnss_num_8octets = asByte(dnses.size() * 2 + 1); - ra.put(nd_option_rdnss) - .put(rdnss_num_8octets) - .putShort(asShort(0)) - .putInt(lifetime); - - for (Inet6Address dns : filteredDnses) { - // NOTE: If the full of list DNS servers doesn't fit in the packet, - // this code will cause a buffer overflow and the RA won't include - // this instance of the option at all. - // - // TODO: Consider looking at ra.remaining() to determine how many - // DNS servers will fit, and adding only those. - ra.put(dns.getAddress()); - } - } - - private boolean createSocket() { - final int send_timout_ms = 300; - - final int oldTag = TrafficStats.getAndSetThreadStatsTag( - TrafficStatsConstants.TAG_SYSTEM_NEIGHBOR); - try { - mSocket = Os.socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); - // Setting SNDTIMEO is purely for defensive purposes. - Os.setsockoptTimeval( - mSocket, SOL_SOCKET, SO_SNDTIMEO, StructTimeval.fromMillis(send_timout_ms)); - SocketUtils.bindSocketToInterface(mSocket, mInterface.name); - TetheringUtils.setupRaSocket(mSocket, mInterface.index); - } catch (ErrnoException | IOException e) { - Log.e(TAG, "Failed to create RA daemon socket: " + e); - return false; - } finally { - TrafficStats.setThreadStatsTag(oldTag); - } - - return true; - } - - private void closeSocket() { - if (mSocket != null) { - try { - SocketUtils.closeSocket(mSocket); - } catch (IOException ignored) { } - } - mSocket = null; - } - - private boolean isSocketValid() { - final FileDescriptor s = mSocket; - return (s != null) && s.valid(); - } - - private boolean isSuitableDestination(InetSocketAddress dest) { - if (mAllNodes.equals(dest)) { - return true; - } - - final InetAddress destip = dest.getAddress(); - return (destip instanceof Inet6Address) - && destip.isLinkLocalAddress() - && (((Inet6Address) destip).getScopeId() == mInterface.index); - } - - private void maybeSendRA(InetSocketAddress dest) { - if (dest == null || !isSuitableDestination(dest)) { - dest = mAllNodes; - } - - try { - synchronized (mLock) { - if (mRaLength < MIN_RA_HEADER_SIZE) { - // No actual RA to send. - return; - } - Os.sendto(mSocket, mRA, 0, mRaLength, 0, dest); - } - Log.d(TAG, "RA sendto " + dest.getAddress().getHostAddress()); - } catch (ErrnoException | SocketException e) { - if (isSocketValid()) { - Log.e(TAG, "sendto error: " + e); - } - } - } - - private final class UnicastResponder extends Thread { - private final InetSocketAddress mSolicitor = new InetSocketAddress(0); - // The recycled buffer for receiving Router Solicitations from clients. - // If the RS is larger than IPV6_MIN_MTU the packets are truncated. - // This is fine since currently only byte 0 is examined anyway. - private final byte[] mSolicitation = new byte[IPV6_MIN_MTU]; - - @Override - public void run() { - while (isSocketValid()) { - try { - // Blocking receive. - final int rval = Os.recvfrom( - mSocket, mSolicitation, 0, mSolicitation.length, 0, mSolicitor); - // Do the least possible amount of validation. - if (rval < 1 || mSolicitation[0] != ICMPV6_ND_ROUTER_SOLICIT) { - continue; - } - } catch (ErrnoException | SocketException e) { - if (isSocketValid()) { - Log.e(TAG, "recvfrom error: " + e); - } - continue; - } - - maybeSendRA(mSolicitor); - } - } - } - - // TODO: Consider moving this to run on a provided Looper as a Handler, - // with WakeupMessage-style messages providing the timer driven input. - private final class MulticastTransmitter extends Thread { - private final Random mRandom = new Random(); - private final AtomicInteger mUrgentAnnouncements = new AtomicInteger(0); - - @Override - public void run() { - while (isSocketValid()) { - try { - Thread.sleep(getNextMulticastTransmitDelayMs()); - } catch (InterruptedException ignored) { - // Stop sleeping, immediately send an RA, and continue. - } - - maybeSendRA(mAllNodes); - synchronized (mLock) { - if (mDeprecatedInfoTracker.decrementCounters()) { - // At least one deprecated PIO has been removed; - // reassemble the RA. - assembleRaLocked(); - } - } - } - } - - public void hup() { - // Set to one fewer that the desired number, because as soon as - // the thread interrupt is processed we immediately send an RA - // and mUrgentAnnouncements is not examined until the subsequent - // sleep interval computation (i.e. this way we send 3 and not 4). - mUrgentAnnouncements.set(MAX_URGENT_RTR_ADVERTISEMENTS - 1); - interrupt(); - } - - private int getNextMulticastTransmitDelaySec() { - boolean deprecationInProgress = false; - synchronized (mLock) { - if (mRaLength < MIN_RA_HEADER_SIZE) { - // No actual RA to send; just sleep for 1 day. - return DAY_IN_SECONDS; - } - deprecationInProgress = !mDeprecatedInfoTracker.isEmpty(); - } - - final int urgentPending = mUrgentAnnouncements.getAndDecrement(); - if ((urgentPending > 0) || deprecationInProgress) { - return MIN_DELAY_BETWEEN_RAS_SEC; - } - - return MIN_RTR_ADV_INTERVAL_SEC + mRandom.nextInt( - MAX_RTR_ADV_INTERVAL_SEC - MIN_RTR_ADV_INTERVAL_SEC); - } - - private long getNextMulticastTransmitDelayMs() { - return 1000 * (long) getNextMulticastTransmitDelaySec(); - } - } -} diff --git a/packages/Tethering/src/android/net/util/BaseNetdUnsolicitedEventListener.java b/packages/Tethering/src/android/net/util/BaseNetdUnsolicitedEventListener.java deleted file mode 100644 index b1ffdb01f5f3..000000000000 --- a/packages/Tethering/src/android/net/util/BaseNetdUnsolicitedEventListener.java +++ /dev/null @@ -1,75 +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.net.util; - -import android.net.INetdUnsolicitedEventListener; - -import androidx.annotation.NonNull; - -/** - * Base {@link INetdUnsolicitedEventListener} that provides no-op implementations which can be - * overridden. - */ -public class BaseNetdUnsolicitedEventListener extends INetdUnsolicitedEventListener.Stub { - - @Override - public void onInterfaceClassActivityChanged(boolean isActive, int timerLabel, long timestampNs, - int uid) { } - - @Override - public void onQuotaLimitReached(@NonNull String alertName, @NonNull String ifName) { } - - @Override - public void onInterfaceDnsServerInfo(@NonNull String ifName, long lifetimeS, - @NonNull String[] servers) { } - - @Override - public void onInterfaceAddressUpdated(@NonNull String addr, String ifName, int flags, - int scope) { } - - @Override - public void onInterfaceAddressRemoved(@NonNull String addr, @NonNull String ifName, int flags, - int scope) { } - - @Override - public void onInterfaceAdded(@NonNull String ifName) { } - - @Override - public void onInterfaceRemoved(@NonNull String ifName) { } - - @Override - public void onInterfaceChanged(@NonNull String ifName, boolean up) { } - - @Override - public void onInterfaceLinkStateChanged(@NonNull String ifName, boolean up) { } - - @Override - public void onRouteChanged(boolean updated, @NonNull String route, @NonNull String gateway, - @NonNull String ifName) { } - - @Override - public void onStrictCleartextDetected(int uid, @NonNull String hex) { } - - @Override - public int getInterfaceVersion() { - return INetdUnsolicitedEventListener.VERSION; - } - - @Override - public String getInterfaceHash() { - return INetdUnsolicitedEventListener.HASH; - } -} diff --git a/packages/Tethering/src/android/net/util/InterfaceSet.java b/packages/Tethering/src/android/net/util/InterfaceSet.java deleted file mode 100644 index 758978711bd4..000000000000 --- a/packages/Tethering/src/android/net/util/InterfaceSet.java +++ /dev/null @@ -1,52 +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.net.util; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.StringJoiner; - - -/** - * @hide - */ -public class InterfaceSet { - public final Set<String> ifnames; - - public InterfaceSet(String... names) { - final Set<String> nameSet = new HashSet<>(); - for (String name : names) { - if (name != null) nameSet.add(name); - } - ifnames = Collections.unmodifiableSet(nameSet); - } - - @Override - public String toString() { - final StringJoiner sj = new StringJoiner(",", "[", "]"); - for (String ifname : ifnames) sj.add(ifname); - return sj.toString(); - } - - @Override - public boolean equals(Object obj) { - return obj != null - && obj instanceof InterfaceSet - && ifnames.equals(((InterfaceSet) obj).ifnames); - } -} diff --git a/packages/Tethering/src/android/net/util/PrefixUtils.java b/packages/Tethering/src/android/net/util/PrefixUtils.java deleted file mode 100644 index f203e9995f3d..000000000000 --- a/packages/Tethering/src/android/net/util/PrefixUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 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.net.util; - -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; - -import java.net.Inet4Address; -import java.net.InetAddress; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - - -/** - * @hide - */ -public class PrefixUtils { - private static final IpPrefix[] MIN_NON_FORWARDABLE_PREFIXES = { - pfx("127.0.0.0/8"), // IPv4 loopback - pfx("169.254.0.0/16"), // IPv4 link-local, RFC3927#section-8 - pfx("::/3"), - pfx("fe80::/64"), // IPv6 link-local - pfx("fc00::/7"), // IPv6 ULA - pfx("ff02::/8"), // IPv6 link-local multicast - }; - - public static final IpPrefix DEFAULT_WIFI_P2P_PREFIX = pfx("192.168.49.0/24"); - - /** Get non forwardable prefixes. */ - public static Set<IpPrefix> getNonForwardablePrefixes() { - final HashSet<IpPrefix> prefixes = new HashSet<>(); - addNonForwardablePrefixes(prefixes); - return prefixes; - } - - /** Add non forwardable prefixes. */ - public static void addNonForwardablePrefixes(Set<IpPrefix> prefixes) { - Collections.addAll(prefixes, MIN_NON_FORWARDABLE_PREFIXES); - } - - /** Get local prefixes from |lp|. */ - public static Set<IpPrefix> localPrefixesFrom(LinkProperties lp) { - final HashSet<IpPrefix> localPrefixes = new HashSet<>(); - if (lp == null) return localPrefixes; - - for (LinkAddress addr : lp.getAllLinkAddresses()) { - if (addr.getAddress().isLinkLocalAddress()) continue; - localPrefixes.add(asIpPrefix(addr)); - } - // TODO: Add directly-connected routes as well (ones from which we did - // not also form a LinkAddress)? - - return localPrefixes; - } - - /** Convert LinkAddress |addr| to IpPrefix. */ - public static IpPrefix asIpPrefix(LinkAddress addr) { - return new IpPrefix(addr.getAddress(), addr.getPrefixLength()); - } - - /** Convert InetAddress |ip| to IpPrefix. */ - public static IpPrefix ipAddressAsPrefix(InetAddress ip) { - final int bitLength = (ip instanceof Inet4Address) - ? NetworkConstants.IPV4_ADDR_BITS - : NetworkConstants.IPV6_ADDR_BITS; - return new IpPrefix(ip, bitLength); - } - - private static IpPrefix pfx(String prefixStr) { - return new IpPrefix(prefixStr); - } -} diff --git a/packages/Tethering/src/android/net/util/TetheringMessageBase.java b/packages/Tethering/src/android/net/util/TetheringMessageBase.java deleted file mode 100644 index 1b763ce920da..000000000000 --- a/packages/Tethering/src/android/net/util/TetheringMessageBase.java +++ /dev/null @@ -1,25 +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.net.util; - -/** - * This class defines Message.what base addresses for various state machine. - */ -public class TetheringMessageBase { - public static final int BASE_MASTER = 0; - public static final int BASE_IPSERVER = 100; - -} diff --git a/packages/Tethering/src/android/net/util/TetheringUtils.java b/packages/Tethering/src/android/net/util/TetheringUtils.java deleted file mode 100644 index b17b4ba77cfb..000000000000 --- a/packages/Tethering/src/android/net/util/TetheringUtils.java +++ /dev/null @@ -1,132 +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.net.util; - -import android.net.TetherStatsParcel; -import android.net.TetheringRequestParcel; - -import androidx.annotation.NonNull; - -import java.io.FileDescriptor; -import java.net.SocketException; -import java.util.Objects; - -/** - * The classes and the methods for tethering utilization. - * - * {@hide} - */ -public class TetheringUtils { - /** - * The object which records offload Tx/Rx forwarded bytes/packets. - * TODO: Replace the inner class ForwardedStats of class OffloadHardwareInterface with - * this class as well. - */ - public static class ForwardedStats { - public final long rxBytes; - public final long rxPackets; - public final long txBytes; - public final long txPackets; - - public ForwardedStats() { - rxBytes = 0; - rxPackets = 0; - txBytes = 0; - txPackets = 0; - } - - public ForwardedStats(long rxBytes, long txBytes) { - this.rxBytes = rxBytes; - this.rxPackets = 0; - this.txBytes = txBytes; - this.txPackets = 0; - } - - public ForwardedStats(long rxBytes, long rxPackets, long txBytes, long txPackets) { - this.rxBytes = rxBytes; - this.rxPackets = rxPackets; - this.txBytes = txBytes; - this.txPackets = txPackets; - } - - public ForwardedStats(@NonNull TetherStatsParcel tetherStats) { - rxBytes = tetherStats.rxBytes; - rxPackets = tetherStats.rxPackets; - txBytes = tetherStats.txBytes; - txPackets = tetherStats.txPackets; - } - - public ForwardedStats(@NonNull ForwardedStats other) { - rxBytes = other.rxBytes; - rxPackets = other.rxPackets; - txBytes = other.txBytes; - txPackets = other.txPackets; - } - - /** Add Tx/Rx bytes/packets and return the result as a new object. */ - @NonNull - public ForwardedStats add(@NonNull ForwardedStats other) { - return new ForwardedStats(rxBytes + other.rxBytes, rxPackets + other.rxPackets, - txBytes + other.txBytes, txPackets + other.txPackets); - } - - /** Subtract Tx/Rx bytes/packets and return the result as a new object. */ - @NonNull - public ForwardedStats subtract(@NonNull ForwardedStats other) { - // TODO: Perhaps throw an exception if any negative difference value just in case. - final long rxBytesDiff = Math.max(rxBytes - other.rxBytes, 0); - final long rxPacketsDiff = Math.max(rxPackets - other.rxPackets, 0); - final long txBytesDiff = Math.max(txBytes - other.txBytes, 0); - final long txPacketsDiff = Math.max(txPackets - other.txPackets, 0); - return new ForwardedStats(rxBytesDiff, rxPacketsDiff, txBytesDiff, txPacketsDiff); - } - - /** Returns the string representation of this object. */ - @NonNull - public String toString() { - return String.format("ForwardedStats(rxb: %d, rxp: %d, txb: %d, txp: %d)", rxBytes, - rxPackets, txBytes, txPackets); - } - } - - /** - * Configures a socket for receiving ICMPv6 router solicitations and sending advertisements. - * @param fd the socket's {@link FileDescriptor}. - * @param ifIndex the interface index. - */ - public static native void setupRaSocket(FileDescriptor fd, int ifIndex) - throws SocketException; - - /** - * Read s as an unsigned 16-bit integer. - */ - public static int uint16(short s) { - return s & 0xffff; - } - - /** Check whether two TetheringRequestParcels are the same. */ - public static boolean isTetheringRequestEquals(final TetheringRequestParcel request, - final TetheringRequestParcel otherRequest) { - if (request == otherRequest) return true; - - return request != null && otherRequest != null - && request.tetheringType == otherRequest.tetheringType - && Objects.equals(request.localIPv4Address, otherRequest.localIPv4Address) - && Objects.equals(request.staticClientAddress, otherRequest.staticClientAddress) - && request.exemptFromEntitlementCheck == otherRequest.exemptFromEntitlementCheck - && request.showProvisioningUi == otherRequest.showProvisioningUi; - } -} diff --git a/packages/Tethering/src/android/net/util/VersionedBroadcastListener.java b/packages/Tethering/src/android/net/util/VersionedBroadcastListener.java deleted file mode 100644 index e2804abd752b..000000000000 --- a/packages/Tethering/src/android/net/util/VersionedBroadcastListener.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 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.net.util; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Handler; -import android.util.Log; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; - - -/** - * A utility class that runs the provided callback on the provided handler when - * intents matching the provided filter arrive. Intents received by a stale - * receiver are safely ignored. - * - * Calls to startListening() and stopListening() must happen on the same thread. - * - * @hide - */ -public class VersionedBroadcastListener { - private static final boolean DBG = false; - - private final String mTag; - private final Context mContext; - private final Handler mHandler; - private final IntentFilter mFilter; - private final Consumer<Intent> mCallback; - private final AtomicInteger mGenerationNumber; - private BroadcastReceiver mReceiver; - - public VersionedBroadcastListener(String tag, Context ctx, Handler handler, - IntentFilter filter, Consumer<Intent> callback) { - mTag = tag; - mContext = ctx; - mHandler = handler; - mFilter = filter; - mCallback = callback; - mGenerationNumber = new AtomicInteger(0); - } - - /** Start listening to intent broadcast. */ - public void startListening() { - if (DBG) Log.d(mTag, "startListening"); - if (mReceiver != null) return; - - mReceiver = new Receiver(mTag, mGenerationNumber, mCallback); - mContext.registerReceiver(mReceiver, mFilter, null, mHandler); - } - - /** Stop listening to intent broadcast. */ - public void stopListening() { - if (DBG) Log.d(mTag, "stopListening"); - if (mReceiver == null) return; - - mGenerationNumber.incrementAndGet(); - mContext.unregisterReceiver(mReceiver); - mReceiver = null; - } - - private static class Receiver extends BroadcastReceiver { - public final String tag; - public final AtomicInteger atomicGenerationNumber; - public final Consumer<Intent> callback; - // Used to verify this receiver is still current. - public final int generationNumber; - - Receiver(String tag, AtomicInteger atomicGenerationNumber, Consumer<Intent> callback) { - this.tag = tag; - this.atomicGenerationNumber = atomicGenerationNumber; - this.callback = callback; - generationNumber = atomicGenerationNumber.incrementAndGet(); - } - - @Override - public void onReceive(Context context, Intent intent) { - final int currentGenerationNumber = atomicGenerationNumber.get(); - - if (DBG) { - Log.d(tag, "receiver generationNumber=" + generationNumber - + ", current generationNumber=" + currentGenerationNumber); - } - if (generationNumber != currentGenerationNumber) return; - - callback.accept(intent); - } - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java b/packages/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java deleted file mode 100644 index 20f30ea7a460..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/BpfCoordinator.java +++ /dev/null @@ -1,778 +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 com.android.networkstack.tethering; - -import static android.net.NetworkStats.DEFAULT_NETWORK_NO; -import static android.net.NetworkStats.METERED_NO; -import static android.net.NetworkStats.ROAMING_NO; -import static android.net.NetworkStats.SET_DEFAULT; -import static android.net.NetworkStats.TAG_NONE; -import static android.net.NetworkStats.UID_ALL; -import static android.net.NetworkStats.UID_TETHERING; -import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED; - -import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS; - -import android.app.usage.NetworkStatsManager; -import android.net.INetd; -import android.net.MacAddress; -import android.net.NetworkStats; -import android.net.NetworkStats.Entry; -import android.net.TetherOffloadRuleParcel; -import android.net.TetherStatsParcel; -import android.net.ip.IpServer; -import android.net.netstats.provider.NetworkStatsProvider; -import android.net.util.SharedLog; -import android.net.util.TetheringUtils.ForwardedStats; -import android.os.ConditionVariable; -import android.os.Handler; -import android.os.RemoteException; -import android.os.ServiceSpecificException; -import android.text.TextUtils; -import android.util.Log; -import android.util.SparseArray; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.IndentingPrintWriter; - -import java.net.Inet6Address; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Objects; - -/** - * This coordinator is responsible for providing BPF offload relevant functionality. - * - Get tethering stats. - * - Set data limit. - * - Set global alert. - * - Add/remove forwarding rules. - * - * @hide - */ -public class BpfCoordinator { - private static final String TAG = BpfCoordinator.class.getSimpleName(); - private static final int DUMP_TIMEOUT_MS = 10_000; - - @VisibleForTesting - enum StatsType { - STATS_PER_IFACE, - STATS_PER_UID, - } - - @NonNull - private final Handler mHandler; - @NonNull - private final INetd mNetd; - @NonNull - private final SharedLog mLog; - @NonNull - private final Dependencies mDeps; - @Nullable - private final BpfTetherStatsProvider mStatsProvider; - - // True if BPF offload is supported, false otherwise. The BPF offload could be disabled by - // a runtime resource overlay package or device configuration. This flag is only initialized - // in the constructor because it is hard to unwind all existing change once device - // configuration is changed. Especially the forwarding rules. Keep the same setting - // to make it simpler. See also TetheringConfiguration. - private final boolean mIsBpfEnabled; - - // Tracks whether BPF tethering is started or not. This is set by tethering before it - // starts the first IpServer and is cleared by tethering shortly before the last IpServer - // is stopped. Note that rule updates (especially deletions, but sometimes additions as - // well) may arrive when this is false. If they do, they must be communicated to netd. - // Changes in data limits may also arrive when this is false, and if they do, they must - // also be communicated to netd. - private boolean mPollingStarted = false; - - // Tracking remaining alert quota. Unlike limit quota is subject to interface, the alert - // quota is interface independent and global for tether offload. - private long mRemainingAlertQuota = QUOTA_UNLIMITED; - - // Maps upstream interface index to offloaded traffic statistics. - // Always contains the latest total bytes/packets, since each upstream was started, received - // from the BPF maps for each interface. - private final SparseArray<ForwardedStats> mStats = new SparseArray<>(); - - // Maps upstream interface names to interface quotas. - // Always contains the latest value received from the framework for each interface, regardless - // of whether offload is currently running (or is even supported) on that interface. Only - // includes interfaces that have a quota set. Note that this map is used for storing the quota - // which is set from the service. Because the service uses the interface name to present the - // interface, this map uses the interface name to be the mapping index. - private final HashMap<String, Long> mInterfaceQuotas = new HashMap<>(); - - // Maps upstream interface index to interface names. - // Store all interface name since boot. Used for lookup what interface name it is from the - // tether stats got from netd because netd reports interface index to present an interface. - // TODO: Remove the unused interface name. - private final SparseArray<String> mInterfaceNames = new SparseArray<>(); - - // Map of downstream rule maps. Each of these maps represents the IPv6 forwarding rules for a - // given downstream. Each map: - // - Is owned by the IpServer that is responsible for that downstream. - // - Must only be modified by that IpServer. - // - Is created when the IpServer adds its first rule, and deleted when the IpServer deletes - // its last rule (or clears its rules). - // TODO: Perhaps seal the map and rule operations which communicates with netd into a class. - // TODO: Does this need to be a LinkedHashMap or can it just be a HashMap? Also, could it be - // a ConcurrentHashMap, in order to avoid the copies in tetherOffloadRuleClear - // and tetherOffloadRuleUpdate? - // TODO: Perhaps use one-dimensional map and access specific downstream rules via downstream - // index. For doing that, IpServer must guarantee that it always has a valid IPv6 downstream - // interface index while calling function to clear all rules. IpServer may be calling clear - // rules function without a valid IPv6 downstream interface index even if it may have one - // before. IpServer would need to call getInterfaceParams() in the constructor instead of when - // startIpv6() is called, and make mInterfaceParams final. - private final HashMap<IpServer, LinkedHashMap<Inet6Address, Ipv6ForwardingRule>> - mIpv6ForwardingRules = new LinkedHashMap<>(); - - // Runnable that used by scheduling next polling of stats. - private final Runnable mScheduledPollingTask = () -> { - updateForwardedStatsFromNetd(); - maybeSchedulePollingStats(); - }; - - @VisibleForTesting - public abstract static class Dependencies { - /** Get handler. */ - @NonNull public abstract Handler getHandler(); - - /** Get netd. */ - @NonNull public abstract INetd getNetd(); - - /** Get network stats manager. */ - @NonNull public abstract NetworkStatsManager getNetworkStatsManager(); - - /** Get shared log. */ - @NonNull public abstract SharedLog getSharedLog(); - - /** Get tethering configuration. */ - @Nullable public abstract TetheringConfiguration getTetherConfig(); - } - - @VisibleForTesting - public BpfCoordinator(@NonNull Dependencies deps) { - mDeps = deps; - mHandler = mDeps.getHandler(); - mNetd = mDeps.getNetd(); - mLog = mDeps.getSharedLog().forSubComponent(TAG); - mIsBpfEnabled = isBpfEnabled(); - BpfTetherStatsProvider provider = new BpfTetherStatsProvider(); - try { - mDeps.getNetworkStatsManager().registerNetworkStatsProvider( - getClass().getSimpleName(), provider); - } catch (RuntimeException e) { - // TODO: Perhaps not allow to use BPF offload because the reregistration failure - // implied that no data limit could be applies on a metered upstream if any. - Log.wtf(TAG, "Cannot register offload stats provider: " + e); - provider = null; - } - mStatsProvider = provider; - } - - /** - * Start BPF tethering offload stats polling when the first upstream is started. - * Note that this can be only called on handler thread. - * TODO: Perhaps check BPF support before starting. - * TODO: Start the stats polling only if there is any client on the downstream. - */ - public void startPolling() { - if (mPollingStarted) return; - - if (!mIsBpfEnabled) { - mLog.i("Offload disabled"); - return; - } - - mPollingStarted = true; - maybeSchedulePollingStats(); - - mLog.i("Polling started"); - } - - /** - * Stop BPF tethering offload stats polling. - * The data limit cleanup and the tether stats maps cleanup are not implemented here. - * These cleanups rely on all IpServers calling #tetherOffloadRuleRemove. After the - * last rule is removed from the upstream, #tetherOffloadRuleRemove does the cleanup - * functionality. - * Note that this can be only called on handler thread. - */ - public void stopPolling() { - if (!mPollingStarted) return; - - // Stop scheduled polling tasks and poll the latest stats from BPF maps. - if (mHandler.hasCallbacks(mScheduledPollingTask)) { - mHandler.removeCallbacks(mScheduledPollingTask); - } - updateForwardedStatsFromNetd(); - mPollingStarted = false; - - mLog.i("Polling stopped"); - } - - /** - * Add forwarding rule. After adding the first rule on a given upstream, must add the data - * limit on the given upstream. - * Note that this can be only called on handler thread. - */ - public void tetherOffloadRuleAdd( - @NonNull final IpServer ipServer, @NonNull final Ipv6ForwardingRule rule) { - if (!mIsBpfEnabled) return; - - try { - // TODO: Perhaps avoid to add a duplicate rule. - mNetd.tetherOffloadRuleAdd(rule.toTetherOffloadRuleParcel()); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e("Could not add IPv6 forwarding rule: ", e); - return; - } - - if (!mIpv6ForwardingRules.containsKey(ipServer)) { - mIpv6ForwardingRules.put(ipServer, new LinkedHashMap<Inet6Address, - Ipv6ForwardingRule>()); - } - LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules = mIpv6ForwardingRules.get(ipServer); - - // Setup the data limit on the given upstream if the first rule is added. - final int upstreamIfindex = rule.upstreamIfindex; - if (!isAnyRuleOnUpstream(upstreamIfindex)) { - // If failed to set a data limit, probably should not use this upstream, because - // the upstream may not want to blow through the data limit that was told to apply. - // TODO: Perhaps stop the coordinator. - boolean success = updateDataLimit(upstreamIfindex); - if (!success) { - final String iface = mInterfaceNames.get(upstreamIfindex); - mLog.e("Setting data limit for " + iface + " failed."); - } - } - - // Must update the adding rule after calling #isAnyRuleOnUpstream because it needs to - // check if it is about adding a first rule for a given upstream. - rules.put(rule.address, rule); - } - - /** - * Remove forwarding rule. After removing the last rule on a given upstream, must clear - * data limit, update the last tether stats and remove the tether stats in the BPF maps. - * Note that this can be only called on handler thread. - */ - public void tetherOffloadRuleRemove( - @NonNull final IpServer ipServer, @NonNull final Ipv6ForwardingRule rule) { - if (!mIsBpfEnabled) return; - - try { - // TODO: Perhaps avoid to remove a non-existent rule. - mNetd.tetherOffloadRuleRemove(rule.toTetherOffloadRuleParcel()); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e("Could not remove IPv6 forwarding rule: ", e); - return; - } - - LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules = mIpv6ForwardingRules.get(ipServer); - if (rules == null) return; - - // Must remove rules before calling #isAnyRuleOnUpstream because it needs to check if - // the last rule is removed for a given upstream. If no rule is removed, return early. - // Avoid unnecessary work on a non-existent rule which may have never been added or - // removed already. - if (rules.remove(rule.address) == null) return; - - // Remove the downstream entry if it has no more rule. - if (rules.isEmpty()) { - mIpv6ForwardingRules.remove(ipServer); - } - - // Do cleanup functionality if there is no more rule on the given upstream. - final int upstreamIfindex = rule.upstreamIfindex; - if (!isAnyRuleOnUpstream(upstreamIfindex)) { - try { - final TetherStatsParcel stats = - mNetd.tetherOffloadGetAndClearStats(upstreamIfindex); - // Update the last stats delta and delete the local cache for a given upstream. - updateQuotaAndStatsFromSnapshot(new TetherStatsParcel[] {stats}); - mStats.remove(upstreamIfindex); - } catch (RemoteException | ServiceSpecificException e) { - Log.wtf(TAG, "Exception when cleanup tether stats for upstream index " - + upstreamIfindex + ": ", e); - } - } - } - - /** - * Clear all forwarding rules for a given downstream. - * Note that this can be only called on handler thread. - */ - public void tetherOffloadRuleClear(@NonNull final IpServer ipServer) { - if (!mIsBpfEnabled) return; - - final LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules = mIpv6ForwardingRules.get( - ipServer); - if (rules == null) return; - - // Need to build a rule list because the rule map may be changed in the iteration. - for (final Ipv6ForwardingRule rule : new ArrayList<Ipv6ForwardingRule>(rules.values())) { - tetherOffloadRuleRemove(ipServer, rule); - } - } - - /** - * Update existing forwarding rules to new upstream for a given downstream. - * Note that this can be only called on handler thread. - */ - public void tetherOffloadRuleUpdate(@NonNull final IpServer ipServer, int newUpstreamIfindex) { - if (!mIsBpfEnabled) return; - - final LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules = mIpv6ForwardingRules.get( - ipServer); - if (rules == null) return; - - // Need to build a rule list because the rule map may be changed in the iteration. - for (final Ipv6ForwardingRule rule : new ArrayList<Ipv6ForwardingRule>(rules.values())) { - // Remove the old rule before adding the new one because the map uses the same key for - // both rules. Reversing the processing order causes that the new rule is removed as - // unexpected. - // TODO: Add new rule first to reduce the latency which has no rule. - tetherOffloadRuleRemove(ipServer, rule); - tetherOffloadRuleAdd(ipServer, rule.onNewUpstream(newUpstreamIfindex)); - } - } - - /** - * Add upstream name to lookup table. The lookup table is used for tether stats interface name - * lookup because the netd only reports interface index in BPF tether stats but the service - * expects the interface name in NetworkStats object. - * Note that this can be only called on handler thread. - */ - public void addUpstreamNameToLookupTable(int upstreamIfindex, @NonNull String upstreamIface) { - if (!mIsBpfEnabled) return; - - if (upstreamIfindex == 0 || TextUtils.isEmpty(upstreamIface)) return; - - // The same interface index to name mapping may be added by different IpServer objects or - // re-added by reconnection on the same upstream interface. Ignore the duplicate one. - final String iface = mInterfaceNames.get(upstreamIfindex); - if (iface == null) { - mInterfaceNames.put(upstreamIfindex, upstreamIface); - } else if (!TextUtils.equals(iface, upstreamIface)) { - Log.wtf(TAG, "The upstream interface name " + upstreamIface - + " is different from the existing interface name " - + iface + " for index " + upstreamIfindex); - } - } - - /** - * Dump information. - * Block the function until all the data are dumped on the handler thread or timed-out. The - * reason is that dumpsys invokes this function on the thread of caller and the data may only - * be allowed to be accessed on the handler thread. - */ - public void dump(@NonNull IndentingPrintWriter pw) { - final ConditionVariable dumpDone = new ConditionVariable(); - mHandler.post(() -> { - pw.println("mIsBpfEnabled: " + mIsBpfEnabled); - pw.println("Polling " + (mPollingStarted ? "started" : "not started")); - pw.println("Stats provider " + (mStatsProvider != null - ? "registered" : "not registered")); - pw.println("Upstream quota: " + mInterfaceQuotas.toString()); - pw.println("Polling interval: " + getPollingInterval() + " ms"); - - pw.println("Forwarding stats:"); - pw.increaseIndent(); - if (mStats.size() == 0) { - pw.println("<empty>"); - } else { - dumpStats(pw); - } - pw.decreaseIndent(); - - pw.println("Forwarding rules:"); - pw.increaseIndent(); - if (mIpv6ForwardingRules.size() == 0) { - pw.println("<empty>"); - } else { - dumpIpv6ForwardingRules(pw); - } - pw.decreaseIndent(); - - dumpDone.open(); - }); - if (!dumpDone.block(DUMP_TIMEOUT_MS)) { - pw.println("... dump timed-out after " + DUMP_TIMEOUT_MS + "ms"); - } - } - - private void dumpStats(@NonNull IndentingPrintWriter pw) { - for (int i = 0; i < mStats.size(); i++) { - final int upstreamIfindex = mStats.keyAt(i); - final ForwardedStats stats = mStats.get(upstreamIfindex); - pw.println(String.format("%d(%s) - %s", upstreamIfindex, mInterfaceNames.get( - upstreamIfindex), stats.toString())); - } - } - - private void dumpIpv6ForwardingRules(@NonNull IndentingPrintWriter pw) { - for (Map.Entry<IpServer, LinkedHashMap<Inet6Address, Ipv6ForwardingRule>> entry : - mIpv6ForwardingRules.entrySet()) { - IpServer ipServer = entry.getKey(); - // The rule downstream interface index is paired with the interface name from - // IpServer#interfaceName. See #startIPv6, #updateIpv6ForwardingRules in IpServer. - final String downstreamIface = ipServer.interfaceName(); - pw.println("[" + downstreamIface + "]: iif(iface) oif(iface) v6addr srcmac dstmac"); - - pw.increaseIndent(); - LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules = entry.getValue(); - for (Ipv6ForwardingRule rule : rules.values()) { - final int upstreamIfindex = rule.upstreamIfindex; - pw.println(String.format("%d(%s) %d(%s) %s %s %s", upstreamIfindex, - mInterfaceNames.get(upstreamIfindex), rule.downstreamIfindex, - downstreamIface, rule.address, rule.srcMac, rule.dstMac)); - } - pw.decreaseIndent(); - } - } - - /** IPv6 forwarding rule class. */ - public static class Ipv6ForwardingRule { - public final int upstreamIfindex; - public final int downstreamIfindex; - - @NonNull - public final Inet6Address address; - @NonNull - public final MacAddress srcMac; - @NonNull - public final MacAddress dstMac; - - public Ipv6ForwardingRule(int upstreamIfindex, int downstreamIfIndex, - @NonNull Inet6Address address, @NonNull MacAddress srcMac, - @NonNull MacAddress dstMac) { - this.upstreamIfindex = upstreamIfindex; - this.downstreamIfindex = downstreamIfIndex; - this.address = address; - this.srcMac = srcMac; - this.dstMac = dstMac; - } - - /** Return a new rule object which updates with new upstream index. */ - @NonNull - public Ipv6ForwardingRule onNewUpstream(int newUpstreamIfindex) { - return new Ipv6ForwardingRule(newUpstreamIfindex, downstreamIfindex, address, srcMac, - dstMac); - } - - /** - * Don't manipulate TetherOffloadRuleParcel directly because implementing onNewUpstream() - * would be error-prone due to generated stable AIDL classes not having a copy constructor. - */ - @NonNull - public TetherOffloadRuleParcel toTetherOffloadRuleParcel() { - final TetherOffloadRuleParcel parcel = new TetherOffloadRuleParcel(); - parcel.inputInterfaceIndex = upstreamIfindex; - parcel.outputInterfaceIndex = downstreamIfindex; - parcel.destination = address.getAddress(); - parcel.prefixLength = 128; - parcel.srcL2Address = srcMac.toByteArray(); - parcel.dstL2Address = dstMac.toByteArray(); - return parcel; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Ipv6ForwardingRule)) return false; - Ipv6ForwardingRule that = (Ipv6ForwardingRule) o; - return this.upstreamIfindex == that.upstreamIfindex - && this.downstreamIfindex == that.downstreamIfindex - && Objects.equals(this.address, that.address) - && Objects.equals(this.srcMac, that.srcMac) - && Objects.equals(this.dstMac, that.dstMac); - } - - @Override - public int hashCode() { - // TODO: if this is ever used in production code, don't pass ifindices - // to Objects.hash() to avoid autoboxing overhead. - return Objects.hash(upstreamIfindex, downstreamIfindex, address, srcMac, dstMac); - } - } - - /** - * A BPF tethering stats provider to provide network statistics to the system. - * Note that this class' data may only be accessed on the handler thread. - */ - @VisibleForTesting - class BpfTetherStatsProvider extends NetworkStatsProvider { - // The offloaded traffic statistics per interface that has not been reported since the - // last call to pushTetherStats. Only the interfaces that were ever tethering upstreams - // and has pending tether stats delta are included in this NetworkStats object. - private NetworkStats mIfaceStats = new NetworkStats(0L, 0); - - // The same stats as above, but counts network stats per uid. - private NetworkStats mUidStats = new NetworkStats(0L, 0); - - @Override - public void onRequestStatsUpdate(int token) { - mHandler.post(() -> pushTetherStats()); - } - - @Override - public void onSetAlert(long quotaBytes) { - mHandler.post(() -> updateAlertQuota(quotaBytes)); - } - - @Override - public void onSetLimit(@NonNull String iface, long quotaBytes) { - if (quotaBytes < QUOTA_UNLIMITED) { - throw new IllegalArgumentException("invalid quota value " + quotaBytes); - } - - mHandler.post(() -> { - final Long curIfaceQuota = mInterfaceQuotas.get(iface); - - if (null == curIfaceQuota && QUOTA_UNLIMITED == quotaBytes) return; - - if (quotaBytes == QUOTA_UNLIMITED) { - mInterfaceQuotas.remove(iface); - } else { - mInterfaceQuotas.put(iface, quotaBytes); - } - maybeUpdateDataLimit(iface); - }); - } - - @VisibleForTesting - void pushTetherStats() { - try { - // The token is not used for now. See b/153606961. - notifyStatsUpdated(0 /* token */, mIfaceStats, mUidStats); - - // Clear the accumulated tether stats delta after reported. Note that create a new - // empty object because NetworkStats#clear is @hide. - mIfaceStats = new NetworkStats(0L, 0); - mUidStats = new NetworkStats(0L, 0); - } catch (RuntimeException e) { - mLog.e("Cannot report network stats: ", e); - } - } - - private void accumulateDiff(@NonNull NetworkStats ifaceDiff, - @NonNull NetworkStats uidDiff) { - mIfaceStats = mIfaceStats.add(ifaceDiff); - mUidStats = mUidStats.add(uidDiff); - } - } - - private boolean isBpfEnabled() { - final TetheringConfiguration config = mDeps.getTetherConfig(); - return (config != null) ? config.isBpfOffloadEnabled() : true /* default value */; - } - - private int getInterfaceIndexFromRules(@NonNull String ifName) { - for (LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules : mIpv6ForwardingRules - .values()) { - for (Ipv6ForwardingRule rule : rules.values()) { - final int upstreamIfindex = rule.upstreamIfindex; - if (TextUtils.equals(ifName, mInterfaceNames.get(upstreamIfindex))) { - return upstreamIfindex; - } - } - } - return 0; - } - - private long getQuotaBytes(@NonNull String iface) { - final Long limit = mInterfaceQuotas.get(iface); - final long quotaBytes = (limit != null) ? limit : QUOTA_UNLIMITED; - - return quotaBytes; - } - - private boolean sendDataLimitToNetd(int ifIndex, long quotaBytes) { - if (ifIndex == 0) { - Log.wtf(TAG, "Invalid interface index."); - return false; - } - - try { - mNetd.tetherOffloadSetInterfaceQuota(ifIndex, quotaBytes); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e("Exception when updating quota " + quotaBytes + ": ", e); - return false; - } - - return true; - } - - // Handle the data limit update from the service which is the stats provider registered for. - private void maybeUpdateDataLimit(@NonNull String iface) { - // Set data limit only on a given upstream which has at least one rule. If we can't get - // an interface index for a given interface name, it means either there is no rule for - // a given upstream or the interface name is not an upstream which is monitored by the - // coordinator. - final int ifIndex = getInterfaceIndexFromRules(iface); - if (ifIndex == 0) return; - - final long quotaBytes = getQuotaBytes(iface); - sendDataLimitToNetd(ifIndex, quotaBytes); - } - - // Handle the data limit update while adding forwarding rules. - private boolean updateDataLimit(int ifIndex) { - final String iface = mInterfaceNames.get(ifIndex); - if (iface == null) { - mLog.e("Fail to get the interface name for index " + ifIndex); - return false; - } - final long quotaBytes = getQuotaBytes(iface); - return sendDataLimitToNetd(ifIndex, quotaBytes); - } - - private boolean isAnyRuleOnUpstream(int upstreamIfindex) { - for (LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules : mIpv6ForwardingRules - .values()) { - for (Ipv6ForwardingRule rule : rules.values()) { - if (upstreamIfindex == rule.upstreamIfindex) return true; - } - } - return false; - } - - @NonNull - private NetworkStats buildNetworkStats(@NonNull StatsType type, int ifIndex, - @NonNull final ForwardedStats diff) { - NetworkStats stats = new NetworkStats(0L, 0); - final String iface = mInterfaceNames.get(ifIndex); - if (iface == null) { - // TODO: Use Log.wtf once the coordinator owns full control of tether stats from netd. - // For now, netd may add the empty stats for the upstream which is not monitored by - // the coordinator. Silently ignore it. - return stats; - } - final int uid = (type == StatsType.STATS_PER_UID) ? UID_TETHERING : UID_ALL; - // Note that the argument 'metered', 'roaming' and 'defaultNetwork' are not recorded for - // network stats snapshot. See NetworkStatsRecorder#recordSnapshotLocked. - return stats.addEntry(new Entry(iface, uid, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO, DEFAULT_NETWORK_NO, diff.rxBytes, diff.rxPackets, - diff.txBytes, diff.txPackets, 0L /* operations */)); - } - - private void updateAlertQuota(long newQuota) { - if (newQuota < QUOTA_UNLIMITED) { - throw new IllegalArgumentException("invalid quota value " + newQuota); - } - if (mRemainingAlertQuota == newQuota) return; - - mRemainingAlertQuota = newQuota; - if (mRemainingAlertQuota == 0) { - mLog.i("onAlertReached"); - if (mStatsProvider != null) mStatsProvider.notifyAlertReached(); - } - } - - private void updateQuotaAndStatsFromSnapshot( - @NonNull final TetherStatsParcel[] tetherStatsList) { - long usedAlertQuota = 0; - for (TetherStatsParcel tetherStats : tetherStatsList) { - final Integer ifIndex = tetherStats.ifIndex; - final ForwardedStats curr = new ForwardedStats(tetherStats); - final ForwardedStats base = mStats.get(ifIndex); - final ForwardedStats diff = (base != null) ? curr.subtract(base) : curr; - usedAlertQuota += diff.rxBytes + diff.txBytes; - - // Update the local cache for counting tether stats delta. - mStats.put(ifIndex, curr); - - // Update the accumulated tether stats delta to the stats provider for the service - // querying. - if (mStatsProvider != null) { - try { - mStatsProvider.accumulateDiff( - buildNetworkStats(StatsType.STATS_PER_IFACE, ifIndex, diff), - buildNetworkStats(StatsType.STATS_PER_UID, ifIndex, diff)); - } catch (ArrayIndexOutOfBoundsException e) { - Log.wtf(TAG, "Fail to update the accumulated stats delta for interface index " - + ifIndex + " : ", e); - } - } - } - - if (mRemainingAlertQuota > 0 && usedAlertQuota > 0) { - // Trim to zero if overshoot. - final long newQuota = Math.max(mRemainingAlertQuota - usedAlertQuota, 0); - updateAlertQuota(newQuota); - } - - // TODO: Count the used limit quota for notifying data limit reached. - } - - private void updateForwardedStatsFromNetd() { - final TetherStatsParcel[] tetherStatsList; - try { - // The reported tether stats are total data usage for all currently-active upstream - // interfaces since tethering start. - tetherStatsList = mNetd.tetherOffloadGetStats(); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e("Problem fetching tethering stats: ", e); - return; - } - updateQuotaAndStatsFromSnapshot(tetherStatsList); - } - - @VisibleForTesting - int getPollingInterval() { - // The valid range of interval is DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS..max_long. - // Ignore the config value is less than the minimum polling interval. Note that the - // minimum interval definition is invoked as OffloadController#isPollingStatsNeeded does. - // TODO: Perhaps define a minimum polling interval constant. - final TetheringConfiguration config = mDeps.getTetherConfig(); - final int configInterval = (config != null) ? config.getOffloadPollInterval() : 0; - return Math.max(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS, configInterval); - } - - private void maybeSchedulePollingStats() { - if (!mPollingStarted) return; - - if (mHandler.hasCallbacks(mScheduledPollingTask)) { - mHandler.removeCallbacks(mScheduledPollingTask); - } - - mHandler.postDelayed(mScheduledPollingTask, getPollingInterval()); - } - - // Return forwarding rule map. This is used for testing only. - // Note that this can be only called on handler thread. - @NonNull - @VisibleForTesting - final HashMap<IpServer, LinkedHashMap<Inet6Address, Ipv6ForwardingRule>> - getForwardingRulesForTesting() { - return mIpv6ForwardingRules; - } - - // Return upstream interface name map. This is used for testing only. - // Note that this can be only called on handler thread. - @NonNull - @VisibleForTesting - final SparseArray<String> getInterfaceNamesForTesting() { - return mInterfaceNames; - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java b/packages/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java deleted file mode 100644 index 8a96988ae1d1..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/ConnectedClientsTracker.java +++ /dev/null @@ -1,183 +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 com.android.networkstack.tethering; - -import static android.net.TetheringManager.TETHERING_WIFI; - -import android.net.MacAddress; -import android.net.TetheredClient; -import android.net.TetheredClient.AddressInfo; -import android.net.ip.IpServer; -import android.net.wifi.WifiClient; -import android.os.SystemClock; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.VisibleForTesting; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Tracker for clients connected to downstreams. - * - * <p>This class is not thread safe, it is intended to be used only from the tethering handler - * thread. - */ -public class ConnectedClientsTracker { - private final Clock mClock; - - @NonNull - private List<WifiClient> mLastWifiClients = Collections.emptyList(); - @NonNull - private List<TetheredClient> mLastTetheredClients = Collections.emptyList(); - - @VisibleForTesting - static class Clock { - public long elapsedRealtime() { - return SystemClock.elapsedRealtime(); - } - } - - public ConnectedClientsTracker() { - this(new Clock()); - } - - @VisibleForTesting - ConnectedClientsTracker(Clock clock) { - mClock = clock; - } - - /** - * Update the tracker with new connected clients. - * - * <p>The new list can be obtained through {@link #getLastTetheredClients()}. - * @param ipServers The IpServers used to assign addresses to clients. - * @param wifiClients The list of L2-connected WiFi clients. Null for no change since last - * update. - * @return True if the list of clients changed since the last calculation. - */ - public boolean updateConnectedClients( - Iterable<IpServer> ipServers, @Nullable List<WifiClient> wifiClients) { - final long now = mClock.elapsedRealtime(); - - if (wifiClients != null) { - mLastWifiClients = wifiClients; - } - final Set<MacAddress> wifiClientMacs = getClientMacs(mLastWifiClients); - - // Build the list of non-expired leases from all IpServers, grouped by mac address - final Map<MacAddress, TetheredClient> clientsMap = new HashMap<>(); - for (IpServer server : ipServers) { - for (TetheredClient client : server.getAllLeases()) { - if (client.getTetheringType() == TETHERING_WIFI - && !wifiClientMacs.contains(client.getMacAddress())) { - // Skip leases of WiFi clients that are not (or no longer) L2-connected - continue; - } - final TetheredClient prunedClient = pruneExpired(client, now); - if (prunedClient == null) continue; // All addresses expired - - addLease(clientsMap, prunedClient); - } - } - - // TODO: add IPv6 addresses from netlink - - // Add connected WiFi clients that do not have any known address - for (MacAddress client : wifiClientMacs) { - if (clientsMap.containsKey(client)) continue; - clientsMap.put(client, new TetheredClient( - client, Collections.emptyList() /* addresses */, TETHERING_WIFI)); - } - - final HashSet<TetheredClient> clients = new HashSet<>(clientsMap.values()); - final boolean clientsChanged = clients.size() != mLastTetheredClients.size() - || !clients.containsAll(mLastTetheredClients); - mLastTetheredClients = Collections.unmodifiableList(new ArrayList<>(clients)); - return clientsChanged; - } - - private static void addLease(Map<MacAddress, TetheredClient> clientsMap, TetheredClient lease) { - final TetheredClient aggregateClient = clientsMap.getOrDefault( - lease.getMacAddress(), lease); - if (aggregateClient == lease) { - // This is the first lease with this mac address - clientsMap.put(lease.getMacAddress(), lease); - return; - } - - // Only add the address info; this assumes that the tethering type is the same when the mac - // address is the same. If a client is connected through different tethering types with the - // same mac address, connected clients callbacks will report all of its addresses under only - // one of these tethering types. This keeps the API simple considering that such a scenario - // would really be a rare edge case. - clientsMap.put(lease.getMacAddress(), aggregateClient.addAddresses(lease)); - } - - /** - * Get the last list of tethered clients, as calculated in {@link #updateConnectedClients}. - * - * <p>The returned list is immutable. - */ - @NonNull - public List<TetheredClient> getLastTetheredClients() { - return mLastTetheredClients; - } - - private static boolean hasExpiredAddress(List<AddressInfo> addresses, long now) { - for (AddressInfo info : addresses) { - if (info.getExpirationTime() <= now) { - return true; - } - } - return false; - } - - @Nullable - private static TetheredClient pruneExpired(TetheredClient client, long now) { - final List<AddressInfo> addresses = client.getAddresses(); - if (addresses.size() == 0) return null; - if (!hasExpiredAddress(addresses, now)) return client; - - final ArrayList<AddressInfo> newAddrs = new ArrayList<>(addresses.size() - 1); - for (AddressInfo info : addresses) { - if (info.getExpirationTime() > now) { - newAddrs.add(info); - } - } - - if (newAddrs.size() == 0) { - return null; - } - return new TetheredClient(client.getMacAddress(), newAddrs, client.getTetheringType()); - } - - @NonNull - private static Set<MacAddress> getClientMacs(@NonNull List<WifiClient> clients) { - final Set<MacAddress> macs = new HashSet<>(clients.size()); - for (WifiClient c : clients) { - macs.add(c.getMacAddress()); - } - return macs; - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java b/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java deleted file mode 100644 index 9dace709d734..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/EntitlementManager.java +++ /dev/null @@ -1,646 +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.networkstack.tethering; - -import static android.net.TetheringConstants.EXTRA_ADD_TETHER_TYPE; -import static android.net.TetheringConstants.EXTRA_PROVISION_CALLBACK; -import static android.net.TetheringConstants.EXTRA_RUN_PROVISION; -import static android.net.TetheringConstants.EXTRA_TETHER_PROVISIONING_RESPONSE; -import static android.net.TetheringConstants.EXTRA_TETHER_SILENT_PROVISIONING_ACTION; -import static android.net.TetheringConstants.EXTRA_TETHER_SUBID; -import static android.net.TetheringConstants.EXTRA_TETHER_UI_PROVISIONING_APP_NAME; -import static android.net.TetheringManager.TETHERING_BLUETOOTH; -import static android.net.TetheringManager.TETHERING_ETHERNET; -import static android.net.TetheringManager.TETHERING_INVALID; -import static android.net.TetheringManager.TETHERING_USB; -import static android.net.TetheringManager.TETHERING_WIFI; -import static android.net.TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN; -import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.net.util.SharedLog; -import android.os.Bundle; -import android.os.ConditionVariable; -import android.os.Handler; -import android.os.Parcel; -import android.os.PersistableBundle; -import android.os.ResultReceiver; -import android.os.SystemClock; -import android.os.SystemProperties; -import android.provider.Settings; -import android.telephony.CarrierConfigManager; -import android.util.SparseIntArray; - -import com.android.internal.annotations.VisibleForTesting; - -import java.io.PrintWriter; -import java.util.BitSet; - -/** - * Re-check tethering provisioning for enabled downstream tether types. - * Reference TetheringManager.TETHERING_{@code *} for each tether type. - * - * All methods of this class must be accessed from the thread of tethering - * state machine. - * @hide - */ -public class EntitlementManager { - private static final String TAG = EntitlementManager.class.getSimpleName(); - private static final boolean DBG = false; - - @VisibleForTesting - protected static final String DISABLE_PROVISIONING_SYSPROP_KEY = "net.tethering.noprovisioning"; - private static final String ACTION_PROVISIONING_ALARM = - "com.android.networkstack.tethering.PROVISIONING_RECHECK_ALARM"; - - private final ComponentName mSilentProvisioningService; - private static final int MS_PER_HOUR = 60 * 60 * 1000; - private static final int DUMP_TIMEOUT = 10_000; - - // The BitSet is the bit map of each enabled downstream types, ex: - // {@link TetheringManager.TETHERING_WIFI} - // {@link TetheringManager.TETHERING_USB} - // {@link TetheringManager.TETHERING_BLUETOOTH} - private final BitSet mCurrentDownstreams; - private final BitSet mExemptedDownstreams; - private final Context mContext; - private final SharedLog mLog; - private final SparseIntArray mEntitlementCacheValue; - private final Handler mHandler; - // Key: TetheringManager.TETHERING_*(downstream). - // Value: TetheringManager.TETHER_ERROR_{NO_ERROR or PROVISION_FAILED}(provisioning result). - private final SparseIntArray mCurrentEntitlementResults; - private final Runnable mPermissionChangeCallback; - private PendingIntent mProvisioningRecheckAlarm; - private boolean mLastCellularUpstreamPermitted = true; - private boolean mUsingCellularAsUpstream = false; - private boolean mNeedReRunProvisioningUi = false; - private OnUiEntitlementFailedListener mListener; - private TetheringConfigurationFetcher mFetcher; - - public EntitlementManager(Context ctx, Handler h, SharedLog log, - Runnable callback) { - mContext = ctx; - mLog = log.forSubComponent(TAG); - mCurrentDownstreams = new BitSet(); - mExemptedDownstreams = new BitSet(); - mCurrentEntitlementResults = new SparseIntArray(); - mEntitlementCacheValue = new SparseIntArray(); - mPermissionChangeCallback = callback; - mHandler = h; - mContext.registerReceiver(mReceiver, new IntentFilter(ACTION_PROVISIONING_ALARM), - null, mHandler); - mSilentProvisioningService = ComponentName.unflattenFromString( - mContext.getResources().getString(R.string.config_wifi_tether_enable)); - } - - public void setOnUiEntitlementFailedListener(final OnUiEntitlementFailedListener listener) { - mListener = listener; - } - - /** Callback fired when UI entitlement failed. */ - public interface OnUiEntitlementFailedListener { - /** - * Ui entitlement check fails in |downstream|. - * - * @param downstream tethering type from TetheringManager.TETHERING_{@code *}. - */ - void onUiEntitlementFailed(int downstream); - } - - public void setTetheringConfigurationFetcher(final TetheringConfigurationFetcher fetcher) { - mFetcher = fetcher; - } - - /** Interface to fetch TetheringConfiguration. */ - public interface TetheringConfigurationFetcher { - /** - * Fetch current tethering configuration. This will be called to ensure whether entitlement - * check is needed. - * @return TetheringConfiguration instance. - */ - TetheringConfiguration fetchTetheringConfiguration(); - } - - /** - * Check if cellular upstream is permitted. - */ - public boolean isCellularUpstreamPermitted() { - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - - return isCellularUpstreamPermitted(config); - } - - private boolean isCellularUpstreamPermitted(final TetheringConfiguration config) { - if (!isTetherProvisioningRequired(config)) return true; - - // If provisioning is required and EntitlementManager doesn't know any downstreams, cellular - // upstream should not be enabled. Enable cellular upstream for exempted downstreams only - // when there is no non-exempted downstream. - if (mCurrentDownstreams.isEmpty()) return !mExemptedDownstreams.isEmpty(); - - return mCurrentEntitlementResults.indexOfValue(TETHER_ERROR_NO_ERROR) > -1; - } - - /** - * Set exempted downstream type. If there is only exempted downstream type active, - * corresponding entitlement check will not be run and cellular upstream will be permitted - * by default. If a privileged app enables tethering without a provisioning check, and then - * another app enables tethering of the same type but does not disable the provisioning check, - * then the downstream immediately loses exempt status and a provisioning check is run. - * If any non-exempted downstream type is active, the cellular upstream will be gated by the - * result of entitlement check from non-exempted downstreams. If entitlement check is still - * in progress on non-exempt downstreams, ceullar upstream would default be disabled. When any - * non-exempted downstream gets positive entitlement result, ceullar upstream will be enabled. - */ - public void setExemptedDownstreamType(final int type) { - mExemptedDownstreams.set(type, true); - } - - /** - * This is called when tethering starts. - * Launch provisioning app if upstream is cellular. - * - * @param downstreamType tethering type from TetheringManager.TETHERING_{@code *} - * @param showProvisioningUi a boolean indicating whether to show the - * provisioning app UI if there is one. - */ - public void startProvisioningIfNeeded(int downstreamType, boolean showProvisioningUi) { - if (!isValidDownstreamType(downstreamType)) return; - - mCurrentDownstreams.set(downstreamType, true); - - mExemptedDownstreams.set(downstreamType, false); - - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - if (!isTetherProvisioningRequired(config)) return; - - // If upstream is not cellular, provisioning app would not be launched - // till upstream change to cellular. - if (mUsingCellularAsUpstream) { - if (showProvisioningUi) { - runUiTetherProvisioning(downstreamType, config); - } else { - runSilentTetherProvisioning(downstreamType, config); - } - mNeedReRunProvisioningUi = false; - } else { - mNeedReRunProvisioningUi |= showProvisioningUi; - } - } - - /** - * Tell EntitlementManager that a given type of tethering has been disabled - * - * @param type tethering type from TetheringManager.TETHERING_{@code *} - */ - public void stopProvisioningIfNeeded(int downstreamType) { - if (!isValidDownstreamType(downstreamType)) return; - - mCurrentDownstreams.set(downstreamType, false); - // There are lurking bugs where the notion of "provisioning required" or - // "tethering supported" may change without without tethering being notified properly. - // Remove the mapping all the time no matter provisioning is required or not. - removeDownstreamMapping(downstreamType); - mExemptedDownstreams.set(downstreamType, false); - } - - /** - * Notify EntitlementManager if upstream is cellular or not. - * - * @param isCellular whether tethering upstream is cellular. - */ - public void notifyUpstream(boolean isCellular) { - if (DBG) { - mLog.i("notifyUpstream: " + isCellular - + ", mLastCellularUpstreamPermitted: " + mLastCellularUpstreamPermitted - + ", mNeedReRunProvisioningUi: " + mNeedReRunProvisioningUi); - } - mUsingCellularAsUpstream = isCellular; - - if (mUsingCellularAsUpstream) { - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - maybeRunProvisioning(config); - } - } - - /** Run provisioning if needed */ - public void maybeRunProvisioning() { - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - maybeRunProvisioning(config); - } - - private void maybeRunProvisioning(final TetheringConfiguration config) { - if (mCurrentDownstreams.isEmpty() || !isTetherProvisioningRequired(config)) { - return; - } - - // Whenever any entitlement value changes, all downstreams will re-evaluate whether they - // are allowed. Therefore even if the silent check here ends in a failure and the UI later - // yields success, then the downstream that got a failure will re-evaluate as a result of - // the change and get the new correct value. - for (int downstream = mCurrentDownstreams.nextSetBit(0); downstream >= 0; - downstream = mCurrentDownstreams.nextSetBit(downstream + 1)) { - if (mCurrentEntitlementResults.indexOfKey(downstream) < 0) { - if (mNeedReRunProvisioningUi) { - mNeedReRunProvisioningUi = false; - runUiTetherProvisioning(downstream, config); - } else { - runSilentTetherProvisioning(downstream, config); - } - } - } - } - - /** - * Check if the device requires a provisioning check in order to enable tethering. - * - * @param config an object that encapsulates the various tethering configuration elements. - * @return a boolean - {@code true} indicating tether provisioning is required by the carrier. - */ - @VisibleForTesting - protected boolean isTetherProvisioningRequired(final TetheringConfiguration config) { - if (SystemProperties.getBoolean(DISABLE_PROVISIONING_SYSPROP_KEY, false) - || config.provisioningApp.length == 0) { - return false; - } - if (carrierConfigAffirmsEntitlementCheckNotRequired(config)) { - return false; - } - return (config.provisioningApp.length == 2); - } - - /** - * Re-check tethering provisioning for all enabled tether types. - * Reference TetheringManager.TETHERING_{@code *} for each tether type. - * - * @param config an object that encapsulates the various tethering configuration elements. - * Note: this method is only called from TetherMaster on the handler thread. - * If there are new callers from different threads, the logic should move to - * masterHandler to avoid race conditions. - */ - public void reevaluateSimCardProvisioning(final TetheringConfiguration config) { - if (DBG) mLog.i("reevaluateSimCardProvisioning"); - - if (!mHandler.getLooper().isCurrentThread()) { - // Except for test, this log should not appear in normal flow. - mLog.log("reevaluateSimCardProvisioning() don't run in TetherMaster thread"); - } - mEntitlementCacheValue.clear(); - mCurrentEntitlementResults.clear(); - - // TODO: refine provisioning check to isTetherProvisioningRequired() ?? - if (!config.hasMobileHotspotProvisionApp() - || carrierConfigAffirmsEntitlementCheckNotRequired(config)) { - evaluateCellularPermission(config); - return; - } - - if (mUsingCellularAsUpstream) { - maybeRunProvisioning(config); - } - } - - /** - * Get carrier configuration bundle. - * @param config an object that encapsulates the various tethering configuration elements. - * */ - public PersistableBundle getCarrierConfig(final TetheringConfiguration config) { - final CarrierConfigManager configManager = (CarrierConfigManager) mContext - .getSystemService(Context.CARRIER_CONFIG_SERVICE); - if (configManager == null) return null; - - final PersistableBundle carrierConfig = configManager.getConfigForSubId( - config.activeDataSubId); - - if (CarrierConfigManager.isConfigForIdentifiedCarrier(carrierConfig)) { - return carrierConfig; - } - - return null; - } - - // The logic here is aimed solely at confirming that a CarrierConfig exists - // and affirms that entitlement checks are not required. - // - // TODO: find a better way to express this, or alter the checking process - // entirely so that this is more intuitive. - private boolean carrierConfigAffirmsEntitlementCheckNotRequired( - final TetheringConfiguration config) { - // Check carrier config for entitlement checks - final PersistableBundle carrierConfig = getCarrierConfig(config); - if (carrierConfig == null) return false; - - // A CarrierConfigManager was found and it has a config. - final boolean isEntitlementCheckRequired = carrierConfig.getBoolean( - CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL); - return !isEntitlementCheckRequired; - } - - /** - * Run no UI tethering provisioning check. - * @param type tethering type from TetheringManager.TETHERING_{@code *} - * @param subId default data subscription ID. - */ - @VisibleForTesting - protected Intent runSilentTetherProvisioning(int type, final TetheringConfiguration config) { - if (DBG) mLog.i("runSilentTetherProvisioning: " + type); - // For silent provisioning, settings would stop tethering when entitlement fail. - ResultReceiver receiver = buildProxyReceiver(type, false/* notifyFail */, null); - - Intent intent = new Intent(); - intent.putExtra(EXTRA_ADD_TETHER_TYPE, type); - intent.putExtra(EXTRA_RUN_PROVISION, true); - intent.putExtra(EXTRA_TETHER_SILENT_PROVISIONING_ACTION, config.provisioningAppNoUi); - intent.putExtra(EXTRA_TETHER_PROVISIONING_RESPONSE, config.provisioningResponse); - intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver); - intent.putExtra(EXTRA_TETHER_SUBID, config.activeDataSubId); - intent.setComponent(mSilentProvisioningService); - // Only admin user can change tethering and SilentTetherProvisioning don't need to - // show UI, it is fine to always start setting's background service as system user. - mContext.startService(intent); - return intent; - } - - private void runUiTetherProvisioning(int type, final TetheringConfiguration config) { - ResultReceiver receiver = buildProxyReceiver(type, true/* notifyFail */, null); - runUiTetherProvisioning(type, config, receiver); - } - - /** - * Run the UI-enabled tethering provisioning check. - * @param type tethering type from TetheringManager.TETHERING_{@code *} - * @param subId default data subscription ID. - * @param receiver to receive entitlement check result. - */ - @VisibleForTesting - protected Intent runUiTetherProvisioning(int type, final TetheringConfiguration config, - ResultReceiver receiver) { - if (DBG) mLog.i("runUiTetherProvisioning: " + type); - - Intent intent = new Intent(Settings.ACTION_TETHER_PROVISIONING_UI); - intent.putExtra(EXTRA_ADD_TETHER_TYPE, type); - intent.putExtra(EXTRA_TETHER_UI_PROVISIONING_APP_NAME, config.provisioningApp); - intent.putExtra(EXTRA_PROVISION_CALLBACK, receiver); - intent.putExtra(EXTRA_TETHER_SUBID, config.activeDataSubId); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - // Only launch entitlement UI for system user. Entitlement UI should not appear for other - // user because only admin user is allowed to change tethering. - mContext.startActivity(intent); - return intent; - } - - // Not needed to check if this don't run on the handler thread because it's private. - private void scheduleProvisioningRechecks(final TetheringConfiguration config) { - if (mProvisioningRecheckAlarm == null) { - final int period = config.provisioningCheckPeriod; - if (period <= 0) return; - - Intent intent = new Intent(ACTION_PROVISIONING_ALARM); - mProvisioningRecheckAlarm = PendingIntent.getBroadcast(mContext, 0, intent, 0); - AlarmManager alarmManager = (AlarmManager) mContext.getSystemService( - Context.ALARM_SERVICE); - long periodMs = period * MS_PER_HOUR; - long firstAlarmTime = SystemClock.elapsedRealtime() + periodMs; - alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, firstAlarmTime, periodMs, - mProvisioningRecheckAlarm); - } - } - - private void cancelTetherProvisioningRechecks() { - if (mProvisioningRecheckAlarm != null) { - AlarmManager alarmManager = (AlarmManager) mContext.getSystemService( - Context.ALARM_SERVICE); - alarmManager.cancel(mProvisioningRecheckAlarm); - mProvisioningRecheckAlarm = null; - } - } - - private void evaluateCellularPermission(final TetheringConfiguration config) { - final boolean permitted = isCellularUpstreamPermitted(config); - - if (DBG) { - mLog.i("Cellular permission change from " + mLastCellularUpstreamPermitted - + " to " + permitted); - } - - if (mLastCellularUpstreamPermitted != permitted) { - mLog.log("Cellular permission change: " + permitted); - mPermissionChangeCallback.run(); - } - // Only schedule periodic re-check when tether is provisioned - // and the result is ok. - if (permitted && mCurrentEntitlementResults.size() > 0) { - scheduleProvisioningRechecks(config); - } else { - cancelTetherProvisioningRechecks(); - } - mLastCellularUpstreamPermitted = permitted; - } - - /** - * Add the mapping between provisioning result and tethering type. - * Notify UpstreamNetworkMonitor if Cellular permission changes. - * - * @param type tethering type from TetheringManager.TETHERING_{@code *} - * @param resultCode Provisioning result - */ - protected void addDownstreamMapping(int type, int resultCode) { - mLog.i("addDownstreamMapping: " + type + ", result: " + resultCode - + " ,TetherTypeRequested: " + mCurrentDownstreams.get(type)); - if (!mCurrentDownstreams.get(type)) return; - - mCurrentEntitlementResults.put(type, resultCode); - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - evaluateCellularPermission(config); - } - - /** - * Remove the mapping for input tethering type. - * @param type tethering type from TetheringManager.TETHERING_{@code *} - */ - protected void removeDownstreamMapping(int type) { - mLog.i("removeDownstreamMapping: " + type); - mCurrentEntitlementResults.delete(type); - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - evaluateCellularPermission(config); - } - - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (ACTION_PROVISIONING_ALARM.equals(intent.getAction())) { - mLog.log("Received provisioning alarm"); - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - reevaluateSimCardProvisioning(config); - } - } - }; - - private static boolean isValidDownstreamType(int type) { - switch (type) { - case TETHERING_BLUETOOTH: - case TETHERING_ETHERNET: - case TETHERING_USB: - case TETHERING_WIFI: - return true; - default: - return false; - } - } - - /** - * Dump the infromation of EntitlementManager. - * @param pw {@link PrintWriter} is used to print formatted - */ - public void dump(PrintWriter pw) { - final ConditionVariable mWaiting = new ConditionVariable(); - mHandler.post(() -> { - pw.print("isCellularUpstreamPermitted: "); - pw.println(isCellularUpstreamPermitted()); - for (int type = mCurrentDownstreams.nextSetBit(0); type >= 0; - type = mCurrentDownstreams.nextSetBit(type + 1)) { - pw.print("Type: "); - pw.print(typeString(type)); - if (mCurrentEntitlementResults.indexOfKey(type) > -1) { - pw.print(", Value: "); - pw.println(errorString(mCurrentEntitlementResults.get(type))); - } else { - pw.println(", Value: empty"); - } - } - mWaiting.open(); - }); - if (!mWaiting.block(DUMP_TIMEOUT)) { - pw.println("... dump timed out after " + DUMP_TIMEOUT + "ms"); - } - pw.print("Exempted: ["); - for (int type = mExemptedDownstreams.nextSetBit(0); type >= 0; - type = mExemptedDownstreams.nextSetBit(type + 1)) { - pw.print(typeString(type)); - pw.print(", "); - } - pw.println("]"); - } - - private static String typeString(int type) { - switch (type) { - case TETHERING_BLUETOOTH: return "TETHERING_BLUETOOTH"; - case TETHERING_INVALID: return "TETHERING_INVALID"; - case TETHERING_USB: return "TETHERING_USB"; - case TETHERING_WIFI: return "TETHERING_WIFI"; - default: - return String.format("TETHERING UNKNOWN TYPE (%d)", type); - } - } - - private static String errorString(int value) { - switch (value) { - case TETHER_ERROR_ENTITLEMENT_UNKNOWN: return "TETHER_ERROR_ENTITLEMENT_UNKONWN"; - case TETHER_ERROR_NO_ERROR: return "TETHER_ERROR_NO_ERROR"; - case TETHER_ERROR_PROVISIONING_FAILED: return "TETHER_ERROR_PROVISIONING_FAILED"; - default: - return String.format("UNKNOWN ERROR (%d)", value); - } - } - - private ResultReceiver buildProxyReceiver(int type, boolean notifyFail, - final ResultReceiver receiver) { - ResultReceiver rr = new ResultReceiver(mHandler) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - int updatedCacheValue = updateEntitlementCacheValue(type, resultCode); - addDownstreamMapping(type, updatedCacheValue); - if (updatedCacheValue == TETHER_ERROR_PROVISIONING_FAILED && notifyFail) { - mListener.onUiEntitlementFailed(type); - } - if (receiver != null) receiver.send(updatedCacheValue, null); - } - }; - - return writeToParcel(rr); - } - - // Instances of ResultReceiver need to be public classes for remote processes to be able - // to load them (otherwise, ClassNotFoundException). For private classes, this method - // performs a trick : round-trip parceling any instance of ResultReceiver will return a - // vanilla instance of ResultReceiver sharing the binder token with the original receiver. - // The binder token has a reference to the original instance of the private class and will - // still call its methods, and can be sent over. However it cannot be used for anything - // else than sending over a Binder call. - // While round-trip parceling is not great, there is currently no other way of generating - // a vanilla instance of ResultReceiver because all its fields are private. - private ResultReceiver writeToParcel(final ResultReceiver receiver) { - Parcel parcel = Parcel.obtain(); - receiver.writeToParcel(parcel, 0); - parcel.setDataPosition(0); - ResultReceiver receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel); - parcel.recycle(); - return receiverForSending; - } - - /** - * Update the last entitlement value to internal cache - * - * @param type tethering type from TetheringManager.TETHERING_{@code *} - * @param resultCode last entitlement value - * @return the last updated entitlement value - */ - private int updateEntitlementCacheValue(int type, int resultCode) { - if (DBG) { - mLog.i("updateEntitlementCacheValue: " + type + ", result: " + resultCode); - } - if (resultCode == TETHER_ERROR_NO_ERROR) { - mEntitlementCacheValue.put(type, resultCode); - return resultCode; - } else { - mEntitlementCacheValue.put(type, TETHER_ERROR_PROVISIONING_FAILED); - return TETHER_ERROR_PROVISIONING_FAILED; - } - } - - /** Get the last value of the tethering entitlement check. */ - public void requestLatestTetheringEntitlementResult(int downstream, ResultReceiver receiver, - boolean showEntitlementUi) { - if (!isValidDownstreamType(downstream)) { - receiver.send(TETHER_ERROR_ENTITLEMENT_UNKNOWN, null); - return; - } - - final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration(); - if (!isTetherProvisioningRequired(config)) { - receiver.send(TETHER_ERROR_NO_ERROR, null); - return; - } - - final int cacheValue = mEntitlementCacheValue.get( - downstream, TETHER_ERROR_ENTITLEMENT_UNKNOWN); - if (cacheValue == TETHER_ERROR_NO_ERROR || !showEntitlementUi) { - receiver.send(cacheValue, null); - } else { - ResultReceiver proxy = buildProxyReceiver(downstream, false/* notifyFail */, receiver); - runUiTetherProvisioning(downstream, config, proxy); - } - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/IPv6TetheringCoordinator.java b/packages/Tethering/src/com/android/networkstack/tethering/IPv6TetheringCoordinator.java deleted file mode 100644 index f3dcaa2529e7..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/IPv6TetheringCoordinator.java +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.networkstack.tethering; - -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.Network; -import android.net.NetworkCapabilities; -import android.net.RouteInfo; -import android.net.ip.IpServer; -import android.net.util.NetworkConstants; -import android.net.util.SharedLog; -import android.util.Log; - -import java.net.Inet6Address; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Random; - - -/** - * IPv6 tethering is rather different from IPv4 owing to the absence of NAT. - * This coordinator is responsible for evaluating the dedicated prefixes - * assigned to the device and deciding how to divvy them up among downstream - * interfaces. - * - * @hide - */ -public class IPv6TetheringCoordinator { - private static final String TAG = IPv6TetheringCoordinator.class.getSimpleName(); - private static final boolean DBG = false; - private static final boolean VDBG = false; - - private static class Downstream { - public final IpServer ipServer; - public final int mode; // IpServer.STATE_* - // Used to append to a ULA /48, constructing a ULA /64 for local use. - public final short subnetId; - - Downstream(IpServer ipServer, int mode, short subnetId) { - this.ipServer = ipServer; - this.mode = mode; - this.subnetId = subnetId; - } - } - - private final ArrayList<IpServer> mNotifyList; - private final SharedLog mLog; - // NOTE: mActiveDownstreams is a list and not a hash data structure because - // we keep active downstreams in arrival order. This is done so /64s can - // be parceled out on a "first come, first served" basis and a /64 used by - // a downstream that is no longer active can be redistributed to any next - // waiting active downstream (again, in arrival order). - private final LinkedList<Downstream> mActiveDownstreams; - private final byte[] mUniqueLocalPrefix; - private short mNextSubnetId; - private UpstreamNetworkState mUpstreamNetworkState; - - public IPv6TetheringCoordinator(ArrayList<IpServer> notifyList, SharedLog log) { - mNotifyList = notifyList; - mLog = log.forSubComponent(TAG); - mActiveDownstreams = new LinkedList<>(); - mUniqueLocalPrefix = generateUniqueLocalPrefix(); - mNextSubnetId = 0; - } - - /** Add active downstream to ipv6 tethering candidate list. */ - public void addActiveDownstream(IpServer downstream, int mode) { - if (findDownstream(downstream) == null) { - // Adding a new downstream appends it to the list. Adding a - // downstream a second time without first removing it has no effect. - // We never change the mode of a downstream except by first removing - // it and then re-adding it (with its new mode specified); - if (mActiveDownstreams.offer(new Downstream(downstream, mode, mNextSubnetId))) { - // Make sure subnet IDs are always positive. They are appended - // to a ULA /48 to make a ULA /64 for local use. - mNextSubnetId = (short) Math.max(0, mNextSubnetId + 1); - } - updateIPv6TetheringInterfaces(); - } - } - - /** Remove downstream from ipv6 tethering candidate list. */ - public void removeActiveDownstream(IpServer downstream) { - stopIPv6TetheringOn(downstream); - if (mActiveDownstreams.remove(findDownstream(downstream))) { - updateIPv6TetheringInterfaces(); - } - - // When tethering is stopping we can reset the subnet counter. - if (mNotifyList.isEmpty()) { - if (!mActiveDownstreams.isEmpty()) { - Log.wtf(TAG, "Tethering notify list empty, IPv6 downstreams non-empty."); - } - mNextSubnetId = 0; - } - } - - /** - * Call when UpstreamNetworkState may be changed. - * If upstream has ipv6 for tethering, update this new UpstreamNetworkState - * to IpServer. Otherwise stop ipv6 tethering on downstream interfaces. - */ - public void updateUpstreamNetworkState(UpstreamNetworkState ns) { - if (VDBG) { - Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns)); - } - if (TetheringInterfaceUtils.getIPv6Interface(ns) == null) { - stopIPv6TetheringOnAllInterfaces(); - setUpstreamNetworkState(null); - return; - } - - if (mUpstreamNetworkState != null - && !ns.network.equals(mUpstreamNetworkState.network)) { - stopIPv6TetheringOnAllInterfaces(); - } - - setUpstreamNetworkState(ns); - updateIPv6TetheringInterfaces(); - } - - private void stopIPv6TetheringOnAllInterfaces() { - for (IpServer ipServer : mNotifyList) { - stopIPv6TetheringOn(ipServer); - } - } - - private void setUpstreamNetworkState(UpstreamNetworkState ns) { - if (ns == null) { - mUpstreamNetworkState = null; - } else { - // Make a deep copy of the parts we need. - mUpstreamNetworkState = new UpstreamNetworkState( - new LinkProperties(ns.linkProperties), - new NetworkCapabilities(ns.networkCapabilities), - new Network(ns.network)); - } - - mLog.log("setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState)); - } - - private void updateIPv6TetheringInterfaces() { - for (IpServer ipServer : mNotifyList) { - final LinkProperties lp = getInterfaceIPv6LinkProperties(ipServer); - ipServer.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, getTtlAdjustment(), 0, lp); - break; - } - } - - private int getTtlAdjustment() { - if (mUpstreamNetworkState == null || mUpstreamNetworkState.networkCapabilities == null) { - return 0; - } - - // If upstream is cellular, set the TTL in Router Advertisements to "network-set TTL" - 1 - // for carrier requirement. - if (mUpstreamNetworkState.networkCapabilities.hasTransport( - NetworkCapabilities.TRANSPORT_CELLULAR)) { - return -1; - } - - // For other non-cellular upstream, set TTL as "network-set TTL" + 1 to preventing arbitrary - // distinction between tethered and untethered traffic. - return 1; - } - - private LinkProperties getInterfaceIPv6LinkProperties(IpServer ipServer) { - final Downstream ds = findDownstream(ipServer); - if (ds == null) return null; - - if (ds.mode == IpServer.STATE_LOCAL_ONLY) { - // Build a Unique Locally-assigned Prefix configuration. - return getUniqueLocalConfig(mUniqueLocalPrefix, ds.subnetId); - } - - // This downstream is in IpServer.STATE_TETHERED mode. - if (mUpstreamNetworkState == null || mUpstreamNetworkState.linkProperties == null) { - return null; - } - - // NOTE: Here, in future, we would have policies to decide how to divvy - // up the available dedicated prefixes among downstream interfaces. - // At this time we have no such mechanism--we only support tethering - // IPv6 toward the oldest (first requested) active downstream. - - final Downstream currentActive = mActiveDownstreams.peek(); - if (currentActive != null && currentActive.ipServer == ipServer) { - final LinkProperties lp = getIPv6OnlyLinkProperties( - mUpstreamNetworkState.linkProperties); - if (lp.hasIpv6DefaultRoute() && lp.hasGlobalIpv6Address()) { - return lp; - } - } - - return null; - } - - Downstream findDownstream(IpServer ipServer) { - for (Downstream ds : mActiveDownstreams) { - if (ds.ipServer == ipServer) return ds; - } - return null; - } - - private static LinkProperties getIPv6OnlyLinkProperties(LinkProperties lp) { - final LinkProperties v6only = new LinkProperties(); - if (lp == null) { - return v6only; - } - - // NOTE: At this time we don't copy over any information about any - // stacked links. No current stacked link configuration has IPv6. - - v6only.setInterfaceName(lp.getInterfaceName()); - - v6only.setMtu(lp.getMtu()); - - for (LinkAddress linkAddr : lp.getLinkAddresses()) { - if (linkAddr.isGlobalPreferred() && linkAddr.getPrefixLength() == 64) { - v6only.addLinkAddress(linkAddr); - } - } - - for (RouteInfo routeInfo : lp.getRoutes()) { - final IpPrefix destination = routeInfo.getDestination(); - if ((destination.getAddress() instanceof Inet6Address) - && (destination.getPrefixLength() <= 64)) { - v6only.addRoute(routeInfo); - } - } - - for (InetAddress dnsServer : lp.getDnsServers()) { - if (isIPv6GlobalAddress(dnsServer)) { - // For now we include ULAs. - v6only.addDnsServer(dnsServer); - } - } - - v6only.setDomains(lp.getDomains()); - - return v6only; - } - - // TODO: Delete this and switch to LinkAddress#isGlobalPreferred once we - // announce our own IPv6 address as DNS server. - private static boolean isIPv6GlobalAddress(InetAddress ip) { - return (ip instanceof Inet6Address) - && !ip.isAnyLocalAddress() - && !ip.isLoopbackAddress() - && !ip.isLinkLocalAddress() - && !ip.isSiteLocalAddress() - && !ip.isMulticastAddress(); - } - - private static LinkProperties getUniqueLocalConfig(byte[] ulp, short subnetId) { - final LinkProperties lp = new LinkProperties(); - - final IpPrefix local48 = makeUniqueLocalPrefix(ulp, (short) 0, 48); - lp.addRoute(new RouteInfo(local48, null, null, RouteInfo.RTN_UNICAST)); - - final IpPrefix local64 = makeUniqueLocalPrefix(ulp, subnetId, 64); - // Because this is a locally-generated ULA, we don't have an upstream - // address. But because the downstream IP address management code gets - // its prefix from the upstream's IP address, we create a fake one here. - lp.addLinkAddress(new LinkAddress(local64.getAddress(), 64)); - - lp.setMtu(NetworkConstants.ETHER_MTU); - return lp; - } - - private static IpPrefix makeUniqueLocalPrefix(byte[] in6addr, short subnetId, int prefixlen) { - final byte[] bytes = Arrays.copyOf(in6addr, in6addr.length); - bytes[7] = (byte) (subnetId >> 8); - bytes[8] = (byte) subnetId; - final InetAddress addr; - try { - addr = InetAddress.getByAddress(bytes); - } catch (UnknownHostException e) { - throw new IllegalStateException("Invalid address length: " + bytes.length, e); - } - return new IpPrefix(addr, prefixlen); - } - - // Generates a Unique Locally-assigned Prefix: - // - // https://tools.ietf.org/html/rfc4193#section-3.1 - // - // The result is a /48 that can be used for local-only communications. - private static byte[] generateUniqueLocalPrefix() { - final byte[] ulp = new byte[6]; // 6 = 48bits / 8bits/byte - (new Random()).nextBytes(ulp); - - final byte[] in6addr = Arrays.copyOf(ulp, NetworkConstants.IPV6_ADDR_LEN); - in6addr[0] = (byte) 0xfd; // fc00::/7 and L=1 - - return in6addr; - } - - private static String toDebugString(UpstreamNetworkState ns) { - if (ns == null) { - return "UpstreamNetworkState{null}"; - } - return ns.toString(); - } - - private static void stopIPv6TetheringOn(IpServer ipServer) { - ipServer.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null); - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java b/packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java deleted file mode 100644 index 88c77b07e7e3..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/OffloadController.java +++ /dev/null @@ -1,811 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import static android.net.NetworkStats.DEFAULT_NETWORK_NO; -import static android.net.NetworkStats.METERED_NO; -import static android.net.NetworkStats.ROAMING_NO; -import static android.net.NetworkStats.SET_DEFAULT; -import static android.net.NetworkStats.TAG_NONE; -import static android.net.NetworkStats.UID_ALL; -import static android.net.NetworkStats.UID_TETHERING; -import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED; -import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; - -import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.app.usage.NetworkStatsManager; -import android.content.ContentResolver; -import android.net.InetAddresses; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.NetworkStats; -import android.net.NetworkStats.Entry; -import android.net.RouteInfo; -import android.net.netlink.ConntrackMessage; -import android.net.netlink.NetlinkConstants; -import android.net.netlink.NetlinkSocket; -import android.net.netstats.provider.NetworkStatsProvider; -import android.net.util.SharedLog; -import android.os.Handler; -import android.provider.Settings; -import android.system.ErrnoException; -import android.system.OsConstants; -import android.text.TextUtils; -import android.util.Log; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.IndentingPrintWriter; -import com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats; - -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -/** - * A class to encapsulate the business logic of programming the tethering - * hardware offload interface. - * - * @hide - */ -public class OffloadController { - private static final String TAG = OffloadController.class.getSimpleName(); - private static final boolean DBG = false; - private static final String ANYIP = "0.0.0.0"; - private static final ForwardedStats EMPTY_STATS = new ForwardedStats(); - - @VisibleForTesting - enum StatsType { - STATS_PER_IFACE, - STATS_PER_UID, - } - - private enum UpdateType { IF_NEEDED, FORCE }; - - private final Handler mHandler; - private final OffloadHardwareInterface mHwInterface; - private final ContentResolver mContentResolver; - @Nullable - private final OffloadTetheringStatsProvider mStatsProvider; - private final SharedLog mLog; - private final HashMap<String, LinkProperties> mDownstreams; - private boolean mConfigInitialized; - private boolean mControlInitialized; - private LinkProperties mUpstreamLinkProperties; - // The complete set of offload-exempt prefixes passed in via Tethering from - // all upstream and downstream sources. - private Set<IpPrefix> mExemptPrefixes; - // A strictly "smaller" set of prefixes, wherein offload-approved prefixes - // (e.g. downstream on-link prefixes) have been removed and replaced with - // prefixes representing only the locally-assigned IP addresses. - private Set<String> mLastLocalPrefixStrs; - - // Maps upstream interface names to offloaded traffic statistics. - // Always contains the latest value received from the hardware for each interface, regardless of - // whether offload is currently running on that interface. - private ConcurrentHashMap<String, ForwardedStats> mForwardedStats = - new ConcurrentHashMap<>(16, 0.75F, 1); - - // Maps upstream interface names to interface quotas. - // Always contains the latest value received from the framework for each interface, regardless - // of whether offload is currently running (or is even supported) on that interface. Only - // includes upstream interfaces that have a quota set. - private HashMap<String, Long> mInterfaceQuotas = new HashMap<>(); - - // Tracking remaining alert quota. Unlike limit quota is subject to interface, the alert - // quota is interface independent and global for tether offload. Note that this is only - // accessed on the handler thread and in the constructor. - private long mRemainingAlertQuota = QUOTA_UNLIMITED; - // Runnable that used to schedule the next stats poll. - private final Runnable mScheduledPollingTask = () -> { - updateStatsForCurrentUpstream(); - maybeSchedulePollingStats(); - }; - - private int mNatUpdateCallbacksReceived; - private int mNatUpdateNetlinkErrors; - - @NonNull - private final Dependencies mDeps; - - // TODO: Put more parameters in constructor into dependency object. - interface Dependencies { - @NonNull - TetheringConfiguration getTetherConfig(); - } - - public OffloadController(Handler h, OffloadHardwareInterface hwi, - ContentResolver contentResolver, NetworkStatsManager nsm, SharedLog log, - @NonNull Dependencies deps) { - mHandler = h; - mHwInterface = hwi; - mContentResolver = contentResolver; - mLog = log.forSubComponent(TAG); - mDownstreams = new HashMap<>(); - mExemptPrefixes = new HashSet<>(); - mLastLocalPrefixStrs = new HashSet<>(); - OffloadTetheringStatsProvider provider = new OffloadTetheringStatsProvider(); - try { - nsm.registerNetworkStatsProvider(getClass().getSimpleName(), provider); - } catch (RuntimeException e) { - Log.wtf(TAG, "Cannot register offload stats provider: " + e); - provider = null; - } - mStatsProvider = provider; - mDeps = deps; - } - - /** Start hardware offload. */ - public boolean start() { - if (started()) return true; - - if (isOffloadDisabled()) { - mLog.i("tethering offload disabled"); - return false; - } - - if (!mConfigInitialized) { - mConfigInitialized = mHwInterface.initOffloadConfig(); - if (!mConfigInitialized) { - mLog.i("tethering offload config not supported"); - stop(); - return false; - } - } - - mControlInitialized = mHwInterface.initOffloadControl( - // OffloadHardwareInterface guarantees that these callback - // methods are called on the handler passed to it, which is the - // same as mHandler, as coordinated by the setup in Tethering. - new OffloadHardwareInterface.ControlCallback() { - @Override - public void onStarted() { - if (!started()) return; - mLog.log("onStarted"); - } - - @Override - public void onStoppedError() { - if (!started()) return; - mLog.log("onStoppedError"); - } - - @Override - public void onStoppedUnsupported() { - if (!started()) return; - mLog.log("onStoppedUnsupported"); - // Poll for statistics and trigger a sweep of tethering - // stats by observers. This might not succeed, but it's - // worth trying anyway. We need to do this because from - // this point on we continue with software forwarding, - // and we need to synchronize stats and limits between - // software and hardware forwarding. - updateStatsForAllUpstreams(); - if (mStatsProvider != null) mStatsProvider.pushTetherStats(); - } - - @Override - public void onSupportAvailable() { - if (!started()) return; - mLog.log("onSupportAvailable"); - - // [1] Poll for statistics and trigger a sweep of stats - // by observers. We need to do this to ensure that any - // limits set take into account any software tethering - // traffic that has been happening in the meantime. - updateStatsForAllUpstreams(); - if (mStatsProvider != null) mStatsProvider.pushTetherStats(); - // [2] (Re)Push all state. - computeAndPushLocalPrefixes(UpdateType.FORCE); - pushAllDownstreamState(); - pushUpstreamParameters(null); - } - - @Override - public void onStoppedLimitReached() { - if (!started()) return; - mLog.log("onStoppedLimitReached"); - - // We cannot reliably determine on which interface the limit was reached, - // because the HAL interface does not specify it. We cannot just use the - // current upstream, because that might have changed since the time that - // the HAL queued the callback. - // TODO: rev the HAL so that it provides an interface name. - - updateStatsForCurrentUpstream(); - if (mStatsProvider != null) { - mStatsProvider.pushTetherStats(); - // Push stats to service does not cause the service react to it - // immediately. Inform the service about limit reached. - mStatsProvider.notifyLimitReached(); - } - } - - @Override - public void onNatTimeoutUpdate(int proto, - String srcAddr, int srcPort, - String dstAddr, int dstPort) { - if (!started()) return; - updateNatTimeout(proto, srcAddr, srcPort, dstAddr, dstPort); - } - }); - - final boolean isStarted = started(); - if (!isStarted) { - mLog.i("tethering offload control not supported"); - stop(); - } else { - mLog.log("tethering offload started"); - mNatUpdateCallbacksReceived = 0; - mNatUpdateNetlinkErrors = 0; - maybeSchedulePollingStats(); - } - return isStarted; - } - - /** Stop hardware offload. */ - public void stop() { - // Completely stops tethering offload. After this method is called, it is no longer safe to - // call any HAL method, no callbacks from the hardware will be delivered, and any in-flight - // callbacks must be ignored. Offload may be started again by calling start(). - final boolean wasStarted = started(); - updateStatsForCurrentUpstream(); - mUpstreamLinkProperties = null; - mHwInterface.stopOffloadControl(); - mControlInitialized = false; - mConfigInitialized = false; - if (mHandler.hasCallbacks(mScheduledPollingTask)) { - mHandler.removeCallbacks(mScheduledPollingTask); - } - if (wasStarted) mLog.log("tethering offload stopped"); - } - - private boolean started() { - return mConfigInitialized && mControlInitialized; - } - - @VisibleForTesting - class OffloadTetheringStatsProvider extends NetworkStatsProvider { - // These stats must only ever be touched on the handler thread. - @NonNull - private NetworkStats mIfaceStats = new NetworkStats(0L, 0); - @NonNull - private NetworkStats mUidStats = new NetworkStats(0L, 0); - - /** - * A helper function that collect tether stats from local hashmap. Note that this does not - * invoke binder call. - */ - @VisibleForTesting - @NonNull - NetworkStats getTetherStats(@NonNull StatsType how) { - NetworkStats stats = new NetworkStats(0L, 0); - final int uid = (how == StatsType.STATS_PER_UID) ? UID_TETHERING : UID_ALL; - - for (final Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) { - final ForwardedStats value = kv.getValue(); - final Entry entry = new Entry(kv.getKey(), uid, SET_DEFAULT, TAG_NONE, METERED_NO, - ROAMING_NO, DEFAULT_NETWORK_NO, value.rxBytes, 0L, value.txBytes, 0L, 0L); - stats = stats.addEntry(entry); - } - - return stats; - } - - @Override - public void onSetLimit(String iface, long quotaBytes) { - // Listen for all iface is necessary since upstream might be changed after limit - // is set. - mHandler.post(() -> { - final Long curIfaceQuota = mInterfaceQuotas.get(iface); - - // If the quota is set to unlimited, the value set to HAL is Long.MAX_VALUE, - // which is ~8.4 x 10^6 TiB, no one can actually reach it. Thus, it is not - // useful to set it multiple times. - // Otherwise, the quota needs to be updated to tell HAL to re-count from now even - // if the quota is the same as the existing one. - if (null == curIfaceQuota && QUOTA_UNLIMITED == quotaBytes) return; - - if (quotaBytes == QUOTA_UNLIMITED) { - mInterfaceQuotas.remove(iface); - } else { - mInterfaceQuotas.put(iface, quotaBytes); - } - maybeUpdateDataLimit(iface); - }); - } - - /** - * Push stats to service, but does not cause a force polling. Note that this can only be - * called on the handler thread. - */ - public void pushTetherStats() { - // TODO: remove the accumulated stats and report the diff from HAL directly. - final NetworkStats ifaceDiff = - getTetherStats(StatsType.STATS_PER_IFACE).subtract(mIfaceStats); - final NetworkStats uidDiff = - getTetherStats(StatsType.STATS_PER_UID).subtract(mUidStats); - try { - notifyStatsUpdated(0 /* token */, ifaceDiff, uidDiff); - mIfaceStats = mIfaceStats.add(ifaceDiff); - mUidStats = mUidStats.add(uidDiff); - } catch (RuntimeException e) { - mLog.e("Cannot report network stats: ", e); - } - } - - @Override - public void onRequestStatsUpdate(int token) { - // Do not attempt to update stats by querying the offload HAL - // synchronously from a different thread than the Handler thread. http://b/64771555. - mHandler.post(() -> { - updateStatsForCurrentUpstream(); - pushTetherStats(); - }); - } - - @Override - public void onSetAlert(long quotaBytes) { - // TODO: Ask offload HAL to notify alert without stopping traffic. - // Post it to handler thread since it access remaining quota bytes. - mHandler.post(() -> { - updateAlertQuota(quotaBytes); - maybeSchedulePollingStats(); - }); - } - } - - private String currentUpstreamInterface() { - return (mUpstreamLinkProperties != null) - ? mUpstreamLinkProperties.getInterfaceName() : null; - } - - private void maybeUpdateStats(String iface) { - if (TextUtils.isEmpty(iface)) { - return; - } - - // Always called on the handler thread. - // - // Use get()/put() instead of updating ForwardedStats in place because we can be called - // concurrently with getTetherStats. In combination with the guarantees provided by - // ConcurrentHashMap, this ensures that getTetherStats always gets the most recent copy of - // the stats for each interface, and does not observe partial writes where rxBytes is - // updated and txBytes is not. - ForwardedStats diff = mHwInterface.getForwardedStats(iface); - final long usedAlertQuota = diff.rxBytes + diff.txBytes; - ForwardedStats base = mForwardedStats.get(iface); - if (base != null) { - diff.add(base); - } - - // Update remaining alert quota if it is still positive. - if (mRemainingAlertQuota > 0 && usedAlertQuota > 0) { - // Trim to zero if overshoot. - final long newQuota = Math.max(mRemainingAlertQuota - usedAlertQuota, 0); - updateAlertQuota(newQuota); - } - - mForwardedStats.put(iface, diff); - // diff is a new object, just created by getForwardedStats(). Therefore, anyone reading from - // mForwardedStats (i.e., any caller of getTetherStats) will see the new stats immediately. - } - - /** - * Update remaining alert quota, fire the {@link NetworkStatsProvider#notifyAlertReached()} - * callback when it reaches zero. This can be invoked either from service setting the alert, or - * {@code maybeUpdateStats} when updating stats. Note that this can be only called on - * handler thread. - * - * @param newQuota non-negative value to indicate the new quota, or - * {@link NetworkStatsProvider#QUOTA_UNLIMITED} to indicate there is no - * quota. - */ - private void updateAlertQuota(long newQuota) { - if (newQuota < QUOTA_UNLIMITED) { - throw new IllegalArgumentException("invalid quota value " + newQuota); - } - if (mRemainingAlertQuota == newQuota) return; - - mRemainingAlertQuota = newQuota; - if (mRemainingAlertQuota == 0) { - mLog.i("notifyAlertReached"); - if (mStatsProvider != null) mStatsProvider.notifyAlertReached(); - } - } - - /** - * Schedule polling if needed, this will be stopped if offload has been - * stopped or remaining quota reaches zero or upstream is empty. - * Note that this can be only called on handler thread. - */ - private void maybeSchedulePollingStats() { - if (!isPollingStatsNeeded()) return; - - if (mHandler.hasCallbacks(mScheduledPollingTask)) { - mHandler.removeCallbacks(mScheduledPollingTask); - } - mHandler.postDelayed(mScheduledPollingTask, - mDeps.getTetherConfig().getOffloadPollInterval()); - } - - private boolean isPollingStatsNeeded() { - return started() && mRemainingAlertQuota > 0 - && !TextUtils.isEmpty(currentUpstreamInterface()) - && mDeps.getTetherConfig() != null - && mDeps.getTetherConfig().getOffloadPollInterval() - >= DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS; - } - - private boolean maybeUpdateDataLimit(String iface) { - // setDataLimit may only be called while offload is occurring on this upstream. - if (!started() || !TextUtils.equals(iface, currentUpstreamInterface())) { - return true; - } - - Long limit = mInterfaceQuotas.get(iface); - if (limit == null) { - limit = Long.MAX_VALUE; - } - - return mHwInterface.setDataLimit(iface, limit); - } - - private void updateStatsForCurrentUpstream() { - maybeUpdateStats(currentUpstreamInterface()); - } - - private void updateStatsForAllUpstreams() { - // In practice, there should only ever be a single digit number of - // upstream interfaces over the lifetime of an active tethering session. - // Roughly speaking, imagine a very ambitious one or two of each of the - // following interface types: [ "rmnet_data", "wlan", "eth", "rndis" ]. - for (Map.Entry<String, ForwardedStats> kv : mForwardedStats.entrySet()) { - maybeUpdateStats(kv.getKey()); - } - } - - /** Set current tethering upstream LinkProperties. */ - public void setUpstreamLinkProperties(LinkProperties lp) { - if (!started() || Objects.equals(mUpstreamLinkProperties, lp)) return; - - final String prevUpstream = currentUpstreamInterface(); - - mUpstreamLinkProperties = (lp != null) ? new LinkProperties(lp) : null; - // Make sure we record this interface in the ForwardedStats map. - final String iface = currentUpstreamInterface(); - if (!TextUtils.isEmpty(iface)) mForwardedStats.putIfAbsent(iface, EMPTY_STATS); - - maybeSchedulePollingStats(); - - // TODO: examine return code and decide what to do if programming - // upstream parameters fails (probably just wait for a subsequent - // onOffloadEvent() callback to tell us offload is available again and - // then reapply all state). - computeAndPushLocalPrefixes(UpdateType.IF_NEEDED); - pushUpstreamParameters(prevUpstream); - } - - /** Set local prefixes. */ - public void setLocalPrefixes(Set<IpPrefix> localPrefixes) { - mExemptPrefixes = localPrefixes; - - if (!started()) return; - computeAndPushLocalPrefixes(UpdateType.IF_NEEDED); - } - - /** Update current downstream LinkProperties. */ - public void notifyDownstreamLinkProperties(LinkProperties lp) { - final String ifname = lp.getInterfaceName(); - final LinkProperties oldLp = mDownstreams.put(ifname, new LinkProperties(lp)); - if (Objects.equals(oldLp, lp)) return; - - if (!started()) return; - pushDownstreamState(oldLp, lp); - } - - private void pushDownstreamState(LinkProperties oldLp, LinkProperties newLp) { - final String ifname = newLp.getInterfaceName(); - final List<RouteInfo> oldRoutes = - (oldLp != null) ? oldLp.getRoutes() : Collections.EMPTY_LIST; - final List<RouteInfo> newRoutes = newLp.getRoutes(); - - // For each old route, if not in new routes: remove. - for (RouteInfo ri : oldRoutes) { - if (shouldIgnoreDownstreamRoute(ri)) continue; - if (!newRoutes.contains(ri)) { - mHwInterface.removeDownstreamPrefix(ifname, ri.getDestination().toString()); - } - } - - // For each new route, if not in old routes: add. - for (RouteInfo ri : newRoutes) { - if (shouldIgnoreDownstreamRoute(ri)) continue; - if (!oldRoutes.contains(ri)) { - mHwInterface.addDownstreamPrefix(ifname, ri.getDestination().toString()); - } - } - } - - private void pushAllDownstreamState() { - for (LinkProperties lp : mDownstreams.values()) { - pushDownstreamState(null, lp); - } - } - - /** Remove downstream interface from offload hardware. */ - public void removeDownstreamInterface(String ifname) { - final LinkProperties lp = mDownstreams.remove(ifname); - if (lp == null) return; - - if (!started()) return; - - for (RouteInfo route : lp.getRoutes()) { - if (shouldIgnoreDownstreamRoute(route)) continue; - mHwInterface.removeDownstreamPrefix(ifname, route.getDestination().toString()); - } - } - - private boolean isOffloadDisabled() { - final int defaultDisposition = mHwInterface.getDefaultTetherOffloadDisabled(); - return (Settings.Global.getInt( - mContentResolver, TETHER_OFFLOAD_DISABLED, defaultDisposition) != 0); - } - - private boolean pushUpstreamParameters(String prevUpstream) { - final String iface = currentUpstreamInterface(); - - if (TextUtils.isEmpty(iface)) { - final boolean rval = mHwInterface.setUpstreamParameters("", ANYIP, ANYIP, null); - // Update stats after we've told the hardware to stop forwarding so - // we don't miss packets. - maybeUpdateStats(prevUpstream); - return rval; - } - - // A stacked interface cannot be an upstream for hardware offload. - // Consequently, we examine only the primary interface name, look at - // getAddresses() rather than getAllAddresses(), and check getRoutes() - // rather than getAllRoutes(). - final ArrayList<String> v6gateways = new ArrayList<>(); - String v4addr = null; - String v4gateway = null; - - for (InetAddress ip : mUpstreamLinkProperties.getAddresses()) { - if (ip instanceof Inet4Address) { - v4addr = ip.getHostAddress(); - break; - } - } - - // Find the gateway addresses of all default routes of either address family. - for (RouteInfo ri : mUpstreamLinkProperties.getRoutes()) { - if (!ri.hasGateway()) continue; - - final String gateway = ri.getGateway().getHostAddress(); - final InetAddress address = ri.getDestination().getAddress(); - if (ri.isDefaultRoute() && address instanceof Inet4Address) { - v4gateway = gateway; - } else if (ri.isDefaultRoute() && address instanceof Inet6Address) { - v6gateways.add(gateway); - } - } - - boolean success = mHwInterface.setUpstreamParameters( - iface, v4addr, v4gateway, (v6gateways.isEmpty() ? null : v6gateways)); - - if (!success) { - return success; - } - - // Update stats after we've told the hardware to change routing so we don't miss packets. - maybeUpdateStats(prevUpstream); - - // Data limits can only be set once offload is running on the upstream. - success = maybeUpdateDataLimit(iface); - if (!success) { - // If we failed to set a data limit, don't use this upstream, because we don't want to - // blow through the data limit that we were told to apply. - mLog.log("Setting data limit for " + iface + " failed, disabling offload."); - stop(); - } - - return success; - } - - private boolean computeAndPushLocalPrefixes(UpdateType how) { - final boolean force = (how == UpdateType.FORCE); - final Set<String> localPrefixStrs = computeLocalPrefixStrings( - mExemptPrefixes, mUpstreamLinkProperties); - if (!force && mLastLocalPrefixStrs.equals(localPrefixStrs)) return true; - - mLastLocalPrefixStrs = localPrefixStrs; - return mHwInterface.setLocalPrefixes(new ArrayList<>(localPrefixStrs)); - } - - // TODO: Factor in downstream LinkProperties once that information is available. - private static Set<String> computeLocalPrefixStrings( - Set<IpPrefix> localPrefixes, LinkProperties upstreamLinkProperties) { - // Create an editable copy. - final Set<IpPrefix> prefixSet = new HashSet<>(localPrefixes); - - // TODO: If a downstream interface (not currently passed in) is reusing - // the /64 of the upstream (64share) then: - // - // [a] remove that /64 from the local prefixes - // [b] add in /128s for IP addresses on the downstream interface - // [c] add in /128s for IP addresses on the upstream interface - // - // Until downstream information is available here, simply add /128s from - // the upstream network; they'll just be redundant with their /64. - if (upstreamLinkProperties != null) { - for (LinkAddress linkAddr : upstreamLinkProperties.getLinkAddresses()) { - if (!linkAddr.isGlobalPreferred()) continue; - final InetAddress ip = linkAddr.getAddress(); - if (!(ip instanceof Inet6Address)) continue; - prefixSet.add(new IpPrefix(ip, 128)); - } - } - - final HashSet<String> localPrefixStrs = new HashSet<>(); - for (IpPrefix pfx : prefixSet) localPrefixStrs.add(pfx.toString()); - return localPrefixStrs; - } - - private static boolean shouldIgnoreDownstreamRoute(RouteInfo route) { - // Ignore any link-local routes. - final IpPrefix destination = route.getDestination(); - final LinkAddress linkAddr = new LinkAddress(destination.getAddress(), - destination.getPrefixLength()); - if (!linkAddr.isGlobalPreferred()) return true; - - return false; - } - - /** Dump information. */ - public void dump(IndentingPrintWriter pw) { - if (isOffloadDisabled()) { - pw.println("Offload disabled"); - return; - } - final boolean isStarted = started(); - pw.println("Offload HALs " + (isStarted ? "started" : "not started")); - LinkProperties lp = mUpstreamLinkProperties; - String upstream = (lp != null) ? lp.getInterfaceName() : null; - pw.println("Current upstream: " + upstream); - pw.println("Exempt prefixes: " + mLastLocalPrefixStrs); - pw.println("NAT timeout update callbacks received during the " - + (isStarted ? "current" : "last") - + " offload session: " - + mNatUpdateCallbacksReceived); - pw.println("NAT timeout update netlink errors during the " - + (isStarted ? "current" : "last") - + " offload session: " - + mNatUpdateNetlinkErrors); - } - - private void updateNatTimeout( - int proto, String srcAddr, int srcPort, String dstAddr, int dstPort) { - final String protoName = protoNameFor(proto); - if (protoName == null) { - mLog.e("Unknown NAT update callback protocol: " + proto); - return; - } - - final Inet4Address src = parseIPv4Address(srcAddr); - if (src == null) { - mLog.e("Failed to parse IPv4 address: " + srcAddr); - return; - } - - if (!isValidUdpOrTcpPort(srcPort)) { - mLog.e("Invalid src port: " + srcPort); - return; - } - - final Inet4Address dst = parseIPv4Address(dstAddr); - if (dst == null) { - mLog.e("Failed to parse IPv4 address: " + dstAddr); - return; - } - - if (!isValidUdpOrTcpPort(dstPort)) { - mLog.e("Invalid dst port: " + dstPort); - return; - } - - mNatUpdateCallbacksReceived++; - final String natDescription = String.format("%s (%s, %s) -> (%s, %s)", - protoName, srcAddr, srcPort, dstAddr, dstPort); - if (DBG) { - mLog.log("NAT timeout update: " + natDescription); - } - - final int timeoutSec = connectionTimeoutUpdateSecondsFor(proto); - final byte[] msg = ConntrackMessage.newIPv4TimeoutUpdateRequest( - proto, src, srcPort, dst, dstPort, timeoutSec); - - try { - NetlinkSocket.sendOneShotKernelMessage(OsConstants.NETLINK_NETFILTER, msg); - } catch (ErrnoException e) { - mNatUpdateNetlinkErrors++; - mLog.e("Error updating NAT conntrack entry >" + natDescription + "<: " + e - + ", msg: " + NetlinkConstants.hexify(msg)); - mLog.log("NAT timeout update callbacks received: " + mNatUpdateCallbacksReceived); - mLog.log("NAT timeout update netlink errors: " + mNatUpdateNetlinkErrors); - } - } - - private static Inet4Address parseIPv4Address(String addrString) { - try { - final InetAddress ip = InetAddresses.parseNumericAddress(addrString); - // TODO: Consider other sanitization steps here, including perhaps: - // not eql to 0.0.0.0 - // not within 169.254.0.0/16 - // not within ::ffff:0.0.0.0/96 - // not within ::/96 - // et cetera. - if (ip instanceof Inet4Address) { - return (Inet4Address) ip; - } - } catch (IllegalArgumentException iae) { } - return null; - } - - private static String protoNameFor(int proto) { - // OsConstants values are not constant expressions; no switch statement. - if (proto == OsConstants.IPPROTO_UDP) { - return "UDP"; - } else if (proto == OsConstants.IPPROTO_TCP) { - return "TCP"; - } - return null; - } - - private static int connectionTimeoutUpdateSecondsFor(int proto) { - // TODO: Replace this with more thoughtful work, perhaps reading from - // and maybe writing to any required - // - // /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_* - // /proc/sys/net/netfilter/nf_conntrack_udp_timeout{,_stream} - // - // entries. TBD. - if (proto == OsConstants.IPPROTO_TCP) { - // Cf. /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established - return 432000; - } else { - // Cf. /proc/sys/net/netfilter/nf_conntrack_udp_timeout_stream - return 180; - } - } - - private static boolean isValidUdpOrTcpPort(int port) { - return port > 0 && port < 65536; - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java b/packages/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java deleted file mode 100644 index 33b9d00e70dc..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/OffloadHardwareInterface.java +++ /dev/null @@ -1,564 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import static android.net.netlink.StructNlMsgHdr.NLM_F_DUMP; -import static android.net.netlink.StructNlMsgHdr.NLM_F_REQUEST; -import static android.net.util.TetheringUtils.uint16; - -import android.annotation.NonNull; -import android.hardware.tetheroffload.config.V1_0.IOffloadConfig; -import android.hardware.tetheroffload.control.V1_0.IOffloadControl; -import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback; -import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate; -import android.hardware.tetheroffload.control.V1_0.NetworkProtocol; -import android.hardware.tetheroffload.control.V1_0.OffloadCallbackEvent; -import android.net.netlink.NetlinkSocket; -import android.net.netlink.StructNlMsgHdr; -import android.net.util.SharedLog; -import android.net.util.SocketUtils; -import android.os.Handler; -import android.os.NativeHandle; -import android.os.RemoteException; -import android.system.ErrnoException; -import android.system.Os; -import android.system.OsConstants; - -import com.android.internal.annotations.VisibleForTesting; - -import java.io.FileDescriptor; -import java.io.InterruptedIOException; -import java.io.IOException; -import java.net.SocketAddress; -import java.net.SocketException; -import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.NoSuchElementException; - - -/** - * Capture tethering dependencies, for injection. - * - * @hide - */ -public class OffloadHardwareInterface { - private static final String TAG = OffloadHardwareInterface.class.getSimpleName(); - private static final String YIELDS = " -> "; - // Change this value to control whether tether offload is enabled or - // disabled by default in the absence of an explicit Settings value. - // See accompanying unittest to distinguish 0 from non-0 values. - private static final int DEFAULT_TETHER_OFFLOAD_DISABLED = 0; - private static final String NO_INTERFACE_NAME = ""; - private static final String NO_IPV4_ADDRESS = ""; - private static final String NO_IPV4_GATEWAY = ""; - // Reference kernel/uapi/linux/netfilter/nfnetlink_compat.h - private static final int NF_NETLINK_CONNTRACK_NEW = 1; - private static final int NF_NETLINK_CONNTRACK_UPDATE = 2; - private static final int NF_NETLINK_CONNTRACK_DESTROY = 4; - // Reference libnetfilter_conntrack/linux_nfnetlink_conntrack.h - public static final short NFNL_SUBSYS_CTNETLINK = 1; - public static final short IPCTNL_MSG_CT_GET = 1; - - private final long NETLINK_MESSAGE_TIMEOUT_MS = 500; - - private final Handler mHandler; - private final SharedLog mLog; - private final Dependencies mDeps; - private IOffloadControl mOffloadControl; - private TetheringOffloadCallback mTetheringOffloadCallback; - private ControlCallback mControlCallback; - - /** The callback to notify status of offload management process. */ - public static class ControlCallback { - /** Offload started. */ - public void onStarted() {} - /** - * Offload stopped because an error has occurred in lower layer. - */ - public void onStoppedError() {} - /** - * Offload stopped because the device has moved to a bearer on which hardware offload is - * not supported. Subsequent calls to setUpstreamParameters and add/removeDownstream will - * likely fail and cannot be presumed to be saved inside of the hardware management process. - * Upon receiving #onSupportAvailable(), the caller should reprogram the hardware to begin - * offload again. - */ - public void onStoppedUnsupported() {} - /** Indicate that offload is able to proivde support for this time. */ - public void onSupportAvailable() {} - /** Offload stopped because of usage limit reached. */ - public void onStoppedLimitReached() {} - - /** Indicate to update NAT timeout. */ - public void onNatTimeoutUpdate(int proto, - String srcAddr, int srcPort, - String dstAddr, int dstPort) {} - } - - /** The object which records Tx/Rx forwarded bytes. */ - public static class ForwardedStats { - public long rxBytes; - public long txBytes; - - public ForwardedStats() { - rxBytes = 0; - txBytes = 0; - } - - @VisibleForTesting - public ForwardedStats(long rxBytes, long txBytes) { - this.rxBytes = rxBytes; - this.txBytes = txBytes; - } - - /** Add Tx/Rx bytes. */ - public void add(ForwardedStats other) { - rxBytes += other.rxBytes; - txBytes += other.txBytes; - } - - /** Returns the string representation of this object. */ - public String toString() { - return String.format("rx:%s tx:%s", rxBytes, txBytes); - } - } - - public OffloadHardwareInterface(Handler h, SharedLog log) { - this(h, log, new Dependencies(log)); - } - - OffloadHardwareInterface(Handler h, SharedLog log, Dependencies deps) { - mHandler = h; - mLog = log.forSubComponent(TAG); - mDeps = deps; - } - - /** Capture OffloadHardwareInterface dependencies, for injection. */ - static class Dependencies { - private final SharedLog mLog; - - Dependencies(SharedLog log) { - mLog = log; - } - - public IOffloadConfig getOffloadConfig() { - try { - return IOffloadConfig.getService(true /*retry*/); - } catch (RemoteException | NoSuchElementException e) { - mLog.e("getIOffloadConfig error " + e); - return null; - } - } - - public IOffloadControl getOffloadControl() { - try { - return IOffloadControl.getService(true /*retry*/); - } catch (RemoteException | NoSuchElementException e) { - mLog.e("tethering offload control not supported: " + e); - return null; - } - } - - public NativeHandle createConntrackSocket(final int groups) { - final FileDescriptor fd; - try { - fd = NetlinkSocket.forProto(OsConstants.NETLINK_NETFILTER); - } catch (ErrnoException e) { - mLog.e("Unable to create conntrack socket " + e); - return null; - } - - final SocketAddress sockAddr = SocketUtils.makeNetlinkSocketAddress(0, groups); - try { - Os.bind(fd, sockAddr); - } catch (ErrnoException | SocketException e) { - mLog.e("Unable to bind conntrack socket for groups " + groups + " error: " + e); - try { - SocketUtils.closeSocket(fd); - } catch (IOException ie) { - // Nothing we can do here - } - return null; - } - try { - Os.connect(fd, sockAddr); - } catch (ErrnoException | SocketException e) { - mLog.e("connect to kernel fail for groups " + groups + " error: " + e); - try { - SocketUtils.closeSocket(fd); - } catch (IOException ie) { - // Nothing we can do here - } - return null; - } - - return new NativeHandle(fd, true); - } - } - - /** Get default value indicating whether offload is supported. */ - public int getDefaultTetherOffloadDisabled() { - return DEFAULT_TETHER_OFFLOAD_DISABLED; - } - - /** - * Offload management process need to know conntrack rules to support NAT, but it may not have - * permission to create netlink netfilter sockets. Create two netlink netfilter sockets and - * share them with offload management process. - */ - public boolean initOffloadConfig() { - final IOffloadConfig offloadConfig = mDeps.getOffloadConfig(); - if (offloadConfig == null) { - mLog.e("Could not find IOffloadConfig service"); - return false; - } - // Per the IConfigOffload definition: - // - // h1 provides a file descriptor bound to the following netlink groups - // (NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY). - // - // h2 provides a file descriptor bound to the following netlink groups - // (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY). - final NativeHandle h1 = mDeps.createConntrackSocket( - NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY); - if (h1 == null) return false; - - sendNetlinkMessage(h1, (short) ((NFNL_SUBSYS_CTNETLINK << 8) | IPCTNL_MSG_CT_GET), - (short) (NLM_F_REQUEST | NLM_F_DUMP)); - - final NativeHandle h2 = mDeps.createConntrackSocket( - NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY); - if (h2 == null) { - closeFdInNativeHandle(h1); - return false; - } - - final CbResults results = new CbResults(); - try { - offloadConfig.setHandles(h1, h2, - (boolean success, String errMsg) -> { - results.mSuccess = success; - results.mErrMsg = errMsg; - }); - } catch (RemoteException e) { - record("initOffloadConfig, setHandles fail", e); - return false; - } - // Explicitly close FDs. - closeFdInNativeHandle(h1); - closeFdInNativeHandle(h2); - - record("initOffloadConfig, setHandles results:", results); - return results.mSuccess; - } - - @VisibleForTesting - public void sendNetlinkMessage(@NonNull NativeHandle handle, short type, short flags) { - final int length = StructNlMsgHdr.STRUCT_SIZE; - final byte[] msg = new byte[length]; - final StructNlMsgHdr nlh = new StructNlMsgHdr(); - final ByteBuffer byteBuffer = ByteBuffer.wrap(msg); - nlh.nlmsg_len = length; - nlh.nlmsg_type = type; - nlh.nlmsg_flags = flags; - nlh.nlmsg_seq = 1; - nlh.pack(byteBuffer); - try { - NetlinkSocket.sendMessage(handle.getFileDescriptor(), msg, 0 /* offset */, length, - NETLINK_MESSAGE_TIMEOUT_MS); - } catch (ErrnoException | InterruptedIOException e) { - mLog.e("Unable to send netfilter message, error: " + e); - } - } - - private void closeFdInNativeHandle(final NativeHandle h) { - try { - h.close(); - } catch (IOException | IllegalStateException e) { - // IllegalStateException means fd is already closed, do nothing here. - // Also nothing we can do if IOException. - } - } - - /** Initialize the tethering offload HAL. */ - public boolean initOffloadControl(ControlCallback controlCb) { - mControlCallback = controlCb; - - if (mOffloadControl == null) { - mOffloadControl = mDeps.getOffloadControl(); - if (mOffloadControl == null) { - mLog.e("tethering IOffloadControl.getService() returned null"); - return false; - } - } - - final String logmsg = String.format("initOffloadControl(%s)", - (controlCb == null) ? "null" - : "0x" + Integer.toHexString(System.identityHashCode(controlCb))); - - mTetheringOffloadCallback = new TetheringOffloadCallback(mHandler, mControlCallback, mLog); - final CbResults results = new CbResults(); - try { - mOffloadControl.initOffload( - mTetheringOffloadCallback, - (boolean success, String errMsg) -> { - results.mSuccess = success; - results.mErrMsg = errMsg; - }); - } catch (RemoteException e) { - record(logmsg, e); - return false; - } - - record(logmsg, results); - return results.mSuccess; - } - - /** Stop IOffloadControl. */ - public void stopOffloadControl() { - if (mOffloadControl != null) { - try { - mOffloadControl.stopOffload( - (boolean success, String errMsg) -> { - if (!success) mLog.e("stopOffload failed: " + errMsg); - }); - } catch (RemoteException e) { - mLog.e("failed to stopOffload: " + e); - } - } - mOffloadControl = null; - mTetheringOffloadCallback = null; - mControlCallback = null; - mLog.log("stopOffloadControl()"); - } - - /** Get Tx/Rx usage from last query. */ - public ForwardedStats getForwardedStats(String upstream) { - final String logmsg = String.format("getForwardedStats(%s)", upstream); - - final ForwardedStats stats = new ForwardedStats(); - try { - mOffloadControl.getForwardedStats( - upstream, - (long rxBytes, long txBytes) -> { - stats.rxBytes = (rxBytes > 0) ? rxBytes : 0; - stats.txBytes = (txBytes > 0) ? txBytes : 0; - }); - } catch (RemoteException e) { - record(logmsg, e); - return stats; - } - - return stats; - } - - /** Set local prefixes to offload management process. */ - public boolean setLocalPrefixes(ArrayList<String> localPrefixes) { - final String logmsg = String.format("setLocalPrefixes([%s])", - String.join(",", localPrefixes)); - - final CbResults results = new CbResults(); - try { - mOffloadControl.setLocalPrefixes(localPrefixes, - (boolean success, String errMsg) -> { - results.mSuccess = success; - results.mErrMsg = errMsg; - }); - } catch (RemoteException e) { - record(logmsg, e); - return false; - } - - record(logmsg, results); - return results.mSuccess; - } - - /** Set data limit value to offload management process. */ - public boolean setDataLimit(String iface, long limit) { - - final String logmsg = String.format("setDataLimit(%s, %d)", iface, limit); - - final CbResults results = new CbResults(); - try { - mOffloadControl.setDataLimit( - iface, limit, - (boolean success, String errMsg) -> { - results.mSuccess = success; - results.mErrMsg = errMsg; - }); - } catch (RemoteException e) { - record(logmsg, e); - return false; - } - - record(logmsg, results); - return results.mSuccess; - } - - /** Set upstream parameters to offload management process. */ - public boolean setUpstreamParameters( - String iface, String v4addr, String v4gateway, ArrayList<String> v6gws) { - iface = (iface != null) ? iface : NO_INTERFACE_NAME; - v4addr = (v4addr != null) ? v4addr : NO_IPV4_ADDRESS; - v4gateway = (v4gateway != null) ? v4gateway : NO_IPV4_GATEWAY; - v6gws = (v6gws != null) ? v6gws : new ArrayList<>(); - - final String logmsg = String.format("setUpstreamParameters(%s, %s, %s, [%s])", - iface, v4addr, v4gateway, String.join(",", v6gws)); - - final CbResults results = new CbResults(); - try { - mOffloadControl.setUpstreamParameters( - iface, v4addr, v4gateway, v6gws, - (boolean success, String errMsg) -> { - results.mSuccess = success; - results.mErrMsg = errMsg; - }); - } catch (RemoteException e) { - record(logmsg, e); - return false; - } - - record(logmsg, results); - return results.mSuccess; - } - - /** Add downstream prefix to offload management process. */ - public boolean addDownstreamPrefix(String ifname, String prefix) { - final String logmsg = String.format("addDownstreamPrefix(%s, %s)", ifname, prefix); - - final CbResults results = new CbResults(); - try { - mOffloadControl.addDownstream(ifname, prefix, - (boolean success, String errMsg) -> { - results.mSuccess = success; - results.mErrMsg = errMsg; - }); - } catch (RemoteException e) { - record(logmsg, e); - return false; - } - - record(logmsg, results); - return results.mSuccess; - } - - /** Remove downstream prefix from offload management process. */ - public boolean removeDownstreamPrefix(String ifname, String prefix) { - final String logmsg = String.format("removeDownstreamPrefix(%s, %s)", ifname, prefix); - - final CbResults results = new CbResults(); - try { - mOffloadControl.removeDownstream(ifname, prefix, - (boolean success, String errMsg) -> { - results.mSuccess = success; - results.mErrMsg = errMsg; - }); - } catch (RemoteException e) { - record(logmsg, e); - return false; - } - - record(logmsg, results); - return results.mSuccess; - } - - private void record(String msg, Throwable t) { - mLog.e(msg + YIELDS + "exception: " + t); - } - - private void record(String msg, CbResults results) { - final String logmsg = msg + YIELDS + results; - if (!results.mSuccess) { - mLog.e(logmsg); - } else { - mLog.log(logmsg); - } - } - - private static class TetheringOffloadCallback extends ITetheringOffloadCallback.Stub { - public final Handler handler; - public final ControlCallback controlCb; - public final SharedLog log; - - TetheringOffloadCallback(Handler h, ControlCallback cb, SharedLog sharedLog) { - handler = h; - controlCb = cb; - log = sharedLog; - } - - @Override - public void onEvent(int event) { - handler.post(() -> { - switch (event) { - case OffloadCallbackEvent.OFFLOAD_STARTED: - controlCb.onStarted(); - break; - case OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR: - controlCb.onStoppedError(); - break; - case OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED: - controlCb.onStoppedUnsupported(); - break; - case OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE: - controlCb.onSupportAvailable(); - break; - case OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED: - controlCb.onStoppedLimitReached(); - break; - default: - log.e("Unsupported OffloadCallbackEvent: " + event); - } - }); - } - - @Override - public void updateTimeout(NatTimeoutUpdate params) { - handler.post(() -> { - controlCb.onNatTimeoutUpdate( - networkProtocolToOsConstant(params.proto), - params.src.addr, uint16(params.src.port), - params.dst.addr, uint16(params.dst.port)); - }); - } - } - - private static int networkProtocolToOsConstant(int proto) { - switch (proto) { - case NetworkProtocol.TCP: return OsConstants.IPPROTO_TCP; - case NetworkProtocol.UDP: return OsConstants.IPPROTO_UDP; - default: - // The caller checks this value and will log an error. Just make - // sure it won't collide with valid OsContants.IPPROTO_* values. - return -Math.abs(proto); - } - } - - private static class CbResults { - boolean mSuccess; - String mErrMsg; - - @Override - public String toString() { - if (mSuccess) { - return "ok"; - } else { - return "fail: " + mErrMsg; - } - } - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java b/packages/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java deleted file mode 100644 index 160a166b632b..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/PrivateAddressCoordinator.java +++ /dev/null @@ -1,254 +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 com.android.networkstack.tethering; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.Network; -import android.net.ip.IpServer; -import android.net.util.PrefixUtils; -import android.util.ArrayMap; -import android.util.ArraySet; - -import androidx.annotation.Nullable; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.IndentingPrintWriter; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; - -/** - * This class coordinate IP addresses conflict problem. - * - * Tethering downstream IP addresses may conflict with network assigned addresses. This - * coordinator is responsible for recording all of network assigned addresses and dispatched - * free address to downstream interfaces. - * - * This class is not thread-safe and should be accessed on the same tethering internal thread. - * @hide - */ -public class PrivateAddressCoordinator { - public static final int PREFIX_LENGTH = 24; - - private static final int MAX_UBYTE = 256; - private static final int BYTE_MASK = 0xff; - // reserved for bluetooth tethering. - private static final int BLUETOOTH_RESERVED = 44; - private static final byte DEFAULT_ID = (byte) 42; - - // Upstream monitor would be stopped when tethering is down. When tethering restart, downstream - // address may be requested before coordinator get current upstream notification. To ensure - // coordinator do not select conflict downstream prefix, mUpstreamPrefixMap would not be cleared - // when tethering is down. Instead coordinator would remove all depcreted upstreams from - // mUpstreamPrefixMap when tethering is starting. See #maybeRemoveDeprectedUpstreams(). - private final ArrayMap<Network, List<IpPrefix>> mUpstreamPrefixMap; - private final ArraySet<IpServer> mDownstreams; - // IANA has reserved the following three blocks of the IP address space for private intranets: - // 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 - // Tethering use 192.168.0.0/16 that has 256 contiguous class C network numbers. - private static final String DEFAULT_TETHERING_PREFIX = "192.168.0.0/16"; - private final IpPrefix mTetheringPrefix; - private final ConnectivityManager mConnectivityMgr; - - public PrivateAddressCoordinator(Context context) { - mDownstreams = new ArraySet<>(); - mUpstreamPrefixMap = new ArrayMap<>(); - mTetheringPrefix = new IpPrefix(DEFAULT_TETHERING_PREFIX); - mConnectivityMgr = (ConnectivityManager) context.getSystemService( - Context.CONNECTIVITY_SERVICE); - } - - /** - * Record a new upstream IpPrefix which may conflict with tethering downstreams. - * The downstreams will be notified if a conflict is found. - */ - public void updateUpstreamPrefix(final Network network, final LinkProperties lp) { - final ArrayList<IpPrefix> ipv4Prefixes = getIpv4Prefixes(lp.getAllLinkAddresses()); - if (ipv4Prefixes.isEmpty()) { - removeUpstreamPrefix(network); - return; - } - - mUpstreamPrefixMap.put(network, ipv4Prefixes); - handleMaybePrefixConflict(ipv4Prefixes); - } - - private ArrayList<IpPrefix> getIpv4Prefixes(final List<LinkAddress> linkAddresses) { - final ArrayList<IpPrefix> list = new ArrayList<>(); - for (LinkAddress address : linkAddresses) { - if (!address.isIpv4()) continue; - - list.add(PrefixUtils.asIpPrefix(address)); - } - - return list; - } - - private void handleMaybePrefixConflict(final List<IpPrefix> prefixes) { - for (IpServer downstream : mDownstreams) { - final IpPrefix target = getDownstreamPrefix(downstream); - if (target == null) continue; - - for (IpPrefix source : prefixes) { - if (isConflictPrefix(source, target)) { - downstream.sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT); - break; - } - } - } - } - - /** Remove IpPrefix records corresponding to input network. */ - public void removeUpstreamPrefix(final Network network) { - mUpstreamPrefixMap.remove(network); - } - - private void maybeRemoveDeprectedUpstreams() { - if (!mDownstreams.isEmpty() || mUpstreamPrefixMap.isEmpty()) return; - - final ArrayList<Network> toBeRemoved = new ArrayList<>(); - List<Network> allNetworks = Arrays.asList(mConnectivityMgr.getAllNetworks()); - for (int i = 0; i < mUpstreamPrefixMap.size(); i++) { - final Network network = mUpstreamPrefixMap.keyAt(i); - if (!allNetworks.contains(network)) toBeRemoved.add(network); - } - - mUpstreamPrefixMap.removeAll(toBeRemoved); - } - - /** - * Pick a random available address and mark its prefix as in use for the provided IpServer, - * returns null if there is no available address. - */ - @Nullable - public LinkAddress requestDownstreamAddress(final IpServer ipServer) { - maybeRemoveDeprectedUpstreams(); - - // Address would be 192.168.[subAddress]/24. - final byte[] bytes = mTetheringPrefix.getRawAddress(); - final int subAddress = getRandomSubAddr(); - final int subNet = (subAddress >> 8) & BYTE_MASK; - bytes[3] = getSanitizedAddressSuffix(subAddress, (byte) 0, (byte) 1, (byte) 0xff); - for (int i = 0; i < MAX_UBYTE; i++) { - final int newSubNet = (subNet + i) & BYTE_MASK; - if (newSubNet == BLUETOOTH_RESERVED) continue; - - bytes[2] = (byte) newSubNet; - final InetAddress addr; - try { - addr = InetAddress.getByAddress(bytes); - } catch (UnknownHostException e) { - throw new IllegalStateException("Invalid address, shouldn't happen.", e); - } - - final IpPrefix prefix = new IpPrefix(addr, PREFIX_LENGTH); - // Check whether this prefix is in use. - if (isDownstreamPrefixInUse(prefix)) continue; - // Check whether this prefix is conflict with any current upstream network. - if (isConflictWithUpstream(prefix)) continue; - - mDownstreams.add(ipServer); - return new LinkAddress(addr, PREFIX_LENGTH); - } - - // No available address. - return null; - } - - /** Get random sub address value. Return value is in 0 ~ 0xffff. */ - @VisibleForTesting - public int getRandomSubAddr() { - return ((new Random()).nextInt()) & 0xffff; // subNet is in 0 ~ 0xffff. - } - - private byte getSanitizedAddressSuffix(final int source, byte... excluded) { - final byte subId = (byte) (source & BYTE_MASK); - for (byte value : excluded) { - if (subId == value) return DEFAULT_ID; - } - - return subId; - } - - /** Release downstream record for IpServer. */ - public void releaseDownstream(final IpServer ipServer) { - mDownstreams.remove(ipServer); - } - - /** Clear current upstream prefixes records. */ - public void clearUpstreamPrefixes() { - mUpstreamPrefixMap.clear(); - } - - private boolean isConflictWithUpstream(final IpPrefix source) { - for (int i = 0; i < mUpstreamPrefixMap.size(); i++) { - final List<IpPrefix> list = mUpstreamPrefixMap.valueAt(i); - for (IpPrefix target : list) { - if (isConflictPrefix(source, target)) return true; - } - } - return false; - } - - private boolean isConflictPrefix(final IpPrefix prefix1, final IpPrefix prefix2) { - if (prefix2.getPrefixLength() < prefix1.getPrefixLength()) { - return prefix2.contains(prefix1.getAddress()); - } - - return prefix1.contains(prefix2.getAddress()); - } - - private boolean isDownstreamPrefixInUse(final IpPrefix source) { - // This class always generates downstream prefixes with the same prefix length, so - // prefixes cannot be contained in each other. They can only be equal to each other. - for (IpServer downstream : mDownstreams) { - final IpPrefix prefix = getDownstreamPrefix(downstream); - if (source.equals(prefix)) return true; - } - return false; - } - - private IpPrefix getDownstreamPrefix(final IpServer downstream) { - final LinkAddress address = downstream.getAddress(); - if (address == null) return null; - - return PrefixUtils.asIpPrefix(address); - } - - void dump(final IndentingPrintWriter pw) { - pw.decreaseIndent(); - pw.println("mUpstreamPrefixMap:"); - pw.increaseIndent(); - for (int i = 0; i < mUpstreamPrefixMap.size(); i++) { - pw.println(mUpstreamPrefixMap.keyAt(i) + " - " + mUpstreamPrefixMap.valueAt(i)); - } - pw.decreaseIndent(); - pw.println("mDownstreams:"); - pw.increaseIndent(); - for (IpServer ipServer : mDownstreams) { - pw.println(ipServer.interfaceType() + " - " + ipServer.getAddress()); - } - pw.decreaseIndent(); - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java b/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java deleted file mode 100644 index 3695ec65d5c0..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/Tethering.java +++ /dev/null @@ -1,2431 +0,0 @@ -/* - * Copyright (C) 2010 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.networkstack.tethering; - -import static android.Manifest.permission.NETWORK_SETTINGS; -import static android.Manifest.permission.NETWORK_STACK; -import static android.content.pm.PackageManager.GET_ACTIVITIES; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.hardware.usb.UsbManager.USB_CONFIGURED; -import static android.hardware.usb.UsbManager.USB_CONNECTED; -import static android.hardware.usb.UsbManager.USB_FUNCTION_NCM; -import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS; -import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED; -import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; -import static android.net.ConnectivityManager.EXTRA_NETWORK_INFO; -import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK; -import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED; -import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY; -import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER; -import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER; -import static android.net.TetheringManager.EXTRA_ERRORED_TETHER; -import static android.net.TetheringManager.TETHERING_BLUETOOTH; -import static android.net.TetheringManager.TETHERING_ETHERNET; -import static android.net.TetheringManager.TETHERING_INVALID; -import static android.net.TetheringManager.TETHERING_NCM; -import static android.net.TetheringManager.TETHERING_USB; -import static android.net.TetheringManager.TETHERING_WIFI; -import static android.net.TetheringManager.TETHERING_WIFI_P2P; -import static android.net.TetheringManager.TETHERING_WIGIG; -import static android.net.TetheringManager.TETHER_ERROR_INTERNAL_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_SERVICE_UNAVAIL; -import static android.net.TetheringManager.TETHER_ERROR_UNAVAIL_IFACE; -import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_IFACE; -import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_TYPE; -import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_FAILED; -import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STARTED; -import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STOPPED; -import static android.net.util.TetheringMessageBase.BASE_MASTER; -import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME; -import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE; -import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE; -import static android.net.wifi.WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR; -import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY; -import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED; -import static android.net.wifi.WifiManager.IFACE_IP_MODE_UNSPECIFIED; -import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED; -import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED; -import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; - -import static com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE; - -import android.app.usage.NetworkStatsManager; -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothPan; -import android.bluetooth.BluetoothProfile; -import android.bluetooth.BluetoothProfile.ServiceListener; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.hardware.usb.UsbManager; -import android.net.ConnectivityManager; -import android.net.EthernetManager; -import android.net.IIntResultListener; -import android.net.INetd; -import android.net.ITetheringEventCallback; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.Network; -import android.net.NetworkCapabilities; -import android.net.NetworkInfo; -import android.net.TetherStatesParcel; -import android.net.TetheredClient; -import android.net.TetheringCallbackStartedParcel; -import android.net.TetheringConfigurationParcel; -import android.net.TetheringRequestParcel; -import android.net.ip.IpServer; -import android.net.shared.NetdUtils; -import android.net.util.BaseNetdUnsolicitedEventListener; -import android.net.util.InterfaceSet; -import android.net.util.PrefixUtils; -import android.net.util.SharedLog; -import android.net.util.TetheringUtils; -import android.net.util.VersionedBroadcastListener; -import android.net.wifi.WifiClient; -import android.net.wifi.WifiManager; -import android.net.wifi.p2p.WifiP2pGroup; -import android.net.wifi.p2p.WifiP2pInfo; -import android.net.wifi.p2p.WifiP2pManager; -import android.os.Binder; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.RemoteCallbackList; -import android.os.RemoteException; -import android.os.ResultReceiver; -import android.os.ServiceSpecificException; -import android.os.UserHandle; -import android.os.UserManager; -import android.provider.Settings; -import android.telephony.PhoneStateListener; -import android.telephony.TelephonyManager; -import android.text.TextUtils; -import android.util.ArrayMap; -import android.util.Log; -import android.util.SparseArray; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.IndentingPrintWriter; -import com.android.internal.util.MessageUtils; -import com.android.internal.util.State; -import com.android.internal.util.StateMachine; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.Executor; -import java.util.concurrent.RejectedExecutionException; - -/** - * - * This class holds much of the business logic to allow Android devices - * to act as IP gateways via USB, BT, and WiFi interfaces. - */ -public class Tethering { - - private static final String TAG = Tethering.class.getSimpleName(); - private static final boolean DBG = false; - private static final boolean VDBG = false; - - private static final Class[] sMessageClasses = { - Tethering.class, TetherMasterSM.class, IpServer.class - }; - private static final SparseArray<String> sMagicDecoderRing = - MessageUtils.findMessageNames(sMessageClasses); - // Keep in sync with NETID_UNSET in system/netd/include/netid_client.h - private static final int NETID_UNSET = 0; - - private static class TetherState { - public final IpServer ipServer; - public int lastState; - public int lastError; - - TetherState(IpServer ipServer) { - this.ipServer = ipServer; - // Assume all state machines start out available and with no errors. - lastState = IpServer.STATE_AVAILABLE; - lastError = TETHER_ERROR_NO_ERROR; - } - - public boolean isCurrentlyServing() { - switch (lastState) { - case IpServer.STATE_TETHERED: - case IpServer.STATE_LOCAL_ONLY: - return true; - default: - return false; - } - } - } - - /** - * Cookie added when registering {@link android.net.TetheringManager.TetheringEventCallback}. - */ - private static class CallbackCookie { - public final boolean hasListClientsPermission; - - private CallbackCookie(boolean hasListClientsPermission) { - this.hasListClientsPermission = hasListClientsPermission; - } - } - - private final SharedLog mLog = new SharedLog(TAG); - private final RemoteCallbackList<ITetheringEventCallback> mTetheringEventCallbacks = - new RemoteCallbackList<>(); - // Currently active tethering requests per tethering type. Only one of each type can be - // requested at a time. After a tethering type is requested, the map keeps tethering parameters - // to be used after the interface comes up asynchronously. - private final SparseArray<TetheringRequestParcel> mActiveTetheringRequests = - new SparseArray<>(); - - // used to synchronize public access to members - // TODO(b/153621704): remove mPublicSync to make Tethering lock free - private final Object mPublicSync; - private final Context mContext; - private final ArrayMap<String, TetherState> mTetherStates; - private final BroadcastReceiver mStateReceiver; - private final Looper mLooper; - private final StateMachine mTetherMasterSM; - private final OffloadController mOffloadController; - private final UpstreamNetworkMonitor mUpstreamNetworkMonitor; - // TODO: Figure out how to merge this and other downstream-tracking objects - // into a single coherent structure. - // Use LinkedHashSet for predictable ordering order for ConnectedClientsTracker. - private final LinkedHashSet<IpServer> mForwardedDownstreams; - private final VersionedBroadcastListener mCarrierConfigChange; - private final TetheringDependencies mDeps; - private final EntitlementManager mEntitlementMgr; - private final Handler mHandler; - private final INetd mNetd; - private final NetdCallback mNetdCallback; - private final UserRestrictionActionListener mTetheringRestriction; - private final ActiveDataSubIdListener mActiveDataSubIdListener; - private final ConnectedClientsTracker mConnectedClientsTracker; - private final TetheringThreadExecutor mExecutor; - private final TetheringNotificationUpdater mNotificationUpdater; - private final UserManager mUserManager; - private final BpfCoordinator mBpfCoordinator; - private final PrivateAddressCoordinator mPrivateAddressCoordinator; - private int mActiveDataSubId = INVALID_SUBSCRIPTION_ID; - // All the usage of mTetheringEventCallback should run in the same thread. - private ITetheringEventCallback mTetheringEventCallback = null; - - private volatile TetheringConfiguration mConfig; - private InterfaceSet mCurrentUpstreamIfaceSet; - - private boolean mRndisEnabled; // track the RNDIS function enabled state - // True iff. WiFi tethering should be started when soft AP is ready. - private boolean mWifiTetherRequested; - private Network mTetherUpstream; - private TetherStatesParcel mTetherStatesParcel; - private boolean mDataSaverEnabled = false; - private String mWifiP2pTetherInterface = null; - private int mOffloadStatus = TETHER_HARDWARE_OFFLOAD_STOPPED; - - @GuardedBy("mPublicSync") - private EthernetManager.TetheredInterfaceRequest mEthernetIfaceRequest; - @GuardedBy("mPublicSync") - private String mConfiguredEthernetIface; - @GuardedBy("mPublicSync") - private EthernetCallback mEthernetCallback; - - public Tethering(TetheringDependencies deps) { - mLog.mark("Tethering.constructed"); - mDeps = deps; - mContext = mDeps.getContext(); - mNetd = mDeps.getINetd(mContext); - mLooper = mDeps.getTetheringLooper(); - mNotificationUpdater = mDeps.getNotificationUpdater(mContext, mLooper); - - mPublicSync = new Object(); - - mTetherStates = new ArrayMap<>(); - mConnectedClientsTracker = new ConnectedClientsTracker(); - - mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper, deps); - mTetherMasterSM.start(); - - mHandler = mTetherMasterSM.getHandler(); - mOffloadController = mDeps.getOffloadController(mHandler, mLog, - new OffloadController.Dependencies() { - - @Override - public TetheringConfiguration getTetherConfig() { - return mConfig; - } - }); - mUpstreamNetworkMonitor = mDeps.getUpstreamNetworkMonitor(mContext, mTetherMasterSM, mLog, - TetherMasterSM.EVENT_UPSTREAM_CALLBACK); - mForwardedDownstreams = new LinkedHashSet<>(); - - IntentFilter filter = new IntentFilter(); - filter.addAction(ACTION_CARRIER_CONFIG_CHANGED); - // EntitlementManager will send EVENT_UPSTREAM_PERMISSION_CHANGED when cellular upstream - // permission is changed according to entitlement check result. - mEntitlementMgr = mDeps.getEntitlementManager(mContext, mHandler, mLog, - () -> mTetherMasterSM.sendMessage( - TetherMasterSM.EVENT_UPSTREAM_PERMISSION_CHANGED)); - mEntitlementMgr.setOnUiEntitlementFailedListener((int downstream) -> { - mLog.log("OBSERVED UiEnitlementFailed"); - stopTethering(downstream); - }); - mEntitlementMgr.setTetheringConfigurationFetcher(() -> { - return mConfig; - }); - - mCarrierConfigChange = new VersionedBroadcastListener( - "CarrierConfigChangeListener", mContext, mHandler, filter, - (Intent ignored) -> { - mLog.log("OBSERVED carrier config change"); - updateConfiguration(); - mEntitlementMgr.reevaluateSimCardProvisioning(mConfig); - }); - - mStateReceiver = new StateReceiver(); - - mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - mTetheringRestriction = new UserRestrictionActionListener( - mUserManager, this, mNotificationUpdater); - mExecutor = new TetheringThreadExecutor(mHandler); - mActiveDataSubIdListener = new ActiveDataSubIdListener(mExecutor); - mNetdCallback = new NetdCallback(); - mPrivateAddressCoordinator = new PrivateAddressCoordinator(mContext); - - // Load tethering configuration. - updateConfiguration(); - - // Must be initialized after tethering configuration is loaded because BpfCoordinator - // constructor needs to use the configuration. - mBpfCoordinator = mDeps.getBpfCoordinator( - new BpfCoordinator.Dependencies() { - @NonNull - public Handler getHandler() { - return mHandler; - } - - @NonNull - public INetd getNetd() { - return mNetd; - } - - @NonNull - public NetworkStatsManager getNetworkStatsManager() { - return mContext.getSystemService(NetworkStatsManager.class); - } - - @NonNull - public SharedLog getSharedLog() { - return mLog; - } - - @Nullable - public TetheringConfiguration getTetherConfig() { - return mConfig; - } - }); - - startStateMachineUpdaters(); - } - - /** - * Start to register callbacks. - * Call this function when tethering is ready to handle callback events. - */ - private void startStateMachineUpdaters() { - try { - mNetd.registerUnsolicitedEventListener(mNetdCallback); - } catch (RemoteException e) { - mLog.e("Unable to register netd UnsolicitedEventListener"); - } - mCarrierConfigChange.startListening(); - mContext.getSystemService(TelephonyManager.class).listen(mActiveDataSubIdListener, - PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE); - - IntentFilter filter = new IntentFilter(); - filter.addAction(UsbManager.ACTION_USB_STATE); - filter.addAction(CONNECTIVITY_ACTION); - filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); - filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); - filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); - filter.addAction(UserManager.ACTION_USER_RESTRICTIONS_CHANGED); - filter.addAction(ACTION_RESTRICT_BACKGROUND_CHANGED); - mContext.registerReceiver(mStateReceiver, filter, null, mHandler); - - final IntentFilter noUpstreamFilter = new IntentFilter(); - noUpstreamFilter.addAction(TetheringNotificationUpdater.ACTION_DISABLE_TETHERING); - mContext.registerReceiver( - mStateReceiver, noUpstreamFilter, PERMISSION_MAINLINE_NETWORK_STACK, mHandler); - - final WifiManager wifiManager = getWifiManager(); - if (wifiManager != null) { - wifiManager.registerSoftApCallback(mExecutor, new TetheringSoftApCallback()); - } - - startTrackDefaultNetwork(); - } - - private class TetheringThreadExecutor implements Executor { - private final Handler mTetherHandler; - TetheringThreadExecutor(Handler handler) { - mTetherHandler = handler; - } - @Override - public void execute(Runnable command) { - if (!mTetherHandler.post(command)) { - throw new RejectedExecutionException(mTetherHandler + " is shutting down"); - } - } - } - - private class ActiveDataSubIdListener extends PhoneStateListener { - ActiveDataSubIdListener(Executor executor) { - super(executor); - } - - @Override - public void onActiveDataSubscriptionIdChanged(int subId) { - mLog.log("OBSERVED active data subscription change, from " + mActiveDataSubId - + " to " + subId); - if (subId == mActiveDataSubId) return; - - mActiveDataSubId = subId; - updateConfiguration(); - mNotificationUpdater.onActiveDataSubscriptionIdChanged(subId); - // To avoid launching unexpected provisioning checks, ignore re-provisioning - // when no CarrierConfig loaded yet. Assume reevaluateSimCardProvisioning() - // will be triggered again when CarrierConfig is loaded. - if (mEntitlementMgr.getCarrierConfig(mConfig) != null) { - mEntitlementMgr.reevaluateSimCardProvisioning(mConfig); - } else { - mLog.log("IGNORED reevaluate provisioning, no carrier config loaded"); - } - } - } - - private WifiManager getWifiManager() { - return (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); - } - - // NOTE: This is always invoked on the mLooper thread. - private void updateConfiguration() { - mConfig = mDeps.generateTetheringConfiguration(mContext, mLog, mActiveDataSubId); - mUpstreamNetworkMonitor.updateMobileRequiresDun(mConfig.isDunRequired); - reportConfigurationChanged(mConfig.toStableParcelable()); - } - - private void maybeDunSettingChanged() { - final boolean isDunRequired = TetheringConfiguration.checkDunRequired(mContext); - if (isDunRequired == mConfig.isDunRequired) return; - updateConfiguration(); - } - - private class NetdCallback extends BaseNetdUnsolicitedEventListener { - @Override - public void onInterfaceChanged(String ifName, boolean up) { - mHandler.post(() -> interfaceStatusChanged(ifName, up)); - } - - @Override - public void onInterfaceLinkStateChanged(String ifName, boolean up) { - mHandler.post(() -> interfaceLinkStateChanged(ifName, up)); - } - - @Override - public void onInterfaceAdded(String ifName) { - mHandler.post(() -> interfaceAdded(ifName)); - } - - @Override - public void onInterfaceRemoved(String ifName) { - mHandler.post(() -> interfaceRemoved(ifName)); - } - } - - private class TetheringSoftApCallback implements WifiManager.SoftApCallback { - // TODO: Remove onStateChanged override when this method has default on - // WifiManager#SoftApCallback interface. - // Wifi listener for state change of the soft AP - @Override - public void onStateChanged(final int state, final int failureReason) { - // Nothing - } - - // Called by wifi when the number of soft AP clients changed. - @Override - public void onConnectedClientsChanged(final List<WifiClient> clients) { - updateConnectedClients(clients); - } - } - - void interfaceStatusChanged(String iface, boolean up) { - // Never called directly: only called from interfaceLinkStateChanged. - // See NetlinkHandler.cpp: notifyInterfaceChanged. - if (VDBG) Log.d(TAG, "interfaceStatusChanged " + iface + ", " + up); - synchronized (mPublicSync) { - if (up) { - maybeTrackNewInterfaceLocked(iface); - } else { - if (ifaceNameToType(iface) == TETHERING_BLUETOOTH - || ifaceNameToType(iface) == TETHERING_WIGIG) { - stopTrackingInterfaceLocked(iface); - } else { - // Ignore usb0 down after enabling RNDIS. - // We will handle disconnect in interfaceRemoved. - // Similarly, ignore interface down for WiFi. We monitor WiFi AP status - // through the WifiManager.WIFI_AP_STATE_CHANGED_ACTION intent. - if (VDBG) Log.d(TAG, "ignore interface down for " + iface); - } - } - } - } - - void interfaceLinkStateChanged(String iface, boolean up) { - interfaceStatusChanged(iface, up); - } - - private int ifaceNameToType(String iface) { - final TetheringConfiguration cfg = mConfig; - - if (cfg.isWifi(iface)) { - return TETHERING_WIFI; - } else if (cfg.isWigig(iface)) { - return TETHERING_WIGIG; - } else if (cfg.isWifiP2p(iface)) { - return TETHERING_WIFI_P2P; - } else if (cfg.isUsb(iface)) { - return TETHERING_USB; - } else if (cfg.isBluetooth(iface)) { - return TETHERING_BLUETOOTH; - } else if (cfg.isNcm(iface)) { - return TETHERING_NCM; - } - return TETHERING_INVALID; - } - - void interfaceAdded(String iface) { - if (VDBG) Log.d(TAG, "interfaceAdded " + iface); - synchronized (mPublicSync) { - maybeTrackNewInterfaceLocked(iface); - } - } - - void interfaceRemoved(String iface) { - if (VDBG) Log.d(TAG, "interfaceRemoved " + iface); - synchronized (mPublicSync) { - stopTrackingInterfaceLocked(iface); - } - } - - void startTethering(final TetheringRequestParcel request, final IIntResultListener listener) { - mHandler.post(() -> { - final TetheringRequestParcel unfinishedRequest = mActiveTetheringRequests.get( - request.tetheringType); - // If tethering is already enabled with a different request, - // disable before re-enabling. - if (unfinishedRequest != null - && !TetheringUtils.isTetheringRequestEquals(unfinishedRequest, request)) { - enableTetheringInternal(request.tetheringType, false /* disabled */, null); - mEntitlementMgr.stopProvisioningIfNeeded(request.tetheringType); - } - mActiveTetheringRequests.put(request.tetheringType, request); - - if (request.exemptFromEntitlementCheck) { - mEntitlementMgr.setExemptedDownstreamType(request.tetheringType); - } else { - mEntitlementMgr.startProvisioningIfNeeded(request.tetheringType, - request.showProvisioningUi); - } - enableTetheringInternal(request.tetheringType, true /* enabled */, listener); - }); - } - - void stopTethering(int type) { - mHandler.post(() -> { - mActiveTetheringRequests.remove(type); - - enableTetheringInternal(type, false /* disabled */, null); - mEntitlementMgr.stopProvisioningIfNeeded(type); - }); - } - - /** - * Enables or disables tethering for the given type. If provisioning is required, it will - * schedule provisioning rechecks for the specified interface. - */ - private void enableTetheringInternal(int type, boolean enable, - final IIntResultListener listener) { - int result = TETHER_ERROR_NO_ERROR; - switch (type) { - case TETHERING_WIFI: - result = setWifiTethering(enable); - break; - case TETHERING_USB: - result = setUsbTethering(enable); - break; - case TETHERING_BLUETOOTH: - setBluetoothTethering(enable, listener); - break; - case TETHERING_NCM: - result = setNcmTethering(enable); - break; - case TETHERING_ETHERNET: - result = setEthernetTethering(enable); - break; - default: - Log.w(TAG, "Invalid tether type."); - result = TETHER_ERROR_UNKNOWN_TYPE; - } - - // The result of Bluetooth tethering will be sent by #setBluetoothTethering. - if (type != TETHERING_BLUETOOTH) { - sendTetherResult(listener, result, type); - } - } - - private void sendTetherResult(final IIntResultListener listener, final int result, - final int type) { - if (listener != null) { - try { - listener.onResult(result); - } catch (RemoteException e) { } - } - - // If changing tethering fail, remove corresponding request - // no matter who trigger the start/stop. - if (result != TETHER_ERROR_NO_ERROR) mActiveTetheringRequests.remove(type); - } - - private int setWifiTethering(final boolean enable) { - final long ident = Binder.clearCallingIdentity(); - try { - synchronized (mPublicSync) { - final WifiManager mgr = getWifiManager(); - if (mgr == null) { - mLog.e("setWifiTethering: failed to get WifiManager!"); - return TETHER_ERROR_SERVICE_UNAVAIL; - } - if ((enable && mgr.startTetheredHotspot(null /* use existing softap config */)) - || (!enable && mgr.stopSoftAp())) { - mWifiTetherRequested = enable; - return TETHER_ERROR_NO_ERROR; - } - } - } finally { - Binder.restoreCallingIdentity(ident); - } - - return TETHER_ERROR_INTERNAL_ERROR; - } - - private void setBluetoothTethering(final boolean enable, final IIntResultListener listener) { - final BluetoothAdapter adapter = mDeps.getBluetoothAdapter(); - if (adapter == null || !adapter.isEnabled()) { - Log.w(TAG, "Tried to enable bluetooth tethering with null or disabled adapter. null: " - + (adapter == null)); - sendTetherResult(listener, TETHER_ERROR_SERVICE_UNAVAIL, TETHERING_BLUETOOTH); - return; - } - - adapter.getProfileProxy(mContext, new ServiceListener() { - @Override - public void onServiceDisconnected(int profile) { } - - @Override - public void onServiceConnected(int profile, BluetoothProfile proxy) { - // Clear identify is fine because caller already pass tethering permission at - // ConnectivityService#startTethering()(or stopTethering) before the control comes - // here. Bluetooth will check tethering permission again that there is - // Context#getOpPackageName() under BluetoothPan#setBluetoothTethering() to get - // caller's package name for permission check. - // Calling BluetoothPan#setBluetoothTethering() here means the package name always - // be system server. If calling identity is not cleared, that package's uid might - // not match calling uid and end up in permission denied. - final long identityToken = Binder.clearCallingIdentity(); - try { - ((BluetoothPan) proxy).setBluetoothTethering(enable); - } finally { - Binder.restoreCallingIdentity(identityToken); - } - // TODO: Enabling bluetooth tethering can fail asynchronously here. - // We should figure out a way to bubble up that failure instead of sending success. - final int result = (((BluetoothPan) proxy).isTetheringOn() == enable) - ? TETHER_ERROR_NO_ERROR - : TETHER_ERROR_INTERNAL_ERROR; - sendTetherResult(listener, result, TETHERING_BLUETOOTH); - adapter.closeProfileProxy(BluetoothProfile.PAN, proxy); - } - }, BluetoothProfile.PAN); - } - - private int setEthernetTethering(final boolean enable) { - final EthernetManager em = (EthernetManager) mContext.getSystemService( - Context.ETHERNET_SERVICE); - synchronized (mPublicSync) { - if (enable) { - if (mEthernetCallback != null) { - Log.d(TAG, "Ethernet tethering already started"); - return TETHER_ERROR_NO_ERROR; - } - - mEthernetCallback = new EthernetCallback(); - mEthernetIfaceRequest = em.requestTetheredInterface(mExecutor, mEthernetCallback); - } else { - stopEthernetTetheringLocked(); - } - } - return TETHER_ERROR_NO_ERROR; - } - - private void stopEthernetTetheringLocked() { - if (mConfiguredEthernetIface != null) { - stopTrackingInterfaceLocked(mConfiguredEthernetIface); - mConfiguredEthernetIface = null; - } - if (mEthernetCallback != null) { - mEthernetIfaceRequest.release(); - mEthernetCallback = null; - mEthernetIfaceRequest = null; - } - } - - private class EthernetCallback implements EthernetManager.TetheredInterfaceCallback { - @Override - public void onAvailable(String iface) { - synchronized (mPublicSync) { - if (this != mEthernetCallback) { - // Ethernet callback arrived after Ethernet tethering stopped. Ignore. - return; - } - maybeTrackNewInterfaceLocked(iface, TETHERING_ETHERNET); - changeInterfaceState(iface, IpServer.STATE_TETHERED); - mConfiguredEthernetIface = iface; - } - } - - @Override - public void onUnavailable() { - synchronized (mPublicSync) { - if (this != mEthernetCallback) { - // onAvailable called after stopping Ethernet tethering. - return; - } - stopEthernetTetheringLocked(); - } - } - } - - int tether(String iface) { - return tether(iface, IpServer.STATE_TETHERED); - } - - private int tether(String iface, int requestedState) { - if (DBG) Log.d(TAG, "Tethering " + iface); - synchronized (mPublicSync) { - TetherState tetherState = mTetherStates.get(iface); - if (tetherState == null) { - Log.e(TAG, "Tried to Tether an unknown iface: " + iface + ", ignoring"); - return TETHER_ERROR_UNKNOWN_IFACE; - } - // Ignore the error status of the interface. If the interface is available, - // the errors are referring to past tethering attempts anyway. - if (tetherState.lastState != IpServer.STATE_AVAILABLE) { - Log.e(TAG, "Tried to Tether an unavailable iface: " + iface + ", ignoring"); - return TETHER_ERROR_UNAVAIL_IFACE; - } - // NOTE: If a CMD_TETHER_REQUESTED message is already in the TISM's queue but not yet - // processed, this will be a no-op and it will not return an error. - // - // This code cannot race with untether() because they both synchronize on mPublicSync. - // TODO: reexamine the threading and messaging model to totally remove mPublicSync. - final int type = tetherState.ipServer.interfaceType(); - final TetheringRequestParcel request = mActiveTetheringRequests.get(type, null); - if (request != null) { - mActiveTetheringRequests.delete(type); - } - tetherState.ipServer.sendMessage(IpServer.CMD_TETHER_REQUESTED, requestedState, 0, - request); - return TETHER_ERROR_NO_ERROR; - } - } - - int untether(String iface) { - if (DBG) Log.d(TAG, "Untethering " + iface); - synchronized (mPublicSync) { - TetherState tetherState = mTetherStates.get(iface); - if (tetherState == null) { - Log.e(TAG, "Tried to Untether an unknown iface :" + iface + ", ignoring"); - return TETHER_ERROR_UNKNOWN_IFACE; - } - if (!tetherState.isCurrentlyServing()) { - Log.e(TAG, "Tried to untether an inactive iface :" + iface + ", ignoring"); - return TETHER_ERROR_UNAVAIL_IFACE; - } - tetherState.ipServer.sendMessage(IpServer.CMD_TETHER_UNREQUESTED); - return TETHER_ERROR_NO_ERROR; - } - } - - void untetherAll() { - stopTethering(TETHERING_WIFI); - stopTethering(TETHERING_WIFI_P2P); - stopTethering(TETHERING_USB); - stopTethering(TETHERING_BLUETOOTH); - stopTethering(TETHERING_ETHERNET); - } - - int getLastTetherError(String iface) { - synchronized (mPublicSync) { - TetherState tetherState = mTetherStates.get(iface); - if (tetherState == null) { - Log.e(TAG, "Tried to getLastTetherError on an unknown iface :" + iface - + ", ignoring"); - return TETHER_ERROR_UNKNOWN_IFACE; - } - return tetherState.lastError; - } - } - - private boolean isProvisioningNeededButUnavailable() { - return isTetherProvisioningRequired() && !doesEntitlementPackageExist(); - } - - boolean isTetherProvisioningRequired() { - final TetheringConfiguration cfg = mConfig; - return mEntitlementMgr.isTetherProvisioningRequired(cfg); - } - - private boolean doesEntitlementPackageExist() { - // provisioningApp must contain package and class name. - if (mConfig.provisioningApp.length != 2) { - return false; - } - - final PackageManager pm = mContext.getPackageManager(); - try { - pm.getPackageInfo(mConfig.provisioningApp[0], GET_ACTIVITIES); - } catch (PackageManager.NameNotFoundException e) { - return false; - } - return true; - } - - // TODO: Figure out how to update for local hotspot mode interfaces. - private void sendTetherStateChangedBroadcast() { - if (!isTetheringSupported()) return; - - final ArrayList<String> availableList = new ArrayList<>(); - final ArrayList<String> tetherList = new ArrayList<>(); - final ArrayList<String> localOnlyList = new ArrayList<>(); - final ArrayList<String> erroredList = new ArrayList<>(); - final ArrayList<Integer> lastErrorList = new ArrayList<>(); - - final TetheringConfiguration cfg = mConfig; - mTetherStatesParcel = new TetherStatesParcel(); - - int downstreamTypesMask = DOWNSTREAM_NONE; - synchronized (mPublicSync) { - for (int i = 0; i < mTetherStates.size(); i++) { - TetherState tetherState = mTetherStates.valueAt(i); - String iface = mTetherStates.keyAt(i); - if (tetherState.lastError != TETHER_ERROR_NO_ERROR) { - erroredList.add(iface); - lastErrorList.add(tetherState.lastError); - } else if (tetherState.lastState == IpServer.STATE_AVAILABLE) { - availableList.add(iface); - } else if (tetherState.lastState == IpServer.STATE_LOCAL_ONLY) { - localOnlyList.add(iface); - } else if (tetherState.lastState == IpServer.STATE_TETHERED) { - if (cfg.isUsb(iface)) { - downstreamTypesMask |= (1 << TETHERING_USB); - } else if (cfg.isWifi(iface)) { - downstreamTypesMask |= (1 << TETHERING_WIFI); - } else if (cfg.isBluetooth(iface)) { - downstreamTypesMask |= (1 << TETHERING_BLUETOOTH); - } - tetherList.add(iface); - } - } - } - - mTetherStatesParcel.availableList = availableList.toArray(new String[0]); - mTetherStatesParcel.tetheredList = tetherList.toArray(new String[0]); - mTetherStatesParcel.localOnlyList = localOnlyList.toArray(new String[0]); - mTetherStatesParcel.erroredIfaceList = erroredList.toArray(new String[0]); - mTetherStatesParcel.lastErrorList = new int[lastErrorList.size()]; - Iterator<Integer> iterator = lastErrorList.iterator(); - for (int i = 0; i < lastErrorList.size(); i++) { - mTetherStatesParcel.lastErrorList[i] = iterator.next().intValue(); - } - reportTetherStateChanged(mTetherStatesParcel); - - final Intent bcast = new Intent(ACTION_TETHER_STATE_CHANGED); - bcast.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); - bcast.putStringArrayListExtra(EXTRA_AVAILABLE_TETHER, availableList); - bcast.putStringArrayListExtra(EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList); - bcast.putStringArrayListExtra(EXTRA_ACTIVE_TETHER, tetherList); - bcast.putStringArrayListExtra(EXTRA_ERRORED_TETHER, erroredList); - mContext.sendStickyBroadcastAsUser(bcast, UserHandle.ALL); - if (DBG) { - Log.d(TAG, String.format( - "sendTetherStateChangedBroadcast %s=[%s] %s=[%s] %s=[%s] %s=[%s]", - "avail", TextUtils.join(",", availableList), - "local_only", TextUtils.join(",", localOnlyList), - "tether", TextUtils.join(",", tetherList), - "error", TextUtils.join(",", erroredList))); - } - - mNotificationUpdater.onDownstreamChanged(downstreamTypesMask); - } - - private class StateReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context content, Intent intent) { - final String action = intent.getAction(); - if (action == null) return; - - if (action.equals(UsbManager.ACTION_USB_STATE)) { - handleUsbAction(intent); - } else if (action.equals(CONNECTIVITY_ACTION)) { - handleConnectivityAction(intent); - } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) { - handleWifiApAction(intent); - } else if (action.equals(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)) { - handleWifiP2pAction(intent); - } else if (action.equals(Intent.ACTION_CONFIGURATION_CHANGED)) { - mLog.log("OBSERVED configuration changed"); - updateConfiguration(); - } else if (action.equals(UserManager.ACTION_USER_RESTRICTIONS_CHANGED)) { - mLog.log("OBSERVED user restrictions changed"); - handleUserRestrictionAction(); - } else if (action.equals(ACTION_RESTRICT_BACKGROUND_CHANGED)) { - mLog.log("OBSERVED data saver changed"); - handleDataSaverChanged(); - } else if (action.equals(TetheringNotificationUpdater.ACTION_DISABLE_TETHERING)) { - untetherAll(); - } - } - - private void handleConnectivityAction(Intent intent) { - final NetworkInfo networkInfo = - (NetworkInfo) intent.getParcelableExtra(EXTRA_NETWORK_INFO); - if (networkInfo == null - || networkInfo.getDetailedState() == NetworkInfo.DetailedState.FAILED) { - return; - } - - if (VDBG) Log.d(TAG, "Tethering got CONNECTIVITY_ACTION: " + networkInfo.toString()); - mTetherMasterSM.sendMessage(TetherMasterSM.CMD_UPSTREAM_CHANGED); - } - - private void handleUsbAction(Intent intent) { - final boolean usbConnected = intent.getBooleanExtra(USB_CONNECTED, false); - final boolean usbConfigured = intent.getBooleanExtra(USB_CONFIGURED, false); - final boolean rndisEnabled = intent.getBooleanExtra(USB_FUNCTION_RNDIS, false); - final boolean ncmEnabled = intent.getBooleanExtra(USB_FUNCTION_NCM, false); - - mLog.log(String.format("USB bcast connected:%s configured:%s rndis:%s", - usbConnected, usbConfigured, rndisEnabled)); - - // There are three types of ACTION_USB_STATE: - // - // - DISCONNECTED (USB_CONNECTED and USB_CONFIGURED are 0) - // Meaning: USB connection has ended either because of - // software reset or hard unplug. - // - // - CONNECTED (USB_CONNECTED is 1, USB_CONFIGURED is 0) - // Meaning: the first stage of USB protocol handshake has - // occurred but it is not complete. - // - // - CONFIGURED (USB_CONNECTED and USB_CONFIGURED are 1) - // Meaning: the USB handshake is completely done and all the - // functions are ready to use. - // - // For more explanation, see b/62552150 . - synchronized (Tethering.this.mPublicSync) { - if (!usbConnected && mRndisEnabled) { - // Turn off tethering if it was enabled and there is a disconnect. - tetherMatchingInterfaces(IpServer.STATE_AVAILABLE, TETHERING_USB); - mEntitlementMgr.stopProvisioningIfNeeded(TETHERING_USB); - } else if (usbConfigured && rndisEnabled) { - // Tether if rndis is enabled and usb is configured. - tetherMatchingInterfaces(IpServer.STATE_TETHERED, TETHERING_USB); - } else if (usbConnected && ncmEnabled) { - tetherMatchingInterfaces(IpServer.STATE_LOCAL_ONLY, TETHERING_NCM); - } - mRndisEnabled = usbConfigured && rndisEnabled; - } - } - - private void handleWifiApAction(Intent intent) { - final int curState = intent.getIntExtra(EXTRA_WIFI_AP_STATE, WIFI_AP_STATE_DISABLED); - final String ifname = intent.getStringExtra(EXTRA_WIFI_AP_INTERFACE_NAME); - final int ipmode = intent.getIntExtra(EXTRA_WIFI_AP_MODE, IFACE_IP_MODE_UNSPECIFIED); - - synchronized (Tethering.this.mPublicSync) { - switch (curState) { - case WifiManager.WIFI_AP_STATE_ENABLING: - // We can see this state on the way to both enabled and failure states. - break; - case WifiManager.WIFI_AP_STATE_ENABLED: - enableWifiIpServingLocked(ifname, ipmode); - break; - case WifiManager.WIFI_AP_STATE_DISABLING: - // We can see this state on the way to disabled. - break; - case WifiManager.WIFI_AP_STATE_DISABLED: - case WifiManager.WIFI_AP_STATE_FAILED: - default: - disableWifiIpServingLocked(ifname, curState); - break; - } - } - } - - private boolean isGroupOwner(WifiP2pGroup group) { - return group != null && group.isGroupOwner() - && !TextUtils.isEmpty(group.getInterface()); - } - - private void handleWifiP2pAction(Intent intent) { - if (mConfig.isWifiP2pLegacyTetheringMode()) return; - - final WifiP2pInfo p2pInfo = - (WifiP2pInfo) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO); - final WifiP2pGroup group = - (WifiP2pGroup) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP); - - if (VDBG) { - Log.d(TAG, "WifiP2pAction: P2pInfo: " + p2pInfo + " Group: " + group); - } - - synchronized (Tethering.this.mPublicSync) { - // if no group is formed, bring it down if needed. - if (p2pInfo == null || !p2pInfo.groupFormed) { - disableWifiP2pIpServingLockedIfNeeded(mWifiP2pTetherInterface); - mWifiP2pTetherInterface = null; - return; - } - - // If there is a group but the device is not the owner, bail out. - if (!isGroupOwner(group)) return; - - // If already serving from the correct interface, nothing to do. - if (group.getInterface().equals(mWifiP2pTetherInterface)) return; - - // If already serving from another interface, turn it down first. - if (!TextUtils.isEmpty(mWifiP2pTetherInterface)) { - mLog.w("P2P tethered interface " + mWifiP2pTetherInterface - + "is different from current interface " - + group.getInterface() + ", re-tether it"); - disableWifiP2pIpServingLockedIfNeeded(mWifiP2pTetherInterface); - } - - // Finally bring up serving on the new interface - mWifiP2pTetherInterface = group.getInterface(); - enableWifiIpServingLocked(mWifiP2pTetherInterface, IFACE_IP_MODE_LOCAL_ONLY); - } - } - - private void handleUserRestrictionAction() { - mTetheringRestriction.onUserRestrictionsChanged(); - } - - private void handleDataSaverChanged() { - final ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService( - Context.CONNECTIVITY_SERVICE); - final boolean isDataSaverEnabled = connMgr.getRestrictBackgroundStatus() - != ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED; - - if (mDataSaverEnabled == isDataSaverEnabled) return; - - mDataSaverEnabled = isDataSaverEnabled; - if (mDataSaverEnabled) { - untetherAll(); - } - } - } - - @VisibleForTesting - boolean isTetheringActive() { - return mActiveTetheringRequests.size() > 0; - } - - @VisibleForTesting - protected static class UserRestrictionActionListener { - private final UserManager mUserMgr; - private final Tethering mWrapper; - private final TetheringNotificationUpdater mNotificationUpdater; - public boolean mDisallowTethering; - - public UserRestrictionActionListener(@NonNull UserManager um, @NonNull Tethering wrapper, - @NonNull TetheringNotificationUpdater updater) { - mUserMgr = um; - mWrapper = wrapper; - mNotificationUpdater = updater; - mDisallowTethering = false; - } - - public void onUserRestrictionsChanged() { - // getUserRestrictions gets restriction for this process' user, which is the primary - // user. This is fine because DISALLOW_CONFIG_TETHERING can only be set on the primary - // user. See UserManager.DISALLOW_CONFIG_TETHERING. - final Bundle restrictions = mUserMgr.getUserRestrictions(); - final boolean newlyDisallowed = - restrictions.getBoolean(UserManager.DISALLOW_CONFIG_TETHERING); - final boolean prevDisallowed = mDisallowTethering; - mDisallowTethering = newlyDisallowed; - - final boolean tetheringDisallowedChanged = (newlyDisallowed != prevDisallowed); - if (!tetheringDisallowedChanged) { - return; - } - - if (!newlyDisallowed) { - // Clear the restricted notification when user is allowed to have tethering - // function. - mNotificationUpdater.tetheringRestrictionLifted(); - return; - } - - if (mWrapper.isTetheringActive()) { - // Restricted notification is shown when tethering function is disallowed on - // user's device. - mNotificationUpdater.notifyTetheringDisabledByRestriction(); - - // Untether from all downstreams since tethering is disallowed. - mWrapper.untetherAll(); - } - // TODO(b/148139325): send tetheringSupported on restriction change - } - } - - private void disableWifiIpServingLockedCommon(int tetheringType, String ifname, int apState) { - mLog.log("Canceling WiFi tethering request -" - + " type=" + tetheringType - + " interface=" + ifname - + " state=" + apState); - - if (!TextUtils.isEmpty(ifname)) { - final TetherState ts = mTetherStates.get(ifname); - if (ts != null) { - ts.ipServer.unwanted(); - return; - } - } - - for (int i = 0; i < mTetherStates.size(); i++) { - final IpServer ipServer = mTetherStates.valueAt(i).ipServer; - if (ipServer.interfaceType() == tetheringType) { - ipServer.unwanted(); - return; - } - } - - mLog.log("Error disabling Wi-Fi IP serving; " - + (TextUtils.isEmpty(ifname) ? "no interface name specified" - : "specified interface: " + ifname)); - } - - private void disableWifiIpServingLocked(String ifname, int apState) { - // Regardless of whether we requested this transition, the AP has gone - // down. Don't try to tether again unless we're requested to do so. - // TODO: Remove this altogether, once Wi-Fi reliably gives us an - // interface name with every broadcast. - mWifiTetherRequested = false; - - disableWifiIpServingLockedCommon(TETHERING_WIFI, ifname, apState); - } - - private void disableWifiP2pIpServingLockedIfNeeded(String ifname) { - if (TextUtils.isEmpty(ifname)) return; - - disableWifiIpServingLockedCommon(TETHERING_WIFI_P2P, ifname, /* dummy */ 0); - } - - private void enableWifiIpServingLocked(String ifname, int wifiIpMode) { - // Map wifiIpMode values to IpServer.Callback serving states, inferring - // from mWifiTetherRequested as a final "best guess". - final int ipServingMode; - switch (wifiIpMode) { - case IFACE_IP_MODE_TETHERED: - ipServingMode = IpServer.STATE_TETHERED; - break; - case IFACE_IP_MODE_LOCAL_ONLY: - ipServingMode = IpServer.STATE_LOCAL_ONLY; - break; - default: - mLog.e("Cannot enable IP serving in unknown WiFi mode: " + wifiIpMode); - return; - } - - if (!TextUtils.isEmpty(ifname)) { - maybeTrackNewInterfaceLocked(ifname); - changeInterfaceState(ifname, ipServingMode); - } else { - mLog.e(String.format( - "Cannot enable IP serving in mode %s on missing interface name", - ipServingMode)); - } - } - - // TODO: Consider renaming to something more accurate in its description. - // This method: - // - allows requesting either tethering or local hotspot serving states - // - handles both enabling and disabling serving states - // - only tethers the first matching interface in listInterfaces() - // order of a given type - private void tetherMatchingInterfaces(int requestedState, int interfaceType) { - if (VDBG) { - Log.d(TAG, "tetherMatchingInterfaces(" + requestedState + ", " + interfaceType + ")"); - } - - String[] ifaces = null; - try { - ifaces = mNetd.interfaceGetList(); - } catch (RemoteException | ServiceSpecificException e) { - Log.e(TAG, "Error listing Interfaces", e); - return; - } - String chosenIface = null; - if (ifaces != null) { - for (String iface : ifaces) { - if (ifaceNameToType(iface) == interfaceType) { - chosenIface = iface; - break; - } - } - } - if (chosenIface == null) { - Log.e(TAG, "could not find iface of type " + interfaceType); - return; - } - - changeInterfaceState(chosenIface, requestedState); - } - - private void changeInterfaceState(String ifname, int requestedState) { - final int result; - switch (requestedState) { - case IpServer.STATE_UNAVAILABLE: - case IpServer.STATE_AVAILABLE: - result = untether(ifname); - break; - case IpServer.STATE_TETHERED: - case IpServer.STATE_LOCAL_ONLY: - result = tether(ifname, requestedState); - break; - default: - Log.wtf(TAG, "Unknown interface state: " + requestedState); - return; - } - if (result != TETHER_ERROR_NO_ERROR) { - Log.e(TAG, "unable start or stop tethering on iface " + ifname); - return; - } - } - - TetheringConfiguration getTetheringConfiguration() { - return mConfig; - } - - boolean hasTetherableConfiguration() { - final TetheringConfiguration cfg = mConfig; - final boolean hasDownstreamConfiguration = - (cfg.tetherableUsbRegexs.length != 0) - || (cfg.tetherableWifiRegexs.length != 0) - || (cfg.tetherableBluetoothRegexs.length != 0); - final boolean hasUpstreamConfiguration = !cfg.preferredUpstreamIfaceTypes.isEmpty() - || cfg.chooseUpstreamAutomatically; - - return hasDownstreamConfiguration && hasUpstreamConfiguration; - } - - // TODO - update callers to use getTetheringConfiguration(), - // which has only final members. - String[] getTetherableUsbRegexs() { - return copy(mConfig.tetherableUsbRegexs); - } - - String[] getTetherableWifiRegexs() { - return copy(mConfig.tetherableWifiRegexs); - } - - String[] getTetherableBluetoothRegexs() { - return copy(mConfig.tetherableBluetoothRegexs); - } - - int setUsbTethering(boolean enable) { - if (VDBG) Log.d(TAG, "setUsbTethering(" + enable + ")"); - UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); - if (usbManager == null) { - mLog.e("setUsbTethering: failed to get UsbManager!"); - return TETHER_ERROR_SERVICE_UNAVAIL; - } - - synchronized (mPublicSync) { - usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_RNDIS - : UsbManager.FUNCTION_NONE); - } - return TETHER_ERROR_NO_ERROR; - } - - private int setNcmTethering(boolean enable) { - if (VDBG) Log.d(TAG, "setNcmTethering(" + enable + ")"); - UsbManager usbManager = (UsbManager) mContext.getSystemService(Context.USB_SERVICE); - synchronized (mPublicSync) { - usbManager.setCurrentFunctions(enable ? UsbManager.FUNCTION_NCM - : UsbManager.FUNCTION_NONE); - } - return TETHER_ERROR_NO_ERROR; - } - - // TODO review API - figure out how to delete these entirely. - String[] getTetheredIfaces() { - ArrayList<String> list = new ArrayList<String>(); - synchronized (mPublicSync) { - for (int i = 0; i < mTetherStates.size(); i++) { - TetherState tetherState = mTetherStates.valueAt(i); - if (tetherState.lastState == IpServer.STATE_TETHERED) { - list.add(mTetherStates.keyAt(i)); - } - } - } - return list.toArray(new String[list.size()]); - } - - String[] getTetherableIfaces() { - ArrayList<String> list = new ArrayList<String>(); - synchronized (mPublicSync) { - for (int i = 0; i < mTetherStates.size(); i++) { - TetherState tetherState = mTetherStates.valueAt(i); - if (tetherState.lastState == IpServer.STATE_AVAILABLE) { - list.add(mTetherStates.keyAt(i)); - } - } - } - return list.toArray(new String[list.size()]); - } - - String[] getTetheredDhcpRanges() { - // TODO: this is only valid for the old DHCP server. Latest search suggests it is only used - // by WifiP2pServiceImpl to start dnsmasq: remove/deprecate after migrating callers. - return mConfig.legacyDhcpRanges; - } - - String[] getErroredIfaces() { - ArrayList<String> list = new ArrayList<String>(); - synchronized (mPublicSync) { - for (int i = 0; i < mTetherStates.size(); i++) { - TetherState tetherState = mTetherStates.valueAt(i); - if (tetherState.lastError != TETHER_ERROR_NO_ERROR) { - list.add(mTetherStates.keyAt(i)); - } - } - } - return list.toArray(new String[list.size()]); - } - - private void logMessage(State state, int what) { - mLog.log(state.getName() + " got " + sMagicDecoderRing.get(what, Integer.toString(what))); - } - - private boolean upstreamWanted() { - if (!mForwardedDownstreams.isEmpty()) return true; - - synchronized (mPublicSync) { - return mWifiTetherRequested; - } - } - - // Needed because the canonical source of upstream truth is just the - // upstream interface set, |mCurrentUpstreamIfaceSet|. - private boolean pertainsToCurrentUpstream(UpstreamNetworkState ns) { - if (ns != null && ns.linkProperties != null && mCurrentUpstreamIfaceSet != null) { - for (String ifname : ns.linkProperties.getAllInterfaceNames()) { - if (mCurrentUpstreamIfaceSet.ifnames.contains(ifname)) { - return true; - } - } - } - return false; - } - - class TetherMasterSM extends StateMachine { - // an interface SM has requested Tethering/Local Hotspot - static final int EVENT_IFACE_SERVING_STATE_ACTIVE = BASE_MASTER + 1; - // an interface SM has unrequested Tethering/Local Hotspot - static final int EVENT_IFACE_SERVING_STATE_INACTIVE = BASE_MASTER + 2; - // upstream connection change - do the right thing - static final int CMD_UPSTREAM_CHANGED = BASE_MASTER + 3; - // we don't have a valid upstream conn, check again after a delay - static final int CMD_RETRY_UPSTREAM = BASE_MASTER + 4; - // Events from NetworkCallbacks that we process on the master state - // machine thread on behalf of the UpstreamNetworkMonitor. - static final int EVENT_UPSTREAM_CALLBACK = BASE_MASTER + 5; - // we treated the error and want now to clear it - static final int CMD_CLEAR_ERROR = BASE_MASTER + 6; - static final int EVENT_IFACE_UPDATE_LINKPROPERTIES = BASE_MASTER + 7; - // Events from EntitlementManager to choose upstream again. - static final int EVENT_UPSTREAM_PERMISSION_CHANGED = BASE_MASTER + 8; - private final State mInitialState; - private final State mTetherModeAliveState; - - private final State mSetIpForwardingEnabledErrorState; - private final State mSetIpForwardingDisabledErrorState; - private final State mStartTetheringErrorState; - private final State mStopTetheringErrorState; - private final State mSetDnsForwardersErrorState; - - // This list is a little subtle. It contains all the interfaces that currently are - // requesting tethering, regardless of whether these interfaces are still members of - // mTetherStates. This allows us to maintain the following predicates: - // - // 1) mTetherStates contains the set of all currently existing, tetherable, link state up - // interfaces. - // 2) mNotifyList contains all state machines that may have outstanding tethering state - // that needs to be torn down. - // - // Because we excise interfaces immediately from mTetherStates, we must maintain mNotifyList - // so that the garbage collector does not clean up the state machine before it has a chance - // to tear itself down. - private final ArrayList<IpServer> mNotifyList; - private final IPv6TetheringCoordinator mIPv6TetheringCoordinator; - private final OffloadWrapper mOffload; - - private static final int UPSTREAM_SETTLE_TIME_MS = 10000; - - TetherMasterSM(String name, Looper looper, TetheringDependencies deps) { - super(name, looper); - - mInitialState = new InitialState(); - mTetherModeAliveState = new TetherModeAliveState(); - mSetIpForwardingEnabledErrorState = new SetIpForwardingEnabledErrorState(); - mSetIpForwardingDisabledErrorState = new SetIpForwardingDisabledErrorState(); - mStartTetheringErrorState = new StartTetheringErrorState(); - mStopTetheringErrorState = new StopTetheringErrorState(); - mSetDnsForwardersErrorState = new SetDnsForwardersErrorState(); - - addState(mInitialState); - addState(mTetherModeAliveState); - addState(mSetIpForwardingEnabledErrorState); - addState(mSetIpForwardingDisabledErrorState); - addState(mStartTetheringErrorState); - addState(mStopTetheringErrorState); - addState(mSetDnsForwardersErrorState); - - mNotifyList = new ArrayList<>(); - mIPv6TetheringCoordinator = deps.getIPv6TetheringCoordinator(mNotifyList, mLog); - mOffload = new OffloadWrapper(); - - setInitialState(mInitialState); - } - - class InitialState extends State { - @Override - public boolean processMessage(Message message) { - logMessage(this, message.what); - switch (message.what) { - case EVENT_IFACE_SERVING_STATE_ACTIVE: { - final IpServer who = (IpServer) message.obj; - if (VDBG) Log.d(TAG, "Tether Mode requested by " + who); - handleInterfaceServingStateActive(message.arg1, who); - transitionTo(mTetherModeAliveState); - break; - } - case EVENT_IFACE_SERVING_STATE_INACTIVE: { - final IpServer who = (IpServer) message.obj; - if (VDBG) Log.d(TAG, "Tether Mode unrequested by " + who); - handleInterfaceServingStateInactive(who); - break; - } - case EVENT_IFACE_UPDATE_LINKPROPERTIES: - // Silently ignore these for now. - break; - default: - return NOT_HANDLED; - } - return HANDLED; - } - } - - protected boolean turnOnMasterTetherSettings() { - final TetheringConfiguration cfg = mConfig; - try { - mNetd.ipfwdEnableForwarding(TAG); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e(e); - transitionTo(mSetIpForwardingEnabledErrorState); - return false; - } - - // TODO: Randomize DHCPv4 ranges, especially in hotspot mode. - // Legacy DHCP server is disabled if passed an empty ranges array - final String[] dhcpRanges = cfg.enableLegacyDhcpServer - ? cfg.legacyDhcpRanges : new String[0]; - try { - NetdUtils.tetherStart(mNetd, true /** usingLegacyDnsProxy */, dhcpRanges); - } catch (RemoteException | ServiceSpecificException e) { - try { - // Stop and retry. - mNetd.tetherStop(); - NetdUtils.tetherStart(mNetd, true /** usingLegacyDnsProxy */, dhcpRanges); - } catch (RemoteException | ServiceSpecificException ee) { - mLog.e(ee); - transitionTo(mStartTetheringErrorState); - return false; - } - } - mLog.log("SET master tether settings: ON"); - return true; - } - - protected boolean turnOffMasterTetherSettings() { - try { - mNetd.tetherStop(); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e(e); - transitionTo(mStopTetheringErrorState); - return false; - } - try { - mNetd.ipfwdDisableForwarding(TAG); - } catch (RemoteException | ServiceSpecificException e) { - mLog.e(e); - transitionTo(mSetIpForwardingDisabledErrorState); - return false; - } - transitionTo(mInitialState); - mLog.log("SET master tether settings: OFF"); - return true; - } - - protected void chooseUpstreamType(boolean tryCell) { - // We rebuild configuration on ACTION_CONFIGURATION_CHANGED, but we - // do not currently know how to watch for changes in DUN settings. - maybeDunSettingChanged(); - - final TetheringConfiguration config = mConfig; - final UpstreamNetworkState ns = (config.chooseUpstreamAutomatically) - ? mUpstreamNetworkMonitor.getCurrentPreferredUpstream() - : mUpstreamNetworkMonitor.selectPreferredUpstreamType( - config.preferredUpstreamIfaceTypes); - if (ns == null) { - if (tryCell) { - mUpstreamNetworkMonitor.registerMobileNetworkRequest(); - // We think mobile should be coming up; don't set a retry. - } else { - sendMessageDelayed(CMD_RETRY_UPSTREAM, UPSTREAM_SETTLE_TIME_MS); - } - } - setUpstreamNetwork(ns); - final Network newUpstream = (ns != null) ? ns.network : null; - if (mTetherUpstream != newUpstream) { - mTetherUpstream = newUpstream; - mUpstreamNetworkMonitor.setCurrentUpstream(mTetherUpstream); - reportUpstreamChanged(ns); - } - } - - protected void setUpstreamNetwork(UpstreamNetworkState ns) { - InterfaceSet ifaces = null; - if (ns != null) { - // Find the interface with the default IPv4 route. It may be the - // interface described by linkProperties, or one of the interfaces - // stacked on top of it. - mLog.i("Looking for default routes on: " + ns.linkProperties); - ifaces = TetheringInterfaceUtils.getTetheringInterfaces(ns); - mLog.i("Found upstream interface(s): " + ifaces); - } - - if (ifaces != null) { - setDnsForwarders(ns.network, ns.linkProperties); - } - notifyDownstreamsOfNewUpstreamIface(ifaces); - if (ns != null && pertainsToCurrentUpstream(ns)) { - // If we already have UpstreamNetworkState for this network update it immediately. - handleNewUpstreamNetworkState(ns); - } else if (mCurrentUpstreamIfaceSet == null) { - // There are no available upstream networks. - handleNewUpstreamNetworkState(null); - } - } - - protected void setDnsForwarders(final Network network, final LinkProperties lp) { - // TODO: Set v4 and/or v6 DNS per available connectivity. - final Collection<InetAddress> dnses = lp.getDnsServers(); - // TODO: Properly support the absence of DNS servers. - final String[] dnsServers; - if (dnses != null && !dnses.isEmpty()) { - dnsServers = new String[dnses.size()]; - int i = 0; - for (InetAddress dns : dnses) { - dnsServers[i++] = dns.getHostAddress(); - } - } else { - dnsServers = mConfig.defaultIPv4DNS; - } - final int netId = (network != null) ? network.getNetId() : NETID_UNSET; - try { - mNetd.tetherDnsSet(netId, dnsServers); - mLog.log(String.format( - "SET DNS forwarders: network=%s dnsServers=%s", - network, Arrays.toString(dnsServers))); - } catch (RemoteException | ServiceSpecificException e) { - // TODO: Investigate how this can fail and what exactly - // happens if/when such failures occur. - mLog.e("setting DNS forwarders failed, " + e); - transitionTo(mSetDnsForwardersErrorState); - } - } - - protected void notifyDownstreamsOfNewUpstreamIface(InterfaceSet ifaces) { - mCurrentUpstreamIfaceSet = ifaces; - for (IpServer ipServer : mNotifyList) { - ipServer.sendMessage(IpServer.CMD_TETHER_CONNECTION_CHANGED, ifaces); - } - } - - protected void handleNewUpstreamNetworkState(UpstreamNetworkState ns) { - mIPv6TetheringCoordinator.updateUpstreamNetworkState(ns); - mOffload.updateUpstreamNetworkState(ns); - } - - private void handleInterfaceServingStateActive(int mode, IpServer who) { - if (mNotifyList.indexOf(who) < 0) { - mNotifyList.add(who); - mIPv6TetheringCoordinator.addActiveDownstream(who, mode); - } - - if (mode == IpServer.STATE_TETHERED) { - // No need to notify OffloadController just yet as there are no - // "offload-able" prefixes to pass along. This will handled - // when the TISM informs Tethering of its LinkProperties. - mForwardedDownstreams.add(who); - } else { - mOffload.excludeDownstreamInterface(who.interfaceName()); - mForwardedDownstreams.remove(who); - } - - // If this is a Wi-Fi interface, notify WifiManager of the active serving state. - if (who.interfaceType() == TETHERING_WIFI) { - final WifiManager mgr = getWifiManager(); - final String iface = who.interfaceName(); - switch (mode) { - case IpServer.STATE_TETHERED: - mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_TETHERED); - break; - case IpServer.STATE_LOCAL_ONLY: - mgr.updateInterfaceIpState(iface, IFACE_IP_MODE_LOCAL_ONLY); - break; - default: - Log.wtf(TAG, "Unknown active serving mode: " + mode); - break; - } - } - } - - private void handleInterfaceServingStateInactive(IpServer who) { - mNotifyList.remove(who); - mIPv6TetheringCoordinator.removeActiveDownstream(who); - mOffload.excludeDownstreamInterface(who.interfaceName()); - mForwardedDownstreams.remove(who); - updateConnectedClients(null /* wifiClients */); - - // If this is a Wi-Fi interface, tell WifiManager of any errors - // or the inactive serving state. - if (who.interfaceType() == TETHERING_WIFI) { - if (who.lastError() != TETHER_ERROR_NO_ERROR) { - getWifiManager().updateInterfaceIpState( - who.interfaceName(), IFACE_IP_MODE_CONFIGURATION_ERROR); - } else { - getWifiManager().updateInterfaceIpState( - who.interfaceName(), IFACE_IP_MODE_UNSPECIFIED); - } - } - } - - private void addUpstreamPrefixes(final UpstreamNetworkState ns) { - mPrivateAddressCoordinator.updateUpstreamPrefix(ns.network, ns.linkProperties); - } - - private void removeUpstreamPrefixes(final UpstreamNetworkState ns) { - mPrivateAddressCoordinator.removeUpstreamPrefix(ns.network); - } - - @VisibleForTesting - void handleUpstreamNetworkMonitorCallback(int arg1, Object o) { - if (arg1 == UpstreamNetworkMonitor.NOTIFY_LOCAL_PREFIXES) { - mOffload.sendOffloadExemptPrefixes((Set<IpPrefix>) o); - return; - } - - final UpstreamNetworkState ns = (UpstreamNetworkState) o; - switch (arg1) { - case UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES: - addUpstreamPrefixes(ns); - break; - case UpstreamNetworkMonitor.EVENT_ON_LOST: - removeUpstreamPrefixes(ns); - break; - } - - if (ns == null || !pertainsToCurrentUpstream(ns)) { - // TODO: In future, this is where upstream evaluation and selection - // could be handled for notifications which include sufficient data. - // For example, after CONNECTIVITY_ACTION listening is removed, here - // is where we could observe a Wi-Fi network becoming available and - // passing validation. - if (mCurrentUpstreamIfaceSet == null) { - // If we have no upstream interface, try to run through upstream - // selection again. If, for example, IPv4 connectivity has shown up - // after IPv6 (e.g., 464xlat became available) we want the chance to - // notice and act accordingly. - chooseUpstreamType(false); - } - return; - } - - switch (arg1) { - case UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES: - if (ns.network.equals(mTetherUpstream)) { - mNotificationUpdater.onUpstreamCapabilitiesChanged(ns.networkCapabilities); - } - handleNewUpstreamNetworkState(ns); - break; - case UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES: - chooseUpstreamType(false); - break; - case UpstreamNetworkMonitor.EVENT_ON_LOST: - // TODO: Re-evaluate possible upstreams. Currently upstream - // reevaluation is triggered via received CONNECTIVITY_ACTION - // broadcasts that result in being passed a - // TetherMasterSM.CMD_UPSTREAM_CHANGED. - handleNewUpstreamNetworkState(null); - break; - default: - mLog.e("Unknown arg1 value: " + arg1); - break; - } - } - - class TetherModeAliveState extends State { - boolean mUpstreamWanted = false; - boolean mTryCell = true; - - @Override - public void enter() { - // If turning on master tether settings fails, we have already - // transitioned to an error state; exit early. - if (!turnOnMasterTetherSettings()) { - return; - } - - mUpstreamNetworkMonitor.startObserveAllNetworks(); - - // TODO: De-duplicate with updateUpstreamWanted() below. - if (upstreamWanted()) { - mUpstreamWanted = true; - mOffload.start(); - chooseUpstreamType(true); - mTryCell = false; - } - - // TODO: Check the upstream interface if it is managed by BPF offload. - mBpfCoordinator.startPolling(); - } - - @Override - public void exit() { - mOffload.stop(); - mUpstreamNetworkMonitor.stop(); - notifyDownstreamsOfNewUpstreamIface(null); - handleNewUpstreamNetworkState(null); - if (mTetherUpstream != null) { - mTetherUpstream = null; - reportUpstreamChanged(null); - } - mBpfCoordinator.stopPolling(); - } - - private boolean updateUpstreamWanted() { - final boolean previousUpstreamWanted = mUpstreamWanted; - mUpstreamWanted = upstreamWanted(); - if (mUpstreamWanted != previousUpstreamWanted) { - if (mUpstreamWanted) { - mOffload.start(); - } else { - mOffload.stop(); - } - } - return previousUpstreamWanted; - } - - @Override - public boolean processMessage(Message message) { - logMessage(this, message.what); - boolean retValue = true; - switch (message.what) { - case EVENT_IFACE_SERVING_STATE_ACTIVE: { - IpServer who = (IpServer) message.obj; - if (VDBG) Log.d(TAG, "Tether Mode requested by " + who); - handleInterfaceServingStateActive(message.arg1, who); - who.sendMessage(IpServer.CMD_TETHER_CONNECTION_CHANGED, - mCurrentUpstreamIfaceSet); - // If there has been a change and an upstream is now - // desired, kick off the selection process. - final boolean previousUpstreamWanted = updateUpstreamWanted(); - if (!previousUpstreamWanted && mUpstreamWanted) { - chooseUpstreamType(true); - } - break; - } - case EVENT_IFACE_SERVING_STATE_INACTIVE: { - IpServer who = (IpServer) message.obj; - if (VDBG) Log.d(TAG, "Tether Mode unrequested by " + who); - handleInterfaceServingStateInactive(who); - - if (mNotifyList.isEmpty()) { - // This transitions us out of TetherModeAliveState, - // either to InitialState or an error state. - turnOffMasterTetherSettings(); - break; - } - - if (DBG) { - Log.d(TAG, "TetherModeAlive still has " + mNotifyList.size() - + " live requests:"); - for (IpServer o : mNotifyList) { - Log.d(TAG, " " + o); - } - } - // If there has been a change and an upstream is no - // longer desired, release any mobile requests. - final boolean previousUpstreamWanted = updateUpstreamWanted(); - if (previousUpstreamWanted && !mUpstreamWanted) { - mUpstreamNetworkMonitor.releaseMobileNetworkRequest(); - } - break; - } - case EVENT_IFACE_UPDATE_LINKPROPERTIES: { - final LinkProperties newLp = (LinkProperties) message.obj; - if (message.arg1 == IpServer.STATE_TETHERED) { - mOffload.updateDownstreamLinkProperties(newLp); - } else { - mOffload.excludeDownstreamInterface(newLp.getInterfaceName()); - } - break; - } - case EVENT_UPSTREAM_PERMISSION_CHANGED: - case CMD_UPSTREAM_CHANGED: - updateUpstreamWanted(); - if (!mUpstreamWanted) break; - - // Need to try DUN immediately if Wi-Fi goes down. - chooseUpstreamType(true); - mTryCell = false; - break; - case CMD_RETRY_UPSTREAM: - updateUpstreamWanted(); - if (!mUpstreamWanted) break; - - chooseUpstreamType(mTryCell); - mTryCell = !mTryCell; - break; - case EVENT_UPSTREAM_CALLBACK: { - updateUpstreamWanted(); - if (mUpstreamWanted) { - handleUpstreamNetworkMonitorCallback(message.arg1, message.obj); - } - break; - } - default: - retValue = false; - break; - } - return retValue; - } - } - - class ErrorState extends State { - private int mErrorNotification; - - @Override - public boolean processMessage(Message message) { - boolean retValue = true; - switch (message.what) { - case EVENT_IFACE_SERVING_STATE_ACTIVE: - IpServer who = (IpServer) message.obj; - who.sendMessage(mErrorNotification); - break; - case CMD_CLEAR_ERROR: - mErrorNotification = TETHER_ERROR_NO_ERROR; - transitionTo(mInitialState); - break; - default: - retValue = false; - } - return retValue; - } - - void notify(int msgType) { - mErrorNotification = msgType; - for (IpServer ipServer : mNotifyList) { - ipServer.sendMessage(msgType); - } - } - - } - - class SetIpForwardingEnabledErrorState extends ErrorState { - @Override - public void enter() { - Log.e(TAG, "Error in setIpForwardingEnabled"); - notify(IpServer.CMD_IP_FORWARDING_ENABLE_ERROR); - } - } - - class SetIpForwardingDisabledErrorState extends ErrorState { - @Override - public void enter() { - Log.e(TAG, "Error in setIpForwardingDisabled"); - notify(IpServer.CMD_IP_FORWARDING_DISABLE_ERROR); - } - } - - class StartTetheringErrorState extends ErrorState { - @Override - public void enter() { - Log.e(TAG, "Error in startTethering"); - notify(IpServer.CMD_START_TETHERING_ERROR); - try { - mNetd.ipfwdDisableForwarding(TAG); - } catch (RemoteException | ServiceSpecificException e) { } - } - } - - class StopTetheringErrorState extends ErrorState { - @Override - public void enter() { - Log.e(TAG, "Error in stopTethering"); - notify(IpServer.CMD_STOP_TETHERING_ERROR); - try { - mNetd.ipfwdDisableForwarding(TAG); - } catch (RemoteException | ServiceSpecificException e) { } - } - } - - class SetDnsForwardersErrorState extends ErrorState { - @Override - public void enter() { - Log.e(TAG, "Error in setDnsForwarders"); - notify(IpServer.CMD_SET_DNS_FORWARDERS_ERROR); - try { - mNetd.tetherStop(); - } catch (RemoteException | ServiceSpecificException e) { } - try { - mNetd.ipfwdDisableForwarding(TAG); - } catch (RemoteException | ServiceSpecificException e) { } - } - } - - // A wrapper class to handle multiple situations where several calls to - // the OffloadController need to happen together. - // - // TODO: This suggests that the interface between OffloadController and - // Tethering is in need of improvement. Refactor these calls into the - // OffloadController implementation. - class OffloadWrapper { - public void start() { - final int status = mOffloadController.start() ? TETHER_HARDWARE_OFFLOAD_STARTED - : TETHER_HARDWARE_OFFLOAD_FAILED; - updateOffloadStatus(status); - sendOffloadExemptPrefixes(); - } - - public void stop() { - mOffloadController.stop(); - updateOffloadStatus(TETHER_HARDWARE_OFFLOAD_STOPPED); - } - - public void updateUpstreamNetworkState(UpstreamNetworkState ns) { - mOffloadController.setUpstreamLinkProperties( - (ns != null) ? ns.linkProperties : null); - } - - public void updateDownstreamLinkProperties(LinkProperties newLp) { - // Update the list of offload-exempt prefixes before adding - // new prefixes on downstream interfaces to the offload HAL. - sendOffloadExemptPrefixes(); - mOffloadController.notifyDownstreamLinkProperties(newLp); - } - - public void excludeDownstreamInterface(String ifname) { - // This and other interfaces may be in local-only hotspot mode; - // resend all local prefixes to the OffloadController. - sendOffloadExemptPrefixes(); - mOffloadController.removeDownstreamInterface(ifname); - } - - public void sendOffloadExemptPrefixes() { - sendOffloadExemptPrefixes(mUpstreamNetworkMonitor.getLocalPrefixes()); - } - - public void sendOffloadExemptPrefixes(final Set<IpPrefix> localPrefixes) { - // Add in well-known minimum set. - PrefixUtils.addNonForwardablePrefixes(localPrefixes); - // Add tragically hardcoded prefixes. - localPrefixes.add(PrefixUtils.DEFAULT_WIFI_P2P_PREFIX); - - // Maybe add prefixes or addresses for downstreams, depending on - // the IP serving mode of each. - for (IpServer ipServer : mNotifyList) { - final LinkProperties lp = ipServer.linkProperties(); - - switch (ipServer.servingMode()) { - case IpServer.STATE_UNAVAILABLE: - case IpServer.STATE_AVAILABLE: - // No usable LinkProperties in these states. - continue; - case IpServer.STATE_TETHERED: - // Only add IPv4 /32 and IPv6 /128 prefixes. The - // directly-connected prefixes will be sent as - // downstream "offload-able" prefixes. - for (LinkAddress addr : lp.getAllLinkAddresses()) { - final InetAddress ip = addr.getAddress(); - if (ip.isLinkLocalAddress()) continue; - localPrefixes.add(PrefixUtils.ipAddressAsPrefix(ip)); - } - break; - case IpServer.STATE_LOCAL_ONLY: - // Add prefixes covering all local IPs. - localPrefixes.addAll(PrefixUtils.localPrefixesFrom(lp)); - break; - } - } - - mOffloadController.setLocalPrefixes(localPrefixes); - } - - private void updateOffloadStatus(final int newStatus) { - if (newStatus == mOffloadStatus) return; - - mOffloadStatus = newStatus; - reportOffloadStatusChanged(mOffloadStatus); - } - } - } - - private void startTrackDefaultNetwork() { - mUpstreamNetworkMonitor.startTrackDefaultNetwork(mDeps.getDefaultNetworkRequest(), - mEntitlementMgr); - } - - /** Get the latest value of the tethering entitlement check. */ - void requestLatestTetheringEntitlementResult(int type, ResultReceiver receiver, - boolean showEntitlementUi) { - if (receiver == null) return; - - mHandler.post(() -> { - mEntitlementMgr.requestLatestTetheringEntitlementResult(type, receiver, - showEntitlementUi); - }); - } - - /** Register tethering event callback */ - void registerTetheringEventCallback(ITetheringEventCallback callback) { - final boolean hasListPermission = - hasCallingPermission(NETWORK_SETTINGS) - || hasCallingPermission(PERMISSION_MAINLINE_NETWORK_STACK) - || hasCallingPermission(NETWORK_STACK); - mHandler.post(() -> { - mTetheringEventCallbacks.register(callback, new CallbackCookie(hasListPermission)); - final TetheringCallbackStartedParcel parcel = new TetheringCallbackStartedParcel(); - parcel.tetheringSupported = isTetheringSupported(); - parcel.upstreamNetwork = mTetherUpstream; - parcel.config = mConfig.toStableParcelable(); - parcel.states = - mTetherStatesParcel != null ? mTetherStatesParcel : emptyTetherStatesParcel(); - parcel.tetheredClients = hasListPermission - ? mConnectedClientsTracker.getLastTetheredClients() - : Collections.emptyList(); - parcel.offloadStatus = mOffloadStatus; - try { - callback.onCallbackStarted(parcel); - } catch (RemoteException e) { - // Not really very much to do here. - } - }); - } - - private TetherStatesParcel emptyTetherStatesParcel() { - final TetherStatesParcel parcel = new TetherStatesParcel(); - parcel.availableList = new String[0]; - parcel.tetheredList = new String[0]; - parcel.localOnlyList = new String[0]; - parcel.erroredIfaceList = new String[0]; - parcel.lastErrorList = new int[0]; - - return parcel; - } - - private boolean hasCallingPermission(@NonNull String permission) { - return mContext.checkCallingPermission(permission) == PERMISSION_GRANTED; - } - - /** Unregister tethering event callback */ - void unregisterTetheringEventCallback(ITetheringEventCallback callback) { - mHandler.post(() -> { - mTetheringEventCallbacks.unregister(callback); - }); - } - - private void reportUpstreamChanged(UpstreamNetworkState ns) { - final int length = mTetheringEventCallbacks.beginBroadcast(); - final Network network = (ns != null) ? ns.network : null; - final NetworkCapabilities capabilities = (ns != null) ? ns.networkCapabilities : null; - try { - for (int i = 0; i < length; i++) { - try { - mTetheringEventCallbacks.getBroadcastItem(i).onUpstreamChanged(network); - } catch (RemoteException e) { - // Not really very much to do here. - } - } - } finally { - mTetheringEventCallbacks.finishBroadcast(); - } - // Need to notify capabilities change after upstream network changed because new network's - // capabilities should be checked every time. - mNotificationUpdater.onUpstreamCapabilitiesChanged(capabilities); - } - - private void reportConfigurationChanged(TetheringConfigurationParcel config) { - final int length = mTetheringEventCallbacks.beginBroadcast(); - try { - for (int i = 0; i < length; i++) { - try { - mTetheringEventCallbacks.getBroadcastItem(i).onConfigurationChanged(config); - // TODO(b/148139325): send tetheringSupported on configuration change - } catch (RemoteException e) { - // Not really very much to do here. - } - } - } finally { - mTetheringEventCallbacks.finishBroadcast(); - } - } - - private void reportTetherStateChanged(TetherStatesParcel states) { - final int length = mTetheringEventCallbacks.beginBroadcast(); - try { - for (int i = 0; i < length; i++) { - try { - mTetheringEventCallbacks.getBroadcastItem(i).onTetherStatesChanged(states); - } catch (RemoteException e) { - // Not really very much to do here. - } - } - } finally { - mTetheringEventCallbacks.finishBroadcast(); - } - } - - private void reportTetherClientsChanged(List<TetheredClient> clients) { - final int length = mTetheringEventCallbacks.beginBroadcast(); - try { - for (int i = 0; i < length; i++) { - try { - final CallbackCookie cookie = - (CallbackCookie) mTetheringEventCallbacks.getBroadcastCookie(i); - if (!cookie.hasListClientsPermission) continue; - mTetheringEventCallbacks.getBroadcastItem(i).onTetherClientsChanged(clients); - } catch (RemoteException e) { - // Not really very much to do here. - } - } - } finally { - mTetheringEventCallbacks.finishBroadcast(); - } - } - - private void reportOffloadStatusChanged(final int status) { - final int length = mTetheringEventCallbacks.beginBroadcast(); - try { - for (int i = 0; i < length; i++) { - try { - mTetheringEventCallbacks.getBroadcastItem(i).onOffloadStatusChanged(status); - } catch (RemoteException e) { - // Not really very much to do here. - } - } - } finally { - mTetheringEventCallbacks.finishBroadcast(); - } - } - - // if ro.tether.denied = true we default to no tethering - // gservices could set the secure setting to 1 though to enable it on a build where it - // had previously been turned off. - boolean isTetheringSupported() { - final int defaultVal = mDeps.isTetheringDenied() ? 0 : 1; - final boolean tetherSupported = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.TETHER_SUPPORTED, defaultVal) != 0; - final boolean tetherEnabledInSettings = tetherSupported - && !mUserManager.hasUserRestriction(UserManager.DISALLOW_CONFIG_TETHERING); - - return tetherEnabledInSettings && hasTetherableConfiguration() - && !isProvisioningNeededButUnavailable(); - } - - void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter writer, @Nullable String[] args) { - // Binder.java closes the resource for us. - @SuppressWarnings("resource") - final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) - != PERMISSION_GRANTED) { - pw.println("Permission Denial: can't dump."); - return; - } - - pw.println("Tethering:"); - pw.increaseIndent(); - - pw.println("Configuration:"); - pw.increaseIndent(); - final TetheringConfiguration cfg = mConfig; - cfg.dump(pw); - pw.decreaseIndent(); - - pw.println("Entitlement:"); - pw.increaseIndent(); - mEntitlementMgr.dump(pw); - pw.decreaseIndent(); - - synchronized (mPublicSync) { - pw.println("Tether state:"); - pw.increaseIndent(); - for (int i = 0; i < mTetherStates.size(); i++) { - final String iface = mTetherStates.keyAt(i); - final TetherState tetherState = mTetherStates.valueAt(i); - pw.print(iface + " - "); - - switch (tetherState.lastState) { - case IpServer.STATE_UNAVAILABLE: - pw.print("UnavailableState"); - break; - case IpServer.STATE_AVAILABLE: - pw.print("AvailableState"); - break; - case IpServer.STATE_TETHERED: - pw.print("TetheredState"); - break; - case IpServer.STATE_LOCAL_ONLY: - pw.print("LocalHotspotState"); - break; - default: - pw.print("UnknownState"); - break; - } - pw.println(" - lastError = " + tetherState.lastError); - } - pw.println("Upstream wanted: " + upstreamWanted()); - pw.println("Current upstream interface(s): " + mCurrentUpstreamIfaceSet); - pw.decreaseIndent(); - } - - pw.println("Hardware offload:"); - pw.increaseIndent(); - mOffloadController.dump(pw); - pw.decreaseIndent(); - - pw.println("BPF offload:"); - pw.increaseIndent(); - mBpfCoordinator.dump(pw); - pw.decreaseIndent(); - - pw.println("Private address coordinator:"); - pw.increaseIndent(); - mPrivateAddressCoordinator.dump(pw); - pw.decreaseIndent(); - - pw.println("Log:"); - pw.increaseIndent(); - if (argsContain(args, "--short")) { - pw.println("<log removed for brevity>"); - } else { - mLog.dump(fd, pw, args); - } - pw.decreaseIndent(); - - pw.decreaseIndent(); - } - - private static boolean argsContain(String[] args, String target) { - for (String arg : args) { - if (target.equals(arg)) return true; - } - return false; - } - - private void updateConnectedClients(final List<WifiClient> wifiClients) { - if (mConnectedClientsTracker.updateConnectedClients(mForwardedDownstreams, wifiClients)) { - reportTetherClientsChanged(mConnectedClientsTracker.getLastTetheredClients()); - } - } - - private IpServer.Callback makeControlCallback() { - return new IpServer.Callback() { - @Override - public void updateInterfaceState(IpServer who, int state, int lastError) { - notifyInterfaceStateChange(who, state, lastError); - } - - @Override - public void updateLinkProperties(IpServer who, LinkProperties newLp) { - notifyLinkPropertiesChanged(who, newLp); - } - - @Override - public void dhcpLeasesChanged() { - updateConnectedClients(null /* wifiClients */); - } - - @Override - public void requestEnableTethering(int tetheringType, boolean enabled) { - enableTetheringInternal(tetheringType, enabled, null); - } - }; - } - - // TODO: Move into TetherMasterSM. - private void notifyInterfaceStateChange(IpServer who, int state, int error) { - final String iface = who.interfaceName(); - synchronized (mPublicSync) { - final TetherState tetherState = mTetherStates.get(iface); - if (tetherState != null && tetherState.ipServer.equals(who)) { - tetherState.lastState = state; - tetherState.lastError = error; - } else { - if (DBG) Log.d(TAG, "got notification from stale iface " + iface); - } - } - - mLog.log(String.format("OBSERVED iface=%s state=%s error=%s", iface, state, error)); - - // If TetherMasterSM is in ErrorState, TetherMasterSM stays there. - // Thus we give a chance for TetherMasterSM to recover to InitialState - // by sending CMD_CLEAR_ERROR - if (error == TETHER_ERROR_INTERNAL_ERROR) { - mTetherMasterSM.sendMessage(TetherMasterSM.CMD_CLEAR_ERROR, who); - } - int which; - switch (state) { - case IpServer.STATE_UNAVAILABLE: - case IpServer.STATE_AVAILABLE: - which = TetherMasterSM.EVENT_IFACE_SERVING_STATE_INACTIVE; - break; - case IpServer.STATE_TETHERED: - case IpServer.STATE_LOCAL_ONLY: - which = TetherMasterSM.EVENT_IFACE_SERVING_STATE_ACTIVE; - break; - default: - Log.wtf(TAG, "Unknown interface state: " + state); - return; - } - mTetherMasterSM.sendMessage(which, state, 0, who); - sendTetherStateChangedBroadcast(); - } - - private void notifyLinkPropertiesChanged(IpServer who, LinkProperties newLp) { - final String iface = who.interfaceName(); - final int state; - synchronized (mPublicSync) { - final TetherState tetherState = mTetherStates.get(iface); - if (tetherState != null && tetherState.ipServer.equals(who)) { - state = tetherState.lastState; - } else { - mLog.log("got notification from stale iface " + iface); - return; - } - } - - mLog.log(String.format( - "OBSERVED LinkProperties update iface=%s state=%s lp=%s", - iface, IpServer.getStateString(state), newLp)); - final int which = TetherMasterSM.EVENT_IFACE_UPDATE_LINKPROPERTIES; - mTetherMasterSM.sendMessage(which, state, 0, newLp); - } - - private void maybeTrackNewInterfaceLocked(final String iface) { - // If we don't care about this type of interface, ignore. - final int interfaceType = ifaceNameToType(iface); - if (interfaceType == TETHERING_INVALID) { - mLog.log(iface + " is not a tetherable iface, ignoring"); - return; - } - maybeTrackNewInterfaceLocked(iface, interfaceType); - } - - private void maybeTrackNewInterfaceLocked(final String iface, int interfaceType) { - // If we have already started a TISM for this interface, skip. - if (mTetherStates.containsKey(iface)) { - mLog.log("active iface (" + iface + ") reported as added, ignoring"); - return; - } - - mLog.log("adding TetheringInterfaceStateMachine for: " + iface); - final TetherState tetherState = new TetherState( - new IpServer(iface, mLooper, interfaceType, mLog, mNetd, mBpfCoordinator, - makeControlCallback(), mConfig.enableLegacyDhcpServer, - mConfig.isBpfOffloadEnabled(), mPrivateAddressCoordinator, - mDeps.getIpServerDependencies())); - mTetherStates.put(iface, tetherState); - tetherState.ipServer.start(); - } - - private void stopTrackingInterfaceLocked(final String iface) { - final TetherState tetherState = mTetherStates.get(iface); - if (tetherState == null) { - mLog.log("attempting to remove unknown iface (" + iface + "), ignoring"); - return; - } - tetherState.ipServer.stop(); - mLog.log("removing TetheringInterfaceStateMachine for: " + iface); - mTetherStates.remove(iface); - } - - private static String[] copy(String[] strarray) { - return Arrays.copyOf(strarray, strarray.length); - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java deleted file mode 100644 index e1771a561370..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import static android.content.Context.TELEPHONY_SERVICE; -import static android.net.ConnectivityManager.TYPE_ETHERNET; -import static android.net.ConnectivityManager.TYPE_MOBILE; -import static android.net.ConnectivityManager.TYPE_MOBILE_DUN; -import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI; -import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY; - -import android.content.Context; -import android.content.res.Resources; -import android.net.TetheringConfigurationParcel; -import android.net.util.SharedLog; -import android.provider.DeviceConfig; -import android.telephony.SubscriptionManager; -import android.telephony.TelephonyManager; -import android.text.TextUtils; - -import com.android.internal.annotations.VisibleForTesting; - -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.StringJoiner; - - -/** - * A utility class to encapsulate the various tethering configuration elements. - * - * This configuration data includes elements describing upstream properties - * (preferred and required types of upstream connectivity as well as default - * DNS servers to use if none are available) and downstream properties (such - * as regular expressions use to match suitable downstream interfaces and the - * DHCPv4 ranges to use). - * - * @hide - */ -public class TetheringConfiguration { - private static final String TAG = TetheringConfiguration.class.getSimpleName(); - - private static final String[] EMPTY_STRING_ARRAY = new String[0]; - - // Default ranges used for the legacy DHCP server. - // USB is 192.168.42.1 and 255.255.255.0 - // Wifi is 192.168.43.1 and 255.255.255.0 - // BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1 - // with 255.255.255.0 - // P2P is 192.168.49.1 and 255.255.255.0 - private static final String[] LEGACY_DHCP_DEFAULT_RANGE = { - "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254", - "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254", - "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254", - "192.168.48.2", "192.168.48.254", "192.168.49.2", "192.168.49.254", - }; - - private static final String[] DEFAULT_IPV4_DNS = {"8.8.4.4", "8.8.8.8"}; - - /** - * Override enabling BPF offload configuration for tethering. - */ - public static final String OVERRIDE_TETHER_ENABLE_BPF_OFFLOAD = - "override_tether_enable_bpf_offload"; - - /** - * Use the old dnsmasq DHCP server for tethering instead of the framework implementation. - */ - public static final String TETHER_ENABLE_LEGACY_DHCP_SERVER = - "tether_enable_legacy_dhcp_server"; - - /** - * Default value that used to periodic polls tether offload stats from tethering offload HAL - * to make the data warnings work. - */ - public static final int DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS = 5000; - - public final String[] tetherableUsbRegexs; - public final String[] tetherableWifiRegexs; - public final String[] tetherableWigigRegexs; - public final String[] tetherableWifiP2pRegexs; - public final String[] tetherableBluetoothRegexs; - public final String[] tetherableNcmRegexs; - public final boolean isDunRequired; - public final boolean chooseUpstreamAutomatically; - public final Collection<Integer> preferredUpstreamIfaceTypes; - public final String[] legacyDhcpRanges; - public final String[] defaultIPv4DNS; - public final boolean enableLegacyDhcpServer; - - public final String[] provisioningApp; - public final String provisioningAppNoUi; - public final int provisioningCheckPeriod; - public final String provisioningResponse; - - public final int activeDataSubId; - - private final int mOffloadPollInterval; - // TODO: Add to TetheringConfigurationParcel if required. - private final boolean mEnableBpfOffload; - - public TetheringConfiguration(Context ctx, SharedLog log, int id) { - final SharedLog configLog = log.forSubComponent("config"); - - activeDataSubId = id; - Resources res = getResources(ctx, activeDataSubId); - - tetherableUsbRegexs = getResourceStringArray(res, R.array.config_tether_usb_regexs); - tetherableNcmRegexs = getResourceStringArray(res, R.array.config_tether_ncm_regexs); - // TODO: Evaluate deleting this altogether now that Wi-Fi always passes - // us an interface name. Careful consideration needs to be given to - // implications for Settings and for provisioning checks. - tetherableWifiRegexs = getResourceStringArray(res, R.array.config_tether_wifi_regexs); - tetherableWigigRegexs = getResourceStringArray(res, R.array.config_tether_wigig_regexs); - tetherableWifiP2pRegexs = getResourceStringArray( - res, R.array.config_tether_wifi_p2p_regexs); - tetherableBluetoothRegexs = getResourceStringArray( - res, R.array.config_tether_bluetooth_regexs); - - isDunRequired = checkDunRequired(ctx); - - chooseUpstreamAutomatically = getResourceBoolean( - res, R.bool.config_tether_upstream_automatic, false /** defaultValue */); - preferredUpstreamIfaceTypes = getUpstreamIfaceTypes(res, isDunRequired); - - legacyDhcpRanges = getLegacyDhcpRanges(res); - defaultIPv4DNS = copy(DEFAULT_IPV4_DNS); - mEnableBpfOffload = getEnableBpfOffload(res); - enableLegacyDhcpServer = getEnableLegacyDhcpServer(res); - - provisioningApp = getResourceStringArray(res, R.array.config_mobile_hotspot_provision_app); - provisioningAppNoUi = getResourceString(res, - R.string.config_mobile_hotspot_provision_app_no_ui); - provisioningCheckPeriod = getResourceInteger(res, - R.integer.config_mobile_hotspot_provision_check_period, - 0 /* No periodic re-check */); - provisioningResponse = getResourceString(res, - R.string.config_mobile_hotspot_provision_response); - - mOffloadPollInterval = getResourceInteger(res, - R.integer.config_tether_offload_poll_interval, - DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - - configLog.log(toString()); - } - - /** Check whether input interface belong to usb.*/ - public boolean isUsb(String iface) { - return matchesDownstreamRegexs(iface, tetherableUsbRegexs); - } - - /** Check whether input interface belong to wifi.*/ - public boolean isWifi(String iface) { - return matchesDownstreamRegexs(iface, tetherableWifiRegexs); - } - - /** Check whether input interface belong to wigig.*/ - public boolean isWigig(String iface) { - return matchesDownstreamRegexs(iface, tetherableWigigRegexs); - } - - /** Check whether this interface is Wifi P2P interface. */ - public boolean isWifiP2p(String iface) { - return matchesDownstreamRegexs(iface, tetherableWifiP2pRegexs); - } - - /** Check whether using legacy mode for wifi P2P. */ - public boolean isWifiP2pLegacyTetheringMode() { - return (tetherableWifiP2pRegexs == null || tetherableWifiP2pRegexs.length == 0); - } - - /** Check whether input interface belong to bluetooth.*/ - public boolean isBluetooth(String iface) { - return matchesDownstreamRegexs(iface, tetherableBluetoothRegexs); - } - - /** Check if interface is ncm */ - public boolean isNcm(String iface) { - return matchesDownstreamRegexs(iface, tetherableNcmRegexs); - } - - /** Check whether no ui entitlement application is available.*/ - public boolean hasMobileHotspotProvisionApp() { - return !TextUtils.isEmpty(provisioningAppNoUi); - } - - /** Does the dumping.*/ - public void dump(PrintWriter pw) { - pw.print("activeDataSubId: "); - pw.println(activeDataSubId); - - dumpStringArray(pw, "tetherableUsbRegexs", tetherableUsbRegexs); - dumpStringArray(pw, "tetherableWifiRegexs", tetherableWifiRegexs); - dumpStringArray(pw, "tetherableWifiP2pRegexs", tetherableWifiP2pRegexs); - dumpStringArray(pw, "tetherableBluetoothRegexs", tetherableBluetoothRegexs); - dumpStringArray(pw, "tetherableNcmRegexs", tetherableNcmRegexs); - - pw.print("isDunRequired: "); - pw.println(isDunRequired); - - pw.print("chooseUpstreamAutomatically: "); - pw.println(chooseUpstreamAutomatically); - pw.print("legacyPreredUpstreamIfaceTypes: "); - pw.println(Arrays.toString(toIntArray(preferredUpstreamIfaceTypes))); - - dumpStringArray(pw, "legacyDhcpRanges", legacyDhcpRanges); - dumpStringArray(pw, "defaultIPv4DNS", defaultIPv4DNS); - - pw.print("offloadPollInterval: "); - pw.println(mOffloadPollInterval); - - dumpStringArray(pw, "provisioningApp", provisioningApp); - pw.print("provisioningAppNoUi: "); - pw.println(provisioningAppNoUi); - - pw.print("enableBpfOffload: "); - pw.println(mEnableBpfOffload); - - pw.print("enableLegacyDhcpServer: "); - pw.println(enableLegacyDhcpServer); - } - - /** Returns the string representation of this object.*/ - public String toString() { - final StringJoiner sj = new StringJoiner(" "); - sj.add(String.format("activeDataSubId:%d", activeDataSubId)); - sj.add(String.format("tetherableUsbRegexs:%s", makeString(tetherableUsbRegexs))); - sj.add(String.format("tetherableWifiRegexs:%s", makeString(tetherableWifiRegexs))); - sj.add(String.format("tetherableWifiP2pRegexs:%s", makeString(tetherableWifiP2pRegexs))); - sj.add(String.format("tetherableBluetoothRegexs:%s", - makeString(tetherableBluetoothRegexs))); - sj.add(String.format("isDunRequired:%s", isDunRequired)); - sj.add(String.format("chooseUpstreamAutomatically:%s", chooseUpstreamAutomatically)); - sj.add(String.format("offloadPollInterval:%d", mOffloadPollInterval)); - sj.add(String.format("preferredUpstreamIfaceTypes:%s", - toIntArray(preferredUpstreamIfaceTypes))); - sj.add(String.format("provisioningApp:%s", makeString(provisioningApp))); - sj.add(String.format("provisioningAppNoUi:%s", provisioningAppNoUi)); - sj.add(String.format("enableBpfOffload:%s", mEnableBpfOffload)); - sj.add(String.format("enableLegacyDhcpServer:%s", enableLegacyDhcpServer)); - return String.format("TetheringConfiguration{%s}", sj.toString()); - } - - private static void dumpStringArray(PrintWriter pw, String label, String[] values) { - pw.print(label); - pw.print(": "); - - if (values != null) { - final StringJoiner sj = new StringJoiner(", ", "[", "]"); - for (String value : values) sj.add(value); - pw.print(sj.toString()); - } else { - pw.print("null"); - } - - pw.println(); - } - - private static String makeString(String[] strings) { - if (strings == null) return "null"; - final StringJoiner sj = new StringJoiner(",", "[", "]"); - for (String s : strings) sj.add(s); - return sj.toString(); - } - - /** Check whether dun is required. */ - public static boolean checkDunRequired(Context ctx) { - final TelephonyManager tm = (TelephonyManager) ctx.getSystemService(TELEPHONY_SERVICE); - // TelephonyManager would uses the active data subscription, which should be the one used - // by tethering. - return (tm != null) ? tm.isTetheringApnRequired() : false; - } - - public int getOffloadPollInterval() { - return mOffloadPollInterval; - } - - public boolean isBpfOffloadEnabled() { - return mEnableBpfOffload; - } - - private static Collection<Integer> getUpstreamIfaceTypes(Resources res, boolean dunRequired) { - final int[] ifaceTypes = res.getIntArray(R.array.config_tether_upstream_types); - final ArrayList<Integer> upstreamIfaceTypes = new ArrayList<>(ifaceTypes.length); - for (int i : ifaceTypes) { - switch (i) { - case TYPE_MOBILE: - case TYPE_MOBILE_HIPRI: - if (dunRequired) continue; - break; - case TYPE_MOBILE_DUN: - if (!dunRequired) continue; - break; - } - upstreamIfaceTypes.add(i); - } - - // Fix up upstream interface types for DUN or mobile. NOTE: independent - // of the value of |dunRequired|, cell data of one form or another is - // *always* an upstream, regardless of the upstream interface types - // specified by configuration resources. - if (dunRequired) { - appendIfNotPresent(upstreamIfaceTypes, TYPE_MOBILE_DUN); - } else { - // Do not modify if a cellular interface type is already present in the - // upstream interface types. Add TYPE_MOBILE and TYPE_MOBILE_HIPRI if no - // cellular interface types are found in the upstream interface types. - // This preserves backwards compatibility and prevents the DUN and default - // mobile types incorrectly appearing together, which could happen on - // previous releases in the common case where checkDunRequired returned - // DUN_UNSPECIFIED. - if (!containsOneOf(upstreamIfaceTypes, TYPE_MOBILE, TYPE_MOBILE_HIPRI)) { - upstreamIfaceTypes.add(TYPE_MOBILE); - upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI); - } - } - - // Always make sure our good friend Ethernet is present. - // TODO: consider unilaterally forcing this at the front. - prependIfNotPresent(upstreamIfaceTypes, TYPE_ETHERNET); - - return upstreamIfaceTypes; - } - - private static boolean matchesDownstreamRegexs(String iface, String[] regexs) { - for (String regex : regexs) { - if (iface.matches(regex)) return true; - } - return false; - } - - private static String[] getLegacyDhcpRanges(Resources res) { - final String[] fromResource = getResourceStringArray(res, R.array.config_tether_dhcp_range); - if ((fromResource.length > 0) && (fromResource.length % 2 == 0)) { - return fromResource; - } - return copy(LEGACY_DHCP_DEFAULT_RANGE); - } - - private static String getResourceString(Resources res, final int resId) { - try { - return res.getString(resId); - } catch (Resources.NotFoundException e) { - return ""; - } - } - - private static boolean getResourceBoolean(Resources res, int resId, boolean defaultValue) { - try { - return res.getBoolean(resId); - } catch (Resources.NotFoundException e404) { - return defaultValue; - } - } - - private static String[] getResourceStringArray(Resources res, int resId) { - try { - final String[] strArray = res.getStringArray(resId); - return (strArray != null) ? strArray : EMPTY_STRING_ARRAY; - } catch (Resources.NotFoundException e404) { - return EMPTY_STRING_ARRAY; - } - } - - private static int getResourceInteger(Resources res, int resId, int defaultValue) { - try { - return res.getInteger(resId); - } catch (Resources.NotFoundException e404) { - return defaultValue; - } - } - - private boolean getEnableBpfOffload(final Resources res) { - // Get BPF offload config - // Priority 1: Device config - // Priority 2: Resource config - // Priority 3: Default value - final boolean defaultValue = getResourceBoolean( - res, R.bool.config_tether_enable_bpf_offload, true /** default value */); - - return getDeviceConfigBoolean(OVERRIDE_TETHER_ENABLE_BPF_OFFLOAD, defaultValue); - } - - private boolean getEnableLegacyDhcpServer(final Resources res) { - return getResourceBoolean( - res, R.bool.config_tether_enable_legacy_dhcp_server, false /** defaultValue */) - || getDeviceConfigBoolean( - TETHER_ENABLE_LEGACY_DHCP_SERVER, false /** defaultValue */); - } - - private boolean getDeviceConfigBoolean(final String name, final boolean defaultValue) { - // Due to the limitation of static mock for testing, using #getDeviceConfigProperty instead - // of DeviceConfig#getBoolean. If using #getBoolean here, the test can't know that the - // returned boolean value comes from device config or default value (because of null - // property string). See the test case testBpfOffload{*} in TetheringConfigurationTest.java. - final String value = getDeviceConfigProperty(name); - return value != null ? Boolean.parseBoolean(value) : defaultValue; - } - - @VisibleForTesting - protected String getDeviceConfigProperty(String name) { - return DeviceConfig.getProperty(NAMESPACE_CONNECTIVITY, name); - } - - private Resources getResources(Context ctx, int subId) { - if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { - return getResourcesForSubIdWrapper(ctx, subId); - } else { - return ctx.getResources(); - } - } - - @VisibleForTesting - protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) { - return SubscriptionManager.getResourcesForSubId(ctx, subId); - } - - private static String[] copy(String[] strarray) { - return Arrays.copyOf(strarray, strarray.length); - } - - private static void prependIfNotPresent(ArrayList<Integer> list, int value) { - if (list.contains(value)) return; - list.add(0, value); - } - - private static void appendIfNotPresent(ArrayList<Integer> list, int value) { - if (list.contains(value)) return; - list.add(value); - } - - private static boolean containsOneOf(ArrayList<Integer> list, Integer... values) { - for (Integer value : values) { - if (list.contains(value)) return true; - } - return false; - } - - private static int[] toIntArray(Collection<Integer> values) { - final int[] result = new int[values.size()]; - int index = 0; - for (Integer value : values) { - result[index++] = value; - } - return result; - } - - /** - * Convert this TetheringConfiguration to a TetheringConfigurationParcel. - */ - public TetheringConfigurationParcel toStableParcelable() { - final TetheringConfigurationParcel parcel = new TetheringConfigurationParcel(); - parcel.subId = activeDataSubId; - parcel.tetherableUsbRegexs = tetherableUsbRegexs; - parcel.tetherableWifiRegexs = tetherableWifiRegexs; - parcel.tetherableBluetoothRegexs = tetherableBluetoothRegexs; - parcel.isDunRequired = isDunRequired; - parcel.chooseUpstreamAutomatically = chooseUpstreamAutomatically; - - parcel.preferredUpstreamIfaceTypes = toIntArray(preferredUpstreamIfaceTypes); - - parcel.legacyDhcpRanges = legacyDhcpRanges; - parcel.defaultIPv4DNS = defaultIPv4DNS; - parcel.enableLegacyDhcpServer = enableLegacyDhcpServer; - parcel.provisioningApp = provisioningApp; - parcel.provisioningAppNoUi = provisioningAppNoUi; - parcel.provisioningCheckPeriod = provisioningCheckPeriod; - return parcel; - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java deleted file mode 100644 index 131a5fbf2abe..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/TetheringDependencies.java +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import android.app.usage.NetworkStatsManager; -import android.bluetooth.BluetoothAdapter; -import android.content.Context; -import android.net.INetd; -import android.net.NetworkRequest; -import android.net.ip.IpServer; -import android.net.util.SharedLog; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.os.SystemProperties; -import android.text.TextUtils; - -import androidx.annotation.NonNull; - -import com.android.internal.util.StateMachine; - -import java.util.ArrayList; - - -/** - * Capture tethering dependencies, for injection. - * - * @hide - */ -public abstract class TetheringDependencies { - /** - * Get a reference to the BpfCoordinator to be used by tethering. - */ - public @NonNull BpfCoordinator getBpfCoordinator( - @NonNull BpfCoordinator.Dependencies deps) { - return new BpfCoordinator(deps); - } - - /** - * Get a reference to the offload hardware interface to be used by tethering. - */ - public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) { - return new OffloadHardwareInterface(h, log); - } - - /** - * Get a reference to the offload controller to be used by tethering. - */ - @NonNull - public OffloadController getOffloadController(@NonNull Handler h, - @NonNull SharedLog log, @NonNull OffloadController.Dependencies deps) { - final NetworkStatsManager statsManager = - (NetworkStatsManager) getContext().getSystemService(Context.NETWORK_STATS_SERVICE); - return new OffloadController(h, getOffloadHardwareInterface(h, log), - getContext().getContentResolver(), statsManager, log, deps); - } - - - /** - * Get a reference to the UpstreamNetworkMonitor to be used by tethering. - */ - public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, StateMachine target, - SharedLog log, int what) { - return new UpstreamNetworkMonitor(ctx, target, log, what); - } - - /** - * Get a reference to the IPv6TetheringCoordinator to be used by tethering. - */ - public IPv6TetheringCoordinator getIPv6TetheringCoordinator( - ArrayList<IpServer> notifyList, SharedLog log) { - return new IPv6TetheringCoordinator(notifyList, log); - } - - /** - * Get dependencies to be used by IpServer. - */ - public abstract IpServer.Dependencies getIpServerDependencies(); - - /** - * Indicates whether tethering is supported on the device. - */ - public boolean isTetheringSupported() { - return true; - } - - /** - * Get the NetworkRequest that should be fulfilled by the default network. - */ - public abstract NetworkRequest getDefaultNetworkRequest(); - - /** - * Get a reference to the EntitlementManager to be used by tethering. - */ - public EntitlementManager getEntitlementManager(Context ctx, Handler h, SharedLog log, - Runnable callback) { - return new EntitlementManager(ctx, h, log, callback); - } - - /** - * Generate a new TetheringConfiguration according to input sub Id. - */ - public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log, - int subId) { - return new TetheringConfiguration(ctx, log, subId); - } - - /** - * Get a reference to INetd to be used by tethering. - */ - public INetd getINetd(Context context) { - return INetd.Stub.asInterface( - (IBinder) context.getSystemService(Context.NETD_SERVICE)); - } - - /** - * Get a reference to the TetheringNotificationUpdater to be used by tethering. - */ - public TetheringNotificationUpdater getNotificationUpdater(@NonNull final Context ctx, - @NonNull final Looper looper) { - return new TetheringNotificationUpdater(ctx, looper); - } - - /** - * Get tethering thread looper. - */ - public abstract Looper getTetheringLooper(); - - /** - * Get Context of TetheringSerice. - */ - public abstract Context getContext(); - - /** - * Get a reference to BluetoothAdapter to be used by tethering. - */ - public abstract BluetoothAdapter getBluetoothAdapter(); - - /** - * Get SystemProperties which indicate whether tethering is denied. - */ - public boolean isTetheringDenied() { - return TextUtils.equals(SystemProperties.get("ro.tether.denied"), "true"); - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringInterfaceUtils.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringInterfaceUtils.java deleted file mode 100644 index ff38f717a121..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/TetheringInterfaceUtils.java +++ /dev/null @@ -1,102 +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.networkstack.tethering; - -import android.annotation.Nullable; -import android.net.LinkProperties; -import android.net.NetworkCapabilities; -import android.net.RouteInfo; -import android.net.util.InterfaceSet; - -import com.android.net.module.util.NetUtils; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * @hide - */ -public final class TetheringInterfaceUtils { - private static final InetAddress IN6ADDR_ANY = getByAddress( - new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - private static final InetAddress INADDR_ANY = getByAddress(new byte[] {0, 0, 0, 0}); - - /** - * Get upstream interfaces for tethering based on default routes for IPv4/IPv6. - * @return null if there is no usable interface, or a set of at least one interface otherwise. - */ - public static @Nullable InterfaceSet getTetheringInterfaces(UpstreamNetworkState ns) { - if (ns == null) { - return null; - } - - final LinkProperties lp = ns.linkProperties; - final String if4 = getInterfaceForDestination(lp, INADDR_ANY); - final String if6 = getIPv6Interface(ns); - - return (if4 == null && if6 == null) ? null : new InterfaceSet(if4, if6); - } - - /** - * Get the upstream interface for IPv6 tethering. - * @return null if there is no usable interface, or the interface name otherwise. - */ - public static @Nullable String getIPv6Interface(UpstreamNetworkState ns) { - // Broadly speaking: - // - // [1] does the upstream have an IPv6 default route? - // - // and - // - // [2] does the upstream have one or more global IPv6 /64s - // dedicated to this device? - // - // In lieu of Prefix Delegation and other evaluation of whether a - // prefix may or may not be dedicated to this device, for now just - // check whether the upstream is TRANSPORT_CELLULAR. This works - // because "[t]he 3GPP network allocates each default bearer a unique - // /64 prefix", per RFC 6459, Section 5.2. - final boolean canTether = - (ns != null) && (ns.network != null) - && (ns.linkProperties != null) && (ns.networkCapabilities != null) - // At least one upstream DNS server: - && ns.linkProperties.hasIpv6DnsServer() - // Minimal amount of IPv6 provisioning: - && ns.linkProperties.hasGlobalIpv6Address() - // Temporary approximation of "dedicated prefix": - && ns.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR); - - return canTether - ? getInterfaceForDestination(ns.linkProperties, IN6ADDR_ANY) - : null; - } - - private static String getInterfaceForDestination(LinkProperties lp, InetAddress dst) { - final RouteInfo ri = (lp != null) - ? NetUtils.selectBestRoute(lp.getAllRoutes(), dst) - : null; - return (ri != null) ? ri.getInterface() : null; - } - - private static InetAddress getByAddress(final byte[] addr) { - try { - return InetAddress.getByAddress(null, addr); - } catch (UnknownHostException e) { - throw new AssertionError("illegal address length" + addr.length); - } - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringNotificationUpdater.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringNotificationUpdater.java deleted file mode 100644 index 593d04a06b93..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/TetheringNotificationUpdater.java +++ /dev/null @@ -1,360 +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 com.android.networkstack.tethering; - -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING; -import static android.text.TextUtils.isEmpty; - -import android.app.Notification; -import android.app.Notification.Action; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.net.NetworkCapabilities; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.os.UserHandle; -import android.provider.Settings; -import android.telephony.SubscriptionManager; -import android.telephony.TelephonyManager; -import android.util.SparseArray; - -import androidx.annotation.DrawableRes; -import androidx.annotation.IntDef; -import androidx.annotation.IntRange; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.internal.annotations.VisibleForTesting; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * A class to display tethering-related notifications. - * - * <p>This class is not thread safe, it is intended to be used only from the tethering handler - * thread. However the constructor is an exception, as it is called on another thread ; - * therefore for thread safety all members of this class MUST either be final or initialized - * to their default value (0, false or null). - * - * @hide - */ -public class TetheringNotificationUpdater { - private static final String TAG = TetheringNotificationUpdater.class.getSimpleName(); - private static final String CHANNEL_ID = "TETHERING_STATUS"; - private static final String WIFI_DOWNSTREAM = "WIFI"; - private static final String USB_DOWNSTREAM = "USB"; - private static final String BLUETOOTH_DOWNSTREAM = "BT"; - @VisibleForTesting - static final String ACTION_DISABLE_TETHERING = - "com.android.server.connectivity.tethering.DISABLE_TETHERING"; - private static final boolean NOTIFY_DONE = true; - private static final boolean NO_NOTIFY = false; - @VisibleForTesting - static final int EVENT_SHOW_NO_UPSTREAM = 1; - // Id to update and cancel restricted notification. Must be unique within the tethering app. - @VisibleForTesting - static final int RESTRICTED_NOTIFICATION_ID = 1001; - // Id to update and cancel no upstream notification. Must be unique within the tethering app. - @VisibleForTesting - static final int NO_UPSTREAM_NOTIFICATION_ID = 1002; - // Id to update and cancel roaming notification. Must be unique within the tethering app. - @VisibleForTesting - static final int ROAMING_NOTIFICATION_ID = 1003; - @VisibleForTesting - static final int NO_ICON_ID = 0; - @VisibleForTesting - static final int DOWNSTREAM_NONE = 0; - // Refer to TelephonyManager#getSimCarrierId for more details about carrier id. - @VisibleForTesting - static final int VERIZON_CARRIER_ID = 1839; - private final Context mContext; - private final NotificationManager mNotificationManager; - private final NotificationChannel mChannel; - private final Handler mHandler; - - // WARNING : the constructor is called on a different thread. Thread safety therefore - // relies on these values being initialized to 0, false or null, and not any other value. If you - // need to change this, you will need to change the thread where the constructor is invoked, or - // to introduce synchronization. - // Downstream type is one of ConnectivityManager.TETHERING_* constants, 0 1 or 2. - // This value has to be made 1 2 and 4, and OR'd with the others. - private int mDownstreamTypesMask = DOWNSTREAM_NONE; - private boolean mNoUpstream = false; - private boolean mRoaming = false; - - // WARNING : this value is not able to being initialized to 0 and must have volatile because - // telephony service is not guaranteed that is up before tethering service starts. If telephony - // is up later than tethering, TetheringNotificationUpdater will use incorrect and valid - // subscription id(0) to query resources. Therefore, initialized subscription id must be - // INVALID_SUBSCRIPTION_ID. - private volatile int mActiveDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; - - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { - RESTRICTED_NOTIFICATION_ID, - NO_UPSTREAM_NOTIFICATION_ID, - ROAMING_NOTIFICATION_ID - }) - @interface NotificationId {} - - private static final class MccMncOverrideInfo { - public final String visitedMccMnc; - public final int homeMcc; - public final int homeMnc; - MccMncOverrideInfo(String visitedMccMnc, int mcc, int mnc) { - this.visitedMccMnc = visitedMccMnc; - this.homeMcc = mcc; - this.homeMnc = mnc; - } - } - - private static final SparseArray<MccMncOverrideInfo> sCarrierIdToMccMnc = new SparseArray<>(); - - static { - sCarrierIdToMccMnc.put(VERIZON_CARRIER_ID, new MccMncOverrideInfo("20404", 311, 480)); - } - - public TetheringNotificationUpdater(@NonNull final Context context, - @NonNull final Looper looper) { - mContext = context; - mNotificationManager = (NotificationManager) context.createContextAsUser(UserHandle.ALL, 0) - .getSystemService(Context.NOTIFICATION_SERVICE); - mChannel = new NotificationChannel( - CHANNEL_ID, - context.getResources().getString(R.string.notification_channel_tethering_status), - NotificationManager.IMPORTANCE_LOW); - mNotificationManager.createNotificationChannel(mChannel); - mHandler = new NotificationHandler(looper); - } - - private class NotificationHandler extends Handler { - NotificationHandler(Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message msg) { - switch(msg.what) { - case EVENT_SHOW_NO_UPSTREAM: - notifyTetheringNoUpstream(); - break; - } - } - } - - /** Called when downstream has changed */ - public void onDownstreamChanged(@IntRange(from = 0, to = 7) final int downstreamTypesMask) { - updateActiveNotifications( - mActiveDataSubId, downstreamTypesMask, mNoUpstream, mRoaming); - } - - /** Called when active data subscription id changed */ - public void onActiveDataSubscriptionIdChanged(final int subId) { - updateActiveNotifications(subId, mDownstreamTypesMask, mNoUpstream, mRoaming); - } - - /** Called when upstream network capabilities changed */ - public void onUpstreamCapabilitiesChanged(@Nullable final NetworkCapabilities capabilities) { - final boolean isNoUpstream = (capabilities == null); - final boolean isRoaming = capabilities != null - && !capabilities.hasCapability(NET_CAPABILITY_NOT_ROAMING); - updateActiveNotifications( - mActiveDataSubId, mDownstreamTypesMask, isNoUpstream, isRoaming); - } - - @NonNull - @VisibleForTesting - final Handler getHandler() { - return mHandler; - } - - @NonNull - @VisibleForTesting - Resources getResourcesForSubId(@NonNull final Context context, final int subId) { - final Resources res = SubscriptionManager.getResourcesForSubId(context, subId); - final TelephonyManager tm = - ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)) - .createForSubscriptionId(mActiveDataSubId); - final int carrierId = tm.getSimCarrierId(); - final String mccmnc = tm.getSimOperator(); - final MccMncOverrideInfo overrideInfo = sCarrierIdToMccMnc.get(carrierId); - if (overrideInfo != null && overrideInfo.visitedMccMnc.equals(mccmnc)) { - // Re-configure MCC/MNC value to specific carrier to get right resources. - final Configuration config = res.getConfiguration(); - config.mcc = overrideInfo.homeMcc; - config.mnc = overrideInfo.homeMnc; - return context.createConfigurationContext(config).getResources(); - } - return res; - } - - private void updateActiveNotifications(final int subId, final int downstreamTypes, - final boolean noUpstream, final boolean isRoaming) { - final boolean tetheringActiveChanged = - (downstreamTypes == DOWNSTREAM_NONE) != (mDownstreamTypesMask == DOWNSTREAM_NONE); - final boolean subIdChanged = subId != mActiveDataSubId; - final boolean upstreamChanged = noUpstream != mNoUpstream; - final boolean roamingChanged = isRoaming != mRoaming; - final boolean updateAll = tetheringActiveChanged || subIdChanged; - mActiveDataSubId = subId; - mDownstreamTypesMask = downstreamTypes; - mNoUpstream = noUpstream; - mRoaming = isRoaming; - - if (updateAll || upstreamChanged) updateNoUpstreamNotification(); - if (updateAll || roamingChanged) updateRoamingNotification(); - } - - private void updateNoUpstreamNotification() { - final boolean tetheringInactive = mDownstreamTypesMask == DOWNSTREAM_NONE; - - if (tetheringInactive || !mNoUpstream || setupNoUpstreamNotification() == NO_NOTIFY) { - clearNotification(NO_UPSTREAM_NOTIFICATION_ID); - mHandler.removeMessages(EVENT_SHOW_NO_UPSTREAM); - } - } - - private void updateRoamingNotification() { - final boolean tetheringInactive = mDownstreamTypesMask == DOWNSTREAM_NONE; - - if (tetheringInactive || !mRoaming || setupRoamingNotification() == NO_NOTIFY) { - clearNotification(ROAMING_NOTIFICATION_ID); - } - } - - @VisibleForTesting - void tetheringRestrictionLifted() { - clearNotification(RESTRICTED_NOTIFICATION_ID); - } - - private void clearNotification(@NotificationId final int id) { - mNotificationManager.cancel(null /* tag */, id); - } - - @VisibleForTesting - static String getSettingsPackageName(@NonNull final PackageManager pm) { - final Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS); - final ComponentName settingsComponent = settingsIntent.resolveActivity(pm); - return settingsComponent != null - ? settingsComponent.getPackageName() : "com.android.settings"; - } - - @VisibleForTesting - void notifyTetheringDisabledByRestriction() { - final Resources res = getResourcesForSubId(mContext, mActiveDataSubId); - final String title = res.getString(R.string.disable_tether_notification_title); - final String message = res.getString(R.string.disable_tether_notification_message); - if (isEmpty(title) || isEmpty(message)) return; - - final PendingIntent pi = PendingIntent.getActivity( - mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */), - 0 /* requestCode */, - new Intent(Settings.ACTION_TETHER_SETTINGS) - .setPackage(getSettingsPackageName(mContext.getPackageManager())), - Intent.FLAG_ACTIVITY_NEW_TASK | PendingIntent.FLAG_IMMUTABLE, - null /* options */); - - showNotification(R.drawable.stat_sys_tether_general, title, message, - RESTRICTED_NOTIFICATION_ID, false /* ongoing */, pi, new Action[0]); - } - - private void notifyTetheringNoUpstream() { - final Resources res = getResourcesForSubId(mContext, mActiveDataSubId); - final String title = res.getString(R.string.no_upstream_notification_title); - final String message = res.getString(R.string.no_upstream_notification_message); - final String disableButton = - res.getString(R.string.no_upstream_notification_disable_button); - if (isEmpty(title) || isEmpty(message) || isEmpty(disableButton)) return; - - final Intent intent = new Intent(ACTION_DISABLE_TETHERING); - intent.setPackage(mContext.getPackageName()); - final PendingIntent pi = PendingIntent.getBroadcast( - mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */), - 0 /* requestCode */, - intent, - PendingIntent.FLAG_IMMUTABLE); - final Action action = new Action.Builder(NO_ICON_ID, disableButton, pi).build(); - - showNotification(R.drawable.stat_sys_tether_general, title, message, - NO_UPSTREAM_NOTIFICATION_ID, true /* ongoing */, null /* pendingIntent */, action); - } - - private boolean setupRoamingNotification() { - final Resources res = getResourcesForSubId(mContext, mActiveDataSubId); - final boolean upstreamRoamingNotification = - res.getBoolean(R.bool.config_upstream_roaming_notification); - - if (!upstreamRoamingNotification) return NO_NOTIFY; - - final String title = res.getString(R.string.upstream_roaming_notification_title); - final String message = res.getString(R.string.upstream_roaming_notification_message); - if (isEmpty(title) || isEmpty(message)) return NO_NOTIFY; - - final PendingIntent pi = PendingIntent.getActivity( - mContext.createContextAsUser(UserHandle.CURRENT, 0 /* flags */), - 0 /* requestCode */, - new Intent(Settings.ACTION_TETHER_SETTINGS) - .setPackage(getSettingsPackageName(mContext.getPackageManager())), - Intent.FLAG_ACTIVITY_NEW_TASK | PendingIntent.FLAG_IMMUTABLE, - null /* options */); - - showNotification(R.drawable.stat_sys_tether_general, title, message, - ROAMING_NOTIFICATION_ID, true /* ongoing */, pi, new Action[0]); - return NOTIFY_DONE; - } - - private boolean setupNoUpstreamNotification() { - final Resources res = getResourcesForSubId(mContext, mActiveDataSubId); - final int delayToShowUpstreamNotification = - res.getInteger(R.integer.delay_to_show_no_upstream_after_no_backhaul); - - if (delayToShowUpstreamNotification < 0) return NO_NOTIFY; - - mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_SHOW_NO_UPSTREAM), - delayToShowUpstreamNotification); - return NOTIFY_DONE; - } - - private void showNotification(@DrawableRes final int iconId, @NonNull final String title, - @NonNull final String message, @NotificationId final int id, final boolean ongoing, - @Nullable PendingIntent pi, @NonNull final Action... actions) { - final Notification notification = - new Notification.Builder(mContext, mChannel.getId()) - .setSmallIcon(iconId) - .setContentTitle(title) - .setContentText(message) - .setOngoing(ongoing) - .setColor(mContext.getColor( - android.R.color.system_notification_accent_color)) - .setVisibility(Notification.VISIBILITY_PUBLIC) - .setCategory(Notification.CATEGORY_STATUS) - .setContentIntent(pi) - .setActions(actions) - .build(); - - mNotificationManager.notify(null /* tag */, id, notification); - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java b/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java deleted file mode 100644 index d084ca0966e8..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/TetheringService.java +++ /dev/null @@ -1,374 +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 com.android.networkstack.tethering; - -import static android.Manifest.permission.ACCESS_NETWORK_STATE; -import static android.Manifest.permission.NETWORK_STACK; -import static android.Manifest.permission.TETHER_PRIVILEGED; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK; -import static android.net.TetheringManager.TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION; -import static android.net.TetheringManager.TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION; -import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_UNSUPPORTED; -import static android.net.dhcp.IDhcpServer.STATUS_UNKNOWN_ERROR; - -import android.app.Service; -import android.bluetooth.BluetoothAdapter; -import android.content.Context; -import android.content.Intent; -import android.net.IIntResultListener; -import android.net.INetworkStackConnector; -import android.net.ITetheringConnector; -import android.net.ITetheringEventCallback; -import android.net.NetworkCapabilities; -import android.net.NetworkRequest; -import android.net.NetworkStack; -import android.net.TetheringRequestParcel; -import android.net.dhcp.DhcpServerCallbacks; -import android.net.dhcp.DhcpServingParamsParcel; -import android.net.ip.IpServer; -import android.os.Binder; -import android.os.HandlerThread; -import android.os.IBinder; -import android.os.Looper; -import android.os.RemoteException; -import android.os.ResultReceiver; -import android.provider.Settings; -import android.util.Log; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.android.internal.annotations.VisibleForTesting; - -import java.io.FileDescriptor; -import java.io.PrintWriter; - -/** - * Android service used to manage tethering. - * - * <p>The service returns a binder for the system server to communicate with the tethering. - */ -public class TetheringService extends Service { - private static final String TAG = TetheringService.class.getSimpleName(); - - private TetheringConnector mConnector; - - @Override - public void onCreate() { - final TetheringDependencies deps = makeTetheringDependencies(); - // The Tethering object needs a fully functional context to start, so this can't be done - // in the constructor. - mConnector = new TetheringConnector(makeTethering(deps), TetheringService.this); - } - - /** - * Make a reference to Tethering object. - */ - @VisibleForTesting - public Tethering makeTethering(TetheringDependencies deps) { - System.loadLibrary("tetherutilsjni"); - return new Tethering(deps); - } - - @NonNull - @Override - public IBinder onBind(Intent intent) { - return mConnector; - } - - private static class TetheringConnector extends ITetheringConnector.Stub { - private final TetheringService mService; - private final Tethering mTethering; - - TetheringConnector(Tethering tether, TetheringService service) { - mTethering = tether; - mService = service; - } - - @Override - public void tether(String iface, String callerPkg, IIntResultListener listener) { - if (checkAndNotifyCommonError(callerPkg, listener)) return; - - try { - listener.onResult(mTethering.tether(iface)); - } catch (RemoteException e) { } - } - - @Override - public void untether(String iface, String callerPkg, IIntResultListener listener) { - if (checkAndNotifyCommonError(callerPkg, listener)) return; - - try { - listener.onResult(mTethering.untether(iface)); - } catch (RemoteException e) { } - } - - @Override - public void setUsbTethering(boolean enable, String callerPkg, IIntResultListener listener) { - if (checkAndNotifyCommonError(callerPkg, listener)) return; - - try { - listener.onResult(mTethering.setUsbTethering(enable)); - } catch (RemoteException e) { } - } - - @Override - public void startTethering(TetheringRequestParcel request, String callerPkg, - IIntResultListener listener) { - if (checkAndNotifyCommonError(callerPkg, - request.exemptFromEntitlementCheck /* onlyAllowPrivileged */, - listener)) { - return; - } - - mTethering.startTethering(request, listener); - } - - @Override - public void stopTethering(int type, String callerPkg, IIntResultListener listener) { - if (checkAndNotifyCommonError(callerPkg, listener)) return; - - try { - mTethering.stopTethering(type); - listener.onResult(TETHER_ERROR_NO_ERROR); - } catch (RemoteException e) { } - } - - @Override - public void requestLatestTetheringEntitlementResult(int type, ResultReceiver receiver, - boolean showEntitlementUi, String callerPkg) { - if (checkAndNotifyCommonError(callerPkg, receiver)) return; - - mTethering.requestLatestTetheringEntitlementResult(type, receiver, showEntitlementUi); - } - - @Override - public void registerTetheringEventCallback(ITetheringEventCallback callback, - String callerPkg) { - try { - if (!hasTetherAccessPermission()) { - callback.onCallbackStopped(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION); - return; - } - mTethering.registerTetheringEventCallback(callback); - } catch (RemoteException e) { } - } - - @Override - public void unregisterTetheringEventCallback(ITetheringEventCallback callback, - String callerPkg) { - try { - if (!hasTetherAccessPermission()) { - callback.onCallbackStopped(TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION); - return; - } - mTethering.unregisterTetheringEventCallback(callback); - } catch (RemoteException e) { } - } - - @Override - public void stopAllTethering(String callerPkg, IIntResultListener listener) { - if (checkAndNotifyCommonError(callerPkg, listener)) return; - - try { - mTethering.untetherAll(); - listener.onResult(TETHER_ERROR_NO_ERROR); - } catch (RemoteException e) { } - } - - @Override - public void isTetheringSupported(String callerPkg, IIntResultListener listener) { - if (checkAndNotifyCommonError(callerPkg, listener)) return; - - try { - listener.onResult(TETHER_ERROR_NO_ERROR); - } catch (RemoteException e) { } - } - - @Override - protected void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter writer, - @Nullable String[] args) { - mTethering.dump(fd, writer, args); - } - - private boolean checkAndNotifyCommonError(String callerPkg, IIntResultListener listener) { - return checkAndNotifyCommonError(callerPkg, false /* onlyAllowPrivileged */, listener); - } - - private boolean checkAndNotifyCommonError(final String callerPkg, - final boolean onlyAllowPrivileged, final IIntResultListener listener) { - try { - if (!hasTetherChangePermission(callerPkg, onlyAllowPrivileged)) { - listener.onResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - return true; - } - if (!mTethering.isTetheringSupported()) { - listener.onResult(TETHER_ERROR_UNSUPPORTED); - return true; - } - } catch (RemoteException e) { - return true; - } - - return false; - } - - private boolean checkAndNotifyCommonError(String callerPkg, ResultReceiver receiver) { - if (!hasTetherChangePermission(callerPkg, false /* onlyAllowPrivileged */)) { - receiver.send(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION, null); - return true; - } - if (!mTethering.isTetheringSupported()) { - receiver.send(TETHER_ERROR_UNSUPPORTED, null); - return true; - } - - return false; - } - - private boolean hasNetworkStackPermission() { - return checkCallingOrSelfPermission(NETWORK_STACK) - || checkCallingOrSelfPermission(PERMISSION_MAINLINE_NETWORK_STACK); - } - - private boolean hasTetherPrivilegedPermission() { - return checkCallingOrSelfPermission(TETHER_PRIVILEGED); - } - - private boolean checkCallingOrSelfPermission(final String permission) { - return mService.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED; - } - - private boolean hasTetherChangePermission(final String callerPkg, - final boolean onlyAllowPrivileged) { - if (onlyAllowPrivileged && !hasNetworkStackPermission()) return false; - - if (hasTetherPrivilegedPermission()) return true; - - if (mTethering.isTetherProvisioningRequired()) return false; - - int uid = Binder.getCallingUid(); - // If callerPkg's uid is not same as Binder.getCallingUid(), - // checkAndNoteWriteSettingsOperation will return false and the operation will be - // denied. - return mService.checkAndNoteWriteSettingsOperation(mService, uid, callerPkg, - false /* throwException */); - } - - private boolean hasTetherAccessPermission() { - if (hasTetherPrivilegedPermission()) return true; - - return mService.checkCallingOrSelfPermission( - ACCESS_NETWORK_STATE) == PERMISSION_GRANTED; - } - } - - /** - * Check if the package is a allowed to write settings. This also accounts that such an access - * happened. - * - * @return {@code true} iff the package is allowed to write settings. - */ - @VisibleForTesting - boolean checkAndNoteWriteSettingsOperation(@NonNull Context context, int uid, - @NonNull String callingPackage, boolean throwException) { - return Settings.checkAndNoteWriteSettingsOperation(context, uid, callingPackage, - throwException); - } - - /** - * An injection method for testing. - */ - @VisibleForTesting - public TetheringDependencies makeTetheringDependencies() { - return new TetheringDependencies() { - @Override - public NetworkRequest getDefaultNetworkRequest() { - // TODO: b/147280869, add a proper system API to replace this. - final NetworkRequest trackDefaultRequest = new NetworkRequest.Builder() - .clearCapabilities() - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED) - .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build(); - return trackDefaultRequest; - } - - @Override - public Looper getTetheringLooper() { - final HandlerThread tetherThread = new HandlerThread("android.tethering"); - tetherThread.start(); - return tetherThread.getLooper(); - } - - @Override - public Context getContext() { - return TetheringService.this; - } - - @Override - public IpServer.Dependencies getIpServerDependencies() { - return new IpServer.Dependencies() { - @Override - public void makeDhcpServer(String ifName, DhcpServingParamsParcel params, - DhcpServerCallbacks cb) { - try { - final INetworkStackConnector service = getNetworkStackConnector(); - if (service == null) return; - - service.makeDhcpServer(ifName, params, cb); - } catch (RemoteException e) { - Log.e(TAG, "Fail to make dhcp server"); - try { - cb.onDhcpServerCreated(STATUS_UNKNOWN_ERROR, null); - } catch (RemoteException re) { } - } - } - }; - } - - // TODO: replace this by NetworkStackClient#getRemoteConnector after refactoring - // networkStackClient. - static final int NETWORKSTACK_TIMEOUT_MS = 60_000; - private INetworkStackConnector getNetworkStackConnector() { - IBinder connector; - try { - final long before = System.currentTimeMillis(); - while ((connector = NetworkStack.getService()) == null) { - if (System.currentTimeMillis() - before > NETWORKSTACK_TIMEOUT_MS) { - Log.wtf(TAG, "Timeout, fail to get INetworkStackConnector"); - return null; - } - Thread.sleep(200); - } - } catch (InterruptedException e) { - Log.wtf(TAG, "Interrupted, fail to get INetworkStackConnector"); - return null; - } - return INetworkStackConnector.Stub.asInterface(connector); - } - - @Override - public BluetoothAdapter getBluetoothAdapter() { - return BluetoothAdapter.getDefaultAdapter(); - } - }; - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java deleted file mode 100644 index 320427c393ac..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkMonitor.java +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import static android.net.ConnectivityManager.TYPE_BLUETOOTH; -import static android.net.ConnectivityManager.TYPE_ETHERNET; -import static android.net.ConnectivityManager.TYPE_MOBILE; -import static android.net.ConnectivityManager.TYPE_MOBILE_DUN; -import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI; -import static android.net.ConnectivityManager.TYPE_WIFI; -import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; -import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED; -import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; -import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.ConnectivityManager.NetworkCallback; -import android.net.IpPrefix; -import android.net.LinkProperties; -import android.net.Network; -import android.net.NetworkCapabilities; -import android.net.NetworkRequest; -import android.net.util.PrefixUtils; -import android.net.util.SharedLog; -import android.os.Handler; -import android.util.Log; -import android.util.SparseIntArray; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.StateMachine; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - - -/** - * A class to centralize all the network and link properties information - * pertaining to the current and any potential upstream network. - * - * The owner of UNM gets it to register network callbacks by calling the - * following methods : - * Calling #startTrackDefaultNetwork() to track the system default network. - * Calling #startObserveAllNetworks() to observe all networks. Listening all - * networks is necessary while the expression of preferred upstreams remains - * a list of legacy connectivity types. In future, this can be revisited. - * Calling #registerMobileNetworkRequest() to bring up mobile DUN/HIPRI network. - * - * The methods and data members of this class are only to be accessed and - * modified from the tethering master state machine thread. Any other - * access semantics would necessitate the addition of locking. - * - * TODO: Move upstream selection logic here. - * - * All callback methods are run on the same thread as the specified target - * state machine. This class does not require locking when accessed from this - * thread. Access from other threads is not advised. - * - * @hide - */ -public class UpstreamNetworkMonitor { - private static final String TAG = UpstreamNetworkMonitor.class.getSimpleName(); - private static final boolean DBG = false; - private static final boolean VDBG = false; - - public static final int EVENT_ON_CAPABILITIES = 1; - public static final int EVENT_ON_LINKPROPERTIES = 2; - public static final int EVENT_ON_LOST = 3; - public static final int NOTIFY_LOCAL_PREFIXES = 10; - // This value is used by deprecated preferredUpstreamIfaceTypes selection which is default - // disabled. - @VisibleForTesting - public static final int TYPE_NONE = -1; - - private static final int CALLBACK_LISTEN_ALL = 1; - private static final int CALLBACK_DEFAULT_INTERNET = 2; - private static final int CALLBACK_MOBILE_REQUEST = 3; - - private static final SparseIntArray sLegacyTypeToTransport = new SparseIntArray(); - static { - sLegacyTypeToTransport.put(TYPE_MOBILE, NetworkCapabilities.TRANSPORT_CELLULAR); - sLegacyTypeToTransport.put(TYPE_MOBILE_DUN, NetworkCapabilities.TRANSPORT_CELLULAR); - sLegacyTypeToTransport.put(TYPE_MOBILE_HIPRI, NetworkCapabilities.TRANSPORT_CELLULAR); - sLegacyTypeToTransport.put(TYPE_WIFI, NetworkCapabilities.TRANSPORT_WIFI); - sLegacyTypeToTransport.put(TYPE_BLUETOOTH, NetworkCapabilities.TRANSPORT_BLUETOOTH); - sLegacyTypeToTransport.put(TYPE_ETHERNET, NetworkCapabilities.TRANSPORT_ETHERNET); - } - - private final Context mContext; - private final SharedLog mLog; - private final StateMachine mTarget; - private final Handler mHandler; - private final int mWhat; - private final HashMap<Network, UpstreamNetworkState> mNetworkMap = new HashMap<>(); - private HashSet<IpPrefix> mLocalPrefixes; - private ConnectivityManager mCM; - private EntitlementManager mEntitlementMgr; - private NetworkCallback mListenAllCallback; - private NetworkCallback mDefaultNetworkCallback; - private NetworkCallback mMobileNetworkCallback; - private boolean mDunRequired; - // Whether the current default upstream is mobile or not. - private boolean mIsDefaultCellularUpstream; - // The current system default network (not really used yet). - private Network mDefaultInternetNetwork; - // The current upstream network used for tethering. - private Network mTetheringUpstreamNetwork; - - public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, SharedLog log, int what) { - mContext = ctx; - mTarget = tgt; - mHandler = mTarget.getHandler(); - mLog = log.forSubComponent(TAG); - mWhat = what; - mLocalPrefixes = new HashSet<>(); - mIsDefaultCellularUpstream = false; - } - - @VisibleForTesting - public UpstreamNetworkMonitor( - ConnectivityManager cm, StateMachine tgt, SharedLog log, int what) { - this((Context) null, tgt, log, what); - mCM = cm; - } - - /** - * Tracking the system default network. This method should be called when system is ready. - * - * @param defaultNetworkRequest should be the same as ConnectivityService default request - * @param entitle a EntitlementManager object to communicate between EntitlementManager and - * UpstreamNetworkMonitor - */ - public void startTrackDefaultNetwork(NetworkRequest defaultNetworkRequest, - EntitlementManager entitle) { - - // defaultNetworkRequest is not really a "request", just a way of tracking the system - // default network. It's guaranteed not to actually bring up any networks because it's - // the should be the same request as the ConnectivityService default request, and thus - // shares fate with it. We can't use registerDefaultNetworkCallback because it will not - // track the system default network if there is a VPN that applies to our UID. - if (mDefaultNetworkCallback == null) { - mDefaultNetworkCallback = new UpstreamNetworkCallback(CALLBACK_DEFAULT_INTERNET); - cm().requestNetwork(defaultNetworkRequest, mDefaultNetworkCallback, mHandler); - } - if (mEntitlementMgr == null) { - mEntitlementMgr = entitle; - } - } - - /** Listen all networks. */ - public void startObserveAllNetworks() { - stop(); - - final NetworkRequest listenAllRequest = new NetworkRequest.Builder() - .clearCapabilities().build(); - mListenAllCallback = new UpstreamNetworkCallback(CALLBACK_LISTEN_ALL); - cm().registerNetworkCallback(listenAllRequest, mListenAllCallback, mHandler); - } - - /** - * Stop tracking candidate tethering upstreams and release mobile network request. - * Note: this function is used when tethering is stopped because tethering do not need to - * choose upstream anymore. But it would not stop default network tracking because - * EntitlementManager may need to know default network to decide whether to request entitlement - * check even tethering is not active yet. - */ - public void stop() { - releaseMobileNetworkRequest(); - - releaseCallback(mListenAllCallback); - mListenAllCallback = null; - - mTetheringUpstreamNetwork = null; - mNetworkMap.clear(); - } - - /** Setup or teardown DUN connection according to |dunRequired|. */ - public void updateMobileRequiresDun(boolean dunRequired) { - final boolean valueChanged = (mDunRequired != dunRequired); - mDunRequired = dunRequired; - if (valueChanged && mobileNetworkRequested()) { - releaseMobileNetworkRequest(); - registerMobileNetworkRequest(); - } - } - - /** Whether mobile network is requested. */ - public boolean mobileNetworkRequested() { - return (mMobileNetworkCallback != null); - } - - /** Request mobile network if mobile upstream is permitted. */ - public void registerMobileNetworkRequest() { - if (!isCellularUpstreamPermitted()) { - mLog.i("registerMobileNetworkRequest() is not permitted"); - releaseMobileNetworkRequest(); - return; - } - if (mMobileNetworkCallback != null) { - mLog.e("registerMobileNetworkRequest() already registered"); - return; - } - - final NetworkRequest mobileUpstreamRequest; - if (mDunRequired) { - mobileUpstreamRequest = new NetworkRequest.Builder() - .addCapability(NET_CAPABILITY_DUN) - .removeCapability(NET_CAPABILITY_NOT_RESTRICTED) - .addTransportType(TRANSPORT_CELLULAR).build(); - } else { - mobileUpstreamRequest = new NetworkRequest.Builder() - .addCapability(NET_CAPABILITY_INTERNET) - .addTransportType(TRANSPORT_CELLULAR).build(); - } - - // The existing default network and DUN callbacks will be notified. - // Therefore, to avoid duplicate notifications, we only register a no-op. - mMobileNetworkCallback = new UpstreamNetworkCallback(CALLBACK_MOBILE_REQUEST); - - // The following use of the legacy type system cannot be removed until - // upstream selection no longer finds networks by legacy type. - // See also http://b/34364553 . - final int legacyType = mDunRequired ? TYPE_MOBILE_DUN : TYPE_MOBILE_HIPRI; - - // TODO: Change the timeout from 0 (no onUnavailable callback) to some - // moderate callback timeout. This might be useful for updating some UI. - // Additionally, we log a message to aid in any subsequent debugging. - mLog.i("requesting mobile upstream network: " + mobileUpstreamRequest); - - cm().requestNetwork(mobileUpstreamRequest, 0, legacyType, mHandler, - mMobileNetworkCallback); - } - - /** Release mobile network request. */ - public void releaseMobileNetworkRequest() { - if (mMobileNetworkCallback == null) return; - - cm().unregisterNetworkCallback(mMobileNetworkCallback); - mMobileNetworkCallback = null; - } - - // So many TODOs here, but chief among them is: make this functionality an - // integral part of this class such that whenever a higher priority network - // becomes available and useful we (a) file a request to keep it up as - // necessary and (b) change all upstream tracking state accordingly (by - // passing LinkProperties up to Tethering). - /** - * Select the first available network from |perferredTypes|. - */ - public UpstreamNetworkState selectPreferredUpstreamType(Iterable<Integer> preferredTypes) { - final TypeStatePair typeStatePair = findFirstAvailableUpstreamByType( - mNetworkMap.values(), preferredTypes, isCellularUpstreamPermitted()); - - mLog.log("preferred upstream type: " + typeStatePair.type); - - switch (typeStatePair.type) { - case TYPE_MOBILE_DUN: - case TYPE_MOBILE_HIPRI: - // Tethering just selected mobile upstream in spite of the default network being - // not mobile. This can happen because of the priority list. - // Notify EntitlementManager to check permission for using mobile upstream. - if (!mIsDefaultCellularUpstream) { - mEntitlementMgr.maybeRunProvisioning(); - } - // If we're on DUN, put our own grab on it. - registerMobileNetworkRequest(); - break; - case TYPE_NONE: - // If we found NONE and mobile upstream is permitted we don't want to do this - // as we want any previous requests to keep trying to bring up something we can use. - if (!isCellularUpstreamPermitted()) releaseMobileNetworkRequest(); - break; - default: - // If we've found an active upstream connection that's not DUN/HIPRI - // we should stop any outstanding DUN/HIPRI requests. - releaseMobileNetworkRequest(); - break; - } - - return typeStatePair.ns; - } - - /** - * Get current preferred upstream network. If default network is cellular and DUN is required, - * preferred upstream would be DUN otherwise preferred upstream is the same as default network. - * Returns null if no current upstream is available. - */ - public UpstreamNetworkState getCurrentPreferredUpstream() { - final UpstreamNetworkState dfltState = (mDefaultInternetNetwork != null) - ? mNetworkMap.get(mDefaultInternetNetwork) - : null; - if (isNetworkUsableAndNotCellular(dfltState)) return dfltState; - - if (!isCellularUpstreamPermitted()) return null; - - if (!mDunRequired) return dfltState; - - // Find a DUN network. Note that code in Tethering causes a DUN request - // to be filed, but this might be moved into this class in future. - return findFirstDunNetwork(mNetworkMap.values()); - } - - /** Tell UpstreamNetworkMonitor which network is the current upstream of tethering. */ - public void setCurrentUpstream(Network upstream) { - mTetheringUpstreamNetwork = upstream; - } - - /** Return local prefixes. */ - public Set<IpPrefix> getLocalPrefixes() { - return (Set<IpPrefix>) mLocalPrefixes.clone(); - } - - private boolean isCellularUpstreamPermitted() { - if (mEntitlementMgr != null) { - return mEntitlementMgr.isCellularUpstreamPermitted(); - } else { - // This flow should only happens in testing. - return true; - } - } - - private void handleAvailable(Network network) { - if (mNetworkMap.containsKey(network)) return; - - if (VDBG) Log.d(TAG, "onAvailable for " + network); - mNetworkMap.put(network, new UpstreamNetworkState(null, null, network)); - } - - private void handleNetCap(Network network, NetworkCapabilities newNc) { - final UpstreamNetworkState prev = mNetworkMap.get(network); - if (prev == null || newNc.equals(prev.networkCapabilities)) { - // Ignore notifications about networks for which we have not yet - // received onAvailable() (should never happen) and any duplicate - // notifications (e.g. matching more than one of our callbacks). - return; - } - - if (VDBG) { - Log.d(TAG, String.format("EVENT_ON_CAPABILITIES for %s: %s", - network, newNc)); - } - - mNetworkMap.put(network, new UpstreamNetworkState( - prev.linkProperties, newNc, network)); - // TODO: If sufficient information is available to select a more - // preferable upstream, do so now and notify the target. - notifyTarget(EVENT_ON_CAPABILITIES, network); - } - - private void handleLinkProp(Network network, LinkProperties newLp) { - final UpstreamNetworkState prev = mNetworkMap.get(network); - if (prev == null || newLp.equals(prev.linkProperties)) { - // Ignore notifications about networks for which we have not yet - // received onAvailable() (should never happen) and any duplicate - // notifications (e.g. matching more than one of our callbacks). - return; - } - - if (VDBG) { - Log.d(TAG, String.format("EVENT_ON_LINKPROPERTIES for %s: %s", - network, newLp)); - } - - mNetworkMap.put(network, new UpstreamNetworkState( - newLp, prev.networkCapabilities, network)); - // TODO: If sufficient information is available to select a more - // preferable upstream, do so now and notify the target. - notifyTarget(EVENT_ON_LINKPROPERTIES, network); - } - - private void handleLost(Network network) { - // There are few TODOs within ConnectivityService's rematching code - // pertaining to spurious onLost() notifications. - // - // TODO: simplify this, probably if favor of code that: - // - selects a new upstream if mTetheringUpstreamNetwork has - // been lost (by any callback) - // - deletes the entry from the map only when the LISTEN_ALL - // callback gets notified. - - if (!mNetworkMap.containsKey(network)) { - // Ignore loss of networks about which we had not previously - // learned any information or for which we have already processed - // an onLost() notification. - return; - } - - if (VDBG) Log.d(TAG, "EVENT_ON_LOST for " + network); - - // TODO: If sufficient information is available to select a more - // preferable upstream, do so now and notify the target. Likewise, - // if the current upstream network is gone, notify the target of the - // fact that we now have no upstream at all. - notifyTarget(EVENT_ON_LOST, mNetworkMap.remove(network)); - } - - private void recomputeLocalPrefixes() { - final HashSet<IpPrefix> localPrefixes = allLocalPrefixes(mNetworkMap.values()); - if (!mLocalPrefixes.equals(localPrefixes)) { - mLocalPrefixes = localPrefixes; - notifyTarget(NOTIFY_LOCAL_PREFIXES, localPrefixes.clone()); - } - } - - // Fetch (and cache) a ConnectivityManager only if and when we need one. - private ConnectivityManager cm() { - if (mCM == null) { - // MUST call the String variant to be able to write unittests. - mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - } - return mCM; - } - - /** - * A NetworkCallback class that handles information of interest directly - * in the thread on which it is invoked. To avoid locking, this MUST be - * run on the same thread as the target state machine's handler. - */ - private class UpstreamNetworkCallback extends NetworkCallback { - private final int mCallbackType; - - UpstreamNetworkCallback(int callbackType) { - mCallbackType = callbackType; - } - - @Override - public void onAvailable(Network network) { - handleAvailable(network); - } - - @Override - public void onCapabilitiesChanged(Network network, NetworkCapabilities newNc) { - if (mCallbackType == CALLBACK_DEFAULT_INTERNET) { - mDefaultInternetNetwork = network; - final boolean newIsCellular = isCellular(newNc); - if (mIsDefaultCellularUpstream != newIsCellular) { - mIsDefaultCellularUpstream = newIsCellular; - mEntitlementMgr.notifyUpstream(newIsCellular); - } - return; - } - - handleNetCap(network, newNc); - } - - @Override - public void onLinkPropertiesChanged(Network network, LinkProperties newLp) { - if (mCallbackType == CALLBACK_DEFAULT_INTERNET) return; - - handleLinkProp(network, newLp); - // Any non-LISTEN_ALL callback will necessarily concern a network that will - // also match the LISTEN_ALL callback by construction of the LISTEN_ALL callback. - // So it's not useful to do this work for non-LISTEN_ALL callbacks. - if (mCallbackType == CALLBACK_LISTEN_ALL) { - recomputeLocalPrefixes(); - } - } - - @Override - public void onLost(Network network) { - if (mCallbackType == CALLBACK_DEFAULT_INTERNET) { - mDefaultInternetNetwork = null; - mIsDefaultCellularUpstream = false; - mEntitlementMgr.notifyUpstream(false); - return; - } - - handleLost(network); - // Any non-LISTEN_ALL callback will necessarily concern a network that will - // also match the LISTEN_ALL callback by construction of the LISTEN_ALL callback. - // So it's not useful to do this work for non-LISTEN_ALL callbacks. - if (mCallbackType == CALLBACK_LISTEN_ALL) { - recomputeLocalPrefixes(); - } - } - } - - private void releaseCallback(NetworkCallback cb) { - if (cb != null) cm().unregisterNetworkCallback(cb); - } - - private void notifyTarget(int which, Network network) { - notifyTarget(which, mNetworkMap.get(network)); - } - - private void notifyTarget(int which, Object obj) { - mTarget.sendMessage(mWhat, which, 0, obj); - } - - private static class TypeStatePair { - public int type = TYPE_NONE; - public UpstreamNetworkState ns = null; - } - - private static TypeStatePair findFirstAvailableUpstreamByType( - Iterable<UpstreamNetworkState> netStates, Iterable<Integer> preferredTypes, - boolean isCellularUpstreamPermitted) { - final TypeStatePair result = new TypeStatePair(); - - for (int type : preferredTypes) { - NetworkCapabilities nc; - try { - nc = networkCapabilitiesForType(type); - } catch (IllegalArgumentException iae) { - Log.e(TAG, "No NetworkCapabilities mapping for legacy type: " + type); - continue; - } - if (!isCellularUpstreamPermitted && isCellular(nc)) { - continue; - } - - for (UpstreamNetworkState value : netStates) { - if (!nc.satisfiedByNetworkCapabilities(value.networkCapabilities)) { - continue; - } - - result.type = type; - result.ns = value; - return result; - } - } - - return result; - } - - private static HashSet<IpPrefix> allLocalPrefixes(Iterable<UpstreamNetworkState> netStates) { - final HashSet<IpPrefix> prefixSet = new HashSet<>(); - - for (UpstreamNetworkState ns : netStates) { - final LinkProperties lp = ns.linkProperties; - if (lp == null) continue; - prefixSet.addAll(PrefixUtils.localPrefixesFrom(lp)); - } - - return prefixSet; - } - - private static boolean isCellular(UpstreamNetworkState ns) { - return (ns != null) && isCellular(ns.networkCapabilities); - } - - private static boolean isCellular(NetworkCapabilities nc) { - return (nc != null) && nc.hasTransport(TRANSPORT_CELLULAR) - && nc.hasCapability(NET_CAPABILITY_NOT_VPN); - } - - private static boolean hasCapability(UpstreamNetworkState ns, int netCap) { - return (ns != null) && (ns.networkCapabilities != null) - && ns.networkCapabilities.hasCapability(netCap); - } - - private static boolean isNetworkUsableAndNotCellular(UpstreamNetworkState ns) { - return (ns != null) && (ns.networkCapabilities != null) && (ns.linkProperties != null) - && !isCellular(ns.networkCapabilities); - } - - private static UpstreamNetworkState findFirstDunNetwork( - Iterable<UpstreamNetworkState> netStates) { - for (UpstreamNetworkState ns : netStates) { - if (isCellular(ns) && hasCapability(ns, NET_CAPABILITY_DUN)) return ns; - } - - return null; - } - - /** - * Given a legacy type (TYPE_WIFI, ...) returns the corresponding NetworkCapabilities instance. - * This function is used for deprecated legacy type and be disabled by default. - */ - @VisibleForTesting - public static NetworkCapabilities networkCapabilitiesForType(int type) { - final NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder(); - - // Map from type to transports. - final int notFound = -1; - final int transport = sLegacyTypeToTransport.get(type, notFound); - if (transport == notFound) { - throw new IllegalArgumentException("unknown legacy type: " + type); - } - builder.addTransportType(transport); - - if (type == TYPE_MOBILE_DUN) { - builder.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN); - // DUN is restricted network, see NetworkCapabilities#FORCE_RESTRICTED_CAPABILITIES. - builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); - } else { - builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); - } - return builder.build(); - } -} diff --git a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkState.java b/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkState.java deleted file mode 100644 index bab9f84cf762..000000000000 --- a/packages/Tethering/src/com/android/networkstack/tethering/UpstreamNetworkState.java +++ /dev/null @@ -1,51 +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 com.android.networkstack.tethering; - -import android.net.LinkProperties; -import android.net.Network; -import android.net.NetworkCapabilities; - -import androidx.annotation.NonNull; - -/** - * Snapshot of tethering upstream network state. - */ -public class UpstreamNetworkState { - /** {@link LinkProperties}. */ - public final LinkProperties linkProperties; - /** {@link NetworkCapabilities}. */ - public final NetworkCapabilities networkCapabilities; - /** {@link Network}. */ - public final Network network; - - /** Constructs a new UpstreamNetworkState. */ - public UpstreamNetworkState(LinkProperties linkProperties, - NetworkCapabilities networkCapabilities, Network network) { - this.linkProperties = linkProperties; - this.networkCapabilities = networkCapabilities; - this.network = network; - } - - @NonNull - @Override - public String toString() { - return String.format("UpstreamNetworkState{%s, %s, %s}", - network == null ? "null" : network, - networkCapabilities == null ? "null" : networkCapabilities, - linkProperties == null ? "null" : linkProperties); - } -} diff --git a/packages/Tethering/tests/integration/Android.bp b/packages/Tethering/tests/integration/Android.bp deleted file mode 100644 index ed69b7d63cb4..000000000000 --- a/packages/Tethering/tests/integration/Android.bp +++ /dev/null @@ -1,85 +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. -// -java_defaults { - name: "TetheringIntegrationTestsDefaults", - srcs: [ - "src/**/*.java", - "src/**/*.kt", - ], - static_libs: [ - "NetworkStackApiStableLib", - "androidx.test.rules", - "frameworks-base-testutils", - "mockito-target-extended-minus-junit4", - "net-tests-utils", - "testables", - ], - libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", - ], - jni_libs: [ - // For mockito extended - "libdexmakerjvmtiagent", - "libstaticjvmtiagent", - ], - jarjar_rules: ":NetworkStackJarJarRules", -} - -android_library { - name: "TetheringIntegrationTestsLib", - platform_apis: true, - defaults: ["TetheringIntegrationTestsDefaults"], - visibility: ["//cts/tests/tests/tethering"] -} - -android_test { - name: "TetheringIntegrationTests", - platform_apis: true, - defaults: ["TetheringIntegrationTestsDefaults"], - test_suites: [ - "device-tests", - "mts", - ], - compile_multilib: "both", -} - -// Special version of the tethering tests that includes all tests necessary for code coverage -// purposes. This is currently the union of TetheringTests, TetheringIntegrationTests and -// NetworkStackTests. -android_test { - name: "TetheringCoverageTests", - platform_apis: true, - test_suites: ["device-tests", "mts"], - test_config: "AndroidTest_Coverage.xml", - defaults: ["libnetworkstackutilsjni_deps"], - static_libs: [ - "NetworkStaticLibTestsLib", - "NetworkStackTestsLib", - "TetheringTestsLib", - "TetheringIntegrationTestsLib", - ], - jni_libs: [ - // For mockito extended - "libdexmakerjvmtiagent", - "libstaticjvmtiagent", - // For NetworkStackUtils included in NetworkStackBase - "libnetworkstackutilsjni", - ], - compile_multilib: "both", - manifest: "AndroidManifest_coverage.xml", -}
\ No newline at end of file diff --git a/packages/Tethering/tests/integration/AndroidManifest.xml b/packages/Tethering/tests/integration/AndroidManifest.xml deleted file mode 100644 index fddfaad29f0f..000000000000 --- a/packages/Tethering/tests/integration/AndroidManifest.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.networkstack.tethering.tests.integration"> - - <uses-permission android:name="android.permission.INTERNET"/> - - <application android:debuggable="true"> - <uses-library android:name="android.test.runner" /> - </application> - <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.networkstack.tethering.tests.integration" - android:label="Tethering integration tests"> - </instrumentation> -</manifest> diff --git a/packages/Tethering/tests/integration/AndroidManifest_coverage.xml b/packages/Tethering/tests/integration/AndroidManifest_coverage.xml deleted file mode 100644 index 06de00d78558..000000000000 --- a/packages/Tethering/tests/integration/AndroidManifest_coverage.xml +++ /dev/null @@ -1,29 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2020 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - package="com.android.networkstack.tethering.tests.coverage"> - - <application tools:replace="android:label" - android:debuggable="true" - android:label="Tethering coverage tests"> - <uses-library android:name="android.test.runner" /> - </application> - <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.networkstack.tethering.tests.coverage" - android:label="Tethering coverage tests"> - </instrumentation> -</manifest> diff --git a/packages/Tethering/tests/integration/AndroidTest_Coverage.xml b/packages/Tethering/tests/integration/AndroidTest_Coverage.xml deleted file mode 100644 index 3def2099e45f..000000000000 --- a/packages/Tethering/tests/integration/AndroidTest_Coverage.xml +++ /dev/null @@ -1,12 +0,0 @@ -<configuration description="Runs coverage tests for Tethering"> - <target_preparer class="com.android.tradefed.targetprep.TestAppInstallSetup"> - <option name="test-file-name" value="TetheringCoverageTests.apk" /> - </target_preparer> - - <option name="test-tag" value="TetheringCoverageTests" /> - <test class="com.android.tradefed.testtype.AndroidJUnitTest" > - <option name="package" value="com.android.networkstack.tethering.tests.coverage" /> - <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> - <option name="hidden-api-checks" value="false"/> - </test> -</configuration>
\ No newline at end of file diff --git a/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java b/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java deleted file mode 100644 index 9bb01ae5df1d..000000000000 --- a/packages/Tethering/tests/integration/src/android/net/EthernetTetheringTest.java +++ /dev/null @@ -1,567 +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.net; - -import static android.Manifest.permission.MANAGE_TEST_NETWORKS; -import static android.Manifest.permission.NETWORK_SETTINGS; -import static android.Manifest.permission.TETHER_PRIVILEGED; -import static android.net.TetheringManager.TETHERING_ETHERNET; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.junit.Assume.assumeFalse; -import static org.junit.Assume.assumeTrue; - -import android.app.UiAutomation; -import android.content.Context; -import android.net.EthernetManager.TetheredInterfaceCallback; -import android.net.EthernetManager.TetheredInterfaceRequest; -import android.net.TetheringManager.StartTetheringCallback; -import android.net.TetheringManager.TetheringEventCallback; -import android.net.TetheringManager.TetheringRequest; -import android.net.dhcp.DhcpAckPacket; -import android.net.dhcp.DhcpOfferPacket; -import android.net.dhcp.DhcpPacket; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.SystemClock; -import android.os.SystemProperties; -import android.system.Os; -import android.util.Log; - -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.MediumTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.testutils.HandlerUtilsKt; -import com.android.testutils.TapPacketReader; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.io.FileDescriptor; -import java.net.Inet4Address; -import java.net.InterfaceAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.nio.ByteBuffer; -import java.util.Collection; -import java.util.List; -import java.util.Random; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -@RunWith(AndroidJUnit4.class) -@MediumTest -public class EthernetTetheringTest { - - private static final String TAG = EthernetTetheringTest.class.getSimpleName(); - private static final int TIMEOUT_MS = 5000; - private static final int PACKET_READ_TIMEOUT_MS = 100; - private static final int DHCP_DISCOVER_ATTEMPTS = 10; - private static final byte[] DHCP_REQUESTED_PARAMS = new byte[] { - DhcpPacket.DHCP_SUBNET_MASK, - DhcpPacket.DHCP_ROUTER, - DhcpPacket.DHCP_DNS_SERVER, - DhcpPacket.DHCP_LEASE_TIME, - }; - private static final String DHCP_HOSTNAME = "testhostname"; - - private final Context mContext = InstrumentationRegistry.getContext(); - private final EthernetManager mEm = mContext.getSystemService(EthernetManager.class); - private final TetheringManager mTm = mContext.getSystemService(TetheringManager.class); - - private TestNetworkInterface mTestIface; - private HandlerThread mHandlerThread; - private Handler mHandler; - private TapPacketReader mTapPacketReader; - - private TetheredInterfaceRequester mTetheredInterfaceRequester; - private MyTetheringEventCallback mTetheringEventCallback; - - private UiAutomation mUiAutomation = - InstrumentationRegistry.getInstrumentation().getUiAutomation(); - private boolean mRunTests; - - @Before - public void setUp() throws Exception { - // Needed to create a TestNetworkInterface, to call requestTetheredInterface, and to receive - // tethered client callbacks. - mUiAutomation.adoptShellPermissionIdentity( - MANAGE_TEST_NETWORKS, NETWORK_SETTINGS, TETHER_PRIVILEGED); - mRunTests = mTm.isTetheringSupported() && mEm != null; - assumeTrue(mRunTests); - - mHandlerThread = new HandlerThread(getClass().getSimpleName()); - mHandlerThread.start(); - mHandler = new Handler(mHandlerThread.getLooper()); - mTetheredInterfaceRequester = new TetheredInterfaceRequester(mHandler, mEm); - } - - private void cleanUp() throws Exception { - mTm.stopTethering(TETHERING_ETHERNET); - if (mTetheringEventCallback != null) { - mTetheringEventCallback.awaitInterfaceUntethered(); - mTetheringEventCallback.unregister(); - mTetheringEventCallback = null; - } - if (mTapPacketReader != null) { - TapPacketReader reader = mTapPacketReader; - mHandler.post(() -> reader.stop()); - mTapPacketReader = null; - } - mHandlerThread.quitSafely(); - mTetheredInterfaceRequester.release(); - mEm.setIncludeTestInterfaces(false); - maybeDeleteTestInterface(); - } - - @After - public void tearDown() throws Exception { - try { - if (mRunTests) cleanUp(); - } finally { - mUiAutomation.dropShellPermissionIdentity(); - } - } - - @Test - public void testVirtualEthernetAlreadyExists() throws Exception { - // This test requires manipulating packets. Skip if there is a physical Ethernet connected. - assumeFalse(mEm.isAvailable()); - - mTestIface = createTestInterface(); - // This must be done now because as soon as setIncludeTestInterfaces(true) is called, the - // interface will be placed in client mode, which will delete the link-local address. - // At that point NetworkInterface.getByName() will cease to work on the interface, because - // starting in R NetworkInterface can no longer see interfaces without IP addresses. - int mtu = getMTU(mTestIface); - - Log.d(TAG, "Including test interfaces"); - mEm.setIncludeTestInterfaces(true); - - final String iface = mTetheredInterfaceRequester.getInterface(); - assertEquals("TetheredInterfaceCallback for unexpected interface", - mTestIface.getInterfaceName(), iface); - - checkVirtualEthernet(mTestIface, mtu); - } - - @Test - public void testVirtualEthernet() throws Exception { - // This test requires manipulating packets. Skip if there is a physical Ethernet connected. - assumeFalse(mEm.isAvailable()); - - CompletableFuture<String> futureIface = mTetheredInterfaceRequester.requestInterface(); - - mEm.setIncludeTestInterfaces(true); - - mTestIface = createTestInterface(); - - final String iface = futureIface.get(TIMEOUT_MS, TimeUnit.MILLISECONDS); - assertEquals("TetheredInterfaceCallback for unexpected interface", - mTestIface.getInterfaceName(), iface); - - checkVirtualEthernet(mTestIface, getMTU(mTestIface)); - } - - @Test - public void testStaticIpv4() throws Exception { - assumeFalse(mEm.isAvailable()); - - mEm.setIncludeTestInterfaces(true); - - mTestIface = createTestInterface(); - - final String iface = mTetheredInterfaceRequester.getInterface(); - assertEquals("TetheredInterfaceCallback for unexpected interface", - mTestIface.getInterfaceName(), iface); - - assertInvalidStaticIpv4Request(iface, null, null); - assertInvalidStaticIpv4Request(iface, "2001:db8::1/64", "2001:db8:2::/64"); - assertInvalidStaticIpv4Request(iface, "192.0.2.2/28", "2001:db8:2::/28"); - assertInvalidStaticIpv4Request(iface, "2001:db8:2::/28", "192.0.2.2/28"); - assertInvalidStaticIpv4Request(iface, "192.0.2.2/28", null); - assertInvalidStaticIpv4Request(iface, null, "192.0.2.2/28"); - assertInvalidStaticIpv4Request(iface, "192.0.2.3/27", "192.0.2.2/28"); - - final String localAddr = "192.0.2.3/28"; - final String clientAddr = "192.0.2.2/28"; - mTetheringEventCallback = enableEthernetTethering(iface, - requestWithStaticIpv4(localAddr, clientAddr)); - - mTetheringEventCallback.awaitInterfaceTethered(); - assertInterfaceHasIpAddress(iface, localAddr); - - byte[] client1 = MacAddress.fromString("1:2:3:4:5:6").toByteArray(); - byte[] client2 = MacAddress.fromString("a:b:c:d:e:f").toByteArray(); - - FileDescriptor fd = mTestIface.getFileDescriptor().getFileDescriptor(); - mTapPacketReader = makePacketReader(fd, getMTU(mTestIface)); - DhcpResults dhcpResults = runDhcp(fd, client1); - assertEquals(new LinkAddress(clientAddr), dhcpResults.ipAddress); - - try { - runDhcp(fd, client2); - fail("Only one client should get an IP address"); - } catch (TimeoutException expected) { } - - } - - private boolean isAdbOverNetwork() { - // If adb TCP port opened, this test may running by adb over network. - return (SystemProperties.getInt("persist.adb.tcp.port", -1) > -1) - || (SystemProperties.getInt("service.adb.tcp.port", -1) > -1); - } - - @Test - public void testPhysicalEthernet() throws Exception { - assumeTrue(mEm.isAvailable()); - // Do not run this test if adb is over network and ethernet is connected. - // It is likely the adb run over ethernet, the adb would break when ethernet is switching - // from client mode to server mode. See b/160389275. - assumeFalse(isAdbOverNetwork()); - - // Get an interface to use. - final String iface = mTetheredInterfaceRequester.getInterface(); - - // Enable Ethernet tethering and check that it starts. - mTetheringEventCallback = enableEthernetTethering(iface); - - // There is nothing more we can do on a physical interface without connecting an actual - // client, which is not possible in this test. - } - - private static final class MyTetheringEventCallback implements TetheringEventCallback { - private final TetheringManager mTm; - private final CountDownLatch mTetheringStartedLatch = new CountDownLatch(1); - private final CountDownLatch mTetheringStoppedLatch = new CountDownLatch(1); - private final CountDownLatch mClientConnectedLatch = new CountDownLatch(1); - private final String mIface; - - private volatile boolean mInterfaceWasTethered = false; - private volatile boolean mUnregistered = false; - private volatile Collection<TetheredClient> mClients = null; - - MyTetheringEventCallback(TetheringManager tm, String iface) { - mTm = tm; - mIface = iface; - } - - public void unregister() { - mTm.unregisterTetheringEventCallback(this); - mUnregistered = true; - } - - @Override - public void onTetheredInterfacesChanged(List<String> interfaces) { - // Ignore stale callbacks registered by previous test cases. - if (mUnregistered) return; - - final boolean wasTethered = mTetheringStartedLatch.getCount() == 0; - if (!mInterfaceWasTethered && (mIface == null || interfaces.contains(mIface))) { - // This interface is being tethered for the first time. - Log.d(TAG, "Tethering started: " + interfaces); - mInterfaceWasTethered = true; - mTetheringStartedLatch.countDown(); - } else if (mInterfaceWasTethered && !interfaces.contains(mIface)) { - Log.d(TAG, "Tethering stopped: " + interfaces); - mTetheringStoppedLatch.countDown(); - } - } - - public void awaitInterfaceTethered() throws Exception { - assertTrue("Ethernet not tethered after " + TIMEOUT_MS + "ms", - mTetheringStartedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); - } - - public void awaitInterfaceUntethered() throws Exception { - // Don't block teardown if the interface was never tethered. - // This is racy because the interface might become tethered right after this check, but - // that can only happen in tearDown if startTethering timed out, which likely means - // the test has already failed. - if (!mInterfaceWasTethered) return; - - assertTrue(mIface + " not untethered after " + TIMEOUT_MS + "ms", - mTetheringStoppedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); - } - - @Override - public void onError(String ifName, int error) { - // Ignore stale callbacks registered by previous test cases. - if (mUnregistered) return; - - fail("TetheringEventCallback got error:" + error + " on iface " + ifName); - } - - @Override - public void onClientsChanged(Collection<TetheredClient> clients) { - // Ignore stale callbacks registered by previous test cases. - if (mUnregistered) return; - - Log.d(TAG, "Got clients changed: " + clients); - mClients = clients; - if (clients.size() > 0) { - mClientConnectedLatch.countDown(); - } - } - - public Collection<TetheredClient> awaitClientConnected() throws Exception { - assertTrue("Did not receive client connected callback after " + TIMEOUT_MS + "ms", - mClientConnectedLatch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)); - return mClients; - } - } - - private MyTetheringEventCallback enableEthernetTethering(String iface, - TetheringRequest request) throws Exception { - MyTetheringEventCallback callback = new MyTetheringEventCallback(mTm, iface); - mTm.registerTetheringEventCallback(mHandler::post, callback); - - StartTetheringCallback startTetheringCallback = new StartTetheringCallback() { - @Override - public void onTetheringFailed(int resultCode) { - fail("Unexpectedly got onTetheringFailed"); - } - }; - Log.d(TAG, "Starting Ethernet tethering"); - mTm.startTethering(request, mHandler::post /* executor */, startTetheringCallback); - callback.awaitInterfaceTethered(); - return callback; - } - - private MyTetheringEventCallback enableEthernetTethering(String iface) throws Exception { - return enableEthernetTethering(iface, - new TetheringRequest.Builder(TETHERING_ETHERNET) - .setShouldShowEntitlementUi(false).build()); - } - - private int getMTU(TestNetworkInterface iface) throws SocketException { - NetworkInterface nif = NetworkInterface.getByName(iface.getInterfaceName()); - assertNotNull("Can't get NetworkInterface object for " + iface.getInterfaceName(), nif); - return nif.getMTU(); - } - - private TapPacketReader makePacketReader(FileDescriptor fd, int mtu) { - final TapPacketReader reader = new TapPacketReader(mHandler, fd, mtu); - mHandler.post(() -> reader.start()); - HandlerUtilsKt.waitForIdle(mHandler, TIMEOUT_MS); - return reader; - } - - private void checkVirtualEthernet(TestNetworkInterface iface, int mtu) throws Exception { - FileDescriptor fd = iface.getFileDescriptor().getFileDescriptor(); - mTapPacketReader = makePacketReader(fd, mtu); - mTetheringEventCallback = enableEthernetTethering(iface.getInterfaceName()); - checkTetheredClientCallbacks(fd); - } - - private DhcpResults runDhcp(FileDescriptor fd, byte[] clientMacAddr) throws Exception { - // We have to retransmit DHCP requests because IpServer declares itself to be ready before - // its DhcpServer is actually started. TODO: fix this race and remove this loop. - DhcpPacket offerPacket = null; - for (int i = 0; i < DHCP_DISCOVER_ATTEMPTS; i++) { - Log.d(TAG, "Sending DHCP discover"); - sendDhcpDiscover(fd, clientMacAddr); - offerPacket = getNextDhcpPacket(); - if (offerPacket instanceof DhcpOfferPacket) break; - } - if (!(offerPacket instanceof DhcpOfferPacket)) { - throw new TimeoutException("No DHCPOFFER received on interface within timeout"); - } - - sendDhcpRequest(fd, offerPacket, clientMacAddr); - DhcpPacket ackPacket = getNextDhcpPacket(); - if (!(ackPacket instanceof DhcpAckPacket)) { - throw new TimeoutException("No DHCPACK received on interface within timeout"); - } - - return ackPacket.toDhcpResults(); - } - - private void checkTetheredClientCallbacks(FileDescriptor fd) throws Exception { - // Create a fake client. - byte[] clientMacAddr = new byte[6]; - new Random().nextBytes(clientMacAddr); - - DhcpResults dhcpResults = runDhcp(fd, clientMacAddr); - - final Collection<TetheredClient> clients = mTetheringEventCallback.awaitClientConnected(); - assertEquals(1, clients.size()); - final TetheredClient client = clients.iterator().next(); - - // Check the MAC address. - assertEquals(MacAddress.fromBytes(clientMacAddr), client.getMacAddress()); - assertEquals(TETHERING_ETHERNET, client.getTetheringType()); - - // Check the hostname. - assertEquals(1, client.getAddresses().size()); - TetheredClient.AddressInfo info = client.getAddresses().get(0); - assertEquals(DHCP_HOSTNAME, info.getHostname()); - - // Check the address is the one that was handed out in the DHCP ACK. - assertLinkAddressMatches(dhcpResults.ipAddress, info.getAddress()); - - // Check that the lifetime is correct +/- 10s. - final long now = SystemClock.elapsedRealtime(); - final long actualLeaseDuration = (info.getAddress().getExpirationTime() - now) / 1000; - final String msg = String.format("IP address should have lifetime of %d, got %d", - dhcpResults.leaseDuration, actualLeaseDuration); - assertTrue(msg, Math.abs(dhcpResults.leaseDuration - actualLeaseDuration) < 10); - } - - private DhcpPacket getNextDhcpPacket() throws ParseException { - byte[] packet; - while ((packet = mTapPacketReader.popPacket(PACKET_READ_TIMEOUT_MS)) != null) { - try { - return DhcpPacket.decodeFullPacket(packet, packet.length, DhcpPacket.ENCAP_L2); - } catch (DhcpPacket.ParseException e) { - // Not a DHCP packet. Continue. - } - } - return null; - } - - private static final class TetheredInterfaceRequester implements TetheredInterfaceCallback { - private final CountDownLatch mInterfaceAvailableLatch = new CountDownLatch(1); - private final Handler mHandler; - private final EthernetManager mEm; - - private TetheredInterfaceRequest mRequest; - private final CompletableFuture<String> mFuture = new CompletableFuture<>(); - - TetheredInterfaceRequester(Handler handler, EthernetManager em) { - mHandler = handler; - mEm = em; - } - - @Override - public void onAvailable(String iface) { - Log.d(TAG, "Ethernet interface available: " + iface); - mFuture.complete(iface); - } - - @Override - public void onUnavailable() { - mFuture.completeExceptionally(new IllegalStateException("onUnavailable received")); - } - - public CompletableFuture<String> requestInterface() { - assertNull("BUG: more than one tethered interface request", mRequest); - Log.d(TAG, "Requesting tethered interface"); - mRequest = mEm.requestTetheredInterface(mHandler::post, this); - return mFuture; - } - - public String getInterface() throws Exception { - return requestInterface().get(TIMEOUT_MS, TimeUnit.MILLISECONDS); - } - - public void release() { - if (mRequest != null) { - mFuture.obtrudeException(new IllegalStateException("Request already released")); - mRequest.release(); - mRequest = null; - } - } - } - - private void sendDhcpDiscover(FileDescriptor fd, byte[] macAddress) throws Exception { - ByteBuffer packet = DhcpPacket.buildDiscoverPacket(DhcpPacket.ENCAP_L2, - new Random().nextInt() /* transactionId */, (short) 0 /* secs */, - macAddress, false /* unicast */, DHCP_REQUESTED_PARAMS, - false /* rapid commit */, DHCP_HOSTNAME); - sendPacket(fd, packet); - } - - private void sendDhcpRequest(FileDescriptor fd, DhcpPacket offerPacket, byte[] macAddress) - throws Exception { - DhcpResults results = offerPacket.toDhcpResults(); - Inet4Address clientIp = (Inet4Address) results.ipAddress.getAddress(); - Inet4Address serverIdentifier = results.serverAddress; - ByteBuffer packet = DhcpPacket.buildRequestPacket(DhcpPacket.ENCAP_L2, - 0 /* transactionId */, (short) 0 /* secs */, DhcpPacket.INADDR_ANY /* clientIp */, - false /* broadcast */, macAddress, clientIp /* requestedIpAddress */, - serverIdentifier, DHCP_REQUESTED_PARAMS, DHCP_HOSTNAME); - sendPacket(fd, packet); - } - - private void sendPacket(FileDescriptor fd, ByteBuffer packet) throws Exception { - assertNotNull("Only tests on virtual interfaces can send packets", fd); - Os.write(fd, packet); - } - - public void assertLinkAddressMatches(LinkAddress l1, LinkAddress l2) { - // Check all fields except the deprecation and expiry times. - String msg = String.format("LinkAddresses do not match. expected: %s actual: %s", l1, l2); - assertTrue(msg, l1.isSameAddressAs(l2)); - assertEquals("LinkAddress flags do not match", l1.getFlags(), l2.getFlags()); - assertEquals("LinkAddress scope does not match", l1.getScope(), l2.getScope()); - } - - private TetheringRequest requestWithStaticIpv4(String local, String client) { - LinkAddress localAddr = local == null ? null : new LinkAddress(local); - LinkAddress clientAddr = client == null ? null : new LinkAddress(client); - return new TetheringRequest.Builder(TETHERING_ETHERNET) - .setStaticIpv4Addresses(localAddr, clientAddr) - .setShouldShowEntitlementUi(false).build(); - } - - private void assertInvalidStaticIpv4Request(String iface, String local, String client) - throws Exception { - try { - enableEthernetTethering(iface, requestWithStaticIpv4(local, client)); - fail("Unexpectedly accepted invalid IPv4 configuration: " + local + ", " + client); - } catch (IllegalArgumentException | NullPointerException expected) { } - } - - private void assertInterfaceHasIpAddress(String iface, String expected) throws Exception { - LinkAddress expectedAddr = new LinkAddress(expected); - NetworkInterface nif = NetworkInterface.getByName(iface); - for (InterfaceAddress ia : nif.getInterfaceAddresses()) { - final LinkAddress addr = new LinkAddress(ia.getAddress(), ia.getNetworkPrefixLength()); - if (expectedAddr.equals(addr)) { - return; - } - } - fail("Expected " + iface + " to have IP address " + expected + ", found " - + nif.getInterfaceAddresses()); - } - - private TestNetworkInterface createTestInterface() throws Exception { - TestNetworkManager tnm = mContext.getSystemService(TestNetworkManager.class); - TestNetworkInterface iface = tnm.createTapInterface(); - Log.d(TAG, "Created test interface " + iface.getInterfaceName()); - assertNotNull(NetworkInterface.getByName(iface.getInterfaceName())); - return iface; - } - - private void maybeDeleteTestInterface() throws Exception { - if (mTestIface != null) { - mTestIface.getFileDescriptor().close(); - Log.d(TAG, "Deleted test interface " + mTestIface.getInterfaceName()); - mTestIface = null; - } - } -} diff --git a/packages/Tethering/tests/unit/Android.bp b/packages/Tethering/tests/unit/Android.bp deleted file mode 100644 index 45c7b656e28f..000000000000 --- a/packages/Tethering/tests/unit/Android.bp +++ /dev/null @@ -1,93 +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. -// - -// Tests in this folder are included both in unit tests and CTS. -java_library { - name: "TetheringCommonTests", - srcs: [ - "common/**/*.java", - "common/**/*.kt" - ], - static_libs: [ - "androidx.test.rules", - "net-tests-utils", - ], - // TODO(b/147200698) change sdk_version to module-current and remove framework-minus-apex - sdk_version: "core_platform", - libs: [ - "framework-minus-apex", - "framework-tethering.impl", - ], - visibility: ["//cts/tests/tests/tethering"], -} - -java_defaults { - name: "TetheringTestsDefaults", - srcs: [ - "src/**/*.java", - "src/**/*.kt", - ], - static_libs: [ - "TetheringApiCurrentLib", - "TetheringCommonTests", - "androidx.test.rules", - "frameworks-base-testutils", - "mockito-target-extended-minus-junit4", - "net-tests-utils", - "testables", - ], - // TODO(b/147200698) change sdk_version to module-current and - // remove framework-minus-apex, ext, and framework-res - sdk_version: "core_platform", - libs: [ - "android.test.runner", - "android.test.base", - "android.test.mock", - "ext", - "framework-minus-apex", - "framework-res", - "framework-tethering.impl", - "framework-wifi.stubs.module_lib", - ], - jni_libs: [ - // For mockito extended - "libdexmakerjvmtiagent", - "libstaticjvmtiagent", - ], - jarjar_rules: "jarjar-rules.txt", -} - -// Library containing the unit tests. This is used by the coverage test target to pull in the -// unit test code. It is not currently used by the tests themselves because all the build -// configuration needed by the tests is in the TetheringTestsDefaults rule. -android_library { - name: "TetheringTestsLib", - defaults: ["TetheringTestsDefaults"], - visibility: [ - "//frameworks/base/packages/Tethering/tests/integration", - ] -} - -android_test { - name: "TetheringTests", - platform_apis: true, - test_suites: [ - "device-tests", - "mts", - ], - defaults: ["TetheringTestsDefaults"], - compile_multilib: "both", -} diff --git a/packages/Tethering/tests/unit/AndroidManifest.xml b/packages/Tethering/tests/unit/AndroidManifest.xml deleted file mode 100644 index 355342f64371..000000000000 --- a/packages/Tethering/tests/unit/AndroidManifest.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2019 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.networkstack.tethering.tests.unit"> - - <application android:debuggable="true"> - <uses-library android:name="android.test.runner" /> - <service - android:name="com.android.networkstack.tethering.MockTetheringService" - android:permission="android.permission.TETHER_PRIVILEGED" - android:exported="true"> - <intent-filter> - <action android:name="com.android.networkstack.tethering.TetheringService"/> - </intent-filter> - </service> - </application> - - <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.networkstack.tethering.tests.unit" - android:label="Tethering service tests"> - </instrumentation> -</manifest> diff --git a/packages/Tethering/tests/unit/common/android/net/TetheredClientTest.kt b/packages/Tethering/tests/unit/common/android/net/TetheredClientTest.kt deleted file mode 100644 index 55c59dd08f41..000000000000 --- a/packages/Tethering/tests/unit/common/android/net/TetheredClientTest.kt +++ /dev/null @@ -1,122 +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.net - -import android.net.InetAddresses.parseNumericAddress -import android.net.TetheredClient.AddressInfo -import android.net.TetheringManager.TETHERING_BLUETOOTH -import android.net.TetheringManager.TETHERING_USB -import android.system.OsConstants.RT_SCOPE_UNIVERSE -import androidx.test.filters.SmallTest -import androidx.test.runner.AndroidJUnit4 -import com.android.testutils.assertParcelSane -import org.junit.Test -import org.junit.runner.RunWith -import kotlin.test.assertEquals -import kotlin.test.assertNotEquals - -private val TEST_MACADDR = MacAddress.fromBytes(byteArrayOf(12, 23, 34, 45, 56, 67)) -private val TEST_OTHER_MACADDR = MacAddress.fromBytes(byteArrayOf(23, 34, 45, 56, 67, 78)) -private val TEST_ADDR1 = makeLinkAddress("192.168.113.3", prefixLength = 24, expTime = 123L) -private val TEST_ADDR2 = makeLinkAddress("fe80::1:2:3", prefixLength = 64, expTime = 456L) -private val TEST_HOSTNAME = "test_hostname" -private val TEST_OTHER_HOSTNAME = "test_other_hostname" -private val TEST_ADDRINFO1 = AddressInfo(TEST_ADDR1, TEST_HOSTNAME) -private val TEST_ADDRINFO2 = AddressInfo(TEST_ADDR2, null) - -private fun makeLinkAddress(addr: String, prefixLength: Int, expTime: Long) = LinkAddress( - parseNumericAddress(addr), - prefixLength, - 0 /* flags */, - RT_SCOPE_UNIVERSE, - expTime /* deprecationTime */, - expTime /* expirationTime */) - -@RunWith(AndroidJUnit4::class) -@SmallTest -class TetheredClientTest { - @Test - fun testParceling() { - assertParcelSane(TEST_ADDRINFO1, fieldCount = 2) - assertParcelSane(makeTestClient(), fieldCount = 3) - } - - @Test - fun testEquals() { - assertEquals(makeTestClient(), makeTestClient()) - - // Different mac address - assertNotEquals(makeTestClient(), TetheredClient( - TEST_OTHER_MACADDR, - listOf(TEST_ADDRINFO1, TEST_ADDRINFO2), - TETHERING_BLUETOOTH)) - - // Different hostname - assertNotEquals(makeTestClient(), TetheredClient( - TEST_MACADDR, - listOf(AddressInfo(TEST_ADDR1, TEST_OTHER_HOSTNAME), TEST_ADDRINFO2), - TETHERING_BLUETOOTH)) - - // Null hostname - assertNotEquals(makeTestClient(), TetheredClient( - TEST_MACADDR, - listOf(AddressInfo(TEST_ADDR1, null), TEST_ADDRINFO2), - TETHERING_BLUETOOTH)) - - // Missing address - assertNotEquals(makeTestClient(), TetheredClient( - TEST_MACADDR, - listOf(TEST_ADDRINFO2), - TETHERING_BLUETOOTH)) - - // Different type - assertNotEquals(makeTestClient(), TetheredClient( - TEST_MACADDR, - listOf(TEST_ADDRINFO1, TEST_ADDRINFO2), - TETHERING_USB)) - } - - @Test - fun testAddAddresses() { - val client1 = TetheredClient(TEST_MACADDR, listOf(TEST_ADDRINFO1), TETHERING_USB) - val client2 = TetheredClient(TEST_OTHER_MACADDR, listOf(TEST_ADDRINFO2), TETHERING_USB) - assertEquals(TetheredClient( - TEST_MACADDR, - listOf(TEST_ADDRINFO1, TEST_ADDRINFO2), - TETHERING_USB), client1.addAddresses(client2)) - } - - @Test - fun testGetters() { - assertEquals(TEST_MACADDR, makeTestClient().macAddress) - assertEquals(listOf(TEST_ADDRINFO1, TEST_ADDRINFO2), makeTestClient().addresses) - assertEquals(TETHERING_BLUETOOTH, makeTestClient().tetheringType) - } - - @Test - fun testAddressInfo_Getters() { - assertEquals(TEST_ADDR1, TEST_ADDRINFO1.address) - assertEquals(TEST_ADDR2, TEST_ADDRINFO2.address) - assertEquals(TEST_HOSTNAME, TEST_ADDRINFO1.hostname) - assertEquals(null, TEST_ADDRINFO2.hostname) - } - - private fun makeTestClient() = TetheredClient( - TEST_MACADDR, - listOf(TEST_ADDRINFO1, TEST_ADDRINFO2), - TETHERING_BLUETOOTH) -}
\ No newline at end of file diff --git a/packages/Tethering/tests/unit/jarjar-rules.txt b/packages/Tethering/tests/unit/jarjar-rules.txt deleted file mode 100644 index ec2d2b02004e..000000000000 --- a/packages/Tethering/tests/unit/jarjar-rules.txt +++ /dev/null @@ -1,11 +0,0 @@ -# Don't jar-jar the entire package because this test use some -# internal classes (like ArrayUtils in com.android.internal.util) -rule com.android.internal.util.BitUtils* com.android.networkstack.tethering.util.BitUtils@1 -rule com.android.internal.util.IndentingPrintWriter.java* com.android.networkstack.tethering.util.IndentingPrintWriter.java@1 -rule com.android.internal.util.IState.java* com.android.networkstack.tethering.util.IState.java@1 -rule com.android.internal.util.MessageUtils* com.android.networkstack.tethering.util.MessageUtils@1 -rule com.android.internal.util.State* com.android.networkstack.tethering.util.State@1 -rule com.android.internal.util.StateMachine* com.android.networkstack.tethering.util.StateMachine@1 -rule com.android.internal.util.TrafficStatsConstants* com.android.networkstack.tethering.util.TrafficStatsConstants@1 - -rule android.util.LocalLog* com.android.networkstack.tethering.util.LocalLog@1 diff --git a/packages/Tethering/tests/unit/src/android/net/dhcp/DhcpServingParamsParcelExtTest.java b/packages/Tethering/tests/unit/src/android/net/dhcp/DhcpServingParamsParcelExtTest.java deleted file mode 100644 index a8857b2e5cb0..000000000000 --- a/packages/Tethering/tests/unit/src/android/net/dhcp/DhcpServingParamsParcelExtTest.java +++ /dev/null @@ -1,123 +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.net.dhcp; - -import static android.net.InetAddresses.parseNumericAddress; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import android.net.LinkAddress; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.net.Inet4Address; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class DhcpServingParamsParcelExtTest { - private static final Inet4Address TEST_ADDRESS = inet4Addr("192.168.0.123"); - private static final Inet4Address TEST_CLIENT_ADDRESS = inet4Addr("192.168.0.42"); - private static final int TEST_ADDRESS_PARCELED = 0xc0a8007b; - private static final int TEST_CLIENT_ADDRESS_PARCELED = 0xc0a8002a; - private static final int TEST_PREFIX_LENGTH = 17; - private static final int TEST_LEASE_TIME_SECS = 120; - private static final int TEST_MTU = 1000; - private static final Set<Inet4Address> TEST_ADDRESS_SET = - new HashSet<Inet4Address>(Arrays.asList( - new Inet4Address[] {inet4Addr("192.168.1.123"), inet4Addr("192.168.1.124")})); - private static final Set<Integer> TEST_ADDRESS_SET_PARCELED = - new HashSet<Integer>(Arrays.asList(new Integer[] {0xc0a8017b, 0xc0a8017c})); - - private DhcpServingParamsParcelExt mParcel; - - @Before - public void setUp() { - mParcel = new DhcpServingParamsParcelExt(); - } - - @Test - public void testSetServerAddr() { - mParcel.setServerAddr(new LinkAddress(TEST_ADDRESS, TEST_PREFIX_LENGTH)); - - assertEquals(TEST_ADDRESS_PARCELED, mParcel.serverAddr); - assertEquals(TEST_PREFIX_LENGTH, mParcel.serverAddrPrefixLength); - } - - @Test - public void testSetDefaultRouters() { - mParcel.setDefaultRouters(TEST_ADDRESS_SET); - assertEquals(TEST_ADDRESS_SET_PARCELED, asSet(mParcel.defaultRouters)); - } - - @Test - public void testSetDnsServers() { - mParcel.setDnsServers(TEST_ADDRESS_SET); - assertEquals(TEST_ADDRESS_SET_PARCELED, asSet(mParcel.dnsServers)); - } - - @Test - public void testSetExcludedAddrs() { - mParcel.setExcludedAddrs(TEST_ADDRESS_SET); - assertEquals(TEST_ADDRESS_SET_PARCELED, asSet(mParcel.excludedAddrs)); - } - - @Test - public void testSetDhcpLeaseTimeSecs() { - mParcel.setDhcpLeaseTimeSecs(TEST_LEASE_TIME_SECS); - assertEquals(TEST_LEASE_TIME_SECS, mParcel.dhcpLeaseTimeSecs); - } - - @Test - public void testSetLinkMtu() { - mParcel.setLinkMtu(TEST_MTU); - assertEquals(TEST_MTU, mParcel.linkMtu); - } - - @Test - public void testSetMetered() { - mParcel.setMetered(true); - assertTrue(mParcel.metered); - mParcel.setMetered(false); - assertFalse(mParcel.metered); - } - - @Test - public void testSetClientAddr() { - mParcel.setSingleClientAddr(TEST_CLIENT_ADDRESS); - assertEquals(TEST_CLIENT_ADDRESS_PARCELED, mParcel.singleClientAddr); - } - - private static Inet4Address inet4Addr(String addr) { - return (Inet4Address) parseNumericAddress(addr); - } - - private static Set<Integer> asSet(int[] ints) { - return IntStream.of(ints).boxed().collect(Collectors.toSet()); - } -} diff --git a/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java b/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java deleted file mode 100644 index 30a9d2252ea6..000000000000 --- a/packages/Tethering/tests/unit/src/android/net/ip/IpServerTest.java +++ /dev/null @@ -1,1074 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net.ip; - -import static android.net.INetd.IF_STATE_UP; -import static android.net.RouteInfo.RTN_UNICAST; -import static android.net.TetheringManager.TETHERING_BLUETOOTH; -import static android.net.TetheringManager.TETHERING_NCM; -import static android.net.TetheringManager.TETHERING_USB; -import static android.net.TetheringManager.TETHERING_WIFI; -import static android.net.TetheringManager.TETHERING_WIFI_P2P; -import static android.net.TetheringManager.TETHER_ERROR_ENABLE_FORWARDING_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_TETHER_IFACE_ERROR; -import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS; -import static android.net.ip.IpServer.STATE_AVAILABLE; -import static android.net.ip.IpServer.STATE_LOCAL_ONLY; -import static android.net.ip.IpServer.STATE_TETHERED; -import static android.net.ip.IpServer.STATE_UNAVAILABLE; -import static android.net.netlink.NetlinkConstants.RTM_DELNEIGH; -import static android.net.netlink.NetlinkConstants.RTM_NEWNEIGH; -import static android.net.netlink.StructNdMsg.NUD_FAILED; -import static android.net.netlink.StructNdMsg.NUD_REACHABLE; -import static android.net.netlink.StructNdMsg.NUD_STALE; - -import static com.android.net.module.util.Inet4AddressUtils.intToInet4AddressHTH; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -import android.app.usage.NetworkStatsManager; -import android.net.INetd; -import android.net.InetAddresses; -import android.net.InterfaceConfigurationParcel; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.MacAddress; -import android.net.RouteInfo; -import android.net.TetherOffloadRuleParcel; -import android.net.TetherStatsParcel; -import android.net.dhcp.DhcpServingParamsParcel; -import android.net.dhcp.IDhcpEventCallbacks; -import android.net.dhcp.IDhcpServer; -import android.net.dhcp.IDhcpServerCallbacks; -import android.net.ip.IpNeighborMonitor.NeighborEvent; -import android.net.ip.IpNeighborMonitor.NeighborEventConsumer; -import android.net.ip.RouterAdvertisementDaemon.RaParams; -import android.net.util.InterfaceParams; -import android.net.util.InterfaceSet; -import android.net.util.PrefixUtils; -import android.net.util.SharedLog; -import android.os.Handler; -import android.os.RemoteException; -import android.os.test.TestLooper; -import android.text.TextUtils; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.networkstack.tethering.BpfCoordinator; -import com.android.networkstack.tethering.BpfCoordinator.Ipv6ForwardingRule; -import com.android.networkstack.tethering.PrivateAddressCoordinator; -import com.android.networkstack.tethering.TetheringConfiguration; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatcher; -import org.mockito.Captor; -import org.mockito.InOrder; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.net.InetAddress; -import java.util.Arrays; -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class IpServerTest { - private static final String IFACE_NAME = "testnet1"; - private static final String UPSTREAM_IFACE = "upstream0"; - private static final String UPSTREAM_IFACE2 = "upstream1"; - private static final int UPSTREAM_IFINDEX = 101; - private static final int UPSTREAM_IFINDEX2 = 102; - private static final String BLUETOOTH_IFACE_ADDR = "192.168.44.1"; - private static final int BLUETOOTH_DHCP_PREFIX_LENGTH = 24; - private static final int DHCP_LEASE_TIME_SECS = 3600; - private static final boolean DEFAULT_USING_BPF_OFFLOAD = true; - - private static final InterfaceParams TEST_IFACE_PARAMS = new InterfaceParams( - IFACE_NAME, 42 /* index */, MacAddress.ALL_ZEROS_ADDRESS, 1500 /* defaultMtu */); - - private static final int MAKE_DHCPSERVER_TIMEOUT_MS = 1000; - - private final LinkAddress mTestAddress = new LinkAddress("192.168.42.5/24"); - private final IpPrefix mBluetoothPrefix = new IpPrefix("192.168.44.0/24"); - - @Mock private INetd mNetd; - @Mock private IpServer.Callback mCallback; - @Mock private SharedLog mSharedLog; - @Mock private IDhcpServer mDhcpServer; - @Mock private RouterAdvertisementDaemon mRaDaemon; - @Mock private IpNeighborMonitor mIpNeighborMonitor; - @Mock private IpServer.Dependencies mDependencies; - @Mock private PrivateAddressCoordinator mAddressCoordinator; - @Mock private NetworkStatsManager mStatsManager; - @Mock private TetheringConfiguration mTetherConfig; - - @Captor private ArgumentCaptor<DhcpServingParamsParcel> mDhcpParamsCaptor; - - private final TestLooper mLooper = new TestLooper(); - private final ArgumentCaptor<LinkProperties> mLinkPropertiesCaptor = - ArgumentCaptor.forClass(LinkProperties.class); - private IpServer mIpServer; - private InterfaceConfigurationParcel mInterfaceConfiguration; - private NeighborEventConsumer mNeighborEventConsumer; - private BpfCoordinator mBpfCoordinator; - - private void initStateMachine(int interfaceType) throws Exception { - initStateMachine(interfaceType, false /* usingLegacyDhcp */, DEFAULT_USING_BPF_OFFLOAD); - } - - private void initStateMachine(int interfaceType, boolean usingLegacyDhcp, - boolean usingBpfOffload) throws Exception { - doAnswer(inv -> { - final IDhcpServerCallbacks cb = inv.getArgument(2); - new Thread(() -> { - try { - cb.onDhcpServerCreated(STATUS_SUCCESS, mDhcpServer); - } catch (RemoteException e) { - fail(e.getMessage()); - } - }).run(); - return null; - }).when(mDependencies).makeDhcpServer(any(), mDhcpParamsCaptor.capture(), any()); - when(mDependencies.getRouterAdvertisementDaemon(any())).thenReturn(mRaDaemon); - when(mDependencies.getInterfaceParams(IFACE_NAME)).thenReturn(TEST_IFACE_PARAMS); - - when(mDependencies.getIfindex(eq(UPSTREAM_IFACE))).thenReturn(UPSTREAM_IFINDEX); - when(mDependencies.getIfindex(eq(UPSTREAM_IFACE2))).thenReturn(UPSTREAM_IFINDEX2); - - mInterfaceConfiguration = new InterfaceConfigurationParcel(); - mInterfaceConfiguration.flags = new String[0]; - if (interfaceType == TETHERING_BLUETOOTH) { - mInterfaceConfiguration.ipv4Addr = BLUETOOTH_IFACE_ADDR; - mInterfaceConfiguration.prefixLength = BLUETOOTH_DHCP_PREFIX_LENGTH; - } - - ArgumentCaptor<NeighborEventConsumer> neighborCaptor = - ArgumentCaptor.forClass(NeighborEventConsumer.class); - doReturn(mIpNeighborMonitor).when(mDependencies).getIpNeighborMonitor(any(), any(), - neighborCaptor.capture()); - - mIpServer = new IpServer( - IFACE_NAME, mLooper.getLooper(), interfaceType, mSharedLog, mNetd, mBpfCoordinator, - mCallback, usingLegacyDhcp, usingBpfOffload, mAddressCoordinator, mDependencies); - mIpServer.start(); - mNeighborEventConsumer = neighborCaptor.getValue(); - - // Starting the state machine always puts us in a consistent state and notifies - // the rest of the world that we've changed from an unknown to available state. - mLooper.dispatchAll(); - reset(mNetd, mCallback); - - when(mRaDaemon.start()).thenReturn(true); - } - - private void initTetheredStateMachine(int interfaceType, String upstreamIface) - throws Exception { - initTetheredStateMachine(interfaceType, upstreamIface, false, - DEFAULT_USING_BPF_OFFLOAD); - } - - private void initTetheredStateMachine(int interfaceType, String upstreamIface, - boolean usingLegacyDhcp, boolean usingBpfOffload) throws Exception { - initStateMachine(interfaceType, usingLegacyDhcp, usingBpfOffload); - dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_TETHERED); - if (upstreamIface != null) { - LinkProperties lp = new LinkProperties(); - lp.setInterfaceName(upstreamIface); - dispatchTetherConnectionChanged(upstreamIface, lp, 0); - } - reset(mNetd, mCallback, mAddressCoordinator); - when(mAddressCoordinator.requestDownstreamAddress(any())).thenReturn(mTestAddress); - } - - @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog); - when(mAddressCoordinator.requestDownstreamAddress(any())).thenReturn(mTestAddress); - when(mTetherConfig.isBpfOffloadEnabled()).thenReturn(true /* default value */); - - mBpfCoordinator = spy(new BpfCoordinator( - new BpfCoordinator.Dependencies() { - @NonNull - public Handler getHandler() { - return new Handler(mLooper.getLooper()); - } - - @NonNull - public INetd getNetd() { - return mNetd; - } - - @NonNull - public NetworkStatsManager getNetworkStatsManager() { - return mStatsManager; - } - - @NonNull - public SharedLog getSharedLog() { - return mSharedLog; - } - - @Nullable - public TetheringConfiguration getTetherConfig() { - return mTetherConfig; - } - })); - } - - @Test - public void startsOutAvailable() { - when(mDependencies.getIpNeighborMonitor(any(), any(), any())) - .thenReturn(mIpNeighborMonitor); - mIpServer = new IpServer(IFACE_NAME, mLooper.getLooper(), TETHERING_BLUETOOTH, mSharedLog, - mNetd, mBpfCoordinator, mCallback, false /* usingLegacyDhcp */, - DEFAULT_USING_BPF_OFFLOAD, mAddressCoordinator, mDependencies); - mIpServer.start(); - mLooper.dispatchAll(); - verify(mCallback).updateInterfaceState( - mIpServer, STATE_AVAILABLE, TETHER_ERROR_NO_ERROR); - verify(mCallback).updateLinkProperties(eq(mIpServer), any(LinkProperties.class)); - verifyNoMoreInteractions(mCallback, mNetd); - } - - @Test - public void shouldDoNothingUntilRequested() throws Exception { - initStateMachine(TETHERING_BLUETOOTH); - final int [] noOp_commands = { - IpServer.CMD_TETHER_UNREQUESTED, - IpServer.CMD_IP_FORWARDING_ENABLE_ERROR, - IpServer.CMD_IP_FORWARDING_DISABLE_ERROR, - IpServer.CMD_START_TETHERING_ERROR, - IpServer.CMD_STOP_TETHERING_ERROR, - IpServer.CMD_SET_DNS_FORWARDERS_ERROR, - IpServer.CMD_TETHER_CONNECTION_CHANGED - }; - for (int command : noOp_commands) { - // None of these commands should trigger us to request action from - // the rest of the system. - dispatchCommand(command); - verifyNoMoreInteractions(mNetd, mCallback); - } - } - - @Test - public void handlesImmediateInterfaceDown() throws Exception { - initStateMachine(TETHERING_BLUETOOTH); - - dispatchCommand(IpServer.CMD_INTERFACE_DOWN); - verify(mCallback).updateInterfaceState( - mIpServer, STATE_UNAVAILABLE, TETHER_ERROR_NO_ERROR); - verify(mCallback).updateLinkProperties(eq(mIpServer), any(LinkProperties.class)); - verifyNoMoreInteractions(mNetd, mCallback); - } - - @Test - public void canBeTethered() throws Exception { - initStateMachine(TETHERING_BLUETOOTH); - - dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_TETHERED); - InOrder inOrder = inOrder(mCallback, mNetd); - inOrder.verify(mNetd).tetherInterfaceAdd(IFACE_NAME); - inOrder.verify(mNetd).networkAddInterface(INetd.LOCAL_NET_ID, IFACE_NAME); - // One for ipv4 route, one for ipv6 link local route. - inOrder.verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(IFACE_NAME), - any(), any()); - inOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_TETHERED, TETHER_ERROR_NO_ERROR); - inOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), any(LinkProperties.class)); - verifyNoMoreInteractions(mNetd, mCallback); - } - - @Test - public void canUnrequestTethering() throws Exception { - initTetheredStateMachine(TETHERING_BLUETOOTH, null); - - dispatchCommand(IpServer.CMD_TETHER_UNREQUESTED); - InOrder inOrder = inOrder(mCallback, mNetd, mAddressCoordinator); - inOrder.verify(mNetd).tetherApplyDnsInterfaces(); - inOrder.verify(mNetd).tetherInterfaceRemove(IFACE_NAME); - inOrder.verify(mNetd).networkRemoveInterface(INetd.LOCAL_NET_ID, IFACE_NAME); - inOrder.verify(mNetd).interfaceSetCfg(argThat(cfg -> IFACE_NAME.equals(cfg.ifName))); - inOrder.verify(mAddressCoordinator).releaseDownstream(any()); - inOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_AVAILABLE, TETHER_ERROR_NO_ERROR); - inOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), any(LinkProperties.class)); - verifyNoMoreInteractions(mNetd, mCallback, mAddressCoordinator); - } - - @Test - public void canBeTetheredAsUsb() throws Exception { - initStateMachine(TETHERING_USB); - - dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_TETHERED); - InOrder inOrder = inOrder(mCallback, mNetd, mAddressCoordinator); - inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any()); - inOrder.verify(mNetd).interfaceSetCfg(argThat(cfg -> - IFACE_NAME.equals(cfg.ifName) && assertContainsFlag(cfg.flags, IF_STATE_UP))); - inOrder.verify(mNetd).tetherInterfaceAdd(IFACE_NAME); - inOrder.verify(mNetd).networkAddInterface(INetd.LOCAL_NET_ID, IFACE_NAME); - inOrder.verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(IFACE_NAME), - any(), any()); - inOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_TETHERED, TETHER_ERROR_NO_ERROR); - inOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), mLinkPropertiesCaptor.capture()); - assertIPv4AddressAndDirectlyConnectedRoute(mLinkPropertiesCaptor.getValue()); - verifyNoMoreInteractions(mNetd, mCallback, mAddressCoordinator); - } - - @Test - public void canBeTetheredAsWifiP2p() throws Exception { - initStateMachine(TETHERING_WIFI_P2P); - - dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_LOCAL_ONLY); - InOrder inOrder = inOrder(mCallback, mNetd, mAddressCoordinator); - inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any()); - inOrder.verify(mNetd).interfaceSetCfg(argThat(cfg -> - IFACE_NAME.equals(cfg.ifName) && assertNotContainsFlag(cfg.flags, IF_STATE_UP))); - inOrder.verify(mNetd).tetherInterfaceAdd(IFACE_NAME); - inOrder.verify(mNetd).networkAddInterface(INetd.LOCAL_NET_ID, IFACE_NAME); - inOrder.verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(IFACE_NAME), - any(), any()); - inOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_LOCAL_ONLY, TETHER_ERROR_NO_ERROR); - inOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), mLinkPropertiesCaptor.capture()); - assertIPv4AddressAndDirectlyConnectedRoute(mLinkPropertiesCaptor.getValue()); - verifyNoMoreInteractions(mNetd, mCallback, mAddressCoordinator); - } - - @Test - public void handlesFirstUpstreamChange() throws Exception { - initTetheredStateMachine(TETHERING_BLUETOOTH, null); - - // Telling the state machine about its upstream interface triggers - // a little more configuration. - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - InOrder inOrder = inOrder(mNetd); - inOrder.verify(mNetd).tetherAddForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).ipfwdAddInterfaceForward(IFACE_NAME, UPSTREAM_IFACE); - verifyNoMoreInteractions(mNetd, mCallback); - } - - @Test - public void handlesChangingUpstream() throws Exception { - initTetheredStateMachine(TETHERING_BLUETOOTH, UPSTREAM_IFACE); - - dispatchTetherConnectionChanged(UPSTREAM_IFACE2); - InOrder inOrder = inOrder(mNetd); - inOrder.verify(mNetd).ipfwdRemoveInterfaceForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherRemoveForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherAddForward(IFACE_NAME, UPSTREAM_IFACE2); - inOrder.verify(mNetd).ipfwdAddInterfaceForward(IFACE_NAME, UPSTREAM_IFACE2); - verifyNoMoreInteractions(mNetd, mCallback); - } - - @Test - public void handlesChangingUpstreamNatFailure() throws Exception { - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE); - - doThrow(RemoteException.class).when(mNetd).tetherAddForward(IFACE_NAME, UPSTREAM_IFACE2); - - dispatchTetherConnectionChanged(UPSTREAM_IFACE2); - InOrder inOrder = inOrder(mNetd); - inOrder.verify(mNetd).ipfwdRemoveInterfaceForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherRemoveForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherAddForward(IFACE_NAME, UPSTREAM_IFACE2); - inOrder.verify(mNetd).ipfwdRemoveInterfaceForward(IFACE_NAME, UPSTREAM_IFACE2); - inOrder.verify(mNetd).tetherRemoveForward(IFACE_NAME, UPSTREAM_IFACE2); - } - - @Test - public void handlesChangingUpstreamInterfaceForwardingFailure() throws Exception { - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE); - - doThrow(RemoteException.class).when(mNetd).ipfwdAddInterfaceForward( - IFACE_NAME, UPSTREAM_IFACE2); - - dispatchTetherConnectionChanged(UPSTREAM_IFACE2); - InOrder inOrder = inOrder(mNetd); - inOrder.verify(mNetd).ipfwdRemoveInterfaceForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherRemoveForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherAddForward(IFACE_NAME, UPSTREAM_IFACE2); - inOrder.verify(mNetd).ipfwdAddInterfaceForward(IFACE_NAME, UPSTREAM_IFACE2); - inOrder.verify(mNetd).ipfwdRemoveInterfaceForward(IFACE_NAME, UPSTREAM_IFACE2); - inOrder.verify(mNetd).tetherRemoveForward(IFACE_NAME, UPSTREAM_IFACE2); - } - - @Test - public void canUnrequestTetheringWithUpstream() throws Exception { - initTetheredStateMachine(TETHERING_BLUETOOTH, UPSTREAM_IFACE); - - dispatchCommand(IpServer.CMD_TETHER_UNREQUESTED); - InOrder inOrder = inOrder(mNetd, mCallback, mAddressCoordinator); - inOrder.verify(mNetd).ipfwdRemoveInterfaceForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherRemoveForward(IFACE_NAME, UPSTREAM_IFACE); - inOrder.verify(mNetd).tetherApplyDnsInterfaces(); - inOrder.verify(mNetd).tetherInterfaceRemove(IFACE_NAME); - inOrder.verify(mNetd).networkRemoveInterface(INetd.LOCAL_NET_ID, IFACE_NAME); - inOrder.verify(mNetd).interfaceSetCfg(argThat(cfg -> IFACE_NAME.equals(cfg.ifName))); - inOrder.verify(mAddressCoordinator).releaseDownstream(any()); - inOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_AVAILABLE, TETHER_ERROR_NO_ERROR); - inOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), any(LinkProperties.class)); - verifyNoMoreInteractions(mNetd, mCallback, mAddressCoordinator); - } - - @Test - public void interfaceDownLeadsToUnavailable() throws Exception { - for (boolean shouldThrow : new boolean[]{true, false}) { - initTetheredStateMachine(TETHERING_USB, null); - - if (shouldThrow) { - doThrow(RemoteException.class).when(mNetd).tetherInterfaceRemove(IFACE_NAME); - } - dispatchCommand(IpServer.CMD_INTERFACE_DOWN); - InOrder usbTeardownOrder = inOrder(mNetd, mCallback); - // Currently IpServer interfaceSetCfg twice to stop IPv4. One just set interface down - // Another one is set IPv4 to 0.0.0.0/0 as clearng ipv4 address. - usbTeardownOrder.verify(mNetd, times(2)).interfaceSetCfg( - argThat(cfg -> IFACE_NAME.equals(cfg.ifName))); - usbTeardownOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_UNAVAILABLE, TETHER_ERROR_NO_ERROR); - usbTeardownOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), mLinkPropertiesCaptor.capture()); - assertNoAddressesNorRoutes(mLinkPropertiesCaptor.getValue()); - } - } - - @Test - public void usbShouldBeTornDownOnTetherError() throws Exception { - initStateMachine(TETHERING_USB); - - doThrow(RemoteException.class).when(mNetd).tetherInterfaceAdd(IFACE_NAME); - dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_TETHERED); - InOrder usbTeardownOrder = inOrder(mNetd, mCallback); - usbTeardownOrder.verify(mNetd).interfaceSetCfg( - argThat(cfg -> IFACE_NAME.equals(cfg.ifName))); - usbTeardownOrder.verify(mNetd).tetherInterfaceAdd(IFACE_NAME); - - usbTeardownOrder.verify(mNetd, times(2)).interfaceSetCfg( - argThat(cfg -> IFACE_NAME.equals(cfg.ifName))); - usbTeardownOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_AVAILABLE, TETHER_ERROR_TETHER_IFACE_ERROR); - usbTeardownOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), mLinkPropertiesCaptor.capture()); - assertNoAddressesNorRoutes(mLinkPropertiesCaptor.getValue()); - } - - @Test - public void shouldTearDownUsbOnUpstreamError() throws Exception { - initTetheredStateMachine(TETHERING_USB, null); - - doThrow(RemoteException.class).when(mNetd).tetherAddForward(anyString(), anyString()); - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - InOrder usbTeardownOrder = inOrder(mNetd, mCallback); - usbTeardownOrder.verify(mNetd).tetherAddForward(IFACE_NAME, UPSTREAM_IFACE); - - usbTeardownOrder.verify(mNetd, times(2)).interfaceSetCfg( - argThat(cfg -> IFACE_NAME.equals(cfg.ifName))); - usbTeardownOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_AVAILABLE, TETHER_ERROR_ENABLE_FORWARDING_ERROR); - usbTeardownOrder.verify(mCallback).updateLinkProperties( - eq(mIpServer), mLinkPropertiesCaptor.capture()); - assertNoAddressesNorRoutes(mLinkPropertiesCaptor.getValue()); - } - - @Test - public void ignoresDuplicateUpstreamNotifications() throws Exception { - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE); - - verifyNoMoreInteractions(mNetd, mCallback); - - for (int i = 0; i < 5; i++) { - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - verifyNoMoreInteractions(mNetd, mCallback); - } - } - - @Test - public void startsDhcpServer() throws Exception { - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE); - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - - assertDhcpStarted(PrefixUtils.asIpPrefix(mTestAddress)); - } - - @Test - public void startsDhcpServerOnBluetooth() throws Exception { - initTetheredStateMachine(TETHERING_BLUETOOTH, UPSTREAM_IFACE); - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - - assertDhcpStarted(mBluetoothPrefix); - } - - @Test - public void startsDhcpServerOnWifiP2p() throws Exception { - initTetheredStateMachine(TETHERING_WIFI_P2P, UPSTREAM_IFACE); - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - - assertDhcpStarted(PrefixUtils.asIpPrefix(mTestAddress)); - } - - @Test - public void startsDhcpServerOnNcm() throws Exception { - initStateMachine(TETHERING_NCM); - dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_LOCAL_ONLY); - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - - assertDhcpStarted(new IpPrefix("192.168.42.0/24")); - } - - @Test - public void testOnNewPrefixRequest() throws Exception { - initStateMachine(TETHERING_NCM); - dispatchCommand(IpServer.CMD_TETHER_REQUESTED, STATE_LOCAL_ONLY); - - final IDhcpEventCallbacks eventCallbacks; - final ArgumentCaptor<IDhcpEventCallbacks> dhcpEventCbsCaptor = - ArgumentCaptor.forClass(IDhcpEventCallbacks.class); - verify(mDhcpServer, timeout(MAKE_DHCPSERVER_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), dhcpEventCbsCaptor.capture()); - eventCallbacks = dhcpEventCbsCaptor.getValue(); - assertDhcpStarted(new IpPrefix("192.168.42.0/24")); - - final ArgumentCaptor<LinkProperties> lpCaptor = - ArgumentCaptor.forClass(LinkProperties.class); - InOrder inOrder = inOrder(mNetd, mCallback, mAddressCoordinator); - inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any()); - inOrder.verify(mNetd).networkAddInterface(INetd.LOCAL_NET_ID, IFACE_NAME); - // One for ipv4 route, one for ipv6 link local route. - inOrder.verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(IFACE_NAME), - any(), any()); - inOrder.verify(mCallback).updateInterfaceState( - mIpServer, STATE_LOCAL_ONLY, TETHER_ERROR_NO_ERROR); - inOrder.verify(mCallback).updateLinkProperties(eq(mIpServer), lpCaptor.capture()); - verifyNoMoreInteractions(mCallback, mAddressCoordinator); - - // Simulate the DHCP server receives DHCPDECLINE on MirrorLink and then signals - // onNewPrefixRequest callback. - final LinkAddress newAddress = new LinkAddress("192.168.100.125/24"); - when(mAddressCoordinator.requestDownstreamAddress(any())).thenReturn(newAddress); - eventCallbacks.onNewPrefixRequest(new IpPrefix("192.168.42.0/24")); - mLooper.dispatchAll(); - - inOrder.verify(mAddressCoordinator).requestDownstreamAddress(any()); - inOrder.verify(mNetd).tetherApplyDnsInterfaces(); - inOrder.verify(mCallback).updateLinkProperties(eq(mIpServer), lpCaptor.capture()); - verifyNoMoreInteractions(mCallback); - - final LinkProperties linkProperties = lpCaptor.getValue(); - final List<LinkAddress> linkAddresses = linkProperties.getLinkAddresses(); - assertEquals(1, linkProperties.getLinkAddresses().size()); - assertEquals(1, linkProperties.getRoutes().size()); - final IpPrefix prefix = new IpPrefix(linkAddresses.get(0).getAddress(), - linkAddresses.get(0).getPrefixLength()); - assertNotEquals(prefix, new IpPrefix("192.168.42.0/24")); - - verify(mDhcpServer).updateParams(mDhcpParamsCaptor.capture(), any()); - assertDhcpServingParams(mDhcpParamsCaptor.getValue(), prefix); - } - - @Test - public void doesNotStartDhcpServerIfDisabled() throws Exception { - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE, true /* usingLegacyDhcp */, - DEFAULT_USING_BPF_OFFLOAD); - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - - verify(mDependencies, never()).makeDhcpServer(any(), any(), any()); - } - - private InetAddress addr(String addr) throws Exception { - return InetAddresses.parseNumericAddress(addr); - } - - private void recvNewNeigh(int ifindex, InetAddress addr, short nudState, MacAddress mac) { - mNeighborEventConsumer.accept(new NeighborEvent(0, RTM_NEWNEIGH, ifindex, addr, - nudState, mac)); - mLooper.dispatchAll(); - } - - private void recvDelNeigh(int ifindex, InetAddress addr, short nudState, MacAddress mac) { - mNeighborEventConsumer.accept(new NeighborEvent(0, RTM_DELNEIGH, ifindex, addr, - nudState, mac)); - mLooper.dispatchAll(); - } - - /** - * Custom ArgumentMatcher for TetherOffloadRuleParcel. This is needed because generated stable - * AIDL classes don't have equals(), so we cannot just use eq(). A custom assert, such as: - * - * private void checkFooCalled(StableParcelable p, ...) { - * ArgumentCaptor<FooParam> captor = ArgumentCaptor.forClass(FooParam.class); - * verify(mMock).foo(captor.capture()); - * Foo foo = captor.getValue(); - * assertFooMatchesExpectations(foo); - * } - * - * almost works, but not quite. This is because if the code under test calls foo() twice, the - * first call to checkFooCalled() matches both the calls, putting both calls into the captor, - * and then fails with TooManyActualInvocations. It also makes it harder to use other mockito - * features such as never(), inOrder(), etc. - * - * This approach isn't great because if the match fails, the error message is unhelpful - * (actual: "android.net.TetherOffloadRuleParcel@8c827b0" or some such), but at least it does - * work. - * - * TODO: consider making the error message more readable by adding a method that catching the - * AssertionFailedError and throwing a new assertion with more details. See - * NetworkMonitorTest#verifyNetworkTested. - * - * See ConnectivityServiceTest#assertRoutesAdded for an alternative approach which solves the - * TooManyActualInvocations problem described above by forcing the caller of the custom assert - * method to specify all expected invocations in one call. This is useful when the stable - * parcelable class being asserted on has a corresponding Java object (eg., RouteInfo and - * RouteInfoParcelable), and the caller can just pass in a list of them. It not useful here - * because there is no such object. - */ - private static class TetherOffloadRuleParcelMatcher implements - ArgumentMatcher<TetherOffloadRuleParcel> { - public final int upstreamIfindex; - public final InetAddress dst; - public final MacAddress dstMac; - - TetherOffloadRuleParcelMatcher(int upstreamIfindex, InetAddress dst, MacAddress dstMac) { - this.upstreamIfindex = upstreamIfindex; - this.dst = dst; - this.dstMac = dstMac; - } - - public boolean matches(TetherOffloadRuleParcel parcel) { - return upstreamIfindex == parcel.inputInterfaceIndex - && (TEST_IFACE_PARAMS.index == parcel.outputInterfaceIndex) - && Arrays.equals(dst.getAddress(), parcel.destination) - && (128 == parcel.prefixLength) - && Arrays.equals(TEST_IFACE_PARAMS.macAddr.toByteArray(), parcel.srcL2Address) - && Arrays.equals(dstMac.toByteArray(), parcel.dstL2Address); - } - - public String toString() { - return String.format("TetherOffloadRuleParcelMatcher(%d, %s, %s", - upstreamIfindex, dst.getHostAddress(), dstMac); - } - } - - @NonNull - private static TetherOffloadRuleParcel matches( - int upstreamIfindex, InetAddress dst, MacAddress dstMac) { - return argThat(new TetherOffloadRuleParcelMatcher(upstreamIfindex, dst, dstMac)); - } - - @NonNull - private static Ipv6ForwardingRule makeForwardingRule( - int upstreamIfindex, @NonNull InetAddress dst, @NonNull MacAddress dstMac) { - return new Ipv6ForwardingRule(upstreamIfindex, TEST_IFACE_PARAMS.index, - (Inet6Address) dst, TEST_IFACE_PARAMS.macAddr, dstMac); - } - - @NonNull - private static TetherStatsParcel buildEmptyTetherStatsParcel(int ifIndex) { - TetherStatsParcel parcel = new TetherStatsParcel(); - parcel.ifIndex = ifIndex; - return parcel; - } - - private void resetNetdAndBpfCoordinator() throws Exception { - reset(mNetd, mBpfCoordinator); - when(mNetd.tetherOffloadGetStats()).thenReturn(new TetherStatsParcel[0]); - when(mNetd.tetherOffloadGetAndClearStats(UPSTREAM_IFINDEX)) - .thenReturn(buildEmptyTetherStatsParcel(UPSTREAM_IFINDEX)); - when(mNetd.tetherOffloadGetAndClearStats(UPSTREAM_IFINDEX2)) - .thenReturn(buildEmptyTetherStatsParcel(UPSTREAM_IFINDEX2)); - } - - @Test - public void addRemoveipv6ForwardingRules() throws Exception { - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE, false /* usingLegacyDhcp */, - DEFAULT_USING_BPF_OFFLOAD); - - final int myIfindex = TEST_IFACE_PARAMS.index; - final int notMyIfindex = myIfindex - 1; - - final MacAddress myMac = TEST_IFACE_PARAMS.macAddr; - final InetAddress neighA = InetAddresses.parseNumericAddress("2001:db8::1"); - final InetAddress neighB = InetAddresses.parseNumericAddress("2001:db8::2"); - final InetAddress neighLL = InetAddresses.parseNumericAddress("fe80::1"); - final InetAddress neighMC = InetAddresses.parseNumericAddress("ff02::1234"); - final MacAddress macNull = MacAddress.fromString("00:00:00:00:00:00"); - final MacAddress macA = MacAddress.fromString("00:00:00:00:00:0a"); - final MacAddress macB = MacAddress.fromString("11:22:33:00:00:0b"); - - resetNetdAndBpfCoordinator(); - verifyNoMoreInteractions(mBpfCoordinator, mNetd); - - // TODO: Perhaps verify the interaction of tetherOffloadSetInterfaceQuota and - // tetherOffloadGetAndClearStats in netd while the rules are changed. - - // Events on other interfaces are ignored. - recvNewNeigh(notMyIfindex, neighA, NUD_REACHABLE, macA); - verifyNoMoreInteractions(mBpfCoordinator, mNetd); - - // Events on this interface are received and sent to netd. - recvNewNeigh(myIfindex, neighA, NUD_REACHABLE, macA); - verify(mBpfCoordinator).tetherOffloadRuleAdd( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighA, macA)); - verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX, neighA, macA)); - resetNetdAndBpfCoordinator(); - - recvNewNeigh(myIfindex, neighB, NUD_REACHABLE, macB); - verify(mBpfCoordinator).tetherOffloadRuleAdd( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighB, macB)); - verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX, neighB, macB)); - resetNetdAndBpfCoordinator(); - - // Link-local and multicast neighbors are ignored. - recvNewNeigh(myIfindex, neighLL, NUD_REACHABLE, macA); - verifyNoMoreInteractions(mBpfCoordinator, mNetd); - recvNewNeigh(myIfindex, neighMC, NUD_REACHABLE, macA); - verifyNoMoreInteractions(mBpfCoordinator, mNetd); - - // A neighbor that is no longer valid causes the rule to be removed. - // NUD_FAILED events do not have a MAC address. - recvNewNeigh(myIfindex, neighA, NUD_FAILED, null); - verify(mBpfCoordinator).tetherOffloadRuleRemove( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighA, macNull)); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighA, macNull)); - resetNetdAndBpfCoordinator(); - - // A neighbor that is deleted causes the rule to be removed. - recvDelNeigh(myIfindex, neighB, NUD_STALE, macB); - verify(mBpfCoordinator).tetherOffloadRuleRemove( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighB, macNull)); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighB, macNull)); - resetNetdAndBpfCoordinator(); - - // Upstream changes result in updating the rules. - recvNewNeigh(myIfindex, neighA, NUD_REACHABLE, macA); - recvNewNeigh(myIfindex, neighB, NUD_REACHABLE, macB); - resetNetdAndBpfCoordinator(); - - InOrder inOrder = inOrder(mNetd); - LinkProperties lp = new LinkProperties(); - lp.setInterfaceName(UPSTREAM_IFACE2); - dispatchTetherConnectionChanged(UPSTREAM_IFACE2, lp, -1); - verify(mBpfCoordinator).tetherOffloadRuleUpdate(mIpServer, UPSTREAM_IFINDEX2); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighA, macA)); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX2, neighA, macA)); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighB, macB)); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX2, neighB, macB)); - resetNetdAndBpfCoordinator(); - - // When the upstream is lost, rules are removed. - dispatchTetherConnectionChanged(null, null, 0); - // Clear function is called two times by: - // - processMessage CMD_TETHER_CONNECTION_CHANGED for the upstream is lost. - // - processMessage CMD_IPV6_TETHER_UPDATE for the IPv6 upstream is lost. - // See dispatchTetherConnectionChanged. - verify(mBpfCoordinator, times(2)).tetherOffloadRuleClear(mIpServer); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX2, neighA, macA)); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX2, neighB, macB)); - resetNetdAndBpfCoordinator(); - - // If the upstream is IPv4-only, no rules are added. - dispatchTetherConnectionChanged(UPSTREAM_IFACE); - resetNetdAndBpfCoordinator(); - recvNewNeigh(myIfindex, neighA, NUD_REACHABLE, macA); - // Clear function is called by #updateIpv6ForwardingRules for the IPv6 upstream is lost. - verify(mBpfCoordinator).tetherOffloadRuleClear(mIpServer); - verifyNoMoreInteractions(mBpfCoordinator, mNetd); - - // Rules can be added again once upstream IPv6 connectivity is available. - lp.setInterfaceName(UPSTREAM_IFACE); - dispatchTetherConnectionChanged(UPSTREAM_IFACE, lp, -1); - recvNewNeigh(myIfindex, neighB, NUD_REACHABLE, macB); - verify(mBpfCoordinator).tetherOffloadRuleAdd( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighB, macB)); - verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX, neighB, macB)); - verify(mBpfCoordinator, never()).tetherOffloadRuleAdd( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighA, macA)); - verify(mNetd, never()).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX, neighA, macA)); - - // If upstream IPv6 connectivity is lost, rules are removed. - resetNetdAndBpfCoordinator(); - dispatchTetherConnectionChanged(UPSTREAM_IFACE, null, 0); - verify(mBpfCoordinator).tetherOffloadRuleClear(mIpServer); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighB, macB)); - - // When the interface goes down, rules are removed. - lp.setInterfaceName(UPSTREAM_IFACE); - dispatchTetherConnectionChanged(UPSTREAM_IFACE, lp, -1); - recvNewNeigh(myIfindex, neighA, NUD_REACHABLE, macA); - recvNewNeigh(myIfindex, neighB, NUD_REACHABLE, macB); - verify(mBpfCoordinator).tetherOffloadRuleAdd( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighA, macA)); - verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX, neighA, macA)); - verify(mBpfCoordinator).tetherOffloadRuleAdd( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neighB, macB)); - verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX, neighB, macB)); - resetNetdAndBpfCoordinator(); - - mIpServer.stop(); - mLooper.dispatchAll(); - verify(mBpfCoordinator).tetherOffloadRuleClear(mIpServer); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighA, macA)); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neighB, macB)); - verify(mIpNeighborMonitor).stop(); - resetNetdAndBpfCoordinator(); - } - - @Test - public void enableDisableUsingBpfOffload() throws Exception { - final int myIfindex = TEST_IFACE_PARAMS.index; - final InetAddress neigh = InetAddresses.parseNumericAddress("2001:db8::1"); - final MacAddress macA = MacAddress.fromString("00:00:00:00:00:0a"); - final MacAddress macNull = MacAddress.fromString("00:00:00:00:00:00"); - - // Expect that rules can be only added/removed when the BPF offload config is enabled. - // Note that the BPF offload disabled case is not a realistic test case. Because IP - // neighbor monitor doesn't start if BPF offload is disabled, there should have no - // neighbor event listening. This is used for testing the protection check just in case. - // TODO: Perhaps remove the BPF offload disabled case test once this check isn't needed - // anymore. - - // [1] Enable BPF offload. - // A neighbor that is added or deleted causes the rule to be added or removed. - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE, false /* usingLegacyDhcp */, - true /* usingBpfOffload */); - resetNetdAndBpfCoordinator(); - - recvNewNeigh(myIfindex, neigh, NUD_REACHABLE, macA); - verify(mBpfCoordinator).tetherOffloadRuleAdd( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neigh, macA)); - verify(mNetd).tetherOffloadRuleAdd(matches(UPSTREAM_IFINDEX, neigh, macA)); - resetNetdAndBpfCoordinator(); - - recvDelNeigh(myIfindex, neigh, NUD_STALE, macA); - verify(mBpfCoordinator).tetherOffloadRuleRemove( - mIpServer, makeForwardingRule(UPSTREAM_IFINDEX, neigh, macNull)); - verify(mNetd).tetherOffloadRuleRemove(matches(UPSTREAM_IFINDEX, neigh, macNull)); - resetNetdAndBpfCoordinator(); - - // [2] Disable BPF offload. - // A neighbor that is added or deleted doesn’t cause the rule to be added or removed. - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE, false /* usingLegacyDhcp */, - false /* usingBpfOffload */); - resetNetdAndBpfCoordinator(); - - recvNewNeigh(myIfindex, neigh, NUD_REACHABLE, macA); - verify(mBpfCoordinator, never()).tetherOffloadRuleAdd(any(), any()); - verify(mNetd, never()).tetherOffloadRuleAdd(any()); - resetNetdAndBpfCoordinator(); - - recvDelNeigh(myIfindex, neigh, NUD_STALE, macA); - verify(mBpfCoordinator, never()).tetherOffloadRuleRemove(any(), any()); - verify(mNetd, never()).tetherOffloadRuleRemove(any()); - resetNetdAndBpfCoordinator(); - } - - @Test - public void doesNotStartIpNeighborMonitorIfBpfOffloadDisabled() throws Exception { - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE, false /* usingLegacyDhcp */, - false /* usingBpfOffload */); - - // IP neighbor monitor doesn't start if BPF offload is disabled. - verify(mIpNeighborMonitor, never()).start(); - } - - private LinkProperties buildIpv6OnlyLinkProperties(final String iface) { - final LinkProperties linkProp = new LinkProperties(); - linkProp.setInterfaceName(iface); - linkProp.addLinkAddress(new LinkAddress("2001:db8::1/64")); - linkProp.addRoute(new RouteInfo(new IpPrefix("::/0"), null, iface, RTN_UNICAST)); - final InetAddress dns = InetAddresses.parseNumericAddress("2001:4860:4860::8888"); - linkProp.addDnsServer(dns); - - return linkProp; - } - - @Test - public void testAdjustTtlValue() throws Exception { - final ArgumentCaptor<RaParams> raParamsCaptor = - ArgumentCaptor.forClass(RaParams.class); - initTetheredStateMachine(TETHERING_WIFI, UPSTREAM_IFACE); - verify(mRaDaemon).buildNewRa(any(), raParamsCaptor.capture()); - final RaParams noV6Params = raParamsCaptor.getValue(); - assertEquals(65, noV6Params.hopLimit); - reset(mRaDaemon); - - when(mNetd.getProcSysNet( - INetd.IPV6, INetd.CONF, UPSTREAM_IFACE, "hop_limit")).thenReturn("64"); - final LinkProperties lp = buildIpv6OnlyLinkProperties(UPSTREAM_IFACE); - dispatchTetherConnectionChanged(UPSTREAM_IFACE, lp, 1); - verify(mRaDaemon).buildNewRa(any(), raParamsCaptor.capture()); - final RaParams nonCellularParams = raParamsCaptor.getValue(); - assertEquals(65, nonCellularParams.hopLimit); - reset(mRaDaemon); - - dispatchTetherConnectionChanged(UPSTREAM_IFACE, null, 0); - verify(mRaDaemon).buildNewRa(any(), raParamsCaptor.capture()); - final RaParams noUpstream = raParamsCaptor.getValue(); - assertEquals(65, nonCellularParams.hopLimit); - reset(mRaDaemon); - - dispatchTetherConnectionChanged(UPSTREAM_IFACE, lp, -1); - verify(mRaDaemon).buildNewRa(any(), raParamsCaptor.capture()); - final RaParams cellularParams = raParamsCaptor.getValue(); - assertEquals(63, cellularParams.hopLimit); - reset(mRaDaemon); - } - - private void assertDhcpServingParams(final DhcpServingParamsParcel params, - final IpPrefix prefix) { - // Last address byte is random - assertTrue(prefix.contains(intToInet4AddressHTH(params.serverAddr))); - assertEquals(prefix.getPrefixLength(), params.serverAddrPrefixLength); - assertEquals(1, params.defaultRouters.length); - assertEquals(params.serverAddr, params.defaultRouters[0]); - assertEquals(1, params.dnsServers.length); - assertEquals(params.serverAddr, params.dnsServers[0]); - assertEquals(DHCP_LEASE_TIME_SECS, params.dhcpLeaseTimeSecs); - if (mIpServer.interfaceType() == TETHERING_NCM) { - assertTrue(params.changePrefixOnDecline); - } - } - - private void assertDhcpStarted(IpPrefix expectedPrefix) throws Exception { - verify(mDependencies, times(1)).makeDhcpServer(eq(IFACE_NAME), any(), any()); - verify(mDhcpServer, timeout(MAKE_DHCPSERVER_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - assertDhcpServingParams(mDhcpParamsCaptor.getValue(), expectedPrefix); - } - - /** - * Send a command to the state machine under test, and run the event loop to idle. - * - * @param command One of the IpServer.CMD_* constants. - * @param arg1 An additional argument to pass. - */ - private void dispatchCommand(int command, int arg1) { - mIpServer.sendMessage(command, arg1); - mLooper.dispatchAll(); - } - - /** - * Send a command to the state machine under test, and run the event loop to idle. - * - * @param command One of the IpServer.CMD_* constants. - */ - private void dispatchCommand(int command) { - mIpServer.sendMessage(command); - mLooper.dispatchAll(); - } - - /** - * Special override to tell the state machine that the upstream interface has changed. - * - * @see #dispatchCommand(int) - * @param upstreamIface String name of upstream interface (or null) - * @param v6lp IPv6 LinkProperties of the upstream interface, or null for an IPv4-only upstream. - */ - private void dispatchTetherConnectionChanged(String upstreamIface, LinkProperties v6lp, - int ttlAdjustment) { - dispatchTetherConnectionChanged(upstreamIface); - mIpServer.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, ttlAdjustment, 0, v6lp); - mLooper.dispatchAll(); - } - - private void dispatchTetherConnectionChanged(String upstreamIface) { - final InterfaceSet ifs = (upstreamIface != null) ? new InterfaceSet(upstreamIface) : null; - mIpServer.sendMessage(IpServer.CMD_TETHER_CONNECTION_CHANGED, ifs); - mLooper.dispatchAll(); - } - - private void assertIPv4AddressAndDirectlyConnectedRoute(LinkProperties lp) { - // Find the first IPv4 LinkAddress. - LinkAddress addr4 = null; - for (LinkAddress addr : lp.getLinkAddresses()) { - if (!(addr.getAddress() instanceof Inet4Address)) continue; - addr4 = addr; - break; - } - assertNotNull("missing IPv4 address", addr4); - - final IpPrefix destination = new IpPrefix(addr4.getAddress(), addr4.getPrefixLength()); - // Assert the presence of the associated directly connected route. - final RouteInfo directlyConnected = new RouteInfo(destination, null, lp.getInterfaceName(), - RouteInfo.RTN_UNICAST); - assertTrue("missing directly connected route: '" + directlyConnected.toString() + "'", - lp.getRoutes().contains(directlyConnected)); - } - - private void assertNoAddressesNorRoutes(LinkProperties lp) { - assertTrue(lp.getLinkAddresses().isEmpty()); - assertTrue(lp.getRoutes().isEmpty()); - // We also check that interface name is non-empty, because we should - // never see an empty interface name in any LinkProperties update. - assertFalse(TextUtils.isEmpty(lp.getInterfaceName())); - } - - private boolean assertContainsFlag(String[] flags, String match) { - for (String flag : flags) { - if (flag.equals(match)) return true; - } - fail("Missing flag: " + match); - return false; - } - - private boolean assertNotContainsFlag(String[] flags, String match) { - for (String flag : flags) { - if (flag.equals(match)) { - fail("Unexpected flag: " + match); - return false; - } - } - return true; - } -} diff --git a/packages/Tethering/tests/unit/src/android/net/util/InterfaceSetTest.java b/packages/Tethering/tests/unit/src/android/net/util/InterfaceSetTest.java deleted file mode 100644 index ea084b607868..000000000000 --- a/packages/Tethering/tests/unit/src/android/net/util/InterfaceSetTest.java +++ /dev/null @@ -1,61 +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.net.util; - -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class InterfaceSetTest { - @Test - public void testNullNamesIgnored() { - final InterfaceSet set = new InterfaceSet(null, "if1", null, "if2", null); - assertEquals(2, set.ifnames.size()); - assertTrue(set.ifnames.contains("if1")); - assertTrue(set.ifnames.contains("if2")); - } - - @Test - public void testToString() { - final InterfaceSet set = new InterfaceSet("if1", "if2"); - final String setString = set.toString(); - assertTrue(setString.equals("[if1,if2]") || setString.equals("[if2,if1]")); - } - - @Test - public void testToString_Empty() { - final InterfaceSet set = new InterfaceSet(null, null); - assertEquals("[]", set.toString()); - } - - @Test - public void testEquals() { - assertEquals(new InterfaceSet(null, "if1", "if2"), new InterfaceSet("if2", "if1")); - assertEquals(new InterfaceSet(null, null), new InterfaceSet()); - assertFalse(new InterfaceSet("if1", "if3").equals(new InterfaceSet("if1", "if2"))); - assertFalse(new InterfaceSet("if1", "if2").equals(new InterfaceSet("if1"))); - assertFalse(new InterfaceSet().equals(null)); - } -} diff --git a/packages/Tethering/tests/unit/src/android/net/util/TetheringUtilsTest.java b/packages/Tethering/tests/unit/src/android/net/util/TetheringUtilsTest.java deleted file mode 100644 index 1499f3be224e..000000000000 --- a/packages/Tethering/tests/unit/src/android/net/util/TetheringUtilsTest.java +++ /dev/null @@ -1,87 +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.net.util; - -import static android.net.TetheringManager.TETHERING_USB; -import static android.net.TetheringManager.TETHERING_WIFI; - -import static junit.framework.Assert.assertFalse; -import static junit.framework.Assert.assertTrue; - -import android.net.LinkAddress; -import android.net.TetheringRequestParcel; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.testutils.MiscAssertsKt; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class TetheringUtilsTest { - private static final LinkAddress TEST_SERVER_ADDR = new LinkAddress("192.168.43.1/24"); - private static final LinkAddress TEST_CLIENT_ADDR = new LinkAddress("192.168.43.5/24"); - private TetheringRequestParcel mTetheringRequest; - - @Before - public void setUp() { - mTetheringRequest = makeTetheringRequestParcel(); - } - - public TetheringRequestParcel makeTetheringRequestParcel() { - final TetheringRequestParcel request = new TetheringRequestParcel(); - request.tetheringType = TETHERING_WIFI; - request.localIPv4Address = TEST_SERVER_ADDR; - request.staticClientAddress = TEST_CLIENT_ADDR; - request.exemptFromEntitlementCheck = false; - request.showProvisioningUi = true; - return request; - } - - @Test - public void testIsTetheringRequestEquals() throws Exception { - TetheringRequestParcel request = makeTetheringRequestParcel(); - - assertTrue(TetheringUtils.isTetheringRequestEquals(mTetheringRequest, mTetheringRequest)); - assertTrue(TetheringUtils.isTetheringRequestEquals(mTetheringRequest, request)); - assertTrue(TetheringUtils.isTetheringRequestEquals(null, null)); - assertFalse(TetheringUtils.isTetheringRequestEquals(mTetheringRequest, null)); - assertFalse(TetheringUtils.isTetheringRequestEquals(null, mTetheringRequest)); - - request = makeTetheringRequestParcel(); - request.tetheringType = TETHERING_USB; - assertFalse(TetheringUtils.isTetheringRequestEquals(mTetheringRequest, request)); - - request = makeTetheringRequestParcel(); - request.localIPv4Address = null; - request.staticClientAddress = null; - assertFalse(TetheringUtils.isTetheringRequestEquals(mTetheringRequest, request)); - - request = makeTetheringRequestParcel(); - request.exemptFromEntitlementCheck = true; - assertFalse(TetheringUtils.isTetheringRequestEquals(mTetheringRequest, request)); - - request = makeTetheringRequestParcel(); - request.showProvisioningUi = false; - assertFalse(TetheringUtils.isTetheringRequestEquals(mTetheringRequest, request)); - - MiscAssertsKt.assertFieldCountEquals(5, TetheringRequestParcel.class); - } -} diff --git a/packages/Tethering/tests/unit/src/android/net/util/VersionedBroadcastListenerTest.java b/packages/Tethering/tests/unit/src/android/net/util/VersionedBroadcastListenerTest.java deleted file mode 100644 index 5a9b6e380ea9..000000000000 --- a/packages/Tethering/tests/unit/src/android/net/util/VersionedBroadcastListenerTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 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.net.util; - -import static org.junit.Assert.assertEquals; -import static org.mockito.Mockito.reset; - -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Handler; -import android.os.Looper; -import android.os.UserHandle; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.internal.util.test.BroadcastInterceptingContext; - -import org.junit.After; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class VersionedBroadcastListenerTest { - private static final String TAG = VersionedBroadcastListenerTest.class.getSimpleName(); - private static final String ACTION_TEST = "action.test.happy.broadcasts"; - - @Mock private Context mContext; - private BroadcastInterceptingContext mServiceContext; - private Handler mHandler; - private VersionedBroadcastListener mListener; - private int mCallbackCount; - - private void doCallback() { - mCallbackCount++; - } - - private class MockContext extends BroadcastInterceptingContext { - MockContext(Context base) { - super(base); - } - } - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - if (Looper.myLooper() == null) { - Looper.prepare(); - } - } - - @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - reset(mContext); - mServiceContext = new MockContext(mContext); - mHandler = new Handler(Looper.myLooper()); - mCallbackCount = 0; - final IntentFilter filter = new IntentFilter(); - filter.addAction(ACTION_TEST); - mListener = new VersionedBroadcastListener( - TAG, mServiceContext, mHandler, filter, (Intent intent) -> doCallback()); - } - - @After public void tearDown() throws Exception { - if (mListener != null) { - mListener.stopListening(); - mListener = null; - } - } - - private void sendBroadcast() { - final Intent intent = new Intent(ACTION_TEST); - mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } - - @Test - public void testBasicListening() { - assertEquals(0, mCallbackCount); - mListener.startListening(); - for (int i = 0; i < 5; i++) { - sendBroadcast(); - assertEquals(i + 1, mCallbackCount); - } - mListener.stopListening(); - } - - @Test - public void testBroadcastsBeforeStartAreIgnored() { - assertEquals(0, mCallbackCount); - for (int i = 0; i < 5; i++) { - sendBroadcast(); - assertEquals(0, mCallbackCount); - } - - mListener.startListening(); - sendBroadcast(); - assertEquals(1, mCallbackCount); - } - - @Test - public void testBroadcastsAfterStopAreIgnored() { - mListener.startListening(); - sendBroadcast(); - assertEquals(1, mCallbackCount); - mListener.stopListening(); - - for (int i = 0; i < 5; i++) { - sendBroadcast(); - assertEquals(1, mCallbackCount); - } - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java deleted file mode 100644 index 64242ae8255f..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/BpfCoordinatorTest.java +++ /dev/null @@ -1,607 +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 com.android.networkstack.tethering; - -import static android.net.NetworkStats.DEFAULT_NETWORK_NO; -import static android.net.NetworkStats.METERED_NO; -import static android.net.NetworkStats.ROAMING_NO; -import static android.net.NetworkStats.SET_DEFAULT; -import static android.net.NetworkStats.TAG_NONE; -import static android.net.NetworkStats.UID_ALL; -import static android.net.NetworkStats.UID_TETHERING; -import static android.net.netstats.provider.NetworkStatsProvider.QUOTA_UNLIMITED; - -import static com.android.networkstack.tethering.BpfCoordinator.StatsType; -import static com.android.networkstack.tethering.BpfCoordinator.StatsType.STATS_PER_IFACE; -import static com.android.networkstack.tethering.BpfCoordinator.StatsType.STATS_PER_UID; -import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.argThat; -import static org.mockito.Mockito.clearInvocations; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.app.usage.NetworkStatsManager; -import android.net.INetd; -import android.net.InetAddresses; -import android.net.MacAddress; -import android.net.NetworkStats; -import android.net.TetherOffloadRuleParcel; -import android.net.TetherStatsParcel; -import android.net.ip.IpServer; -import android.net.util.SharedLog; -import android.os.Handler; -import android.os.test.TestLooper; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.networkstack.tethering.BpfCoordinator.Ipv6ForwardingRule; -import com.android.testutils.TestableNetworkStatsProviderCbBinder; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.ArgumentMatcher; -import org.mockito.InOrder; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.net.Inet6Address; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashMap; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class BpfCoordinatorTest { - private static final int DOWNSTREAM_IFINDEX = 10; - private static final MacAddress DOWNSTREAM_MAC = MacAddress.ALL_ZEROS_ADDRESS; - private static final InetAddress NEIGH_A = InetAddresses.parseNumericAddress("2001:db8::1"); - private static final InetAddress NEIGH_B = InetAddresses.parseNumericAddress("2001:db8::2"); - private static final MacAddress MAC_A = MacAddress.fromString("00:00:00:00:00:0a"); - private static final MacAddress MAC_B = MacAddress.fromString("11:22:33:00:00:0b"); - - @Mock private NetworkStatsManager mStatsManager; - @Mock private INetd mNetd; - @Mock private IpServer mIpServer; - @Mock private TetheringConfiguration mTetherConfig; - - // Late init since methods must be called by the thread that created this object. - private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb; - private BpfCoordinator.BpfTetherStatsProvider mTetherStatsProvider; - private final ArgumentCaptor<ArrayList> mStringArrayCaptor = - ArgumentCaptor.forClass(ArrayList.class); - private final TestLooper mTestLooper = new TestLooper(); - private BpfCoordinator.Dependencies mDeps = - new BpfCoordinator.Dependencies() { - @NonNull - public Handler getHandler() { - return new Handler(mTestLooper.getLooper()); - } - - @NonNull - public INetd getNetd() { - return mNetd; - } - - @NonNull - public NetworkStatsManager getNetworkStatsManager() { - return mStatsManager; - } - - @NonNull - public SharedLog getSharedLog() { - return new SharedLog("test"); - } - - @Nullable - public TetheringConfiguration getTetherConfig() { - return mTetherConfig; - } - }; - - @Before public void setUp() { - MockitoAnnotations.initMocks(this); - when(mTetherConfig.isBpfOffloadEnabled()).thenReturn(true /* default value */); - } - - private void waitForIdle() { - mTestLooper.dispatchAll(); - } - - private void setupFunctioningNetdInterface() throws Exception { - when(mNetd.tetherOffloadGetStats()).thenReturn(new TetherStatsParcel[0]); - } - - @NonNull - private BpfCoordinator makeBpfCoordinator() throws Exception { - final BpfCoordinator coordinator = new BpfCoordinator(mDeps); - final ArgumentCaptor<BpfCoordinator.BpfTetherStatsProvider> - tetherStatsProviderCaptor = - ArgumentCaptor.forClass(BpfCoordinator.BpfTetherStatsProvider.class); - verify(mStatsManager).registerNetworkStatsProvider(anyString(), - tetherStatsProviderCaptor.capture()); - mTetherStatsProvider = tetherStatsProviderCaptor.getValue(); - assertNotNull(mTetherStatsProvider); - mTetherStatsProviderCb = new TestableNetworkStatsProviderCbBinder(); - mTetherStatsProvider.setProviderCallbackBinder(mTetherStatsProviderCb); - return coordinator; - } - - @NonNull - private static NetworkStats.Entry buildTestEntry(@NonNull StatsType how, - @NonNull String iface, long rxBytes, long rxPackets, long txBytes, long txPackets) { - return new NetworkStats.Entry(iface, how == STATS_PER_IFACE ? UID_ALL : UID_TETHERING, - SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, rxBytes, - rxPackets, txBytes, txPackets, 0L); - } - - @NonNull - private static TetherStatsParcel buildTestTetherStatsParcel(@NonNull Integer ifIndex, - long rxBytes, long rxPackets, long txBytes, long txPackets) { - final TetherStatsParcel parcel = new TetherStatsParcel(); - parcel.ifIndex = ifIndex; - parcel.rxBytes = rxBytes; - parcel.rxPackets = rxPackets; - parcel.txBytes = txBytes; - parcel.txPackets = txPackets; - return parcel; - } - - // Set up specific tether stats list and wait for the stats cache is updated by polling thread - // in the coordinator. Beware of that it is only used for the default polling interval. - private void setTetherOffloadStatsList(TetherStatsParcel[] tetherStatsList) throws Exception { - when(mNetd.tetherOffloadGetStats()).thenReturn(tetherStatsList); - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - } - - @Test - public void testGetForwardedStats() throws Exception { - setupFunctioningNetdInterface(); - - final BpfCoordinator coordinator = makeBpfCoordinator(); - coordinator.startPolling(); - - final String wlanIface = "wlan0"; - final Integer wlanIfIndex = 100; - final String mobileIface = "rmnet_data0"; - final Integer mobileIfIndex = 101; - - // Add interface name to lookup table. In realistic case, the upstream interface name will - // be added by IpServer when IpServer has received with a new IPv6 upstream update event. - coordinator.addUpstreamNameToLookupTable(wlanIfIndex, wlanIface); - coordinator.addUpstreamNameToLookupTable(mobileIfIndex, mobileIface); - - // [1] Both interface stats are changed. - // Setup the tether stats of wlan and mobile interface. Note that move forward the time of - // the looper to make sure the new tether stats has been updated by polling update thread. - setTetherOffloadStatsList(new TetherStatsParcel[] { - buildTestTetherStatsParcel(wlanIfIndex, 1000, 100, 2000, 200), - buildTestTetherStatsParcel(mobileIfIndex, 3000, 300, 4000, 400)}); - - final NetworkStats expectedIfaceStats = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_IFACE, wlanIface, 1000, 100, 2000, 200)) - .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 3000, 300, 4000, 400)); - - final NetworkStats expectedUidStats = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_UID, wlanIface, 1000, 100, 2000, 200)) - .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 3000, 300, 4000, 400)); - - // Force pushing stats update to verify the stats reported. - // TODO: Perhaps make #expectNotifyStatsUpdated to use test TetherStatsParcel object for - // verifying the notification. - mTetherStatsProvider.pushTetherStats(); - mTetherStatsProviderCb.expectNotifyStatsUpdated(expectedIfaceStats, expectedUidStats); - - // [2] Only one interface stats is changed. - // The tether stats of mobile interface is accumulated and The tether stats of wlan - // interface is the same. - setTetherOffloadStatsList(new TetherStatsParcel[] { - buildTestTetherStatsParcel(wlanIfIndex, 1000, 100, 2000, 200), - buildTestTetherStatsParcel(mobileIfIndex, 3010, 320, 4030, 440)}); - - final NetworkStats expectedIfaceStatsDiff = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_IFACE, wlanIface, 0, 0, 0, 0)) - .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 10, 20, 30, 40)); - - final NetworkStats expectedUidStatsDiff = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_UID, wlanIface, 0, 0, 0, 0)) - .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 10, 20, 30, 40)); - - // Force pushing stats update to verify that only diff of stats is reported. - mTetherStatsProvider.pushTetherStats(); - mTetherStatsProviderCb.expectNotifyStatsUpdated(expectedIfaceStatsDiff, - expectedUidStatsDiff); - - // [3] Stop coordinator. - // Shutdown the coordinator and clear the invocation history, especially the - // tetherOffloadGetStats() calls. - coordinator.stopPolling(); - clearInvocations(mNetd); - - // Verify the polling update thread stopped. - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - verify(mNetd, never()).tetherOffloadGetStats(); - } - - @Test - public void testOnSetAlert() throws Exception { - setupFunctioningNetdInterface(); - - final BpfCoordinator coordinator = makeBpfCoordinator(); - coordinator.startPolling(); - - final String mobileIface = "rmnet_data0"; - final Integer mobileIfIndex = 100; - coordinator.addUpstreamNameToLookupTable(mobileIfIndex, mobileIface); - - // Verify that set quota to 0 will immediately triggers a callback. - mTetherStatsProvider.onSetAlert(0); - waitForIdle(); - mTetherStatsProviderCb.expectNotifyAlertReached(); - - // Verify that notifyAlertReached never fired if quota is not yet reached. - when(mNetd.tetherOffloadGetStats()).thenReturn( - new TetherStatsParcel[] {buildTestTetherStatsParcel(mobileIfIndex, 0, 0, 0, 0)}); - mTetherStatsProvider.onSetAlert(100); - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - mTetherStatsProviderCb.assertNoCallback(); - - // Verify that notifyAlertReached fired when quota is reached. - when(mNetd.tetherOffloadGetStats()).thenReturn( - new TetherStatsParcel[] {buildTestTetherStatsParcel(mobileIfIndex, 50, 0, 50, 0)}); - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - mTetherStatsProviderCb.expectNotifyAlertReached(); - - // Verify that set quota with UNLIMITED won't trigger any callback. - mTetherStatsProvider.onSetAlert(QUOTA_UNLIMITED); - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - mTetherStatsProviderCb.assertNoCallback(); - } - - // The custom ArgumentMatcher simply comes from IpServerTest. - // TODO: move both of them into a common utility class for reusing the code. - private static class TetherOffloadRuleParcelMatcher implements - ArgumentMatcher<TetherOffloadRuleParcel> { - public final int upstreamIfindex; - public final int downstreamIfindex; - public final Inet6Address address; - public final MacAddress srcMac; - public final MacAddress dstMac; - - TetherOffloadRuleParcelMatcher(@NonNull Ipv6ForwardingRule rule) { - upstreamIfindex = rule.upstreamIfindex; - downstreamIfindex = rule.downstreamIfindex; - address = rule.address; - srcMac = rule.srcMac; - dstMac = rule.dstMac; - } - - public boolean matches(@NonNull TetherOffloadRuleParcel parcel) { - return upstreamIfindex == parcel.inputInterfaceIndex - && (downstreamIfindex == parcel.outputInterfaceIndex) - && Arrays.equals(address.getAddress(), parcel.destination) - && (128 == parcel.prefixLength) - && Arrays.equals(srcMac.toByteArray(), parcel.srcL2Address) - && Arrays.equals(dstMac.toByteArray(), parcel.dstL2Address); - } - - public String toString() { - return String.format("TetherOffloadRuleParcelMatcher(%d, %d, %s, %s, %s", - upstreamIfindex, downstreamIfindex, address.getHostAddress(), srcMac, dstMac); - } - } - - @NonNull - private TetherOffloadRuleParcel matches(@NonNull Ipv6ForwardingRule rule) { - return argThat(new TetherOffloadRuleParcelMatcher(rule)); - } - - @NonNull - private static Ipv6ForwardingRule buildTestForwardingRule( - int upstreamIfindex, @NonNull InetAddress address, @NonNull MacAddress dstMac) { - return new Ipv6ForwardingRule(upstreamIfindex, DOWNSTREAM_IFINDEX, (Inet6Address) address, - DOWNSTREAM_MAC, dstMac); - } - - @Test - public void testSetDataLimit() throws Exception { - setupFunctioningNetdInterface(); - - final BpfCoordinator coordinator = makeBpfCoordinator(); - - final String mobileIface = "rmnet_data0"; - final Integer mobileIfIndex = 100; - coordinator.addUpstreamNameToLookupTable(mobileIfIndex, mobileIface); - - // [1] Default limit. - // Set the unlimited quota as default if the service has never applied a data limit for a - // given upstream. Note that the data limit only be applied on an upstream which has rules. - final Ipv6ForwardingRule rule = buildTestForwardingRule(mobileIfIndex, NEIGH_A, MAC_A); - final InOrder inOrder = inOrder(mNetd); - coordinator.tetherOffloadRuleAdd(mIpServer, rule); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(rule)); - inOrder.verify(mNetd).tetherOffloadSetInterfaceQuota(mobileIfIndex, QUOTA_UNLIMITED); - inOrder.verifyNoMoreInteractions(); - - // [2] Specific limit. - // Applying the data limit boundary {min, 1gb, max, infinity} on current upstream. - for (final long quota : new long[] {0, 1048576000, Long.MAX_VALUE, QUOTA_UNLIMITED}) { - mTetherStatsProvider.onSetLimit(mobileIface, quota); - waitForIdle(); - inOrder.verify(mNetd).tetherOffloadSetInterfaceQuota(mobileIfIndex, quota); - inOrder.verifyNoMoreInteractions(); - } - - // [3] Invalid limit. - // The valid range of quota is 0..max_int64 or -1 (unlimited). - final long invalidLimit = Long.MIN_VALUE; - try { - mTetherStatsProvider.onSetLimit(mobileIface, invalidLimit); - waitForIdle(); - fail("No exception thrown for invalid limit " + invalidLimit + "."); - } catch (IllegalArgumentException expected) { - assertEquals(expected.getMessage(), "invalid quota value " + invalidLimit); - } - } - - // TODO: Test the case in which the rules are changed from different IpServer objects. - @Test - public void testSetDataLimitOnRuleChange() throws Exception { - setupFunctioningNetdInterface(); - - final BpfCoordinator coordinator = makeBpfCoordinator(); - - final String mobileIface = "rmnet_data0"; - final Integer mobileIfIndex = 100; - coordinator.addUpstreamNameToLookupTable(mobileIfIndex, mobileIface); - - // Applying a data limit to the current upstream does not take any immediate action. - // The data limit could be only set on an upstream which has rules. - final long limit = 12345; - final InOrder inOrder = inOrder(mNetd); - mTetherStatsProvider.onSetLimit(mobileIface, limit); - waitForIdle(); - inOrder.verify(mNetd, never()).tetherOffloadSetInterfaceQuota(anyInt(), anyLong()); - - // Adding the first rule on current upstream immediately sends the quota to netd. - final Ipv6ForwardingRule ruleA = buildTestForwardingRule(mobileIfIndex, NEIGH_A, MAC_A); - coordinator.tetherOffloadRuleAdd(mIpServer, ruleA); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(ruleA)); - inOrder.verify(mNetd).tetherOffloadSetInterfaceQuota(mobileIfIndex, limit); - inOrder.verifyNoMoreInteractions(); - - // Adding the second rule on current upstream does not send the quota to netd. - final Ipv6ForwardingRule ruleB = buildTestForwardingRule(mobileIfIndex, NEIGH_B, MAC_B); - coordinator.tetherOffloadRuleAdd(mIpServer, ruleB); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(ruleB)); - inOrder.verify(mNetd, never()).tetherOffloadSetInterfaceQuota(anyInt(), anyLong()); - - // Removing the second rule on current upstream does not send the quota to netd. - coordinator.tetherOffloadRuleRemove(mIpServer, ruleB); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(ruleB)); - inOrder.verify(mNetd, never()).tetherOffloadSetInterfaceQuota(anyInt(), anyLong()); - - // Removing the last rule on current upstream immediately sends the cleanup stuff to netd. - when(mNetd.tetherOffloadGetAndClearStats(mobileIfIndex)) - .thenReturn(buildTestTetherStatsParcel(mobileIfIndex, 0, 0, 0, 0)); - coordinator.tetherOffloadRuleRemove(mIpServer, ruleA); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(ruleA)); - inOrder.verify(mNetd).tetherOffloadGetAndClearStats(mobileIfIndex); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void testTetherOffloadRuleUpdateAndClear() throws Exception { - setupFunctioningNetdInterface(); - - final BpfCoordinator coordinator = makeBpfCoordinator(); - - final String ethIface = "eth1"; - final String mobileIface = "rmnet_data0"; - final Integer ethIfIndex = 100; - final Integer mobileIfIndex = 101; - coordinator.addUpstreamNameToLookupTable(ethIfIndex, ethIface); - coordinator.addUpstreamNameToLookupTable(mobileIfIndex, mobileIface); - - final InOrder inOrder = inOrder(mNetd); - - // Before the rule test, here are the additional actions while the rules are changed. - // - After adding the first rule on a given upstream, the coordinator adds a data limit. - // If the service has never applied the data limit, set an unlimited quota as default. - // - After removing the last rule on a given upstream, the coordinator gets the last stats. - // Then, it clears the stats and the limit entry from BPF maps. - // See tetherOffloadRule{Add, Remove, Clear, Clean}. - - // [1] Adding rules on the upstream Ethernet. - // Note that the default data limit is applied after the first rule is added. - final Ipv6ForwardingRule ethernetRuleA = buildTestForwardingRule( - ethIfIndex, NEIGH_A, MAC_A); - final Ipv6ForwardingRule ethernetRuleB = buildTestForwardingRule( - ethIfIndex, NEIGH_B, MAC_B); - - coordinator.tetherOffloadRuleAdd(mIpServer, ethernetRuleA); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(ethernetRuleA)); - inOrder.verify(mNetd).tetherOffloadSetInterfaceQuota(ethIfIndex, QUOTA_UNLIMITED); - - coordinator.tetherOffloadRuleAdd(mIpServer, ethernetRuleB); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(ethernetRuleB)); - - // [2] Update the existing rules from Ethernet to cellular. - final Ipv6ForwardingRule mobileRuleA = buildTestForwardingRule( - mobileIfIndex, NEIGH_A, MAC_A); - final Ipv6ForwardingRule mobileRuleB = buildTestForwardingRule( - mobileIfIndex, NEIGH_B, MAC_B); - when(mNetd.tetherOffloadGetAndClearStats(ethIfIndex)) - .thenReturn(buildTestTetherStatsParcel(ethIfIndex, 10, 20, 30, 40)); - - // Update the existing rules for upstream changes. The rules are removed and re-added one - // by one for updating upstream interface index by #tetherOffloadRuleUpdate. - coordinator.tetherOffloadRuleUpdate(mIpServer, mobileIfIndex); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(ethernetRuleA)); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(mobileRuleA)); - inOrder.verify(mNetd).tetherOffloadSetInterfaceQuota(mobileIfIndex, QUOTA_UNLIMITED); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(ethernetRuleB)); - inOrder.verify(mNetd).tetherOffloadGetAndClearStats(ethIfIndex); - inOrder.verify(mNetd).tetherOffloadRuleAdd(matches(mobileRuleB)); - - // [3] Clear all rules for a given IpServer. - when(mNetd.tetherOffloadGetAndClearStats(mobileIfIndex)) - .thenReturn(buildTestTetherStatsParcel(mobileIfIndex, 50, 60, 70, 80)); - coordinator.tetherOffloadRuleClear(mIpServer); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(mobileRuleA)); - inOrder.verify(mNetd).tetherOffloadRuleRemove(matches(mobileRuleB)); - inOrder.verify(mNetd).tetherOffloadGetAndClearStats(mobileIfIndex); - - // [4] Force pushing stats update to verify that the last diff of stats is reported on all - // upstreams. - mTetherStatsProvider.pushTetherStats(); - mTetherStatsProviderCb.expectNotifyStatsUpdated( - new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_IFACE, ethIface, 10, 20, 30, 40)) - .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 50, 60, 70, 80)), - new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_UID, ethIface, 10, 20, 30, 40)) - .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 50, 60, 70, 80))); - } - - @Test - public void testTetheringConfigDisable() throws Exception { - setupFunctioningNetdInterface(); - when(mTetherConfig.isBpfOffloadEnabled()).thenReturn(false); - - final BpfCoordinator coordinator = makeBpfCoordinator(); - coordinator.startPolling(); - - // The tether stats polling task should not be scheduled. - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - verify(mNetd, never()).tetherOffloadGetStats(); - - // The interface name lookup table can't be added. - final String iface = "rmnet_data0"; - final Integer ifIndex = 100; - coordinator.addUpstreamNameToLookupTable(ifIndex, iface); - assertEquals(0, coordinator.getInterfaceNamesForTesting().size()); - - // The rule can't be added. - final InetAddress neigh = InetAddresses.parseNumericAddress("2001:db8::1"); - final MacAddress mac = MacAddress.fromString("00:00:00:00:00:0a"); - final Ipv6ForwardingRule rule = buildTestForwardingRule(ifIndex, neigh, mac); - coordinator.tetherOffloadRuleAdd(mIpServer, rule); - verify(mNetd, never()).tetherOffloadRuleAdd(any()); - LinkedHashMap<Inet6Address, Ipv6ForwardingRule> rules = - coordinator.getForwardingRulesForTesting().get(mIpServer); - assertNull(rules); - - // The rule can't be removed. This is not a realistic case because adding rule is not - // allowed. That implies no rule could be removed, cleared or updated. Verify these - // cases just in case. - rules = new LinkedHashMap<Inet6Address, Ipv6ForwardingRule>(); - rules.put(rule.address, rule); - coordinator.getForwardingRulesForTesting().put(mIpServer, rules); - coordinator.tetherOffloadRuleRemove(mIpServer, rule); - verify(mNetd, never()).tetherOffloadRuleRemove(any()); - rules = coordinator.getForwardingRulesForTesting().get(mIpServer); - assertNotNull(rules); - assertEquals(1, rules.size()); - - // The rule can't be cleared. - coordinator.tetherOffloadRuleClear(mIpServer); - verify(mNetd, never()).tetherOffloadRuleRemove(any()); - rules = coordinator.getForwardingRulesForTesting().get(mIpServer); - assertNotNull(rules); - assertEquals(1, rules.size()); - - // The rule can't be updated. - coordinator.tetherOffloadRuleUpdate(mIpServer, rule.upstreamIfindex + 1 /* new */); - verify(mNetd, never()).tetherOffloadRuleRemove(any()); - verify(mNetd, never()).tetherOffloadRuleAdd(any()); - rules = coordinator.getForwardingRulesForTesting().get(mIpServer); - assertNotNull(rules); - assertEquals(1, rules.size()); - } - - @Test - public void testTetheringConfigSetPollingInterval() throws Exception { - setupFunctioningNetdInterface(); - - final BpfCoordinator coordinator = makeBpfCoordinator(); - - // [1] The default polling interval. - coordinator.startPolling(); - assertEquals(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS, coordinator.getPollingInterval()); - coordinator.stopPolling(); - - // [2] Expect the invalid polling interval isn't applied. The valid range of interval is - // DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS..max_long. - for (final int interval - : new int[] {0, 100, DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS - 1}) { - when(mTetherConfig.getOffloadPollInterval()).thenReturn(interval); - coordinator.startPolling(); - assertEquals(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS, coordinator.getPollingInterval()); - coordinator.stopPolling(); - } - - // [3] Set a specific polling interval which is larger than default value. - // Use a large polling interval to avoid flaky test because the time forwarding - // approximation is used to verify the scheduled time of the polling thread. - final int pollingInterval = 100_000; - when(mTetherConfig.getOffloadPollInterval()).thenReturn(pollingInterval); - coordinator.startPolling(); - - // Expect the specific polling interval to be applied. - assertEquals(pollingInterval, coordinator.getPollingInterval()); - - // Start on a new polling time slot. - mTestLooper.moveTimeForward(pollingInterval); - waitForIdle(); - clearInvocations(mNetd); - - // Move time forward to 90% polling interval time. Expect that the polling thread has not - // scheduled yet. - mTestLooper.moveTimeForward((long) (pollingInterval * 0.9)); - waitForIdle(); - verify(mNetd, never()).tetherOffloadGetStats(); - - // Move time forward to the remaining 10% polling interval time. Expect that the polling - // thread has scheduled. - mTestLooper.moveTimeForward((long) (pollingInterval * 0.1)); - waitForIdle(); - verify(mNetd).tetherOffloadGetStats(); - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt deleted file mode 100644 index d915354b0c37..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/ConnectedClientsTrackerTest.kt +++ /dev/null @@ -1,162 +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 com.android.networkstack.tethering - -import android.net.LinkAddress -import android.net.MacAddress -import android.net.TetheredClient -import android.net.TetheredClient.AddressInfo -import android.net.TetheringManager.TETHERING_USB -import android.net.TetheringManager.TETHERING_WIFI -import android.net.ip.IpServer -import android.net.wifi.WifiClient -import androidx.test.filters.SmallTest -import androidx.test.runner.AndroidJUnit4 -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.mock -import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue - -@RunWith(AndroidJUnit4::class) -@SmallTest -class ConnectedClientsTrackerTest { - - private val server1 = mock(IpServer::class.java) - private val server2 = mock(IpServer::class.java) - private val servers = listOf(server1, server2) - - private val clock = TestClock(1324L) - - private val client1Addr = MacAddress.fromString("01:23:45:67:89:0A") - private val client1 = TetheredClient(client1Addr, listOf( - makeAddrInfo("192.168.43.44/32", null /* hostname */, clock.time + 20)), - TETHERING_WIFI) - private val wifiClient1 = makeWifiClient(client1Addr) - private val client2Addr = MacAddress.fromString("02:34:56:78:90:AB") - private val client2Exp30AddrInfo = makeAddrInfo( - "192.168.43.45/32", "my_hostname", clock.time + 30) - private val client2 = TetheredClient(client2Addr, listOf( - client2Exp30AddrInfo, - makeAddrInfo("2001:db8:12::34/72", "other_hostname", clock.time + 10)), - TETHERING_WIFI) - private val wifiClient2 = makeWifiClient(client2Addr) - private val client3Addr = MacAddress.fromString("03:45:67:89:0A:BC") - private val client3 = TetheredClient(client3Addr, - listOf(makeAddrInfo("2001:db8:34::34/72", "other_other_hostname", clock.time + 10)), - TETHERING_USB) - - private fun makeAddrInfo(addr: String, hostname: String?, expTime: Long) = - LinkAddress(addr).let { - AddressInfo(LinkAddress(it.address, it.prefixLength, it.flags, it.scope, - expTime /* deprecationTime */, expTime /* expirationTime */), hostname) - } - - @Test - fun testUpdateConnectedClients() { - doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases - doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases - - val tracker = ConnectedClientsTracker(clock) - assertFalse(tracker.updateConnectedClients(servers, null)) - - // Obtain a lease for client 1 - doReturn(listOf(client1)).`when`(server1).allLeases - assertSameClients(listOf(client1), assertNewClients(tracker, servers, listOf(wifiClient1))) - - // Client 2 L2-connected, no lease yet - val client2WithoutAddr = TetheredClient(client2Addr, emptyList(), TETHERING_WIFI) - assertSameClients(listOf(client1, client2WithoutAddr), - assertNewClients(tracker, servers, listOf(wifiClient1, wifiClient2))) - - // Client 2 lease obtained - doReturn(listOf(client1, client2)).`when`(server1).allLeases - assertSameClients(listOf(client1, client2), assertNewClients(tracker, servers, null)) - - // Client 3 lease obtained - doReturn(listOf(client3)).`when`(server2).allLeases - assertSameClients(listOf(client1, client2, client3), - assertNewClients(tracker, servers, null)) - - // Client 2 L2-disconnected - assertSameClients(listOf(client1, client3), - assertNewClients(tracker, servers, listOf(wifiClient1))) - - // Client 1 L2-disconnected - assertSameClients(listOf(client3), assertNewClients(tracker, servers, emptyList())) - - // Client 1 comes back - assertSameClients(listOf(client1, client3), - assertNewClients(tracker, servers, listOf(wifiClient1))) - - // Leases lost, client 1 still L2-connected - doReturn(emptyList<TetheredClient>()).`when`(server1).allLeases - doReturn(emptyList<TetheredClient>()).`when`(server2).allLeases - assertSameClients(listOf(TetheredClient(client1Addr, emptyList(), TETHERING_WIFI)), - assertNewClients(tracker, servers, null)) - } - - @Test - fun testUpdateConnectedClients_LeaseExpiration() { - val tracker = ConnectedClientsTracker(clock) - doReturn(listOf(client1, client2)).`when`(server1).allLeases - doReturn(listOf(client3)).`when`(server2).allLeases - assertSameClients(listOf(client1, client2, client3), assertNewClients( - tracker, servers, listOf(wifiClient1, wifiClient2))) - - clock.time += 20 - // Client 3 has no remaining lease: removed - val expectedClients = listOf( - // Client 1 has no remaining lease but is L2-connected - TetheredClient(client1Addr, emptyList(), TETHERING_WIFI), - // Client 2 has some expired leases - TetheredClient( - client2Addr, - // Only the "t + 30" address is left, the "t + 10" address expired - listOf(client2Exp30AddrInfo), - TETHERING_WIFI)) - assertSameClients(expectedClients, assertNewClients(tracker, servers, null)) - } - - private fun assertNewClients( - tracker: ConnectedClientsTracker, - ipServers: Iterable<IpServer>, - wifiClients: List<WifiClient>? - ): List<TetheredClient> { - assertTrue(tracker.updateConnectedClients(ipServers, wifiClients)) - return tracker.lastTetheredClients - } - - private fun assertSameClients(expected: List<TetheredClient>, actual: List<TetheredClient>) { - val expectedSet = HashSet(expected) - assertEquals(expected.size, expectedSet.size) - assertEquals(expectedSet, HashSet(actual)) - } - - private fun makeWifiClient(macAddr: MacAddress): WifiClient { - // Use a mock WifiClient as the constructor is not part of the WiFi module exported API. - return mock(WifiClient::class.java).apply { doReturn(macAddr).`when`(this).macAddress } - } - - private class TestClock(var time: Long) : ConnectedClientsTracker.Clock() { - override fun elapsedRealtime(): Long { - return time - } - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java deleted file mode 100644 index 354e75356e9f..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/EntitlementManagerTest.java +++ /dev/null @@ -1,623 +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.networkstack.tethering; - -import static android.net.TetheringConstants.EXTRA_ADD_TETHER_TYPE; -import static android.net.TetheringConstants.EXTRA_PROVISION_CALLBACK; -import static android.net.TetheringConstants.EXTRA_RUN_PROVISION; -import static android.net.TetheringConstants.EXTRA_TETHER_PROVISIONING_RESPONSE; -import static android.net.TetheringConstants.EXTRA_TETHER_SILENT_PROVISIONING_ACTION; -import static android.net.TetheringConstants.EXTRA_TETHER_SUBID; -import static android.net.TetheringConstants.EXTRA_TETHER_UI_PROVISIONING_APP_NAME; -import static android.net.TetheringManager.TETHERING_BLUETOOTH; -import static android.net.TetheringManager.TETHERING_ETHERNET; -import static android.net.TetheringManager.TETHERING_INVALID; -import static android.net.TetheringManager.TETHERING_USB; -import static android.net.TetheringManager.TETHERING_WIFI; -import static android.net.TetheringManager.TETHERING_WIFI_P2P; -import static android.net.TetheringManager.TETHER_ERROR_ENTITLEMENT_UNKNOWN; -import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_PROVISIONING_FAILED; -import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY; -import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; - -import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; -import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.anyBoolean; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.content.Intent; -import android.content.res.Resources; -import android.net.util.SharedLog; -import android.os.Bundle; -import android.os.Handler; -import android.os.PersistableBundle; -import android.os.ResultReceiver; -import android.os.SystemProperties; -import android.os.test.TestLooper; -import android.provider.DeviceConfig; -import android.provider.Settings; -import android.telephony.CarrierConfigManager; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.internal.util.test.BroadcastInterceptingContext; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.InOrder; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.MockitoSession; -import org.mockito.quality.Strictness; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class EntitlementManagerTest { - - private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; - private static final String PROVISIONING_NO_UI_APP_NAME = "no_ui_app"; - private static final String PROVISIONING_APP_RESPONSE = "app_response"; - - @Mock private CarrierConfigManager mCarrierConfigManager; - @Mock private Context mContext; - @Mock private Resources mResources; - @Mock private SharedLog mLog; - @Mock private EntitlementManager.OnUiEntitlementFailedListener mEntitlementFailedListener; - - // Like so many Android system APIs, these cannot be mocked because it is marked final. - // We have to use the real versions. - private final PersistableBundle mCarrierConfig = new PersistableBundle(); - private final TestLooper mLooper = new TestLooper(); - private Context mMockContext; - private Runnable mPermissionChangeCallback; - - private WrappedEntitlementManager mEnMgr; - private TetheringConfiguration mConfig; - private MockitoSession mMockingSession; - - private class MockContext extends BroadcastInterceptingContext { - MockContext(Context base) { - super(base); - } - - @Override - public Resources getResources() { - return mResources; - } - } - - public class WrappedEntitlementManager extends EntitlementManager { - public int fakeEntitlementResult = TETHER_ERROR_ENTITLEMENT_UNKNOWN; - public int uiProvisionCount = 0; - public int silentProvisionCount = 0; - - public WrappedEntitlementManager(Context ctx, Handler h, SharedLog log, - Runnable callback) { - super(ctx, h, log, callback); - } - - public void reset() { - fakeEntitlementResult = TETHER_ERROR_ENTITLEMENT_UNKNOWN; - uiProvisionCount = 0; - silentProvisionCount = 0; - } - - @Override - protected Intent runUiTetherProvisioning(int type, - final TetheringConfiguration config, final ResultReceiver receiver) { - Intent intent = super.runUiTetherProvisioning(type, config, receiver); - assertUiTetherProvisioningIntent(type, config, receiver, intent); - uiProvisionCount++; - receiver.send(fakeEntitlementResult, null); - return intent; - } - - private void assertUiTetherProvisioningIntent(int type, final TetheringConfiguration config, - final ResultReceiver receiver, final Intent intent) { - assertEquals(Settings.ACTION_TETHER_PROVISIONING_UI, intent.getAction()); - assertEquals(type, intent.getIntExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_INVALID)); - final String[] appName = intent.getStringArrayExtra( - EXTRA_TETHER_UI_PROVISIONING_APP_NAME); - assertEquals(PROVISIONING_APP_NAME.length, appName.length); - for (int i = 0; i < PROVISIONING_APP_NAME.length; i++) { - assertEquals(PROVISIONING_APP_NAME[i], appName[i]); - } - assertEquals(receiver, intent.getParcelableExtra(EXTRA_PROVISION_CALLBACK)); - assertEquals(config.activeDataSubId, - intent.getIntExtra(EXTRA_TETHER_SUBID, INVALID_SUBSCRIPTION_ID)); - } - - @Override - protected Intent runSilentTetherProvisioning(int type, - final TetheringConfiguration config) { - Intent intent = super.runSilentTetherProvisioning(type, config); - assertSilentTetherProvisioning(type, config, intent); - silentProvisionCount++; - addDownstreamMapping(type, fakeEntitlementResult); - return intent; - } - - private void assertSilentTetherProvisioning(int type, final TetheringConfiguration config, - final Intent intent) { - assertEquals(type, intent.getIntExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_INVALID)); - assertEquals(true, intent.getBooleanExtra(EXTRA_RUN_PROVISION, false)); - assertEquals(PROVISIONING_NO_UI_APP_NAME, - intent.getStringExtra(EXTRA_TETHER_SILENT_PROVISIONING_ACTION)); - assertEquals(PROVISIONING_APP_RESPONSE, - intent.getStringExtra(EXTRA_TETHER_PROVISIONING_RESPONSE)); - assertTrue(intent.hasExtra(EXTRA_PROVISION_CALLBACK)); - assertEquals(config.activeDataSubId, - intent.getIntExtra(EXTRA_TETHER_SUBID, INVALID_SUBSCRIPTION_ID)); - } - } - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - mMockingSession = mockitoSession() - .initMocks(this) - .mockStatic(SystemProperties.class) - .mockStatic(DeviceConfig.class) - .strictness(Strictness.WARN) - .startMocking(); - // Don't disable tethering provisioning unless requested. - doReturn(false).when( - () -> SystemProperties.getBoolean( - eq(EntitlementManager.DISABLE_PROVISIONING_SYSPROP_KEY), anyBoolean())); - doReturn(null).when( - () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY), anyString())); - - when(mResources.getStringArray(R.array.config_tether_dhcp_range)) - .thenReturn(new String[0]); - when(mResources.getStringArray(R.array.config_tether_usb_regexs)) - .thenReturn(new String[0]); - when(mResources.getStringArray(R.array.config_tether_wifi_regexs)) - .thenReturn(new String[0]); - when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs)) - .thenReturn(new String[0]); - when(mResources.getIntArray(R.array.config_tether_upstream_types)) - .thenReturn(new int[0]); - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - false); - when(mResources.getString(R.string.config_wifi_tether_enable)).thenReturn(""); - when(mLog.forSubComponent(anyString())).thenReturn(mLog); - - mMockContext = new MockContext(mContext); - mPermissionChangeCallback = spy(() -> { }); - mEnMgr = new WrappedEntitlementManager(mMockContext, new Handler(mLooper.getLooper()), mLog, - mPermissionChangeCallback); - mEnMgr.setOnUiEntitlementFailedListener(mEntitlementFailedListener); - mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - mEnMgr.setTetheringConfigurationFetcher(() -> { - return mConfig; - }); - } - - @After - public void tearDown() throws Exception { - mMockingSession.finishMocking(); - } - - private void setupForRequiredProvisioning() { - // Produce some acceptable looking provision app setting if requested. - when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app)) - .thenReturn(PROVISIONING_APP_NAME); - when(mResources.getString(R.string.config_mobile_hotspot_provision_app_no_ui)) - .thenReturn(PROVISIONING_NO_UI_APP_NAME); - when(mResources.getString(R.string.config_mobile_hotspot_provision_response)).thenReturn( - PROVISIONING_APP_RESPONSE); - // Act like the CarrierConfigManager is present and ready unless told otherwise. - when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE)) - .thenReturn(mCarrierConfigManager); - when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mCarrierConfig); - mCarrierConfig.putBoolean(CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true); - mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true); - mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - } - - @Test - public void canRequireProvisioning() { - setupForRequiredProvisioning(); - assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig)); - } - - @Test - public void toleratesCarrierConfigManagerMissing() { - setupForRequiredProvisioning(); - when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE)) - .thenReturn(null); - mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - // Couldn't get the CarrierConfigManager, but still had a declared provisioning app. - // Therefore provisioning still be required. - assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig)); - } - - @Test - public void toleratesCarrierConfigMissing() { - setupForRequiredProvisioning(); - when(mCarrierConfigManager.getConfig()).thenReturn(null); - mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - // We still have a provisioning app configured, so still require provisioning. - assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig)); - } - - @Test - public void toleratesCarrierConfigNotLoaded() { - setupForRequiredProvisioning(); - mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, false); - // We still have a provisioning app configured, so still require provisioning. - assertTrue(mEnMgr.isTetherProvisioningRequired(mConfig)); - } - - @Test - public void provisioningNotRequiredWhenAppNotFound() { - setupForRequiredProvisioning(); - when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app)) - .thenReturn(null); - mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertFalse(mEnMgr.isTetherProvisioningRequired(mConfig)); - when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app)) - .thenReturn(new String[] {"malformedApp"}); - mConfig = new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertFalse(mEnMgr.isTetherProvisioningRequired(mConfig)); - } - - @Test - public void testRequestLastEntitlementCacheValue() throws Exception { - // 1. Entitlement check is not required. - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - ResultReceiver receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_NO_ERROR, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - - setupForRequiredProvisioning(); - // 2. No cache value and don't need to run entitlement check. - receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - // 3. No cache value and ui entitlement check is needed. - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_PROVISIONING_FAILED, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true); - mLooper.dispatchAll(); - assertEquals(1, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - // 4. Cache value is TETHER_ERROR_PROVISIONING_FAILED and don't need to run entitlement - // check. - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_PROVISIONING_FAILED, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - // 5. Cache value is TETHER_ERROR_PROVISIONING_FAILED and ui entitlement check is needed. - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_NO_ERROR, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true); - mLooper.dispatchAll(); - assertEquals(1, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - // 6. Cache value is TETHER_ERROR_NO_ERROR. - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_NO_ERROR, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - // 7. Test get value for other downstream type. - receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_USB, receiver, false); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - // 8. Test get value for invalid downstream type. - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - receiver = new ResultReceiver(null) { - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - assertEquals(TETHER_ERROR_ENTITLEMENT_UNKNOWN, resultCode); - } - }; - mEnMgr.requestLatestTetheringEntitlementResult(TETHERING_WIFI_P2P, receiver, true); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - mEnMgr.reset(); - } - - private void assertPermissionChangeCallback(InOrder inOrder) { - inOrder.verify(mPermissionChangeCallback, times(1)).run(); - } - - private void assertNoPermissionChange(InOrder inOrder) { - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void verifyPermissionResult() { - final InOrder inOrder = inOrder(mPermissionChangeCallback); - setupForRequiredProvisioning(); - mEnMgr.notifyUpstream(true); - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); - mLooper.dispatchAll(); - // Permitted: true -> false - assertPermissionChangeCallback(inOrder); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - - mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI); - mLooper.dispatchAll(); - // Permitted: false -> false - assertNoPermissionChange(inOrder); - - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); - mLooper.dispatchAll(); - // Permitted: false -> true - assertPermissionChangeCallback(inOrder); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - } - - @Test - public void verifyPermissionIfAllNotApproved() { - final InOrder inOrder = inOrder(mPermissionChangeCallback); - setupForRequiredProvisioning(); - mEnMgr.notifyUpstream(true); - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); - mLooper.dispatchAll(); - // Permitted: true -> false - assertPermissionChangeCallback(inOrder); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true); - mLooper.dispatchAll(); - // Permitted: false -> false - assertNoPermissionChange(inOrder); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.startProvisioningIfNeeded(TETHERING_BLUETOOTH, true); - mLooper.dispatchAll(); - // Permitted: false -> false - assertNoPermissionChange(inOrder); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - } - - @Test - public void verifyPermissionIfAnyApproved() { - final InOrder inOrder = inOrder(mPermissionChangeCallback); - setupForRequiredProvisioning(); - mEnMgr.notifyUpstream(true); - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); - mLooper.dispatchAll(); - // Permitted: true -> true - assertNoPermissionChange(inOrder); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true); - mLooper.dispatchAll(); - // Permitted: true -> true - assertNoPermissionChange(inOrder); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - - mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI); - mLooper.dispatchAll(); - // Permitted: true -> false - assertPermissionChangeCallback(inOrder); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - } - - @Test - public void verifyPermissionWhenProvisioningNotStarted() { - final InOrder inOrder = inOrder(mPermissionChangeCallback); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - assertNoPermissionChange(inOrder); - setupForRequiredProvisioning(); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - assertNoPermissionChange(inOrder); - } - - @Test - public void testRunTetherProvisioning() { - final InOrder inOrder = inOrder(mPermissionChangeCallback); - setupForRequiredProvisioning(); - // 1. start ui provisioning, upstream is mobile - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - mEnMgr.notifyUpstream(true); - mLooper.dispatchAll(); - mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true); - mLooper.dispatchAll(); - assertEquals(1, mEnMgr.uiProvisionCount); - assertEquals(0, mEnMgr.silentProvisionCount); - // Permitted: true -> true - assertNoPermissionChange(inOrder); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - mEnMgr.reset(); - - // 2. start no-ui provisioning - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, false); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - assertEquals(1, mEnMgr.silentProvisionCount); - // Permitted: true -> true - assertNoPermissionChange(inOrder); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - mEnMgr.reset(); - - // 3. tear down mobile, then start ui provisioning - mEnMgr.notifyUpstream(false); - mLooper.dispatchAll(); - mEnMgr.startProvisioningIfNeeded(TETHERING_BLUETOOTH, true); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - assertEquals(0, mEnMgr.silentProvisionCount); - assertNoPermissionChange(inOrder); - mEnMgr.reset(); - - // 4. switch upstream back to mobile - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - mEnMgr.notifyUpstream(true); - mLooper.dispatchAll(); - assertEquals(1, mEnMgr.uiProvisionCount); - assertEquals(0, mEnMgr.silentProvisionCount); - // Permitted: true -> true - assertNoPermissionChange(inOrder); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - mEnMgr.reset(); - - // 5. tear down mobile, then switch SIM - mEnMgr.notifyUpstream(false); - mLooper.dispatchAll(); - mEnMgr.reevaluateSimCardProvisioning(mConfig); - assertEquals(0, mEnMgr.uiProvisionCount); - assertEquals(0, mEnMgr.silentProvisionCount); - assertNoPermissionChange(inOrder); - mEnMgr.reset(); - - // 6. switch upstream back to mobile again - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.notifyUpstream(true); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - assertEquals(3, mEnMgr.silentProvisionCount); - // Permitted: true -> false - assertPermissionChangeCallback(inOrder); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - mEnMgr.reset(); - - // 7. start ui provisioning, upstream is mobile, downstream is ethernet - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - mEnMgr.startProvisioningIfNeeded(TETHERING_ETHERNET, true); - mLooper.dispatchAll(); - assertEquals(1, mEnMgr.uiProvisionCount); - assertEquals(0, mEnMgr.silentProvisionCount); - // Permitted: false -> true - assertPermissionChangeCallback(inOrder); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - mEnMgr.reset(); - - // 8. downstream is invalid - mEnMgr.fakeEntitlementResult = TETHER_ERROR_NO_ERROR; - mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI_P2P, true); - mLooper.dispatchAll(); - assertEquals(0, mEnMgr.uiProvisionCount); - assertEquals(0, mEnMgr.silentProvisionCount); - assertNoPermissionChange(inOrder); - mEnMgr.reset(); - } - - @Test - public void testCallStopTetheringWhenUiProvisioningFail() { - setupForRequiredProvisioning(); - verify(mEntitlementFailedListener, times(0)).onUiEntitlementFailed(TETHERING_WIFI); - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.notifyUpstream(true); - mLooper.dispatchAll(); - mEnMgr.startProvisioningIfNeeded(TETHERING_WIFI, true); - mLooper.dispatchAll(); - assertEquals(1, mEnMgr.uiProvisionCount); - verify(mEntitlementFailedListener, times(1)).onUiEntitlementFailed(TETHERING_WIFI); - } - - @Test - public void testsetExemptedDownstreamType() throws Exception { - setupForRequiredProvisioning(); - // Cellular upstream is not permitted when no entitlement result. - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - - // If there is exempted downstream and no other non-exempted downstreams, cellular is - // permitted. - mEnMgr.setExemptedDownstreamType(TETHERING_WIFI); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - - // If second downstream run entitlement check fail, cellular upstream is not permitted. - mEnMgr.fakeEntitlementResult = TETHER_ERROR_PROVISIONING_FAILED; - mEnMgr.notifyUpstream(true); - mLooper.dispatchAll(); - mEnMgr.startProvisioningIfNeeded(TETHERING_USB, true); - mLooper.dispatchAll(); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - - // When second downstream is down, exempted downstream can use cellular upstream. - assertEquals(1, mEnMgr.uiProvisionCount); - verify(mEntitlementFailedListener).onUiEntitlementFailed(TETHERING_USB); - mEnMgr.stopProvisioningIfNeeded(TETHERING_USB); - assertTrue(mEnMgr.isCellularUpstreamPermitted()); - - mEnMgr.stopProvisioningIfNeeded(TETHERING_WIFI); - assertFalse(mEnMgr.isCellularUpstreamPermitted()); - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/IPv6TetheringCoordinatorTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/IPv6TetheringCoordinatorTest.java deleted file mode 100644 index f2b5314e5a17..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/IPv6TetheringCoordinatorTest.java +++ /dev/null @@ -1,156 +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 com.android.networkstack.tethering; - -import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; -import static android.net.RouteInfo.RTN_UNICAST; -import static android.net.ip.IpServer.STATE_LOCAL_ONLY; -import static android.net.ip.IpServer.STATE_TETHERED; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -import android.net.InetAddresses; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.Network; -import android.net.NetworkCapabilities; -import android.net.RouteInfo; -import android.net.ip.IpServer; -import android.net.util.SharedLog; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -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 java.net.InetAddress; -import java.util.ArrayList; -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class IPv6TetheringCoordinatorTest { - private static final String TEST_DNS_SERVER = "2001:4860:4860::8888"; - private static final String TEST_INTERFACE = "test_rmnet0"; - private static final String TEST_IPV6_ADDRESS = "2001:db8::1/64"; - private static final String TEST_IPV4_ADDRESS = "192.168.100.1/24"; - - private IPv6TetheringCoordinator mIPv6TetheringCoordinator; - private ArrayList<IpServer> mNotifyList; - - @Mock private SharedLog mSharedLog; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog); - mNotifyList = new ArrayList<IpServer>(); - mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mSharedLog); - } - - private UpstreamNetworkState createDualStackUpstream(final int transportType) { - final Network network = mock(Network.class); - final NetworkCapabilities netCap = - new NetworkCapabilities.Builder().addTransportType(transportType).build(); - final InetAddress dns = InetAddresses.parseNumericAddress(TEST_DNS_SERVER); - final LinkProperties linkProp = new LinkProperties(); - linkProp.setInterfaceName(TEST_INTERFACE); - linkProp.addLinkAddress(new LinkAddress(TEST_IPV6_ADDRESS)); - linkProp.addLinkAddress(new LinkAddress(TEST_IPV4_ADDRESS)); - linkProp.addRoute(new RouteInfo(new IpPrefix("::/0"), null, TEST_INTERFACE, RTN_UNICAST)); - linkProp.addRoute(new RouteInfo(new IpPrefix("0.0.0.0/0"), null, TEST_INTERFACE, - RTN_UNICAST)); - linkProp.addDnsServer(dns); - return new UpstreamNetworkState(linkProp, netCap, network); - } - - private void assertOnlyOneV6AddressAndNoV4(LinkProperties lp) { - assertEquals(lp.getInterfaceName(), TEST_INTERFACE); - assertFalse(lp.hasIpv4Address()); - final List<LinkAddress> addresses = lp.getLinkAddresses(); - assertEquals(addresses.size(), 1); - final LinkAddress v6Address = addresses.get(0); - assertEquals(v6Address, new LinkAddress(TEST_IPV6_ADDRESS)); - } - - @Test - public void testUpdateIpv6Upstream() throws Exception { - // 1. Add first IpServer. - final IpServer firstServer = mock(IpServer.class); - mNotifyList.add(firstServer); - mIPv6TetheringCoordinator.addActiveDownstream(firstServer, STATE_TETHERED); - verify(firstServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null); - verifyNoMoreInteractions(firstServer); - - // 2. Add second IpServer and it would not have ipv6 tethering. - final IpServer secondServer = mock(IpServer.class); - mNotifyList.add(secondServer); - mIPv6TetheringCoordinator.addActiveDownstream(secondServer, STATE_LOCAL_ONLY); - verifyNoMoreInteractions(secondServer); - reset(firstServer, secondServer); - - // 3. No upstream. - mIPv6TetheringCoordinator.updateUpstreamNetworkState(null); - verify(secondServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null); - reset(firstServer, secondServer); - - // 4. Update ipv6 mobile upstream. - final UpstreamNetworkState mobileUpstream = createDualStackUpstream(TRANSPORT_CELLULAR); - final ArgumentCaptor<LinkProperties> lp = ArgumentCaptor.forClass(LinkProperties.class); - mIPv6TetheringCoordinator.updateUpstreamNetworkState(mobileUpstream); - verify(firstServer).sendMessage(eq(IpServer.CMD_IPV6_TETHER_UPDATE), eq(-1), eq(0), - lp.capture()); - final LinkProperties v6OnlyLink = lp.getValue(); - assertOnlyOneV6AddressAndNoV4(v6OnlyLink); - verifyNoMoreInteractions(firstServer); - verifyNoMoreInteractions(secondServer); - reset(firstServer, secondServer); - - // 5. Remove first IpServer. - mNotifyList.remove(firstServer); - mIPv6TetheringCoordinator.removeActiveDownstream(firstServer); - verify(firstServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null); - verify(secondServer).sendMessage(eq(IpServer.CMD_IPV6_TETHER_UPDATE), eq(-1), eq(0), - lp.capture()); - final LinkProperties localOnlyLink = lp.getValue(); - assertNotNull(localOnlyLink); - assertNotEquals(localOnlyLink, v6OnlyLink); - reset(firstServer, secondServer); - - // 6. Remove second IpServer. - mNotifyList.remove(secondServer); - mIPv6TetheringCoordinator.removeActiveDownstream(secondServer); - verifyNoMoreInteractions(firstServer); - verify(secondServer).sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, null); - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java deleted file mode 100644 index f4d248914aed..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/MockTetheringService.java +++ /dev/null @@ -1,70 +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 com.android.networkstack.tethering; - -import static android.Manifest.permission.WRITE_SETTINGS; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; - -import static org.mockito.Mockito.mock; - -import android.content.Context; -import android.content.Intent; -import android.net.ITetheringConnector; -import android.os.Binder; -import android.os.IBinder; - -import androidx.annotation.NonNull; - -public class MockTetheringService extends TetheringService { - private final Tethering mTethering = mock(Tethering.class); - - @Override - public IBinder onBind(Intent intent) { - return new MockTetheringConnector(super.onBind(intent)); - } - - @Override - public Tethering makeTethering(TetheringDependencies deps) { - return mTethering; - } - - @Override - boolean checkAndNoteWriteSettingsOperation(@NonNull Context context, int uid, - @NonNull String callingPackage, boolean throwException) { - // Test this does not verify the calling package / UID, as calling package could be shell - // and not match the UID. - return context.checkCallingOrSelfPermission(WRITE_SETTINGS) == PERMISSION_GRANTED; - } - - public Tethering getTethering() { - return mTethering; - } - - public class MockTetheringConnector extends Binder { - final IBinder mBase; - MockTetheringConnector(IBinder base) { - mBase = base; - } - - public ITetheringConnector getTetheringConnector() { - return ITetheringConnector.Stub.asInterface(mBase); - } - - public MockTetheringService getService() { - return MockTetheringService.this; - } - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java deleted file mode 100644 index b291438937c7..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadControllerTest.java +++ /dev/null @@ -1,827 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import static android.net.NetworkStats.DEFAULT_NETWORK_NO; -import static android.net.NetworkStats.METERED_NO; -import static android.net.NetworkStats.ROAMING_NO; -import static android.net.NetworkStats.SET_DEFAULT; -import static android.net.NetworkStats.TAG_NONE; -import static android.net.NetworkStats.UID_ALL; -import static android.net.NetworkStats.UID_TETHERING; -import static android.net.RouteInfo.RTN_UNICAST; -import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED; - -import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_IFACE; -import static com.android.networkstack.tethering.OffloadController.StatsType.STATS_PER_UID; -import static com.android.networkstack.tethering.OffloadHardwareInterface.ForwardedStats; -import static com.android.networkstack.tethering.TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS; -import static com.android.testutils.MiscAssertsKt.assertContainsAll; -import static com.android.testutils.MiscAssertsKt.assertThrows; -import static com.android.testutils.NetworkStatsUtilsKt.assertNetworkStatsEquals; - -import static junit.framework.Assert.assertNotNull; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyLong; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.clearInvocations; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -import android.annotation.NonNull; -import android.app.usage.NetworkStatsManager; -import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.net.ITetheringStatsProvider; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.NetworkStats; -import android.net.NetworkStats.Entry; -import android.net.RouteInfo; -import android.net.netstats.provider.NetworkStatsProvider; -import android.net.util.SharedLog; -import android.os.Handler; -import android.os.test.TestLooper; -import android.provider.Settings; -import android.provider.Settings.SettingNotFoundException; -import android.test.mock.MockContentResolver; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.internal.util.test.FakeSettingsProvider; -import com.android.testutils.TestableNetworkStatsProviderCbBinder; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.InOrder; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class OffloadControllerTest { - private static final String RNDIS0 = "test_rndis0"; - private static final String RMNET0 = "test_rmnet_data0"; - private static final String WLAN0 = "test_wlan0"; - - private static final String IPV6_LINKLOCAL = "fe80::/64"; - private static final String IPV6_DOC_PREFIX = "2001:db8::/64"; - private static final String IPV6_DISCARD_PREFIX = "100::/64"; - private static final String USB_PREFIX = "192.168.42.0/24"; - private static final String WIFI_PREFIX = "192.168.43.0/24"; - private static final long WAIT_FOR_IDLE_TIMEOUT = 2 * 1000; - - @Mock private OffloadHardwareInterface mHardware; - @Mock private ApplicationInfo mApplicationInfo; - @Mock private Context mContext; - @Mock private NetworkStatsManager mStatsManager; - @Mock private TetheringConfiguration mTetherConfig; - // Late init since methods must be called by the thread that created this object. - private TestableNetworkStatsProviderCbBinder mTetherStatsProviderCb; - private OffloadController.OffloadTetheringStatsProvider mTetherStatsProvider; - private final ArgumentCaptor<ArrayList> mStringArrayCaptor = - ArgumentCaptor.forClass(ArrayList.class); - private final ArgumentCaptor<OffloadHardwareInterface.ControlCallback> mControlCallbackCaptor = - ArgumentCaptor.forClass(OffloadHardwareInterface.ControlCallback.class); - private MockContentResolver mContentResolver; - private final TestLooper mTestLooper = new TestLooper(); - private OffloadController.Dependencies mDeps = new OffloadController.Dependencies() { - @Override - public TetheringConfiguration getTetherConfig() { - return mTetherConfig; - } - }; - - @Before public void setUp() { - MockitoAnnotations.initMocks(this); - when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo); - when(mContext.getPackageName()).thenReturn("OffloadControllerTest"); - mContentResolver = new MockContentResolver(mContext); - mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); - when(mContext.getContentResolver()).thenReturn(mContentResolver); - FakeSettingsProvider.clearSettingsProvider(); - when(mTetherConfig.getOffloadPollInterval()).thenReturn(-1); // Disabled. - } - - @After public void tearDown() throws Exception { - FakeSettingsProvider.clearSettingsProvider(); - } - - private void setupFunctioningHardwareInterface() { - when(mHardware.initOffloadConfig()).thenReturn(true); - when(mHardware.initOffloadControl(mControlCallbackCaptor.capture())) - .thenReturn(true); - when(mHardware.setUpstreamParameters(anyString(), any(), any(), any())).thenReturn(true); - when(mHardware.getForwardedStats(any())).thenReturn(new ForwardedStats()); - when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true); - } - - private void enableOffload() { - Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0); - } - - private void setOffloadPollInterval(int interval) { - when(mTetherConfig.getOffloadPollInterval()).thenReturn(interval); - } - - private void waitForIdle() { - mTestLooper.dispatchAll(); - } - - private OffloadController makeOffloadController() throws Exception { - OffloadController offload = new OffloadController(new Handler(mTestLooper.getLooper()), - mHardware, mContentResolver, mStatsManager, new SharedLog("test"), mDeps); - final ArgumentCaptor<OffloadController.OffloadTetheringStatsProvider> - tetherStatsProviderCaptor = - ArgumentCaptor.forClass(OffloadController.OffloadTetheringStatsProvider.class); - verify(mStatsManager).registerNetworkStatsProvider(anyString(), - tetherStatsProviderCaptor.capture()); - mTetherStatsProvider = tetherStatsProviderCaptor.getValue(); - assertNotNull(mTetherStatsProvider); - mTetherStatsProviderCb = new TestableNetworkStatsProviderCbBinder(); - mTetherStatsProvider.setProviderCallbackBinder(mTetherStatsProviderCb); - return offload; - } - - @Test - public void testNoSettingsValueDefaultDisabledDoesNotStart() throws Exception { - setupFunctioningHardwareInterface(); - when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(1); - assertThrows(SettingNotFoundException.class, () -> - Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED)); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final InOrder inOrder = inOrder(mHardware); - inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled(); - inOrder.verify(mHardware, never()).initOffloadConfig(); - inOrder.verify(mHardware, never()).initOffloadControl( - any(OffloadHardwareInterface.ControlCallback.class)); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void testNoSettingsValueDefaultEnabledDoesStart() throws Exception { - setupFunctioningHardwareInterface(); - when(mHardware.getDefaultTetherOffloadDisabled()).thenReturn(0); - assertThrows(SettingNotFoundException.class, () -> - Settings.Global.getInt(mContentResolver, TETHER_OFFLOAD_DISABLED)); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final InOrder inOrder = inOrder(mHardware); - inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled(); - inOrder.verify(mHardware, times(1)).initOffloadConfig(); - inOrder.verify(mHardware, times(1)).initOffloadControl( - any(OffloadHardwareInterface.ControlCallback.class)); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void testSettingsAllowsStart() throws Exception { - setupFunctioningHardwareInterface(); - Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 0); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final InOrder inOrder = inOrder(mHardware); - inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled(); - inOrder.verify(mHardware, times(1)).initOffloadConfig(); - inOrder.verify(mHardware, times(1)).initOffloadControl( - any(OffloadHardwareInterface.ControlCallback.class)); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void testSettingsDisablesStart() throws Exception { - setupFunctioningHardwareInterface(); - Settings.Global.putInt(mContentResolver, TETHER_OFFLOAD_DISABLED, 1); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final InOrder inOrder = inOrder(mHardware); - inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled(); - inOrder.verify(mHardware, never()).initOffloadConfig(); - inOrder.verify(mHardware, never()).initOffloadControl(anyObject()); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void testSetUpstreamLinkPropertiesWorking() throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final InOrder inOrder = inOrder(mHardware); - inOrder.verify(mHardware, times(1)).getDefaultTetherOffloadDisabled(); - inOrder.verify(mHardware, times(1)).initOffloadConfig(); - inOrder.verify(mHardware, times(1)).initOffloadControl( - any(OffloadHardwareInterface.ControlCallback.class)); - inOrder.verifyNoMoreInteractions(); - - // In reality, the UpstreamNetworkMonitor would have passed down to us - // a covering set of local prefixes representing a minimum essential - // set plus all the prefixes on networks with network agents. - // - // We simulate that there, and then add upstream elements one by one - // and watch what happens. - final Set<IpPrefix> minimumLocalPrefixes = new HashSet<>(); - for (String s : new String[]{ - "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"}) { - minimumLocalPrefixes.add(new IpPrefix(s)); - } - offload.setLocalPrefixes(minimumLocalPrefixes); - inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture()); - ArrayList<String> localPrefixes = mStringArrayCaptor.getValue(); - assertEquals(4, localPrefixes.size()); - assertContainsAll(localPrefixes, - "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"); - inOrder.verifyNoMoreInteractions(); - - offload.setUpstreamLinkProperties(null); - // No change in local addresses means no call to setLocalPrefixes(). - inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); - // This LinkProperties value does not differ from the default upstream. - // There should be no extraneous call to setUpstreamParameters(). - inOrder.verify(mHardware, never()).setUpstreamParameters( - anyObject(), anyObject(), anyObject(), anyObject()); - inOrder.verifyNoMoreInteractions(); - - final LinkProperties lp = new LinkProperties(); - - final String testIfName = "rmnet_data17"; - lp.setInterfaceName(testIfName); - offload.setUpstreamLinkProperties(lp); - // No change in local addresses means no call to setLocalPrefixes(). - inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(testIfName), eq(null), eq(null), eq(null)); - inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); - inOrder.verifyNoMoreInteractions(); - - final String ipv4Addr = "192.0.2.5"; - final String linkAddr = ipv4Addr + "/24"; - lp.addLinkAddress(new LinkAddress(linkAddr)); - lp.addRoute(new RouteInfo(new IpPrefix("192.0.2.0/24"), null, null, RTN_UNICAST)); - offload.setUpstreamLinkProperties(lp); - // IPv4 prefixes and addresses on the upstream are simply left as whole - // prefixes (already passed in from UpstreamNetworkMonitor code). If a - // tethering client sends traffic to the IPv4 default router or other - // clients on the upstream this will not be hardware-forwarded, and that - // should be fine for now. Ergo: no change in local addresses, no call - // to setLocalPrefixes(). - inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(testIfName), eq(ipv4Addr), eq(null), eq(null)); - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); - inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); - inOrder.verifyNoMoreInteractions(); - - final String ipv4Gateway = "192.0.2.1"; - lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv4Gateway), null, RTN_UNICAST)); - offload.setUpstreamLinkProperties(lp); - // No change in local addresses means no call to setLocalPrefixes(). - inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), eq(null)); - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); - inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); - inOrder.verifyNoMoreInteractions(); - - final String ipv6Gw1 = "fe80::cafe"; - lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv6Gw1), null, RTN_UNICAST)); - offload.setUpstreamLinkProperties(lp); - // No change in local addresses means no call to setLocalPrefixes(). - inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); - ArrayList<String> v6gws = mStringArrayCaptor.getValue(); - assertEquals(1, v6gws.size()); - assertTrue(v6gws.contains(ipv6Gw1)); - inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); - inOrder.verifyNoMoreInteractions(); - - final String ipv6Gw2 = "fe80::d00d"; - lp.addRoute(new RouteInfo(null, InetAddress.getByName(ipv6Gw2), null, RTN_UNICAST)); - offload.setUpstreamLinkProperties(lp); - // No change in local addresses means no call to setLocalPrefixes(). - inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); - v6gws = mStringArrayCaptor.getValue(); - assertEquals(2, v6gws.size()); - assertTrue(v6gws.contains(ipv6Gw1)); - assertTrue(v6gws.contains(ipv6Gw2)); - inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); - inOrder.verifyNoMoreInteractions(); - - final LinkProperties stacked = new LinkProperties(); - stacked.setInterfaceName("stacked"); - stacked.addLinkAddress(new LinkAddress("192.0.2.129/25")); - stacked.addRoute(new RouteInfo(null, InetAddress.getByName("192.0.2.254"), null, - RTN_UNICAST)); - stacked.addRoute(new RouteInfo(null, InetAddress.getByName("fe80::bad:f00"), null, - RTN_UNICAST)); - assertTrue(lp.addStackedLink(stacked)); - offload.setUpstreamLinkProperties(lp); - // No change in local addresses means no call to setLocalPrefixes(). - inOrder.verify(mHardware, never()).setLocalPrefixes(mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture()); - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); - v6gws = mStringArrayCaptor.getValue(); - assertEquals(2, v6gws.size()); - assertTrue(v6gws.contains(ipv6Gw1)); - assertTrue(v6gws.contains(ipv6Gw2)); - inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); - inOrder.verifyNoMoreInteractions(); - - // Add in some IPv6 upstream info. When there is a tethered downstream - // making use of the IPv6 prefix we would expect to see the /64 route - // removed from "local prefixes" and /128s added for the upstream IPv6 - // addresses. This is not yet implemented, and for now we simply - // expect to see these /128s. - lp.addRoute(new RouteInfo(new IpPrefix("2001:db8::/64"), null, null, RTN_UNICAST)); - // "2001:db8::/64" plus "assigned" ASCII in hex - lp.addLinkAddress(new LinkAddress("2001:db8::6173:7369:676e:6564/64")); - // "2001:db8::/64" plus "random" ASCII in hex - lp.addLinkAddress(new LinkAddress("2001:db8::7261:6e64:6f6d/64")); - offload.setUpstreamLinkProperties(lp); - inOrder.verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture()); - localPrefixes = mStringArrayCaptor.getValue(); - assertEquals(6, localPrefixes.size()); - assertContainsAll(localPrefixes, - "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64", - "2001:db8::6173:7369:676e:6564/128", "2001:db8::7261:6e64:6f6d/128"); - // The relevant parts of the LinkProperties have not changed, but at the - // moment we do not de-dup upstream LinkProperties this carefully. - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(testIfName), eq(ipv4Addr), eq(ipv4Gateway), mStringArrayCaptor.capture()); - v6gws = mStringArrayCaptor.getValue(); - assertEquals(2, v6gws.size()); - assertTrue(v6gws.contains(ipv6Gw1)); - assertTrue(v6gws.contains(ipv6Gw2)); - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(testIfName)); - inOrder.verify(mHardware, times(1)).setDataLimit(eq(testIfName), eq(Long.MAX_VALUE)); - inOrder.verifyNoMoreInteractions(); - - // Completely identical LinkProperties updates are de-duped. - offload.setUpstreamLinkProperties(lp); - // This LinkProperties value does not differ from the default upstream. - // There should be no extraneous call to setUpstreamParameters(). - inOrder.verify(mHardware, never()).setUpstreamParameters( - anyObject(), anyObject(), anyObject(), anyObject()); - inOrder.verifyNoMoreInteractions(); - } - - private static @NonNull Entry buildTestEntry(@NonNull OffloadController.StatsType how, - @NonNull String iface, long rxBytes, long txBytes) { - return new Entry(iface, how == STATS_PER_IFACE ? UID_ALL : UID_TETHERING, SET_DEFAULT, - TAG_NONE, METERED_NO, ROAMING_NO, DEFAULT_NETWORK_NO, rxBytes, 0L, - txBytes, 0L, 0L); - } - - @Test - public void testGetForwardedStats() throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final String ethernetIface = "eth1"; - final String mobileIface = "rmnet_data0"; - - when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn( - new ForwardedStats(12345, 54321)); - when(mHardware.getForwardedStats(eq(mobileIface))).thenReturn( - new ForwardedStats(999, 99999)); - - InOrder inOrder = inOrder(mHardware); - - final LinkProperties lp = new LinkProperties(); - lp.setInterfaceName(ethernetIface); - offload.setUpstreamLinkProperties(lp); - // Previous upstream was null, so no stats are fetched. - inOrder.verify(mHardware, never()).getForwardedStats(any()); - - lp.setInterfaceName(mobileIface); - offload.setUpstreamLinkProperties(lp); - // Expect that we fetch stats from the previous upstream. - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface)); - - lp.setInterfaceName(ethernetIface); - offload.setUpstreamLinkProperties(lp); - // Expect that we fetch stats from the previous upstream. - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(mobileIface)); - - // Verify that the fetched stats are stored. - final NetworkStats ifaceStats = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE); - final NetworkStats uidStats = mTetherStatsProvider.getTetherStats(STATS_PER_UID); - final NetworkStats expectedIfaceStats = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999)) - .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 12345, 54321)); - - final NetworkStats expectedUidStats = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 999, 99999)) - .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 12345, 54321)); - - assertNetworkStatsEquals(expectedIfaceStats, ifaceStats); - assertNetworkStatsEquals(expectedUidStats, uidStats); - - // Force pushing stats update to verify the stats reported. - mTetherStatsProvider.pushTetherStats(); - mTetherStatsProviderCb.expectNotifyStatsUpdated(expectedIfaceStats, expectedUidStats); - - when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn( - new ForwardedStats(100000, 100000)); - offload.setUpstreamLinkProperties(null); - // Expect that we first clear the HAL's upstream parameters. - inOrder.verify(mHardware, times(1)).setUpstreamParameters( - eq(""), eq("0.0.0.0"), eq("0.0.0.0"), eq(null)); - // Expect that we fetch stats from the previous upstream. - inOrder.verify(mHardware, times(1)).getForwardedStats(eq(ethernetIface)); - - // There is no current upstream, so no stats are fetched. - inOrder.verify(mHardware, never()).getForwardedStats(any()); - inOrder.verifyNoMoreInteractions(); - - // Verify that the stored stats is accumulated. - final NetworkStats ifaceStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_IFACE); - final NetworkStats uidStatsAccu = mTetherStatsProvider.getTetherStats(STATS_PER_UID); - final NetworkStats expectedIfaceStatsAccu = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 999, 99999)) - .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 112345, 154321)); - - final NetworkStats expectedUidStatsAccu = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 999, 99999)) - .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 112345, 154321)); - - assertNetworkStatsEquals(expectedIfaceStatsAccu, ifaceStatsAccu); - assertNetworkStatsEquals(expectedUidStatsAccu, uidStatsAccu); - - // Verify that only diff of stats is reported. - mTetherStatsProvider.pushTetherStats(); - final NetworkStats expectedIfaceStatsDiff = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_IFACE, mobileIface, 0, 0)) - .addEntry(buildTestEntry(STATS_PER_IFACE, ethernetIface, 100000, 100000)); - - final NetworkStats expectedUidStatsDiff = new NetworkStats(0L, 2) - .addEntry(buildTestEntry(STATS_PER_UID, mobileIface, 0, 0)) - .addEntry(buildTestEntry(STATS_PER_UID, ethernetIface, 100000, 100000)); - mTetherStatsProviderCb.expectNotifyStatsUpdated(expectedIfaceStatsDiff, - expectedUidStatsDiff); - } - - @Test - public void testSetInterfaceQuota() throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final String ethernetIface = "eth1"; - final String mobileIface = "rmnet_data0"; - final long ethernetLimit = 12345; - final long mobileLimit = 12345678; - - final LinkProperties lp = new LinkProperties(); - lp.setInterfaceName(ethernetIface); - offload.setUpstreamLinkProperties(lp); - - final InOrder inOrder = inOrder(mHardware); - when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true); - when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(true); - - // Applying an interface quota to the current upstream immediately sends it to the hardware. - mTetherStatsProvider.onSetLimit(ethernetIface, ethernetLimit); - waitForIdle(); - inOrder.verify(mHardware).setDataLimit(ethernetIface, ethernetLimit); - inOrder.verifyNoMoreInteractions(); - - // Applying an interface quota to another upstream does not take any immediate action. - mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit); - waitForIdle(); - inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong()); - - // Switching to that upstream causes the quota to be applied if the parameters were applied - // correctly. - lp.setInterfaceName(mobileIface); - offload.setUpstreamLinkProperties(lp); - waitForIdle(); - inOrder.verify(mHardware).setDataLimit(mobileIface, mobileLimit); - - // Setting a limit of ITetheringStatsProvider.QUOTA_UNLIMITED causes the limit to be set - // to Long.MAX_VALUE. - mTetherStatsProvider.onSetLimit(mobileIface, ITetheringStatsProvider.QUOTA_UNLIMITED); - waitForIdle(); - inOrder.verify(mHardware).setDataLimit(mobileIface, Long.MAX_VALUE); - - // If setting upstream parameters fails, then the data limit is not set. - when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(false); - lp.setInterfaceName(ethernetIface); - offload.setUpstreamLinkProperties(lp); - mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit); - waitForIdle(); - inOrder.verify(mHardware, never()).setDataLimit(anyString(), anyLong()); - - // If setting the data limit fails while changing upstreams, offload is stopped. - when(mHardware.setUpstreamParameters(any(), any(), any(), any())).thenReturn(true); - when(mHardware.setDataLimit(anyString(), anyLong())).thenReturn(false); - lp.setInterfaceName(mobileIface); - offload.setUpstreamLinkProperties(lp); - mTetherStatsProvider.onSetLimit(mobileIface, mobileLimit); - waitForIdle(); - inOrder.verify(mHardware).getForwardedStats(ethernetIface); - inOrder.verify(mHardware).stopOffloadControl(); - } - - @Test - public void testDataLimitCallback() throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue(); - callback.onStoppedLimitReached(); - mTetherStatsProviderCb.expectNotifyStatsUpdated(); - } - - @Test - public void testAddRemoveDownstreams() throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - final InOrder inOrder = inOrder(mHardware); - inOrder.verify(mHardware, times(1)).initOffloadConfig(); - inOrder.verify(mHardware, times(1)).initOffloadControl( - any(OffloadHardwareInterface.ControlCallback.class)); - inOrder.verifyNoMoreInteractions(); - - // Tethering makes several calls to setLocalPrefixes() before add/remove - // downstream calls are made. This is not tested here; only the behavior - // of notifyDownstreamLinkProperties() and removeDownstreamInterface() - // are tested. - - // [1] USB tethering is started. - final LinkProperties usbLinkProperties = new LinkProperties(); - usbLinkProperties.setInterfaceName(RNDIS0); - usbLinkProperties.addLinkAddress(new LinkAddress("192.168.42.1/24")); - usbLinkProperties.addRoute( - new RouteInfo(new IpPrefix(USB_PREFIX), null, null, RTN_UNICAST)); - offload.notifyDownstreamLinkProperties(usbLinkProperties); - inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, USB_PREFIX); - inOrder.verifyNoMoreInteractions(); - - // [2] Routes for IPv6 link-local prefixes should never be added. - usbLinkProperties.addRoute( - new RouteInfo(new IpPrefix(IPV6_LINKLOCAL), null, null, RTN_UNICAST)); - offload.notifyDownstreamLinkProperties(usbLinkProperties); - inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString()); - inOrder.verifyNoMoreInteractions(); - - // [3] Add an IPv6 prefix for good measure. Only new offload-able - // prefixes should be passed to the HAL. - usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64")); - usbLinkProperties.addRoute( - new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, null, RTN_UNICAST)); - offload.notifyDownstreamLinkProperties(usbLinkProperties); - inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX); - inOrder.verifyNoMoreInteractions(); - - // [4] Adding addresses doesn't affect notifyDownstreamLinkProperties(). - // The address is passed in by a separate setLocalPrefixes() invocation. - usbLinkProperties.addLinkAddress(new LinkAddress("2001:db8::2/64")); - offload.notifyDownstreamLinkProperties(usbLinkProperties); - inOrder.verify(mHardware, never()).addDownstreamPrefix(eq(RNDIS0), anyString()); - - // [5] Differences in local routes are converted into addDownstream() - // and removeDownstream() invocations accordingly. - usbLinkProperties.removeRoute( - new RouteInfo(new IpPrefix(IPV6_DOC_PREFIX), null, RNDIS0, RTN_UNICAST)); - usbLinkProperties.addRoute( - new RouteInfo(new IpPrefix(IPV6_DISCARD_PREFIX), null, null, RTN_UNICAST)); - offload.notifyDownstreamLinkProperties(usbLinkProperties); - inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DOC_PREFIX); - inOrder.verify(mHardware, times(1)).addDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX); - inOrder.verifyNoMoreInteractions(); - - // [6] Removing a downstream interface which was never added causes no - // interactions with the HAL. - offload.removeDownstreamInterface(WLAN0); - inOrder.verifyNoMoreInteractions(); - - // [7] Removing an active downstream removes all remaining prefixes. - offload.removeDownstreamInterface(RNDIS0); - inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, USB_PREFIX); - inOrder.verify(mHardware, times(1)).removeDownstreamPrefix(RNDIS0, IPV6_DISCARD_PREFIX); - inOrder.verifyNoMoreInteractions(); - } - - @Test - public void testControlCallbackOnStoppedUnsupportedFetchesAllStats() throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - // Pretend to set a few different upstreams (only the interface name - // matters for this test; we're ignoring IP and route information). - final LinkProperties upstreamLp = new LinkProperties(); - for (String ifname : new String[]{RMNET0, WLAN0, RMNET0}) { - upstreamLp.setInterfaceName(ifname); - offload.setUpstreamLinkProperties(upstreamLp); - } - - // Clear invocation history, especially the getForwardedStats() calls - // that happen with setUpstreamParameters(). - clearInvocations(mHardware); - - OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue(); - callback.onStoppedUnsupported(); - - // Verify forwarded stats behaviour. - verify(mHardware, times(1)).getForwardedStats(eq(RMNET0)); - verify(mHardware, times(1)).getForwardedStats(eq(WLAN0)); - // TODO: verify the exact stats reported. - mTetherStatsProviderCb.expectNotifyStatsUpdated(); - mTetherStatsProviderCb.assertNoCallback(); - verifyNoMoreInteractions(mHardware); - } - - @Test - public void testControlCallbackOnSupportAvailableFetchesAllStatsAndPushesAllParameters() - throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - - final OffloadController offload = makeOffloadController(); - offload.start(); - - // Pretend to set a few different upstreams (only the interface name - // matters for this test; we're ignoring IP and route information). - final LinkProperties upstreamLp = new LinkProperties(); - for (String ifname : new String[]{RMNET0, WLAN0, RMNET0}) { - upstreamLp.setInterfaceName(ifname); - offload.setUpstreamLinkProperties(upstreamLp); - } - - // Pretend that some local prefixes and downstreams have been added - // (and removed, for good measure). - final Set<IpPrefix> minimumLocalPrefixes = new HashSet<>(); - for (String s : new String[]{ - "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"}) { - minimumLocalPrefixes.add(new IpPrefix(s)); - } - offload.setLocalPrefixes(minimumLocalPrefixes); - - final LinkProperties usbLinkProperties = new LinkProperties(); - usbLinkProperties.setInterfaceName(RNDIS0); - usbLinkProperties.addLinkAddress(new LinkAddress("192.168.42.1/24")); - usbLinkProperties.addRoute( - new RouteInfo(new IpPrefix(USB_PREFIX), null, null, RTN_UNICAST)); - offload.notifyDownstreamLinkProperties(usbLinkProperties); - - final LinkProperties wifiLinkProperties = new LinkProperties(); - wifiLinkProperties.setInterfaceName(WLAN0); - wifiLinkProperties.addLinkAddress(new LinkAddress("192.168.43.1/24")); - wifiLinkProperties.addRoute( - new RouteInfo(new IpPrefix(WIFI_PREFIX), null, null, RTN_UNICAST)); - wifiLinkProperties.addRoute( - new RouteInfo(new IpPrefix(IPV6_LINKLOCAL), null, null, RTN_UNICAST)); - // Use a benchmark prefix (RFC 5180 + erratum), since the documentation - // prefix is included in the excluded prefix list. - wifiLinkProperties.addLinkAddress(new LinkAddress("2001:2::1/64")); - wifiLinkProperties.addLinkAddress(new LinkAddress("2001:2::2/64")); - wifiLinkProperties.addRoute( - new RouteInfo(new IpPrefix("2001:2::/64"), null, null, RTN_UNICAST)); - offload.notifyDownstreamLinkProperties(wifiLinkProperties); - - offload.removeDownstreamInterface(RNDIS0); - - // Clear invocation history, especially the getForwardedStats() calls - // that happen with setUpstreamParameters(). - clearInvocations(mHardware); - - OffloadHardwareInterface.ControlCallback callback = mControlCallbackCaptor.getValue(); - callback.onSupportAvailable(); - - // Verify forwarded stats behaviour. - verify(mHardware, times(1)).getForwardedStats(eq(RMNET0)); - verify(mHardware, times(1)).getForwardedStats(eq(WLAN0)); - mTetherStatsProviderCb.expectNotifyStatsUpdated(); - mTetherStatsProviderCb.assertNoCallback(); - - // TODO: verify local prefixes and downstreams are also pushed to the HAL. - verify(mHardware, times(1)).setLocalPrefixes(mStringArrayCaptor.capture()); - ArrayList<String> localPrefixes = mStringArrayCaptor.getValue(); - assertEquals(4, localPrefixes.size()); - assertContainsAll(localPrefixes, - // TODO: The logic to find and exclude downstream IP prefixes - // is currently in Tethering's OffloadWrapper but must be moved - // into OffloadController proper. After this, also check for: - // "192.168.43.1/32", "2001:2::1/128", "2001:2::2/128" - "127.0.0.0/8", "192.0.2.0/24", "fe80::/64", "2001:db8::/64"); - verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "192.168.43.0/24"); - verify(mHardware, times(1)).addDownstreamPrefix(WLAN0, "2001:2::/64"); - verify(mHardware, times(1)).setUpstreamParameters(eq(RMNET0), any(), any(), any()); - verify(mHardware, times(1)).setDataLimit(eq(RMNET0), anyLong()); - verifyNoMoreInteractions(mHardware); - } - - @Test - public void testOnSetAlert() throws Exception { - setupFunctioningHardwareInterface(); - enableOffload(); - setOffloadPollInterval(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - final OffloadController offload = makeOffloadController(); - offload.start(); - - // Initialize with fake eth upstream. - final String ethernetIface = "eth1"; - InOrder inOrder = inOrder(mHardware); - final LinkProperties lp = new LinkProperties(); - lp.setInterfaceName(ethernetIface); - offload.setUpstreamLinkProperties(lp); - // Previous upstream was null, so no stats are fetched. - inOrder.verify(mHardware, never()).getForwardedStats(any()); - - // Verify that set quota to 0 will immediately triggers an callback. - mTetherStatsProvider.onSetAlert(0); - waitForIdle(); - mTetherStatsProviderCb.expectNotifyAlertReached(); - - // Verify that notifyAlertReached never fired if quota is not yet reached. - when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn( - new ForwardedStats(0, 0)); - mTetherStatsProvider.onSetAlert(100); - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - mTetherStatsProviderCb.assertNoCallback(); - - // Verify that notifyAlertReached fired when quota is reached. - when(mHardware.getForwardedStats(eq(ethernetIface))).thenReturn( - new ForwardedStats(50, 50)); - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - mTetherStatsProviderCb.expectNotifyAlertReached(); - - // Verify that set quota with UNLIMITED won't trigger any callback, and won't fetch - // any stats since the polling is stopped. - reset(mHardware); - mTetherStatsProvider.onSetAlert(NetworkStatsProvider.QUOTA_UNLIMITED); - mTestLooper.moveTimeForward(DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - waitForIdle(); - mTetherStatsProviderCb.assertNoCallback(); - verify(mHardware, never()).getForwardedStats(any()); - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHardwareInterfaceTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHardwareInterfaceTest.java deleted file mode 100644 index c543fad62dba..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/OffloadHardwareInterfaceTest.java +++ /dev/null @@ -1,254 +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 com.android.networkstack.tethering; - -import static android.net.util.TetheringUtils.uint16; -import static android.system.OsConstants.SOCK_STREAM; -import static android.system.OsConstants.AF_UNIX; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.hardware.tetheroffload.config.V1_0.IOffloadConfig; -import android.hardware.tetheroffload.control.V1_0.IOffloadControl; -import android.hardware.tetheroffload.control.V1_0.ITetheringOffloadCallback; -import android.hardware.tetheroffload.control.V1_0.NatTimeoutUpdate; -import android.hardware.tetheroffload.control.V1_0.NetworkProtocol; -import android.hardware.tetheroffload.control.V1_0.OffloadCallbackEvent; -import android.net.netlink.StructNlMsgHdr; -import android.net.util.SharedLog; -import android.os.Handler; -import android.os.NativeHandle; -import android.os.test.TestLooper; -import android.system.ErrnoException; -import android.system.OsConstants; -import android.system.Os; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -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 java.io.FileDescriptor; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.util.ArrayList; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class OffloadHardwareInterfaceTest { - private static final String RMNET0 = "test_rmnet_data0"; - - private final TestLooper mTestLooper = new TestLooper(); - - private OffloadHardwareInterface mOffloadHw; - private ITetheringOffloadCallback mTetheringOffloadCallback; - private OffloadHardwareInterface.ControlCallback mControlCallback; - - @Mock private IOffloadConfig mIOffloadConfig; - @Mock private IOffloadControl mIOffloadControl; - @Mock private NativeHandle mNativeHandle; - - // Random values to test Netlink message. - private static final short TEST_TYPE = 184; - private static final short TEST_FLAGS = 263; - - class MyDependencies extends OffloadHardwareInterface.Dependencies { - MyDependencies(SharedLog log) { - super(log); - } - - @Override - public IOffloadConfig getOffloadConfig() { - return mIOffloadConfig; - } - - @Override - public IOffloadControl getOffloadControl() { - return mIOffloadControl; - } - - @Override - public NativeHandle createConntrackSocket(final int groups) { - return mNativeHandle; - } - } - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - final SharedLog log = new SharedLog("test"); - mOffloadHw = new OffloadHardwareInterface(new Handler(mTestLooper.getLooper()), log, - new MyDependencies(log)); - mControlCallback = spy(new OffloadHardwareInterface.ControlCallback()); - } - - private void startOffloadHardwareInterface() throws Exception { - mOffloadHw.initOffloadConfig(); - mOffloadHw.initOffloadControl(mControlCallback); - final ArgumentCaptor<ITetheringOffloadCallback> mOffloadCallbackCaptor = - ArgumentCaptor.forClass(ITetheringOffloadCallback.class); - verify(mIOffloadControl).initOffload(mOffloadCallbackCaptor.capture(), any()); - mTetheringOffloadCallback = mOffloadCallbackCaptor.getValue(); - } - - @Test - public void testGetForwardedStats() throws Exception { - startOffloadHardwareInterface(); - final OffloadHardwareInterface.ForwardedStats stats = mOffloadHw.getForwardedStats(RMNET0); - verify(mIOffloadControl).getForwardedStats(eq(RMNET0), any()); - assertNotNull(stats); - } - - @Test - public void testSetLocalPrefixes() throws Exception { - startOffloadHardwareInterface(); - final ArrayList<String> localPrefixes = new ArrayList<>(); - localPrefixes.add("127.0.0.0/8"); - localPrefixes.add("fe80::/64"); - mOffloadHw.setLocalPrefixes(localPrefixes); - verify(mIOffloadControl).setLocalPrefixes(eq(localPrefixes), any()); - } - - @Test - public void testSetDataLimit() throws Exception { - startOffloadHardwareInterface(); - final long limit = 12345; - mOffloadHw.setDataLimit(RMNET0, limit); - verify(mIOffloadControl).setDataLimit(eq(RMNET0), eq(limit), any()); - } - - @Test - public void testSetUpstreamParameters() throws Exception { - startOffloadHardwareInterface(); - final String v4addr = "192.168.10.1"; - final String v4gateway = "192.168.10.255"; - final ArrayList<String> v6gws = new ArrayList<>(0); - v6gws.add("2001:db8::1"); - mOffloadHw.setUpstreamParameters(RMNET0, v4addr, v4gateway, v6gws); - verify(mIOffloadControl).setUpstreamParameters(eq(RMNET0), eq(v4addr), eq(v4gateway), - eq(v6gws), any()); - - final ArgumentCaptor<ArrayList<String>> mArrayListCaptor = - ArgumentCaptor.forClass(ArrayList.class); - mOffloadHw.setUpstreamParameters(null, null, null, null); - verify(mIOffloadControl).setUpstreamParameters(eq(""), eq(""), eq(""), - mArrayListCaptor.capture(), any()); - assertEquals(mArrayListCaptor.getValue().size(), 0); - } - - @Test - public void testUpdateDownstreamPrefix() throws Exception { - startOffloadHardwareInterface(); - final String ifName = "wlan1"; - final String prefix = "192.168.43.0/24"; - mOffloadHw.addDownstreamPrefix(ifName, prefix); - verify(mIOffloadControl).addDownstream(eq(ifName), eq(prefix), any()); - - mOffloadHw.removeDownstreamPrefix(ifName, prefix); - verify(mIOffloadControl).removeDownstream(eq(ifName), eq(prefix), any()); - } - - @Test - public void testTetheringOffloadCallback() throws Exception { - startOffloadHardwareInterface(); - - mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STARTED); - mTestLooper.dispatchAll(); - verify(mControlCallback).onStarted(); - - mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_ERROR); - mTestLooper.dispatchAll(); - verify(mControlCallback).onStoppedError(); - - mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_UNSUPPORTED); - mTestLooper.dispatchAll(); - verify(mControlCallback).onStoppedUnsupported(); - - mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_SUPPORT_AVAILABLE); - mTestLooper.dispatchAll(); - verify(mControlCallback).onSupportAvailable(); - - mTetheringOffloadCallback.onEvent(OffloadCallbackEvent.OFFLOAD_STOPPED_LIMIT_REACHED); - mTestLooper.dispatchAll(); - verify(mControlCallback).onStoppedLimitReached(); - - final NatTimeoutUpdate tcpParams = buildNatTimeoutUpdate(NetworkProtocol.TCP); - mTetheringOffloadCallback.updateTimeout(tcpParams); - mTestLooper.dispatchAll(); - verify(mControlCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_TCP), - eq(tcpParams.src.addr), - eq(uint16(tcpParams.src.port)), - eq(tcpParams.dst.addr), - eq(uint16(tcpParams.dst.port))); - - final NatTimeoutUpdate udpParams = buildNatTimeoutUpdate(NetworkProtocol.UDP); - mTetheringOffloadCallback.updateTimeout(udpParams); - mTestLooper.dispatchAll(); - verify(mControlCallback).onNatTimeoutUpdate(eq(OsConstants.IPPROTO_UDP), - eq(udpParams.src.addr), - eq(uint16(udpParams.src.port)), - eq(udpParams.dst.addr), - eq(uint16(udpParams.dst.port))); - } - - @Test - public void testNetlinkMessage() throws Exception { - FileDescriptor writeSocket = new FileDescriptor(); - FileDescriptor readSocket = new FileDescriptor(); - try { - Os.socketpair(AF_UNIX, SOCK_STREAM, 0, writeSocket, readSocket); - } catch (ErrnoException e) { - fail(); - return; - } - when(mNativeHandle.getFileDescriptor()).thenReturn(writeSocket); - - mOffloadHw.sendNetlinkMessage(mNativeHandle, TEST_TYPE, TEST_FLAGS); - - ByteBuffer buffer = ByteBuffer.allocate(StructNlMsgHdr.STRUCT_SIZE); - int read = Os.read(readSocket, buffer); - - buffer.flip(); - assertEquals(StructNlMsgHdr.STRUCT_SIZE, buffer.getInt()); - assertEquals(TEST_TYPE, buffer.getShort()); - assertEquals(TEST_FLAGS, buffer.getShort()); - assertEquals(1 /* seq */, buffer.getInt()); - assertEquals(0 /* pid */, buffer.getInt()); - } - - private NatTimeoutUpdate buildNatTimeoutUpdate(final int proto) { - final NatTimeoutUpdate params = new NatTimeoutUpdate(); - params.proto = proto; - params.src.addr = "192.168.43.200"; - params.src.port = 100; - params.dst.addr = "172.50.46.169"; - params.dst.port = 150; - return params; - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/PrivateAddressCoordinatorTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/PrivateAddressCoordinatorTest.java deleted file mode 100644 index 93efd49a6d69..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/PrivateAddressCoordinatorTest.java +++ /dev/null @@ -1,254 +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 com.android.networkstack.tethering; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.InetAddresses; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.Network; -import android.net.ip.IpServer; -import android.net.util.NetworkConstants; -import android.net.util.PrefixUtils; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.List; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class PrivateAddressCoordinatorTest { - private static final String TEST_MOBILE_IFNAME = "test_rmnet_data0"; - private static final String TEST_WIFI_IFNAME = "test_wlan0"; - - @Mock private IpServer mHotspotIpServer; - @Mock private IpServer mUsbIpServer; - @Mock private IpServer mEthernetIpServer; - @Mock private Context mContext; - @Mock private ConnectivityManager mConnectivityMgr; - - private PrivateAddressCoordinator mPrivateAddressCoordinator; - private final IpPrefix mBluetoothPrefix = new IpPrefix("192.168.44.0/24"); - private final Network mWifiNetwork = new Network(1); - private final Network mMobileNetwork = new Network(2); - private final Network[] mAllNetworks = {mMobileNetwork, mWifiNetwork}; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - - when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)).thenReturn(mConnectivityMgr); - when(mConnectivityMgr.getAllNetworks()).thenReturn(mAllNetworks); - mPrivateAddressCoordinator = spy(new PrivateAddressCoordinator(mContext)); - } - - @Test - public void testDownstreamPrefixRequest() throws Exception { - LinkAddress address = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - final IpPrefix hotspotPrefix = PrefixUtils.asIpPrefix(address); - assertNotEquals(hotspotPrefix, mBluetoothPrefix); - - address = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - final IpPrefix testDupRequest = PrefixUtils.asIpPrefix(address); - assertNotEquals(hotspotPrefix, testDupRequest); - assertNotEquals(mBluetoothPrefix, testDupRequest); - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - - address = mPrivateAddressCoordinator.requestDownstreamAddress( - mUsbIpServer); - final IpPrefix usbPrefix = PrefixUtils.asIpPrefix(address); - assertNotEquals(usbPrefix, mBluetoothPrefix); - assertNotEquals(usbPrefix, hotspotPrefix); - mPrivateAddressCoordinator.releaseDownstream(mUsbIpServer); - } - - @Test - public void testRequestDownstreamAddress() throws Exception { - LinkAddress expectedAddress = new LinkAddress("192.168.43.42/24"); - int fakeSubAddr = 0x2b00; - when(mPrivateAddressCoordinator.getRandomSubAddr()).thenReturn(fakeSubAddr); - LinkAddress actualAddress = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - assertEquals(actualAddress, expectedAddress); - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - - fakeSubAddr = 0x2b01; - when(mPrivateAddressCoordinator.getRandomSubAddr()).thenReturn(fakeSubAddr); - actualAddress = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - assertEquals(actualAddress, expectedAddress); - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - - fakeSubAddr = 0x2bff; - when(mPrivateAddressCoordinator.getRandomSubAddr()).thenReturn(fakeSubAddr); - actualAddress = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - assertEquals(actualAddress, expectedAddress); - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - - expectedAddress = new LinkAddress("192.168.43.5/24"); - fakeSubAddr = 0x2b05; - when(mPrivateAddressCoordinator.getRandomSubAddr()).thenReturn(fakeSubAddr); - actualAddress = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - assertEquals(actualAddress, expectedAddress); - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - } - - @Test - public void testReserveBluetoothPrefix() throws Exception { - final int fakeSubAddr = 0x2c05; - when(mPrivateAddressCoordinator.getRandomSubAddr()).thenReturn(fakeSubAddr); - LinkAddress address = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - final IpPrefix hotspotPrefix = PrefixUtils.asIpPrefix(address); - assertNotEquals("Should not get reserved prefix: ", mBluetoothPrefix, hotspotPrefix); - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - } - - @Test - public void testNoConflictDownstreamPrefix() throws Exception { - final int fakeHotspotSubAddr = 0x2b05; - final IpPrefix predefinedPrefix = new IpPrefix("192.168.43.0/24"); - when(mPrivateAddressCoordinator.getRandomSubAddr()).thenReturn(fakeHotspotSubAddr); - LinkAddress address = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - final IpPrefix hotspotPrefix = PrefixUtils.asIpPrefix(address); - assertEquals("Wrong wifi perfix: ", predefinedPrefix, hotspotPrefix); - when(mHotspotIpServer.getAddress()).thenReturn(address); - - address = mPrivateAddressCoordinator.requestDownstreamAddress( - mUsbIpServer); - final IpPrefix usbPrefix = PrefixUtils.asIpPrefix(address); - assertNotEquals(predefinedPrefix, usbPrefix); - - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - mPrivateAddressCoordinator.releaseDownstream(mUsbIpServer); - address = mPrivateAddressCoordinator.requestDownstreamAddress( - mUsbIpServer); - final IpPrefix allowUseFreePrefix = PrefixUtils.asIpPrefix(address); - assertEquals("Fail to reselect available perfix: ", predefinedPrefix, allowUseFreePrefix); - } - - private LinkProperties buildUpstreamLinkProperties(boolean withIPv4, boolean withIPv6, - boolean isMobile) { - final String testIface; - final String testIpv4Address; - if (isMobile) { - testIface = TEST_MOBILE_IFNAME; - testIpv4Address = "10.0.0.1"; - } else { - testIface = TEST_WIFI_IFNAME; - testIpv4Address = "192.168.43.5"; - } - - final LinkProperties prop = new LinkProperties(); - prop.setInterfaceName(testIface); - - if (withIPv4) { - prop.addLinkAddress( - new LinkAddress(InetAddresses.parseNumericAddress(testIpv4Address), - NetworkConstants.IPV4_ADDR_BITS)); - } - - if (withIPv6) { - prop.addLinkAddress( - new LinkAddress(InetAddresses.parseNumericAddress("2001:db8::"), - NetworkConstants.RFC7421_PREFIX_LENGTH)); - } - return prop; - } - - @Test - public void testNoConflictUpstreamPrefix() throws Exception { - final int fakeHotspotSubId = 43; - final int fakeHotspotSubAddr = 0x2b05; - final IpPrefix predefinedPrefix = new IpPrefix("192.168.43.0/24"); - // Force always get subAddress "43.5" for conflict testing. - when(mPrivateAddressCoordinator.getRandomSubAddr()).thenReturn(fakeHotspotSubAddr); - // 1. Enable hotspot with prefix 192.168.43.0/24 - final LinkAddress hotspotAddr = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - final IpPrefix hotspotPrefix = PrefixUtils.asIpPrefix(hotspotAddr); - assertEquals("Wrong wifi perfix: ", predefinedPrefix, hotspotPrefix); - when(mHotspotIpServer.getAddress()).thenReturn(hotspotAddr); - // 2. Update v6 only mobile network, hotspot prefix should not be removed. - List<String> testConflicts; - final LinkProperties v6OnlyMobileProp = buildUpstreamLinkProperties(false, true, true); - mPrivateAddressCoordinator.updateUpstreamPrefix(mMobileNetwork, v6OnlyMobileProp); - verify(mHotspotIpServer, never()).sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT); - mPrivateAddressCoordinator.removeUpstreamPrefix(mMobileNetwork); - // 3. Update v4 only mobile network, hotspot prefix should not be removed. - final LinkProperties v4OnlyMobileProp = buildUpstreamLinkProperties(true, false, true); - mPrivateAddressCoordinator.updateUpstreamPrefix(mMobileNetwork, v4OnlyMobileProp); - verify(mHotspotIpServer, never()).sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT); - // 4. Update v4v6 mobile network, hotspot prefix should not be removed. - final LinkProperties v4v6MobileProp = buildUpstreamLinkProperties(true, true, true); - mPrivateAddressCoordinator.updateUpstreamPrefix(mMobileNetwork, v4v6MobileProp); - verify(mHotspotIpServer, never()).sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT); - // 5. Update v6 only wifi network, hotspot prefix should not be removed. - final LinkProperties v6OnlyWifiProp = buildUpstreamLinkProperties(false, true, false); - mPrivateAddressCoordinator.updateUpstreamPrefix(mWifiNetwork, v6OnlyWifiProp); - verify(mHotspotIpServer, never()).sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT); - mPrivateAddressCoordinator.removeUpstreamPrefix(mWifiNetwork); - // 6. Update v4 only wifi network, it conflict with hotspot prefix. - final LinkProperties v4OnlyWifiProp = buildUpstreamLinkProperties(true, false, false); - mPrivateAddressCoordinator.updateUpstreamPrefix(mWifiNetwork, v4OnlyWifiProp); - verify(mHotspotIpServer).sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT); - reset(mHotspotIpServer); - // 7. Restart hotspot again and its prefix is different previous. - mPrivateAddressCoordinator.releaseDownstream(mHotspotIpServer); - final LinkAddress hotspotAddr2 = mPrivateAddressCoordinator.requestDownstreamAddress( - mHotspotIpServer); - final IpPrefix hotspotPrefix2 = PrefixUtils.asIpPrefix(hotspotAddr2); - assertNotEquals(hotspotPrefix, hotspotPrefix2); - when(mHotspotIpServer.getAddress()).thenReturn(hotspotAddr2); - mPrivateAddressCoordinator.updateUpstreamPrefix(mWifiNetwork, v4OnlyWifiProp); - verify(mHotspotIpServer, never()).sendMessage(IpServer.CMD_NOTIFY_PREFIX_CONFLICT); - // 7. Usb tethering can be enabled and its prefix is different with conflict one. - final LinkAddress usbAddr = mPrivateAddressCoordinator.requestDownstreamAddress( - mUsbIpServer); - final IpPrefix usbPrefix = PrefixUtils.asIpPrefix(usbAddr); - assertNotEquals(predefinedPrefix, usbPrefix); - assertNotEquals(hotspotPrefix2, usbPrefix); - when(mUsbIpServer.getAddress()).thenReturn(usbAddr); - // 8. Disable wifi upstream, then wifi's prefix can be selected again. - mPrivateAddressCoordinator.removeUpstreamPrefix(mWifiNetwork); - final LinkAddress ethAddr = mPrivateAddressCoordinator.requestDownstreamAddress( - mEthernetIpServer); - final IpPrefix ethPrefix = PrefixUtils.asIpPrefix(ethAddr); - assertEquals(predefinedPrefix, ethPrefix); - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java deleted file mode 100644 index a9ac4e2851f3..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringConfigurationTest.java +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import static android.net.ConnectivityManager.TYPE_ETHERNET; -import static android.net.ConnectivityManager.TYPE_MOBILE; -import static android.net.ConnectivityManager.TYPE_MOBILE_DUN; -import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI; -import static android.net.ConnectivityManager.TYPE_WIFI; -import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY; -import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; - -import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; -import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.content.res.Resources; -import android.net.util.SharedLog; -import android.provider.DeviceConfig; -import android.telephony.TelephonyManager; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.internal.util.test.BroadcastInterceptingContext; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoSession; -import org.mockito.quality.Strictness; - -import java.util.Arrays; -import java.util.Iterator; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class TetheringConfigurationTest { - private final SharedLog mLog = new SharedLog("TetheringConfigurationTest"); - - private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; - private static final String PROVISIONING_NO_UI_APP_NAME = "no_ui_app"; - private static final String PROVISIONING_APP_RESPONSE = "app_response"; - @Mock private Context mContext; - @Mock private TelephonyManager mTelephonyManager; - @Mock private Resources mResources; - @Mock private Resources mResourcesForSubId; - private Context mMockContext; - private boolean mHasTelephonyManager; - private boolean mEnableLegacyDhcpServer; - private MockitoSession mMockingSession; - - private class MockTetheringConfiguration extends TetheringConfiguration { - MockTetheringConfiguration(Context ctx, SharedLog log, int id) { - super(ctx, log, id); - } - - @Override - protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) { - return mResourcesForSubId; - } - } - - private class MockContext extends BroadcastInterceptingContext { - MockContext(Context base) { - super(base); - } - - @Override - public Resources getResources() { - return mResources; - } - - @Override - public Object getSystemService(String name) { - if (Context.TELEPHONY_SERVICE.equals(name)) { - return mHasTelephonyManager ? mTelephonyManager : null; - } - return super.getSystemService(name); - } - } - - @Before - public void setUp() throws Exception { - // TODO: use a dependencies class instead of mock statics. - mMockingSession = mockitoSession() - .initMocks(this) - .mockStatic(DeviceConfig.class) - .strictness(Strictness.WARN) - .startMocking(); - doReturn(null).when( - () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY), - eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER))); - - when(mResources.getStringArray(R.array.config_tether_dhcp_range)).thenReturn( - new String[0]); - when(mResources.getInteger(R.integer.config_tether_offload_poll_interval)).thenReturn( - TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS); - when(mResources.getStringArray(R.array.config_tether_usb_regexs)).thenReturn(new String[0]); - when(mResources.getStringArray(R.array.config_tether_wifi_regexs)) - .thenReturn(new String[]{ "test_wlan\\d" }); - when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs)).thenReturn( - new String[0]); - when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[0]); - when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app)) - .thenReturn(new String[0]); - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - false); - initializeBpfOffloadConfiguration(true, null /* unset */); - - mHasTelephonyManager = true; - mMockContext = new MockContext(mContext); - mEnableLegacyDhcpServer = false; - } - - @After - public void tearDown() throws Exception { - mMockingSession.finishMocking(); - } - - private TetheringConfiguration getTetheringConfiguration(int... legacyTetherUpstreamTypes) { - when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn( - legacyTetherUpstreamTypes); - return new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - } - - @Test - public void testNoTelephonyManagerMeansNoDun() { - mHasTelephonyManager = false; - final TetheringConfiguration cfg = getTetheringConfiguration( - new int[]{TYPE_MOBILE_DUN, TYPE_WIFI}); - assertFalse(cfg.isDunRequired); - assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN)); - // Just to prove we haven't clobbered Wi-Fi: - assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI)); - } - - @Test - public void testDunFromTelephonyManagerMeansDun() { - when(mTelephonyManager.isTetheringApnRequired()).thenReturn(true); - - final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI); - final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration( - TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI); - final TetheringConfiguration cfgWifiDun = getTetheringConfiguration( - TYPE_WIFI, TYPE_MOBILE_DUN); - final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration( - TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN); - - for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, - cfgWifiDun, cfgMobileWifiHipriDun)) { - String msg = "config=" + cfg.toString(); - assertTrue(msg, cfg.isDunRequired); - assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN)); - assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE)); - assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)); - // Just to prove we haven't clobbered Wi-Fi: - assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI)); - } - } - - @Test - public void testDunNotRequiredFromTelephonyManagerMeansNoDun() { - when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false); - - final TetheringConfiguration cfgWifi = getTetheringConfiguration(TYPE_WIFI); - final TetheringConfiguration cfgMobileWifiHipri = getTetheringConfiguration( - TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI); - final TetheringConfiguration cfgWifiDun = getTetheringConfiguration( - TYPE_WIFI, TYPE_MOBILE_DUN); - final TetheringConfiguration cfgWifiMobile = getTetheringConfiguration( - TYPE_WIFI, TYPE_MOBILE); - final TetheringConfiguration cfgWifiHipri = getTetheringConfiguration( - TYPE_WIFI, TYPE_MOBILE_HIPRI); - final TetheringConfiguration cfgMobileWifiHipriDun = getTetheringConfiguration( - TYPE_MOBILE, TYPE_WIFI, TYPE_MOBILE_HIPRI, TYPE_MOBILE_DUN); - - String msg; - // TYPE_MOBILE_DUN should be present in none of the combinations. - // TYPE_WIFI should not be affected. - for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun, - cfgWifiMobile, cfgWifiHipri, cfgMobileWifiHipriDun)) { - msg = "config=" + cfg.toString(); - assertFalse(msg, cfg.isDunRequired); - assertFalse(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN)); - assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI)); - } - - for (TetheringConfiguration cfg : Arrays.asList(cfgWifi, cfgMobileWifiHipri, cfgWifiDun, - cfgMobileWifiHipriDun)) { - msg = "config=" + cfg.toString(); - assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE)); - assertTrue(msg, cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)); - } - msg = "config=" + cfgWifiMobile.toString(); - assertTrue(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE)); - assertFalse(msg, cfgWifiMobile.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)); - msg = "config=" + cfgWifiHipri.toString(); - assertFalse(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE)); - assertTrue(msg, cfgWifiHipri.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)); - - } - - @Test - public void testNoDefinedUpstreamTypesAddsEthernet() { - when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[]{}); - when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false); - - final TetheringConfiguration cfg = new TetheringConfiguration( - mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator(); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue()); - // The following is because the code always adds some kind of mobile - // upstream, be it DUN or, in this case where DUN is NOT required, - // make sure there is at least one of MOBILE or HIPRI. With the empty - // list of the configuration in this test, it will always add both - // MOBILE and HIPRI, in that order. - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_MOBILE, upstreamIterator.next().intValue()); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue()); - assertFalse(upstreamIterator.hasNext()); - } - - @Test - public void testDefinedUpstreamTypesSansEthernetAddsEthernet() { - when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn( - new int[]{TYPE_WIFI, TYPE_MOBILE_HIPRI}); - when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false); - - final TetheringConfiguration cfg = new TetheringConfiguration( - mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator(); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue()); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_WIFI, upstreamIterator.next().intValue()); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue()); - assertFalse(upstreamIterator.hasNext()); - } - - @Test - public void testDefinedUpstreamTypesWithEthernetDoesNotAddEthernet() { - when(mResources.getIntArray(R.array.config_tether_upstream_types)) - .thenReturn(new int[]{TYPE_WIFI, TYPE_ETHERNET, TYPE_MOBILE_HIPRI}); - when(mTelephonyManager.isTetheringApnRequired()).thenReturn(false); - - final TetheringConfiguration cfg = new TetheringConfiguration( - mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - final Iterator<Integer> upstreamIterator = cfg.preferredUpstreamIfaceTypes.iterator(); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_WIFI, upstreamIterator.next().intValue()); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_ETHERNET, upstreamIterator.next().intValue()); - assertTrue(upstreamIterator.hasNext()); - assertEquals(TYPE_MOBILE_HIPRI, upstreamIterator.next().intValue()); - assertFalse(upstreamIterator.hasNext()); - } - - private void initializeBpfOffloadConfiguration( - final boolean fromRes, final String fromDevConfig) { - when(mResources.getBoolean(R.bool.config_tether_enable_bpf_offload)).thenReturn(fromRes); - doReturn(fromDevConfig).when( - () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY), - eq(TetheringConfiguration.OVERRIDE_TETHER_ENABLE_BPF_OFFLOAD))); - } - - @Test - public void testBpfOffloadEnabledByResource() { - initializeBpfOffloadConfiguration(true, null /* unset */); - final TetheringConfiguration enableByRes = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertTrue(enableByRes.isBpfOffloadEnabled()); - } - - @Test - public void testBpfOffloadEnabledByDeviceConfigOverride() { - for (boolean res : new boolean[]{true, false}) { - initializeBpfOffloadConfiguration(res, "true"); - final TetheringConfiguration enableByDevConOverride = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertTrue(enableByDevConOverride.isBpfOffloadEnabled()); - } - } - - @Test - public void testBpfOffloadDisabledByResource() { - initializeBpfOffloadConfiguration(false, null /* unset */); - final TetheringConfiguration disableByRes = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertFalse(disableByRes.isBpfOffloadEnabled()); - } - - @Test - public void testBpfOffloadDisabledByDeviceConfigOverride() { - for (boolean res : new boolean[]{true, false}) { - initializeBpfOffloadConfiguration(res, "false"); - final TetheringConfiguration disableByDevConOverride = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertFalse(disableByDevConOverride.isBpfOffloadEnabled()); - } - } - - @Test - public void testNewDhcpServerDisabled() { - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - true); - doReturn("false").when( - () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY), - eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER))); - - final TetheringConfiguration enableByRes = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertTrue(enableByRes.enableLegacyDhcpServer); - - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - false); - doReturn("true").when( - () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY), - eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER))); - - final TetheringConfiguration enableByDevConfig = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertTrue(enableByDevConfig.enableLegacyDhcpServer); - } - - @Test - public void testNewDhcpServerEnabled() { - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - false); - doReturn("false").when( - () -> DeviceConfig.getProperty(eq(NAMESPACE_CONNECTIVITY), - eq(TetheringConfiguration.TETHER_ENABLE_LEGACY_DHCP_SERVER))); - - final TetheringConfiguration cfg = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - - assertFalse(cfg.enableLegacyDhcpServer); - } - - @Test - public void testOffloadIntervalByResource() { - final TetheringConfiguration intervalByDefault = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertEquals(TetheringConfiguration.DEFAULT_TETHER_OFFLOAD_POLL_INTERVAL_MS, - intervalByDefault.getOffloadPollInterval()); - - final int[] testOverrides = {0, 3000, -1}; - for (final int override : testOverrides) { - when(mResources.getInteger(R.integer.config_tether_offload_poll_interval)).thenReturn( - override); - final TetheringConfiguration overrideByRes = - new TetheringConfiguration(mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertEquals(override, overrideByRes.getOffloadPollInterval()); - } - } - - @Test - public void testGetResourcesBySubId() { - setUpResourceForSubId(); - final TetheringConfiguration cfg = new TetheringConfiguration( - mMockContext, mLog, INVALID_SUBSCRIPTION_ID); - assertTrue(cfg.provisioningApp.length == 0); - final int anyValidSubId = 1; - final MockTetheringConfiguration mockCfg = - new MockTetheringConfiguration(mMockContext, mLog, anyValidSubId); - assertEquals(mockCfg.provisioningApp[0], PROVISIONING_APP_NAME[0]); - assertEquals(mockCfg.provisioningApp[1], PROVISIONING_APP_NAME[1]); - assertEquals(mockCfg.provisioningAppNoUi, PROVISIONING_NO_UI_APP_NAME); - assertEquals(mockCfg.provisioningResponse, PROVISIONING_APP_RESPONSE); - } - - private void setUpResourceForSubId() { - when(mResourcesForSubId.getStringArray( - R.array.config_tether_dhcp_range)).thenReturn(new String[0]); - when(mResourcesForSubId.getStringArray( - R.array.config_tether_usb_regexs)).thenReturn(new String[0]); - when(mResourcesForSubId.getStringArray( - R.array.config_tether_wifi_regexs)).thenReturn(new String[]{ "test_wlan\\d" }); - when(mResourcesForSubId.getStringArray( - R.array.config_tether_bluetooth_regexs)).thenReturn(new String[0]); - when(mResourcesForSubId.getIntArray(R.array.config_tether_upstream_types)).thenReturn( - new int[0]); - when(mResourcesForSubId.getStringArray( - R.array.config_mobile_hotspot_provision_app)).thenReturn(PROVISIONING_APP_NAME); - when(mResourcesForSubId.getString(R.string.config_mobile_hotspot_provision_app_no_ui)) - .thenReturn(PROVISIONING_NO_UI_APP_NAME); - when(mResourcesForSubId.getString( - R.string.config_mobile_hotspot_provision_response)).thenReturn( - PROVISIONING_APP_RESPONSE); - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt deleted file mode 100644 index 4b6bbac051e0..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringNotificationUpdaterTest.kt +++ /dev/null @@ -1,381 +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 com.android.networkstack.tethering - -import android.app.Notification -import android.app.NotificationManager -import android.content.Context -import android.content.pm.ActivityInfo -import android.content.pm.ApplicationInfo -import android.content.pm.PackageManager -import android.content.pm.ResolveInfo -import android.content.res.Resources -import android.net.ConnectivityManager.TETHERING_WIFI -import android.os.Handler -import android.os.HandlerThread -import android.os.Looper -import android.net.NetworkCapabilities -import android.net.NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING -import android.os.UserHandle -import android.telephony.TelephonyManager -import androidx.test.filters.SmallTest -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.runner.AndroidJUnit4 -import com.android.internal.util.test.BroadcastInterceptingContext -import com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE -import com.android.networkstack.tethering.TetheringNotificationUpdater.EVENT_SHOW_NO_UPSTREAM -import com.android.networkstack.tethering.TetheringNotificationUpdater.NO_UPSTREAM_NOTIFICATION_ID -import com.android.networkstack.tethering.TetheringNotificationUpdater.RESTRICTED_NOTIFICATION_ID -import com.android.networkstack.tethering.TetheringNotificationUpdater.ROAMING_NOTIFICATION_ID -import com.android.networkstack.tethering.TetheringNotificationUpdater.VERIZON_CARRIER_ID -import com.android.testutils.waitForIdle -import org.junit.After -import org.junit.Assert.assertEquals -import org.junit.Assert.fail -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.ArgumentCaptor -import org.mockito.ArgumentMatchers.any -import org.mockito.ArgumentMatchers.anyInt -import org.mockito.ArgumentMatchers.eq -import org.mockito.Mock -import org.mockito.Mockito.doReturn -import org.mockito.Mockito.mock -import org.mockito.Mockito.never -import org.mockito.Mockito.reset -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.Mockito.verifyZeroInteractions -import org.mockito.MockitoAnnotations - -const val TEST_SUBID = 1 -const val WIFI_MASK = 1 shl TETHERING_WIFI -const val TEST_DISALLOW_TITLE = "Tether function is disallowed" -const val TEST_DISALLOW_MESSAGE = "Please contact your admin" -const val TEST_NO_UPSTREAM_TITLE = "Hotspot has no internet access" -const val TEST_NO_UPSTREAM_MESSAGE = "Device cannot connect to internet." -const val TEST_NO_UPSTREAM_BUTTON = "Turn off hotspot" -const val TEST_ROAMING_TITLE = "Hotspot is on" -const val TEST_ROAMING_MESSAGE = "Additional charges may apply while roaming." - -@RunWith(AndroidJUnit4::class) -@SmallTest -class TetheringNotificationUpdaterTest { - // lateinit used here for mocks as they need to be reinitialized between each test and the test - // should crash if they are used before being initialized. - @Mock private lateinit var mockContext: Context - @Mock private lateinit var notificationManager: NotificationManager - @Mock private lateinit var telephonyManager: TelephonyManager - @Mock private lateinit var testResources: Resources - - // lateinit for these classes under test, as they should be reset to a different instance for - // every test but should always be initialized before use (or the test should crash). - private lateinit var context: TestContext - private lateinit var notificationUpdater: TetheringNotificationUpdater - private lateinit var fakeTetheringThread: HandlerThread - - private val ROAMING_CAPABILITIES = NetworkCapabilities() - private val HOME_CAPABILITIES = NetworkCapabilities().addCapability(NET_CAPABILITY_NOT_ROAMING) - private val NOTIFICATION_ICON_ID = R.drawable.stat_sys_tether_general - private val TIMEOUT_MS = 500L - - private inner class TestContext(c: Context) : BroadcastInterceptingContext(c) { - override fun createContextAsUser(user: UserHandle, flags: Int) = - if (user == UserHandle.ALL) mockContext else this - override fun getSystemService(name: String) = - if (name == Context.TELEPHONY_SERVICE) telephonyManager - else super.getSystemService(name) - } - - private inner class WrappedNotificationUpdater(c: Context, looper: Looper) - : TetheringNotificationUpdater(c, looper) { - override fun getResourcesForSubId(c: Context, subId: Int) = - if (subId == TEST_SUBID) testResources else super.getResourcesForSubId(c, subId) - } - - private fun setupResources() { - doReturn(5).`when`(testResources) - .getInteger(R.integer.delay_to_show_no_upstream_after_no_backhaul) - doReturn(true).`when`(testResources) - .getBoolean(R.bool.config_upstream_roaming_notification) - doReturn(TEST_DISALLOW_TITLE).`when`(testResources) - .getString(R.string.disable_tether_notification_title) - doReturn(TEST_DISALLOW_MESSAGE).`when`(testResources) - .getString(R.string.disable_tether_notification_message) - doReturn(TEST_NO_UPSTREAM_TITLE).`when`(testResources) - .getString(R.string.no_upstream_notification_title) - doReturn(TEST_NO_UPSTREAM_MESSAGE).`when`(testResources) - .getString(R.string.no_upstream_notification_message) - doReturn(TEST_NO_UPSTREAM_BUTTON).`when`(testResources) - .getString(R.string.no_upstream_notification_disable_button) - doReturn(TEST_ROAMING_TITLE).`when`(testResources) - .getString(R.string.upstream_roaming_notification_title) - doReturn(TEST_ROAMING_MESSAGE).`when`(testResources) - .getString(R.string.upstream_roaming_notification_message) - } - - @Before - fun setUp() { - MockitoAnnotations.initMocks(this) - context = TestContext(InstrumentationRegistry.getInstrumentation().context) - doReturn(notificationManager).`when`(mockContext) - .getSystemService(Context.NOTIFICATION_SERVICE) - fakeTetheringThread = HandlerThread(this::class.java.simpleName) - fakeTetheringThread.start() - notificationUpdater = WrappedNotificationUpdater(context, fakeTetheringThread.looper) - setupResources() - } - - @After - fun tearDown() { - fakeTetheringThread.quitSafely() - } - - private fun Notification.title() = this.extras.getString(Notification.EXTRA_TITLE) - private fun Notification.text() = this.extras.getString(Notification.EXTRA_TEXT) - - private fun verifyNotification(iconId: Int, title: String, text: String, id: Int) { - verify(notificationManager, never()).cancel(any(), eq(id)) - - val notificationCaptor = ArgumentCaptor.forClass(Notification::class.java) - verify(notificationManager, times(1)) - .notify(any(), eq(id), notificationCaptor.capture()) - - val notification = notificationCaptor.getValue() - assertEquals(iconId, notification.smallIcon.resId) - assertEquals(title, notification.title()) - assertEquals(text, notification.text()) - - reset(notificationManager) - } - - private fun verifyNotificationCancelled( - notificationIds: List<Int>, - resetAfterVerified: Boolean = true - ) { - notificationIds.forEach { - verify(notificationManager, times(1)).cancel(any(), eq(it)) - } - if (resetAfterVerified) reset(notificationManager) - } - - @Test - fun testRestrictedNotification() { - // Set test sub id. - notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // User restrictions on. Show restricted notification. - notificationUpdater.notifyTetheringDisabledByRestriction() - verifyNotification(NOTIFICATION_ICON_ID, TEST_DISALLOW_TITLE, TEST_DISALLOW_MESSAGE, - RESTRICTED_NOTIFICATION_ID) - - // User restrictions off. Clear notification. - notificationUpdater.tetheringRestrictionLifted() - verifyNotificationCancelled(listOf(RESTRICTED_NOTIFICATION_ID)) - - // No downstream. - notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE) - verifyZeroInteractions(notificationManager) - - // User restrictions on again. Show restricted notification. - notificationUpdater.notifyTetheringDisabledByRestriction() - verifyNotification(NOTIFICATION_ICON_ID, TEST_DISALLOW_TITLE, TEST_DISALLOW_MESSAGE, - RESTRICTED_NOTIFICATION_ID) - } - - val MAX_BACKOFF_MS = 200L - /** - * Waits for all messages, including delayed ones, to be processed. - * - * This will wait until the handler has no more messages to be processed including - * delayed ones, or the timeout has expired. It uses an exponential backoff strategy - * to wait longer and longer to consume less CPU, with the max granularity being - * MAX_BACKOFF_MS. - * - * @return true if all messages have been processed including delayed ones, false if timeout - * - * TODO: Move this method to com.android.testutils.HandlerUtils.kt. - */ - private fun Handler.waitForDelayedMessage(what: Int?, timeoutMs: Long) { - fun hasMatchingMessages() = - if (what == null) hasMessagesOrCallbacks() else hasMessages(what) - val expiry = System.currentTimeMillis() + timeoutMs - var delay = 5L - while (System.currentTimeMillis() < expiry && hasMatchingMessages()) { - // None of Handler, Looper, Message and MessageQueue expose any way to retrieve - // the time when the next (let alone the last) message will be processed, so - // short of examining the internals with reflection sleep() is the only solution. - Thread.sleep(delay) - delay = (delay * 2) - .coerceAtMost(expiry - System.currentTimeMillis()) - .coerceAtMost(MAX_BACKOFF_MS) - } - - val timeout = expiry - System.currentTimeMillis() - if (timeout <= 0) fail("Delayed message did not process yet after ${timeoutMs}ms") - waitForIdle(timeout) - } - - @Test - fun testNoUpstreamNotification() { - // Set test sub id. - notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // Wifi downstream. - notificationUpdater.onDownstreamChanged(WIFI_MASK) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // There is no upstream. Show no upstream notification. - notificationUpdater.onUpstreamCapabilitiesChanged(null) - notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS) - verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE, - NO_UPSTREAM_NOTIFICATION_ID) - - // Same capabilities changed. Nothing happened. - notificationUpdater.onUpstreamCapabilitiesChanged(null) - verifyZeroInteractions(notificationManager) - - // Upstream come back. Clear no upstream notification. - notificationUpdater.onUpstreamCapabilitiesChanged(HOME_CAPABILITIES) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID)) - - // No upstream again. Show no upstream notification. - notificationUpdater.onUpstreamCapabilitiesChanged(null) - notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS) - verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE, - NO_UPSTREAM_NOTIFICATION_ID) - - // No downstream. - notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // Wifi downstream and home capabilities. - notificationUpdater.onDownstreamChanged(WIFI_MASK) - notificationUpdater.onUpstreamCapabilitiesChanged(HOME_CAPABILITIES) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // Set R.integer.delay_to_show_no_upstream_after_no_backhaul to -1 and change to no upstream - // again. Don't put up no upstream notification. - doReturn(-1).`when`(testResources) - .getInteger(R.integer.delay_to_show_no_upstream_after_no_backhaul) - notificationUpdater.onUpstreamCapabilitiesChanged(null) - notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID)) - } - - @Test - fun testGetResourcesForSubId() { - doReturn(telephonyManager).`when`(telephonyManager).createForSubscriptionId(anyInt()) - doReturn(1234).`when`(telephonyManager).getSimCarrierId() - doReturn("000000").`when`(telephonyManager).getSimOperator() - - val subId = -2 // Use invalid subId to avoid getting resource from cache or real subId. - val config = context.resources.configuration - var res = notificationUpdater.getResourcesForSubId(context, subId) - assertEquals(config.mcc, res.configuration.mcc) - assertEquals(config.mnc, res.configuration.mnc) - - doReturn(VERIZON_CARRIER_ID).`when`(telephonyManager).getSimCarrierId() - res = notificationUpdater.getResourcesForSubId(context, subId) - assertEquals(config.mcc, res.configuration.mcc) - assertEquals(config.mnc, res.configuration.mnc) - - doReturn("20404").`when`(telephonyManager).getSimOperator() - res = notificationUpdater.getResourcesForSubId(context, subId) - assertEquals(311, res.configuration.mcc) - assertEquals(480, res.configuration.mnc) - } - - @Test - fun testRoamingNotification() { - // Set test sub id. - notificationUpdater.onActiveDataSubscriptionIdChanged(TEST_SUBID) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // Wifi downstream. - notificationUpdater.onDownstreamChanged(WIFI_MASK) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // Upstream capabilities changed to roaming state. Show roaming notification. - notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES) - verifyNotification(NOTIFICATION_ICON_ID, TEST_ROAMING_TITLE, TEST_ROAMING_MESSAGE, - ROAMING_NOTIFICATION_ID) - - // Same capabilities change. Nothing happened. - notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES) - verifyZeroInteractions(notificationManager) - - // Upstream capabilities changed to home state. Clear roaming notification. - notificationUpdater.onUpstreamCapabilitiesChanged(HOME_CAPABILITIES) - verifyNotificationCancelled(listOf(ROAMING_NOTIFICATION_ID)) - - // Upstream capabilities changed to roaming state again. Show roaming notification. - notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES) - verifyNotification(NOTIFICATION_ICON_ID, TEST_ROAMING_TITLE, TEST_ROAMING_MESSAGE, - ROAMING_NOTIFICATION_ID) - - // No upstream. Clear roaming notification and show no upstream notification. - notificationUpdater.onUpstreamCapabilitiesChanged(null) - notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS) - verifyNotificationCancelled(listOf(ROAMING_NOTIFICATION_ID), false) - verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE, - NO_UPSTREAM_NOTIFICATION_ID) - - // No downstream. - notificationUpdater.onDownstreamChanged(DOWNSTREAM_NONE) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - - // Wifi downstream again. - notificationUpdater.onDownstreamChanged(WIFI_MASK) - notificationUpdater.handler.waitForDelayedMessage(EVENT_SHOW_NO_UPSTREAM, TIMEOUT_MS) - verifyNotificationCancelled(listOf(ROAMING_NOTIFICATION_ID), false) - verifyNotification(NOTIFICATION_ICON_ID, TEST_NO_UPSTREAM_TITLE, TEST_NO_UPSTREAM_MESSAGE, - NO_UPSTREAM_NOTIFICATION_ID) - - // Set R.bool.config_upstream_roaming_notification to false and change upstream - // network to roaming state again. No roaming notification. - doReturn(false).`when`(testResources) - .getBoolean(R.bool.config_upstream_roaming_notification) - notificationUpdater.onUpstreamCapabilitiesChanged(ROAMING_CAPABILITIES) - verifyNotificationCancelled(listOf(NO_UPSTREAM_NOTIFICATION_ID, ROAMING_NOTIFICATION_ID)) - } - - @Test - fun testGetSettingsPackageName() { - val defaultSettingsPackageName = "com.android.settings" - val testSettingsPackageName = "com.android.test.settings" - val pm = mock(PackageManager::class.java) - doReturn(null).`when`(pm).resolveActivity(any(), anyInt()) - assertEquals(defaultSettingsPackageName, - TetheringNotificationUpdater.getSettingsPackageName(pm)) - - val resolveInfo = ResolveInfo().apply { - activityInfo = ActivityInfo().apply { - name = "test" - applicationInfo = ApplicationInfo().apply { - packageName = testSettingsPackageName - } - } - } - doReturn(resolveInfo).`when`(pm).resolveActivity(any(), anyInt()) - assertEquals(testSettingsPackageName, - TetheringNotificationUpdater.getSettingsPackageName(pm)) - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java deleted file mode 100644 index 22d894bf471e..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringServiceTest.java +++ /dev/null @@ -1,473 +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 com.android.networkstack.tethering; - -import static android.Manifest.permission.ACCESS_NETWORK_STATE; -import static android.Manifest.permission.TETHER_PRIVILEGED; -import static android.Manifest.permission.UPDATE_APP_OPS_STATS; -import static android.Manifest.permission.WRITE_SETTINGS; -import static android.net.TetheringManager.TETHERING_WIFI; -import static android.net.TetheringManager.TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION; -import static android.net.TetheringManager.TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION; -import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -import android.app.UiAutomation; -import android.content.Intent; -import android.net.IIntResultListener; -import android.net.ITetheringConnector; -import android.net.ITetheringEventCallback; -import android.net.TetheringRequestParcel; -import android.os.Bundle; -import android.os.Handler; -import android.os.ResultReceiver; - -import androidx.test.InstrumentationRegistry; -import androidx.test.filters.SmallTest; -import androidx.test.rule.ServiceTestRule; -import androidx.test.runner.AndroidJUnit4; - -import com.android.networkstack.tethering.MockTetheringService.MockTetheringConnector; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public final class TetheringServiceTest { - private static final String TEST_IFACE_NAME = "test_wlan0"; - private static final String TEST_CALLER_PKG = "com.android.shell"; - @Mock private ITetheringEventCallback mITetheringEventCallback; - @Rule public ServiceTestRule mServiceTestRule; - private Tethering mTethering; - private Intent mMockServiceIntent; - private ITetheringConnector mTetheringConnector; - private UiAutomation mUiAutomation; - - private class TestTetheringResult extends IIntResultListener.Stub { - private int mResult = -1; // Default value that does not match any result code. - @Override - public void onResult(final int resultCode) { - mResult = resultCode; - } - - public void assertResult(final int expected) { - assertEquals(expected, mResult); - } - } - - private class MyResultReceiver extends ResultReceiver { - MyResultReceiver(Handler handler) { - super(handler); - } - private int mResult = -1; // Default value that does not match any result code. - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - mResult = resultCode; - } - - public void assertResult(int expected) { - assertEquals(expected, mResult); - } - } - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - mUiAutomation = - InstrumentationRegistry.getInstrumentation().getUiAutomation(); - mServiceTestRule = new ServiceTestRule(); - mMockServiceIntent = new Intent( - InstrumentationRegistry.getTargetContext(), - MockTetheringService.class); - final MockTetheringConnector mockConnector = - (MockTetheringConnector) mServiceTestRule.bindService(mMockServiceIntent); - mTetheringConnector = mockConnector.getTetheringConnector(); - final MockTetheringService service = mockConnector.getService(); - mTethering = service.getTethering(); - } - - @After - public void tearDown() throws Exception { - mServiceTestRule.unbindService(); - mUiAutomation.dropShellPermissionIdentity(); - } - - private interface TestTetheringCall { - void runTetheringCall(TestTetheringResult result) throws Exception; - } - - private void runAsNoPermission(final TestTetheringCall test) throws Exception { - runTetheringCall(test, new String[0]); - } - - private void runAsTetherPrivileged(final TestTetheringCall test) throws Exception { - runTetheringCall(test, TETHER_PRIVILEGED); - } - - private void runAsAccessNetworkState(final TestTetheringCall test) throws Exception { - runTetheringCall(test, ACCESS_NETWORK_STATE); - } - - private void runAsWriteSettings(final TestTetheringCall test) throws Exception { - runTetheringCall(test, WRITE_SETTINGS, UPDATE_APP_OPS_STATS); - } - - private void runTetheringCall(final TestTetheringCall test, String... permissions) - throws Exception { - if (permissions.length > 0) mUiAutomation.adoptShellPermissionIdentity(permissions); - try { - when(mTethering.isTetheringSupported()).thenReturn(true); - test.runTetheringCall(new TestTetheringResult()); - } finally { - mUiAutomation.dropShellPermissionIdentity(); - } - } - - private void verifyNoMoreInteractionsForTethering() { - verifyNoMoreInteractions(mTethering); - verifyNoMoreInteractions(mITetheringEventCallback); - reset(mTethering, mITetheringEventCallback); - } - - private void runTether(final TestTetheringResult result) throws Exception { - when(mTethering.tether(TEST_IFACE_NAME)).thenReturn(TETHER_ERROR_NO_ERROR); - mTetheringConnector.tether(TEST_IFACE_NAME, TEST_CALLER_PKG, result); - verify(mTethering).isTetheringSupported(); - verify(mTethering).tether(TEST_IFACE_NAME); - result.assertResult(TETHER_ERROR_NO_ERROR); - } - - @Test - public void testTether() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.tether(TEST_IFACE_NAME, TEST_CALLER_PKG, result); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((result) -> { - runTether(result); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((result) -> { - runTether(result); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runUnTether(final TestTetheringResult result) throws Exception { - when(mTethering.untether(TEST_IFACE_NAME)).thenReturn(TETHER_ERROR_NO_ERROR); - mTetheringConnector.untether(TEST_IFACE_NAME, TEST_CALLER_PKG, result); - verify(mTethering).isTetheringSupported(); - verify(mTethering).untether(TEST_IFACE_NAME); - result.assertResult(TETHER_ERROR_NO_ERROR); - } - - @Test - public void testUntether() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.untether(TEST_IFACE_NAME, TEST_CALLER_PKG, result); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((result) -> { - runUnTether(result); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((result) -> { - runUnTether(result); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runSetUsbTethering(final TestTetheringResult result) throws Exception { - when(mTethering.setUsbTethering(true /* enable */)).thenReturn(TETHER_ERROR_NO_ERROR); - mTetheringConnector.setUsbTethering(true /* enable */, TEST_CALLER_PKG, result); - verify(mTethering).isTetheringSupported(); - verify(mTethering).setUsbTethering(true /* enable */); - result.assertResult(TETHER_ERROR_NO_ERROR); - } - - @Test - public void testSetUsbTethering() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.setUsbTethering(true /* enable */, TEST_CALLER_PKG, result); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((result) -> { - runSetUsbTethering(result); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((result) -> { - runSetUsbTethering(result); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - - } - - private void runStartTethering(final TestTetheringResult result, - final TetheringRequestParcel request) throws Exception { - mTetheringConnector.startTethering(request, TEST_CALLER_PKG, result); - verify(mTethering).isTetheringSupported(); - verify(mTethering).startTethering(eq(request), eq(result)); - } - - @Test - public void testStartTethering() throws Exception { - final TetheringRequestParcel request = new TetheringRequestParcel(); - request.tetheringType = TETHERING_WIFI; - - runAsNoPermission((result) -> { - mTetheringConnector.startTethering(request, TEST_CALLER_PKG, result); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((result) -> { - runStartTethering(result, request); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((result) -> { - runStartTethering(result, request); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runStartTetheringAndVerifyNoPermission(final TestTetheringResult result) - throws Exception { - final TetheringRequestParcel request = new TetheringRequestParcel(); - request.tetheringType = TETHERING_WIFI; - request.exemptFromEntitlementCheck = true; - mTetheringConnector.startTethering(request, TEST_CALLER_PKG, result); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - } - - @Test - public void testFailToBypassEntitlementWithoutNeworkStackPermission() throws Exception { - final TetheringRequestParcel request = new TetheringRequestParcel(); - request.tetheringType = TETHERING_WIFI; - request.exemptFromEntitlementCheck = true; - - runAsNoPermission((result) -> { - runStartTetheringAndVerifyNoPermission(result); - }); - - runAsTetherPrivileged((result) -> { - runStartTetheringAndVerifyNoPermission(result); - }); - - runAsWriteSettings((result) -> { - runStartTetheringAndVerifyNoPermission(result); - }); - } - - private void runStopTethering(final TestTetheringResult result) throws Exception { - mTetheringConnector.stopTethering(TETHERING_WIFI, TEST_CALLER_PKG, result); - verify(mTethering).isTetheringSupported(); - verify(mTethering).stopTethering(TETHERING_WIFI); - result.assertResult(TETHER_ERROR_NO_ERROR); - } - - @Test - public void testStopTethering() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.stopTethering(TETHERING_WIFI, TEST_CALLER_PKG, result); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((result) -> { - runStopTethering(result); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((result) -> { - runStopTethering(result); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runRequestLatestTetheringEntitlementResult() throws Exception { - final MyResultReceiver result = new MyResultReceiver(null); - mTetheringConnector.requestLatestTetheringEntitlementResult(TETHERING_WIFI, result, - true /* showEntitlementUi */, TEST_CALLER_PKG); - verify(mTethering).isTetheringSupported(); - verify(mTethering).requestLatestTetheringEntitlementResult(eq(TETHERING_WIFI), - eq(result), eq(true) /* showEntitlementUi */); - } - - @Test - public void testRequestLatestTetheringEntitlementResult() throws Exception { - // Run as no permission. - final MyResultReceiver result = new MyResultReceiver(null); - mTetheringConnector.requestLatestTetheringEntitlementResult(TETHERING_WIFI, result, - true /* showEntitlementUi */, TEST_CALLER_PKG); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractions(mTethering); - - runAsTetherPrivileged((none) -> { - runRequestLatestTetheringEntitlementResult(); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((none) -> { - runRequestLatestTetheringEntitlementResult(); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runRegisterTetheringEventCallback() throws Exception { - mTetheringConnector.registerTetheringEventCallback(mITetheringEventCallback, - TEST_CALLER_PKG); - verify(mTethering).registerTetheringEventCallback(eq(mITetheringEventCallback)); - } - - @Test - public void testRegisterTetheringEventCallback() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.registerTetheringEventCallback(mITetheringEventCallback, - TEST_CALLER_PKG); - verify(mITetheringEventCallback).onCallbackStopped( - TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((none) -> { - runRegisterTetheringEventCallback(); - verifyNoMoreInteractionsForTethering(); - }); - - runAsAccessNetworkState((none) -> { - runRegisterTetheringEventCallback(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runUnregisterTetheringEventCallback() throws Exception { - mTetheringConnector.unregisterTetheringEventCallback(mITetheringEventCallback, - TEST_CALLER_PKG); - verify(mTethering).unregisterTetheringEventCallback(eq(mITetheringEventCallback)); - } - - @Test - public void testUnregisterTetheringEventCallback() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.unregisterTetheringEventCallback(mITetheringEventCallback, - TEST_CALLER_PKG); - verify(mITetheringEventCallback).onCallbackStopped( - TETHER_ERROR_NO_ACCESS_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((none) -> { - runUnregisterTetheringEventCallback(); - verifyNoMoreInteractionsForTethering(); - }); - - runAsAccessNetworkState((none) -> { - runUnregisterTetheringEventCallback(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runStopAllTethering(final TestTetheringResult result) throws Exception { - mTetheringConnector.stopAllTethering(TEST_CALLER_PKG, result); - verify(mTethering).isTetheringSupported(); - verify(mTethering).untetherAll(); - result.assertResult(TETHER_ERROR_NO_ERROR); - } - - @Test - public void testStopAllTethering() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.stopAllTethering(TEST_CALLER_PKG, result); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((result) -> { - runStopAllTethering(result); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((result) -> { - runStopAllTethering(result); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - } - - private void runIsTetheringSupported(final TestTetheringResult result) throws Exception { - mTetheringConnector.isTetheringSupported(TEST_CALLER_PKG, result); - verify(mTethering).isTetheringSupported(); - result.assertResult(TETHER_ERROR_NO_ERROR); - } - - @Test - public void testIsTetheringSupported() throws Exception { - runAsNoPermission((result) -> { - mTetheringConnector.isTetheringSupported(TEST_CALLER_PKG, result); - verify(mTethering).isTetherProvisioningRequired(); - result.assertResult(TETHER_ERROR_NO_CHANGE_TETHERING_PERMISSION); - verifyNoMoreInteractionsForTethering(); - }); - - runAsTetherPrivileged((result) -> { - runIsTetheringSupported(result); - verifyNoMoreInteractionsForTethering(); - }); - - runAsWriteSettings((result) -> { - runIsTetheringSupported(result); - verify(mTethering).isTetherProvisioningRequired(); - verifyNoMoreInteractionsForTethering(); - }); - } -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java deleted file mode 100644 index 64538c7d97c1..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/TetheringTest.java +++ /dev/null @@ -1,1986 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.networkstack.tethering; - -import static android.content.pm.PackageManager.GET_ACTIVITIES; -import static android.hardware.usb.UsbManager.USB_CONFIGURED; -import static android.hardware.usb.UsbManager.USB_CONNECTED; -import static android.hardware.usb.UsbManager.USB_FUNCTION_NCM; -import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS; -import static android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED; -import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED; -import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED; -import static android.net.RouteInfo.RTN_UNICAST; -import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED; -import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY; -import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER; -import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER; -import static android.net.TetheringManager.TETHERING_ETHERNET; -import static android.net.TetheringManager.TETHERING_NCM; -import static android.net.TetheringManager.TETHERING_USB; -import static android.net.TetheringManager.TETHERING_WIFI; -import static android.net.TetheringManager.TETHER_ERROR_IFACE_CFG_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_NO_ERROR; -import static android.net.TetheringManager.TETHER_ERROR_UNKNOWN_IFACE; -import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_FAILED; -import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STARTED; -import static android.net.TetheringManager.TETHER_HARDWARE_OFFLOAD_STOPPED; -import static android.net.dhcp.IDhcpServer.STATUS_SUCCESS; -import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME; -import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE; -import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE; -import static android.net.wifi.WifiManager.IFACE_IP_MODE_LOCAL_ONLY; -import static android.net.wifi.WifiManager.IFACE_IP_MODE_TETHERED; -import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED; -import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; - -import static com.android.net.module.util.Inet4AddressUtils.intToInet4AddressHTH; -import static com.android.networkstack.tethering.TetheringNotificationUpdater.DOWNSTREAM_NONE; -import static com.android.networkstack.tethering.UpstreamNetworkMonitor.EVENT_ON_CAPABILITIES; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.notNull; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -import android.app.usage.NetworkStatsManager; -import android.bluetooth.BluetoothAdapter; -import android.content.BroadcastReceiver; -import android.content.ContentResolver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.hardware.usb.UsbManager; -import android.net.ConnectivityManager; -import android.net.EthernetManager; -import android.net.EthernetManager.TetheredInterfaceCallback; -import android.net.EthernetManager.TetheredInterfaceRequest; -import android.net.IIntResultListener; -import android.net.INetd; -import android.net.ITetheringEventCallback; -import android.net.InetAddresses; -import android.net.InterfaceConfigurationParcel; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.MacAddress; -import android.net.Network; -import android.net.NetworkCapabilities; -import android.net.NetworkRequest; -import android.net.RouteInfo; -import android.net.TetherStatesParcel; -import android.net.TetheredClient; -import android.net.TetheringCallbackStartedParcel; -import android.net.TetheringConfigurationParcel; -import android.net.TetheringRequestParcel; -import android.net.dhcp.DhcpServerCallbacks; -import android.net.dhcp.DhcpServingParamsParcel; -import android.net.dhcp.IDhcpServer; -import android.net.ip.IpNeighborMonitor; -import android.net.ip.IpServer; -import android.net.ip.RouterAdvertisementDaemon; -import android.net.util.InterfaceParams; -import android.net.util.NetworkConstants; -import android.net.util.SharedLog; -import android.net.wifi.SoftApConfiguration; -import android.net.wifi.WifiManager; -import android.net.wifi.p2p.WifiP2pGroup; -import android.net.wifi.p2p.WifiP2pInfo; -import android.net.wifi.p2p.WifiP2pManager; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.PersistableBundle; -import android.os.RemoteException; -import android.os.UserHandle; -import android.os.UserManager; -import android.os.test.TestLooper; -import android.provider.Settings; -import android.telephony.CarrierConfigManager; -import android.telephony.PhoneStateListener; -import android.telephony.TelephonyManager; -import android.test.mock.MockContentResolver; - -import androidx.annotation.NonNull; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.internal.util.ArrayUtils; -import com.android.internal.util.StateMachine; -import com.android.internal.util.test.BroadcastInterceptingContext; -import com.android.internal.util.test.FakeSettingsProvider; -import com.android.testutils.MiscAssertsKt; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.io.FileDescriptor; -import java.io.PrintWriter; -import java.net.Inet4Address; -import java.net.Inet6Address; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Vector; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class TetheringTest { - private static final int IFINDEX_OFFSET = 100; - - private static final String TEST_MOBILE_IFNAME = "test_rmnet_data0"; - private static final String TEST_XLAT_MOBILE_IFNAME = "v4-test_rmnet_data0"; - private static final String TEST_USB_IFNAME = "test_rndis0"; - private static final String TEST_WIFI_IFNAME = "test_wlan0"; - private static final String TEST_WLAN_IFNAME = "test_wlan1"; - private static final String TEST_P2P_IFNAME = "test_p2p-p2p0-0"; - private static final String TEST_NCM_IFNAME = "test_ncm0"; - private static final String TEST_ETH_IFNAME = "test_eth0"; - private static final String TETHERING_NAME = "Tethering"; - private static final String[] PROVISIONING_APP_NAME = {"some", "app"}; - private static final String PROVISIONING_NO_UI_APP_NAME = "no_ui_app"; - - private static final int DHCPSERVER_START_TIMEOUT_MS = 1000; - - @Mock private ApplicationInfo mApplicationInfo; - @Mock private Context mContext; - @Mock private NetworkStatsManager mStatsManager; - @Mock private OffloadHardwareInterface mOffloadHardwareInterface; - @Mock private OffloadHardwareInterface.ForwardedStats mForwardedStats; - @Mock private Resources mResources; - @Mock private TelephonyManager mTelephonyManager; - @Mock private UsbManager mUsbManager; - @Mock private WifiManager mWifiManager; - @Mock private CarrierConfigManager mCarrierConfigManager; - @Mock private UpstreamNetworkMonitor mUpstreamNetworkMonitor; - @Mock private IPv6TetheringCoordinator mIPv6TetheringCoordinator; - @Mock private RouterAdvertisementDaemon mRouterAdvertisementDaemon; - @Mock private IpNeighborMonitor mIpNeighborMonitor; - @Mock private IDhcpServer mDhcpServer; - @Mock private INetd mNetd; - @Mock private UserManager mUserManager; - @Mock private NetworkRequest mNetworkRequest; - @Mock private ConnectivityManager mCm; - @Mock private EthernetManager mEm; - @Mock private TetheringNotificationUpdater mNotificationUpdater; - @Mock private BpfCoordinator mBpfCoordinator; - @Mock private PackageManager mPackageManager; - - private final MockIpServerDependencies mIpServerDependencies = - spy(new MockIpServerDependencies()); - private final MockTetheringDependencies mTetheringDependencies = - new MockTetheringDependencies(); - - // Like so many Android system APIs, these cannot be mocked because it is marked final. - // We have to use the real versions. - private final PersistableBundle mCarrierConfig = new PersistableBundle(); - private final TestLooper mLooper = new TestLooper(); - - private Vector<Intent> mIntents; - private BroadcastInterceptingContext mServiceContext; - private MockContentResolver mContentResolver; - private BroadcastReceiver mBroadcastReceiver; - private Tethering mTethering; - private PhoneStateListener mPhoneStateListener; - private InterfaceConfigurationParcel mInterfaceConfiguration; - private TetheringConfiguration mConfig; - private EntitlementManager mEntitleMgr; - private OffloadController mOffloadCtrl; - - private class TestContext extends BroadcastInterceptingContext { - TestContext(Context base) { - super(base); - } - - @Override - public ApplicationInfo getApplicationInfo() { - return mApplicationInfo; - } - - @Override - public ContentResolver getContentResolver() { - return mContentResolver; - } - - @Override - public String getPackageName() { - return "TetheringTest"; - } - - @Override - public Resources getResources() { - return mResources; - } - - @Override - public Object getSystemService(String name) { - if (Context.WIFI_SERVICE.equals(name)) return mWifiManager; - if (Context.USB_SERVICE.equals(name)) return mUsbManager; - if (Context.TELEPHONY_SERVICE.equals(name)) return mTelephonyManager; - if (Context.USER_SERVICE.equals(name)) return mUserManager; - if (Context.NETWORK_STATS_SERVICE.equals(name)) return mStatsManager; - if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm; - if (Context.ETHERNET_SERVICE.equals(name)) return mEm; - return super.getSystemService(name); - } - - @Override - public PackageManager getPackageManager() { - return mPackageManager; - } - - @Override - public String getSystemServiceName(Class<?> serviceClass) { - if (TelephonyManager.class.equals(serviceClass)) return Context.TELEPHONY_SERVICE; - return super.getSystemServiceName(serviceClass); - } - } - - public class MockIpServerDependencies extends IpServer.Dependencies { - @Override - public RouterAdvertisementDaemon getRouterAdvertisementDaemon( - InterfaceParams ifParams) { - return mRouterAdvertisementDaemon; - } - - @Override - public InterfaceParams getInterfaceParams(String ifName) { - assertTrue("Non-mocked interface " + ifName, - ifName.equals(TEST_USB_IFNAME) - || ifName.equals(TEST_WLAN_IFNAME) - || ifName.equals(TEST_MOBILE_IFNAME) - || ifName.equals(TEST_P2P_IFNAME) - || ifName.equals(TEST_NCM_IFNAME) - || ifName.equals(TEST_ETH_IFNAME)); - final String[] ifaces = new String[] { - TEST_USB_IFNAME, TEST_WLAN_IFNAME, TEST_MOBILE_IFNAME, TEST_P2P_IFNAME, - TEST_NCM_IFNAME, TEST_ETH_IFNAME}; - return new InterfaceParams(ifName, ArrayUtils.indexOf(ifaces, ifName) + IFINDEX_OFFSET, - MacAddress.ALL_ZEROS_ADDRESS); - } - - @Override - public void makeDhcpServer(String ifName, DhcpServingParamsParcel params, - DhcpServerCallbacks cb) { - new Thread(() -> { - try { - cb.onDhcpServerCreated(STATUS_SUCCESS, mDhcpServer); - } catch (RemoteException e) { - fail(e.getMessage()); - } - }).run(); - } - - public IpNeighborMonitor getIpNeighborMonitor(Handler h, SharedLog l, - IpNeighborMonitor.NeighborEventConsumer c) { - return mIpNeighborMonitor; - } - } - - // MyTetheringConfiguration is used to override static method for testing. - private class MyTetheringConfiguration extends TetheringConfiguration { - MyTetheringConfiguration(Context ctx, SharedLog log, int id) { - super(ctx, log, id); - } - - @Override - protected String getDeviceConfigProperty(final String name) { - return null; - } - - @Override - protected Resources getResourcesForSubIdWrapper(Context ctx, int subId) { - return mResources; - } - } - - public class MockTetheringDependencies extends TetheringDependencies { - StateMachine mUpstreamNetworkMonitorMasterSM; - ArrayList<IpServer> mIpv6CoordinatorNotifyList; - - public void reset() { - mUpstreamNetworkMonitorMasterSM = null; - mIpv6CoordinatorNotifyList = null; - } - - @Override - public BpfCoordinator getBpfCoordinator( - BpfCoordinator.Dependencies deps) { - return mBpfCoordinator; - } - - @Override - public OffloadHardwareInterface getOffloadHardwareInterface(Handler h, SharedLog log) { - return mOffloadHardwareInterface; - } - - @Override - public OffloadController getOffloadController(Handler h, SharedLog log, - OffloadController.Dependencies deps) { - mOffloadCtrl = spy(super.getOffloadController(h, log, deps)); - // Return real object here instead of mock because - // testReportFailCallbackIfOffloadNotSupported depend on real OffloadController object. - return mOffloadCtrl; - } - - @Override - public UpstreamNetworkMonitor getUpstreamNetworkMonitor(Context ctx, - StateMachine target, SharedLog log, int what) { - mUpstreamNetworkMonitorMasterSM = target; - return mUpstreamNetworkMonitor; - } - - @Override - public IPv6TetheringCoordinator getIPv6TetheringCoordinator( - ArrayList<IpServer> notifyList, SharedLog log) { - mIpv6CoordinatorNotifyList = notifyList; - return mIPv6TetheringCoordinator; - } - - @Override - public IpServer.Dependencies getIpServerDependencies() { - return mIpServerDependencies; - } - - @Override - public NetworkRequest getDefaultNetworkRequest() { - return mNetworkRequest; - } - - @Override - public EntitlementManager getEntitlementManager(Context ctx, Handler h, SharedLog log, - Runnable callback) { - mEntitleMgr = spy(super.getEntitlementManager(ctx, h, log, callback)); - return mEntitleMgr; - } - - @Override - public boolean isTetheringSupported() { - return true; - } - - @Override - public TetheringConfiguration generateTetheringConfiguration(Context ctx, SharedLog log, - int subId) { - mConfig = spy(new MyTetheringConfiguration(ctx, log, subId)); - return mConfig; - } - - @Override - public INetd getINetd(Context context) { - return mNetd; - } - - @Override - public Looper getTetheringLooper() { - return mLooper.getLooper(); - } - - @Override - public Context getContext() { - return mServiceContext; - } - - @Override - public BluetoothAdapter getBluetoothAdapter() { - // TODO: add test for bluetooth tethering. - return null; - } - - @Override - public TetheringNotificationUpdater getNotificationUpdater(Context ctx, Looper looper) { - return mNotificationUpdater; - } - - @Override - public boolean isTetheringDenied() { - return false; - } - } - - private static UpstreamNetworkState buildMobileUpstreamState(boolean withIPv4, - boolean withIPv6, boolean with464xlat) { - final LinkProperties prop = new LinkProperties(); - prop.setInterfaceName(TEST_MOBILE_IFNAME); - - if (withIPv4) { - prop.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), - InetAddresses.parseNumericAddress("10.0.0.1"), - TEST_MOBILE_IFNAME, RTN_UNICAST)); - } - - if (withIPv6) { - prop.addDnsServer(InetAddresses.parseNumericAddress("2001:db8::2")); - prop.addLinkAddress( - new LinkAddress(InetAddresses.parseNumericAddress("2001:db8::"), - NetworkConstants.RFC7421_PREFIX_LENGTH)); - prop.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), - InetAddresses.parseNumericAddress("2001:db8::1"), - TEST_MOBILE_IFNAME, RTN_UNICAST)); - } - - if (with464xlat) { - final LinkProperties stackedLink = new LinkProperties(); - stackedLink.setInterfaceName(TEST_XLAT_MOBILE_IFNAME); - stackedLink.addRoute(new RouteInfo(new IpPrefix(Inet4Address.ANY, 0), - InetAddresses.parseNumericAddress("192.0.0.1"), - TEST_XLAT_MOBILE_IFNAME, RTN_UNICAST)); - - prop.addStackedLink(stackedLink); - } - - - final NetworkCapabilities capabilities = new NetworkCapabilities() - .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); - return new UpstreamNetworkState(prop, capabilities, new Network(100)); - } - - private static UpstreamNetworkState buildMobileIPv4UpstreamState() { - return buildMobileUpstreamState(true, false, false); - } - - private static UpstreamNetworkState buildMobileIPv6UpstreamState() { - return buildMobileUpstreamState(false, true, false); - } - - private static UpstreamNetworkState buildMobileDualStackUpstreamState() { - return buildMobileUpstreamState(true, true, false); - } - - private static UpstreamNetworkState buildMobile464xlatUpstreamState() { - return buildMobileUpstreamState(false, true, true); - } - - // See FakeSettingsProvider#clearSettingsProvider() that this needs to be called before and - // after use. - @BeforeClass - public static void setupOnce() { - FakeSettingsProvider.clearSettingsProvider(); - } - - @AfterClass - public static void tearDownOnce() { - FakeSettingsProvider.clearSettingsProvider(); - } - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - when(mResources.getStringArray(R.array.config_tether_dhcp_range)) - .thenReturn(new String[0]); - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - false); - when(mNetd.interfaceGetList()) - .thenReturn(new String[] { - TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_USB_IFNAME, TEST_P2P_IFNAME, - TEST_NCM_IFNAME, TEST_ETH_IFNAME}); - when(mResources.getString(R.string.config_wifi_tether_enable)).thenReturn(""); - mInterfaceConfiguration = new InterfaceConfigurationParcel(); - mInterfaceConfiguration.flags = new String[0]; - when(mRouterAdvertisementDaemon.start()) - .thenReturn(true); - initOffloadConfiguration(true /* offloadConfig */, true /* offloadControl */, - 0 /* defaultDisabled */); - when(mOffloadHardwareInterface.getForwardedStats(any())).thenReturn(mForwardedStats); - - mServiceContext = new TestContext(mContext); - mContentResolver = new MockContentResolver(mServiceContext); - mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); - setTetheringSupported(true /* supported */); - mIntents = new Vector<>(); - mBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - mIntents.addElement(intent); - } - }; - mServiceContext.registerReceiver(mBroadcastReceiver, - new IntentFilter(ACTION_TETHER_STATE_CHANGED)); - mTethering = makeTethering(); - verify(mStatsManager, times(1)).registerNetworkStatsProvider(anyString(), any()); - verify(mNetd).registerUnsolicitedEventListener(any()); - final ArgumentCaptor<PhoneStateListener> phoneListenerCaptor = - ArgumentCaptor.forClass(PhoneStateListener.class); - verify(mTelephonyManager).listen(phoneListenerCaptor.capture(), - eq(PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE)); - verify(mWifiManager).registerSoftApCallback(any(), any()); - mPhoneStateListener = phoneListenerCaptor.getValue(); - } - - private void setTetheringSupported(final boolean supported) { - Settings.Global.putInt(mContentResolver, Settings.Global.TETHER_SUPPORTED, - supported ? 1 : 0); - when(mUserManager.hasUserRestriction( - UserManager.DISALLOW_CONFIG_TETHERING)).thenReturn(!supported); - // Setup tetherable configuration. - when(mResources.getStringArray(R.array.config_tether_usb_regexs)) - .thenReturn(new String[] { "test_rndis\\d" }); - when(mResources.getStringArray(R.array.config_tether_wifi_regexs)) - .thenReturn(new String[]{ "test_wlan\\d" }); - when(mResources.getStringArray(R.array.config_tether_wifi_p2p_regexs)) - .thenReturn(new String[]{ "test_p2p-p2p\\d-.*" }); - when(mResources.getStringArray(R.array.config_tether_bluetooth_regexs)) - .thenReturn(new String[0]); - when(mResources.getStringArray(R.array.config_tether_ncm_regexs)) - .thenReturn(new String[] { "test_ncm\\d" }); - when(mResources.getIntArray(R.array.config_tether_upstream_types)).thenReturn(new int[0]); - when(mResources.getBoolean(R.bool.config_tether_upstream_automatic)).thenReturn(true); - } - - private void initTetheringUpstream(UpstreamNetworkState upstreamState) { - when(mUpstreamNetworkMonitor.getCurrentPreferredUpstream()).thenReturn(upstreamState); - when(mUpstreamNetworkMonitor.selectPreferredUpstreamType(any())).thenReturn(upstreamState); - } - - private Tethering makeTethering() { - mTetheringDependencies.reset(); - return new Tethering(mTetheringDependencies); - } - - private TetheringRequestParcel createTetheringRequestParcel(final int type) { - return createTetheringRequestParcel(type, null, null, false); - } - - private TetheringRequestParcel createTetheringRequestParcel(final int type, - final LinkAddress serverAddr, final LinkAddress clientAddr, final boolean exempt) { - final TetheringRequestParcel request = new TetheringRequestParcel(); - request.tetheringType = type; - request.localIPv4Address = serverAddr; - request.staticClientAddress = clientAddr; - request.exemptFromEntitlementCheck = exempt; - request.showProvisioningUi = false; - - return request; - } - - @After - public void tearDown() { - mServiceContext.unregisterReceiver(mBroadcastReceiver); - } - - private void sendWifiApStateChanged(int state) { - final Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); - intent.putExtra(EXTRA_WIFI_AP_STATE, state); - mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } - - private void sendWifiApStateChanged(int state, String ifname, int ipmode) { - final Intent intent = new Intent(WifiManager.WIFI_AP_STATE_CHANGED_ACTION); - intent.putExtra(EXTRA_WIFI_AP_STATE, state); - intent.putExtra(EXTRA_WIFI_AP_INTERFACE_NAME, ifname); - intent.putExtra(EXTRA_WIFI_AP_MODE, ipmode); - mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } - - private static final String[] P2P_RECEIVER_PERMISSIONS_FOR_BROADCAST = { - android.Manifest.permission.ACCESS_FINE_LOCATION, - android.Manifest.permission.ACCESS_WIFI_STATE - }; - - private void sendWifiP2pConnectionChanged( - boolean isGroupFormed, boolean isGroupOwner, String ifname) { - WifiP2pGroup group = null; - WifiP2pInfo p2pInfo = new WifiP2pInfo(); - p2pInfo.groupFormed = isGroupFormed; - if (isGroupFormed) { - p2pInfo.isGroupOwner = isGroupOwner; - group = mock(WifiP2pGroup.class); - when(group.isGroupOwner()).thenReturn(isGroupOwner); - when(group.getInterface()).thenReturn(ifname); - } - - final Intent intent = mock(Intent.class); - when(intent.getAction()).thenReturn(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); - when(intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO)).thenReturn(p2pInfo); - when(intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP)).thenReturn(group); - - mServiceContext.sendBroadcastAsUserMultiplePermissions(intent, UserHandle.ALL, - P2P_RECEIVER_PERMISSIONS_FOR_BROADCAST); - } - - private void sendUsbBroadcast(boolean connected, boolean configured, boolean function, - int type) { - final Intent intent = new Intent(UsbManager.ACTION_USB_STATE); - intent.putExtra(USB_CONNECTED, connected); - intent.putExtra(USB_CONFIGURED, configured); - if (type == TETHERING_USB) { - intent.putExtra(USB_FUNCTION_RNDIS, function); - } else { - intent.putExtra(USB_FUNCTION_NCM, function); - } - mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } - - private void sendConfigurationChanged() { - final Intent intent = new Intent(Intent.ACTION_CONFIGURATION_CHANGED); - mServiceContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - } - - private void verifyInterfaceServingModeStarted(String ifname) throws Exception { - verify(mNetd, times(1)).interfaceSetCfg(any(InterfaceConfigurationParcel.class)); - verify(mNetd, times(1)).tetherInterfaceAdd(ifname); - verify(mNetd, times(1)).networkAddInterface(INetd.LOCAL_NET_ID, ifname); - verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(ifname), - anyString(), anyString()); - } - - private void verifyTetheringBroadcast(String ifname, String whichExtra) { - // Verify that ifname is in the whichExtra array of the tether state changed broadcast. - final Intent bcast = mIntents.get(0); - assertEquals(ACTION_TETHER_STATE_CHANGED, bcast.getAction()); - final ArrayList<String> ifnames = bcast.getStringArrayListExtra(whichExtra); - assertTrue(ifnames.contains(ifname)); - mIntents.remove(bcast); - } - - public void failingLocalOnlyHotspotLegacyApBroadcast( - boolean emulateInterfaceStatusChanged) throws Exception { - // Emulate externally-visible WifiManager effects, causing the - // per-interface state machine to start up, and telling us that - // hotspot mode is to be started. - if (emulateInterfaceStatusChanged) { - mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true); - } - sendWifiApStateChanged(WIFI_AP_STATE_ENABLED); - mLooper.dispatchAll(); - - // If, and only if, Tethering received an interface status changed then - // it creates a IpServer and sends out a broadcast indicating that the - // interface is "available". - if (emulateInterfaceStatusChanged) { - // There is 1 IpServer state change event: STATE_AVAILABLE - verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE); - verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED); - } - verifyNoMoreInteractions(mNetd); - verifyNoMoreInteractions(mWifiManager); - } - - private void prepareNcmTethering() { - // Emulate startTethering(TETHERING_NCM) called - mTethering.startTethering(createTetheringRequestParcel(TETHERING_NCM), null); - mLooper.dispatchAll(); - verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NCM); - - mTethering.interfaceStatusChanged(TEST_NCM_IFNAME, true); - } - - private void prepareUsbTethering(UpstreamNetworkState upstreamState) { - initTetheringUpstream(upstreamState); - - // Emulate pressing the USB tethering button in Settings UI. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB), null); - mLooper.dispatchAll(); - verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); - - mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true); - } - - @Test - public void testUsbConfiguredBroadcastStartsTethering() throws Exception { - UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState(); - prepareUsbTethering(upstreamState); - - // This should produce no activity of any kind. - verifyNoMoreInteractions(mNetd); - - // Pretend we then receive USB configured broadcast. - sendUsbBroadcast(true, true, true, TETHERING_USB); - mLooper.dispatchAll(); - // Now we should see the start of tethering mechanics (in this case: - // tetherMatchingInterfaces() which starts by fetching all interfaces). - verify(mNetd, times(1)).interfaceGetList(); - - // UpstreamNetworkMonitor should receive selected upstream - verify(mUpstreamNetworkMonitor, times(1)).getCurrentPreferredUpstream(); - verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network); - } - - @Test - public void failingLocalOnlyHotspotLegacyApBroadcastWithIfaceStatusChanged() throws Exception { - failingLocalOnlyHotspotLegacyApBroadcast(true); - } - - @Test - public void failingLocalOnlyHotspotLegacyApBroadcastSansIfaceStatusChanged() throws Exception { - failingLocalOnlyHotspotLegacyApBroadcast(false); - } - - public void workingLocalOnlyHotspotEnrichedApBroadcast( - boolean emulateInterfaceStatusChanged) throws Exception { - // Emulate externally-visible WifiManager effects, causing the - // per-interface state machine to start up, and telling us that - // hotspot mode is to be started. - if (emulateInterfaceStatusChanged) { - mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true); - } - sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_LOCAL_ONLY); - mLooper.dispatchAll(); - - verifyInterfaceServingModeStarted(TEST_WLAN_IFNAME); - verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER); - verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME); - verify(mNetd, times(1)).tetherStartWithConfiguration(any()); - verifyNoMoreInteractions(mNetd); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_LOCAL_ONLY); - verifyNoMoreInteractions(mWifiManager); - verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY); - verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks(); - // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_LOCAL_ONLY - verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE); - - // Emulate externally-visible WifiManager effects, when hotspot mode - // is being torn down. - sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED); - mTethering.interfaceRemoved(TEST_WLAN_IFNAME); - mLooper.dispatchAll(); - - verify(mNetd, times(1)).tetherApplyDnsInterfaces(); - verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME); - verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME); - // interfaceSetCfg() called once for enabling and twice disabling IPv4. - verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class)); - verify(mNetd, times(1)).tetherStop(); - verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME); - verify(mWifiManager, times(3)).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED); - verifyNoMoreInteractions(mNetd); - verifyNoMoreInteractions(mWifiManager); - // Asking for the last error after the per-interface state machine - // has been reaped yields an unknown interface error. - assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME)); - } - - /** - * Send CMD_IPV6_TETHER_UPDATE to IpServers as would be done by IPv6TetheringCoordinator. - */ - private void sendIPv6TetherUpdates(UpstreamNetworkState upstreamState) { - // IPv6TetheringCoordinator must have been notified of downstream - verify(mIPv6TetheringCoordinator, times(1)).addActiveDownstream( - argThat(sm -> sm.linkProperties().getInterfaceName().equals(TEST_USB_IFNAME)), - eq(IpServer.STATE_TETHERED)); - - for (IpServer ipSrv : mTetheringDependencies.mIpv6CoordinatorNotifyList) { - UpstreamNetworkState ipv6OnlyState = buildMobileUpstreamState(false, true, false); - ipSrv.sendMessage(IpServer.CMD_IPV6_TETHER_UPDATE, 0, 0, - upstreamState.linkProperties.isIpv6Provisioned() - ? ipv6OnlyState.linkProperties - : null); - } - mLooper.dispatchAll(); - } - - private void runUsbTethering(UpstreamNetworkState upstreamState) { - prepareUsbTethering(upstreamState); - sendUsbBroadcast(true, true, true, TETHERING_USB); - mLooper.dispatchAll(); - } - - @Test - public void workingMobileUsbTethering_IPv4() throws Exception { - UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState(); - runUsbTethering(upstreamState); - - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - - sendIPv6TetherUpdates(upstreamState); - verify(mRouterAdvertisementDaemon, never()).buildNewRa(any(), notNull()); - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - } - - @Test - public void workingMobileUsbTethering_IPv4LegacyDhcp() { - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - true); - sendConfigurationChanged(); - final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState(); - runUsbTethering(upstreamState); - sendIPv6TetherUpdates(upstreamState); - - verify(mIpServerDependencies, never()).makeDhcpServer(any(), any(), any()); - } - - @Test - public void workingMobileUsbTethering_IPv6() throws Exception { - UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState(); - runUsbTethering(upstreamState); - - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - - sendIPv6TetherUpdates(upstreamState); - verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull()); - verify(mNetd, times(1)).tetherApplyDnsInterfaces(); - } - - @Test - public void workingMobileUsbTethering_DualStack() throws Exception { - UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState(); - runUsbTethering(upstreamState); - - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - verify(mRouterAdvertisementDaemon, times(1)).start(); - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - - sendIPv6TetherUpdates(upstreamState); - verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull()); - verify(mNetd, times(1)).tetherApplyDnsInterfaces(); - } - - @Test - public void workingMobileUsbTethering_MultipleUpstreams() throws Exception { - UpstreamNetworkState upstreamState = buildMobile464xlatUpstreamState(); - runUsbTethering(upstreamState); - - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME); - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - - sendIPv6TetherUpdates(upstreamState); - verify(mRouterAdvertisementDaemon, times(1)).buildNewRa(any(), notNull()); - verify(mNetd, times(1)).tetherApplyDnsInterfaces(); - } - - @Test - public void workingMobileUsbTethering_v6Then464xlat() throws Exception { - // Setup IPv6 - UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState(); - runUsbTethering(upstreamState); - - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - - // Then 464xlat comes up - upstreamState = buildMobile464xlatUpstreamState(); - initTetheringUpstream(upstreamState); - - // Upstream LinkProperties changed: UpstreamNetworkMonitor sends EVENT_ON_LINKPROPERTIES. - mTetheringDependencies.mUpstreamNetworkMonitorMasterSM.sendMessage( - Tethering.TetherMasterSM.EVENT_UPSTREAM_CALLBACK, - UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES, - 0, - upstreamState); - mLooper.dispatchAll(); - - // Forwarding is added for 464xlat - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_XLAT_MOBILE_IFNAME); - // Forwarding was not re-added for v6 (still times(1)) - verify(mNetd, times(1)).tetherAddForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - verify(mNetd, times(1)).ipfwdAddInterfaceForward(TEST_USB_IFNAME, TEST_MOBILE_IFNAME); - // DHCP not restarted on downstream (still times(1)) - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - } - - @Test - public void configTetherUpstreamAutomaticIgnoresConfigTetherUpstreamTypes() throws Exception { - when(mResources.getBoolean(R.bool.config_tether_upstream_automatic)).thenReturn(true); - sendConfigurationChanged(); - - // Setup IPv6 - final UpstreamNetworkState upstreamState = buildMobileIPv6UpstreamState(); - runUsbTethering(upstreamState); - - // UpstreamNetworkMonitor should choose upstream automatically - // (in this specific case: choose the default network). - verify(mUpstreamNetworkMonitor, times(1)).getCurrentPreferredUpstream(); - verify(mUpstreamNetworkMonitor, never()).selectPreferredUpstreamType(any()); - - verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(upstreamState.network); - } - - private void runNcmTethering() { - prepareNcmTethering(); - sendUsbBroadcast(true, true, true, TETHERING_NCM); - mLooper.dispatchAll(); - } - - @Test - public void workingNcmTethering() throws Exception { - runNcmTethering(); - - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - } - - @Test - public void workingNcmTethering_LegacyDhcp() { - when(mResources.getBoolean(R.bool.config_tether_enable_legacy_dhcp_server)).thenReturn( - true); - sendConfigurationChanged(); - runNcmTethering(); - - verify(mIpServerDependencies, never()).makeDhcpServer(any(), any(), any()); - } - - @Test - public void workingLocalOnlyHotspotEnrichedApBroadcastWithIfaceChanged() throws Exception { - workingLocalOnlyHotspotEnrichedApBroadcast(true); - } - - @Test - public void workingLocalOnlyHotspotEnrichedApBroadcastSansIfaceChanged() throws Exception { - workingLocalOnlyHotspotEnrichedApBroadcast(false); - } - - // TODO: Test with and without interfaceStatusChanged(). - @Test - public void failingWifiTetheringLegacyApBroadcast() throws Exception { - when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true); - - // Emulate pressing the WiFi tethering button. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null); - mLooper.dispatchAll(); - verify(mWifiManager, times(1)).startTetheredHotspot(null); - verifyNoMoreInteractions(mWifiManager); - verifyNoMoreInteractions(mNetd); - - // Emulate externally-visible WifiManager effects, causing the - // per-interface state machine to start up, and telling us that - // tethering mode is to be started. - mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true); - sendWifiApStateChanged(WIFI_AP_STATE_ENABLED); - mLooper.dispatchAll(); - - // There is 1 IpServer state change event: STATE_AVAILABLE - verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE); - verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED); - verifyNoMoreInteractions(mNetd); - verifyNoMoreInteractions(mWifiManager); - } - - // TODO: Test with and without interfaceStatusChanged(). - @Test - public void workingWifiTetheringEnrichedApBroadcast() throws Exception { - when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true); - - // Emulate pressing the WiFi tethering button. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null); - mLooper.dispatchAll(); - verify(mWifiManager, times(1)).startTetheredHotspot(null); - verifyNoMoreInteractions(mWifiManager); - verifyNoMoreInteractions(mNetd); - - // Emulate externally-visible WifiManager effects, causing the - // per-interface state machine to start up, and telling us that - // tethering mode is to be started. - mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true); - sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED); - mLooper.dispatchAll(); - - verifyInterfaceServingModeStarted(TEST_WLAN_IFNAME); - verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER); - verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME); - verify(mNetd, times(1)).tetherStartWithConfiguration(any()); - verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(TEST_WLAN_IFNAME), - anyString(), anyString()); - verifyNoMoreInteractions(mNetd); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED); - verifyNoMoreInteractions(mWifiManager); - verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_ACTIVE_TETHER); - verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks(); - // In tethering mode, in the default configuration, an explicit request - // for a mobile network is also made. - verify(mUpstreamNetworkMonitor, times(1)).registerMobileNetworkRequest(); - // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_TETHERED - verify(mNotificationUpdater, times(1)).onDownstreamChanged(DOWNSTREAM_NONE); - verify(mNotificationUpdater, times(1)).onDownstreamChanged(eq(1 << TETHERING_WIFI)); - - ///// - // We do not currently emulate any upstream being found. - // - // This is why there are no calls to verify mNetd.tetherAddForward() or - // mNetd.ipfwdAddInterfaceForward(). - ///// - - // Emulate pressing the WiFi tethering button. - mTethering.stopTethering(TETHERING_WIFI); - mLooper.dispatchAll(); - verify(mWifiManager, times(1)).stopSoftAp(); - verifyNoMoreInteractions(mWifiManager); - verifyNoMoreInteractions(mNetd); - - // Emulate externally-visible WifiManager effects, when tethering mode - // is being torn down. - sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED); - mTethering.interfaceRemoved(TEST_WLAN_IFNAME); - mLooper.dispatchAll(); - - verify(mNetd, times(1)).tetherApplyDnsInterfaces(); - verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME); - verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME); - // interfaceSetCfg() called once for enabling and twice for disabling IPv4. - verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class)); - verify(mNetd, times(1)).tetherStop(); - verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME); - verify(mWifiManager, times(3)).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED); - verifyNoMoreInteractions(mNetd); - verifyNoMoreInteractions(mWifiManager); - // Asking for the last error after the per-interface state machine - // has been reaped yields an unknown interface error. - assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_WLAN_IFNAME)); - } - - // TODO: Test with and without interfaceStatusChanged(). - @Test - public void failureEnablingIpForwarding() throws Exception { - when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true); - doThrow(new RemoteException()).when(mNetd).ipfwdEnableForwarding(TETHERING_NAME); - - // Emulate pressing the WiFi tethering button. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null); - mLooper.dispatchAll(); - verify(mWifiManager, times(1)).startTetheredHotspot(null); - verifyNoMoreInteractions(mWifiManager); - verifyNoMoreInteractions(mNetd); - - // Emulate externally-visible WifiManager effects, causing the - // per-interface state machine to start up, and telling us that - // tethering mode is to be started. - mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true); - sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED); - mLooper.dispatchAll(); - - // We verify get/set called three times here: twice for setup and once during - // teardown because all events happen over the course of the single - // dispatchAll() above. Note that once the IpServer IPv4 address config - // code is refactored the two calls during shutdown will revert to one. - verify(mNetd, times(3)).interfaceSetCfg(argThat(p -> TEST_WLAN_IFNAME.equals(p.ifName))); - verify(mNetd, times(1)).tetherInterfaceAdd(TEST_WLAN_IFNAME); - verify(mNetd, times(1)).networkAddInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME); - verify(mNetd, times(2)).networkAddRoute(eq(INetd.LOCAL_NET_ID), eq(TEST_WLAN_IFNAME), - anyString(), anyString()); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_UNSPECIFIED); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_TETHERED); - // There are 3 IpServer state change event: - // STATE_AVAILABLE -> STATE_TETHERED -> STATE_AVAILABLE. - verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE); - verify(mNotificationUpdater, times(1)).onDownstreamChanged(eq(1 << TETHERING_WIFI)); - verifyTetheringBroadcast(TEST_WLAN_IFNAME, EXTRA_AVAILABLE_TETHER); - // This is called, but will throw. - verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME); - // This never gets called because of the exception thrown above. - verify(mNetd, times(0)).tetherStartWithConfiguration(any()); - // When the master state machine transitions to an error state it tells - // downstream interfaces, which causes us to tell Wi-Fi about the error - // so it can take down AP mode. - verify(mNetd, times(1)).tetherApplyDnsInterfaces(); - verify(mNetd, times(1)).tetherInterfaceRemove(TEST_WLAN_IFNAME); - verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_WLAN_IFNAME); - verify(mWifiManager).updateInterfaceIpState( - TEST_WLAN_IFNAME, WifiManager.IFACE_IP_MODE_CONFIGURATION_ERROR); - - verifyNoMoreInteractions(mWifiManager); - verifyNoMoreInteractions(mNetd); - } - - private void runUserRestrictionsChange( - boolean currentDisallow, boolean nextDisallow, boolean isTetheringActive, - int expectedInteractionsWithShowNotification) throws Exception { - final Bundle newRestrictions = new Bundle(); - newRestrictions.putBoolean(UserManager.DISALLOW_CONFIG_TETHERING, nextDisallow); - final Tethering mockTethering = mock(Tethering.class); - when(mockTethering.isTetheringActive()).thenReturn(isTetheringActive); - when(mUserManager.getUserRestrictions()).thenReturn(newRestrictions); - - final Tethering.UserRestrictionActionListener ural = - new Tethering.UserRestrictionActionListener( - mUserManager, mockTethering, mNotificationUpdater); - ural.mDisallowTethering = currentDisallow; - - ural.onUserRestrictionsChanged(); - - verify(mNotificationUpdater, times(expectedInteractionsWithShowNotification)) - .notifyTetheringDisabledByRestriction(); - verify(mockTethering, times(expectedInteractionsWithShowNotification)).untetherAll(); - } - - @Test - public void testDisallowTetheringWhenTetheringIsNotActive() throws Exception { - final boolean isTetheringActive = false; - final boolean currDisallow = false; - final boolean nextDisallow = true; - final int expectedInteractionsWithShowNotification = 0; - - runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive, - expectedInteractionsWithShowNotification); - } - - @Test - public void testDisallowTetheringWhenTetheringIsActive() throws Exception { - final boolean isTetheringActive = true; - final boolean currDisallow = false; - final boolean nextDisallow = true; - final int expectedInteractionsWithShowNotification = 1; - - runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive, - expectedInteractionsWithShowNotification); - } - - @Test - public void testAllowTetheringWhenTetheringIsNotActive() throws Exception { - final boolean isTetheringActive = false; - final boolean currDisallow = true; - final boolean nextDisallow = false; - final int expectedInteractionsWithShowNotification = 0; - - runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive, - expectedInteractionsWithShowNotification); - } - - @Test - public void testAllowTetheringWhenTetheringIsActive() throws Exception { - final boolean isTetheringActive = true; - final boolean currDisallow = true; - final boolean nextDisallow = false; - final int expectedInteractionsWithShowNotification = 0; - - runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive, - expectedInteractionsWithShowNotification); - } - - @Test - public void testDisallowTetheringUnchanged() throws Exception { - final boolean isTetheringActive = true; - final int expectedInteractionsWithShowNotification = 0; - boolean currDisallow = true; - boolean nextDisallow = true; - - runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive, - expectedInteractionsWithShowNotification); - - currDisallow = false; - nextDisallow = false; - - runUserRestrictionsChange(currDisallow, nextDisallow, isTetheringActive, - expectedInteractionsWithShowNotification); - } - - private class TestTetheringEventCallback extends ITetheringEventCallback.Stub { - private final ArrayList<Network> mActualUpstreams = new ArrayList<>(); - private final ArrayList<TetheringConfigurationParcel> mTetheringConfigs = - new ArrayList<>(); - private final ArrayList<TetherStatesParcel> mTetherStates = new ArrayList<>(); - private final ArrayList<Integer> mOffloadStatus = new ArrayList<>(); - - // This function will remove the recorded callbacks, so it must be called once for - // each callback. If this is called after multiple callback, the order matters. - // onCallbackCreated counts as the first call to expectUpstreamChanged with - // @see onCallbackCreated. - public void expectUpstreamChanged(Network... networks) { - if (networks == null) { - assertNoUpstreamChangeCallback(); - return; - } - - final ArrayList<Network> expectedUpstreams = - new ArrayList<Network>(Arrays.asList(networks)); - for (Network upstream : expectedUpstreams) { - // throws OOB if no expectations - assertEquals(mActualUpstreams.remove(0), upstream); - } - assertNoUpstreamChangeCallback(); - } - - // This function will remove the recorded callbacks, so it must be called once - // for each callback. If this is called after multiple callback, the order matters. - // onCallbackCreated counts as the first call to onConfigurationChanged with - // @see onCallbackCreated. - public void expectConfigurationChanged(TetheringConfigurationParcel... tetherConfigs) { - final ArrayList<TetheringConfigurationParcel> expectedTetherConfig = - new ArrayList<TetheringConfigurationParcel>(Arrays.asList(tetherConfigs)); - for (TetheringConfigurationParcel config : expectedTetherConfig) { - // throws OOB if no expectations - final TetheringConfigurationParcel actualConfig = mTetheringConfigs.remove(0); - assertTetherConfigParcelEqual(actualConfig, config); - } - assertNoConfigChangeCallback(); - } - - public void expectOffloadStatusChanged(final int expectedStatus) { - assertOffloadStatusChangedCallback(); - assertEquals(mOffloadStatus.remove(0), new Integer(expectedStatus)); - } - - public TetherStatesParcel pollTetherStatesChanged() { - assertStateChangeCallback(); - return mTetherStates.remove(0); - } - - @Override - public void onUpstreamChanged(Network network) { - mActualUpstreams.add(network); - } - - @Override - public void onConfigurationChanged(TetheringConfigurationParcel config) { - mTetheringConfigs.add(config); - } - - @Override - public void onTetherStatesChanged(TetherStatesParcel states) { - mTetherStates.add(states); - } - - @Override - public void onTetherClientsChanged(List<TetheredClient> clients) { - // TODO: check this - } - - @Override - public void onOffloadStatusChanged(final int status) { - mOffloadStatus.add(status); - } - - @Override - public void onCallbackStarted(TetheringCallbackStartedParcel parcel) { - mActualUpstreams.add(parcel.upstreamNetwork); - mTetheringConfigs.add(parcel.config); - mTetherStates.add(parcel.states); - mOffloadStatus.add(parcel.offloadStatus); - } - - @Override - public void onCallbackStopped(int errorCode) { } - - public void assertNoUpstreamChangeCallback() { - assertTrue(mActualUpstreams.isEmpty()); - } - - public void assertNoConfigChangeCallback() { - assertTrue(mTetheringConfigs.isEmpty()); - } - - public void assertNoStateChangeCallback() { - assertTrue(mTetherStates.isEmpty()); - } - - public void assertStateChangeCallback() { - assertFalse(mTetherStates.isEmpty()); - } - - public void assertOffloadStatusChangedCallback() { - assertFalse(mOffloadStatus.isEmpty()); - } - - public void assertNoCallback() { - assertNoUpstreamChangeCallback(); - assertNoConfigChangeCallback(); - assertNoStateChangeCallback(); - } - - private void assertTetherConfigParcelEqual(@NonNull TetheringConfigurationParcel actual, - @NonNull TetheringConfigurationParcel expect) { - assertEquals(actual.subId, expect.subId); - assertArrayEquals(actual.tetherableUsbRegexs, expect.tetherableUsbRegexs); - assertArrayEquals(actual.tetherableWifiRegexs, expect.tetherableWifiRegexs); - assertArrayEquals(actual.tetherableBluetoothRegexs, expect.tetherableBluetoothRegexs); - assertEquals(actual.isDunRequired, expect.isDunRequired); - assertEquals(actual.chooseUpstreamAutomatically, expect.chooseUpstreamAutomatically); - assertArrayEquals(actual.preferredUpstreamIfaceTypes, - expect.preferredUpstreamIfaceTypes); - assertArrayEquals(actual.legacyDhcpRanges, expect.legacyDhcpRanges); - assertArrayEquals(actual.defaultIPv4DNS, expect.defaultIPv4DNS); - assertEquals(actual.enableLegacyDhcpServer, expect.enableLegacyDhcpServer); - assertArrayEquals(actual.provisioningApp, expect.provisioningApp); - assertEquals(actual.provisioningAppNoUi, expect.provisioningAppNoUi); - assertEquals(actual.provisioningCheckPeriod, expect.provisioningCheckPeriod); - } - } - - private void assertTetherStatesNotNullButEmpty(final TetherStatesParcel parcel) { - assertFalse(parcel == null); - assertEquals(0, parcel.availableList.length); - assertEquals(0, parcel.tetheredList.length); - assertEquals(0, parcel.localOnlyList.length); - assertEquals(0, parcel.erroredIfaceList.length); - assertEquals(0, parcel.lastErrorList.length); - MiscAssertsKt.assertFieldCountEquals(5, TetherStatesParcel.class); - } - - @Test - public void testRegisterTetheringEventCallback() throws Exception { - TestTetheringEventCallback callback = new TestTetheringEventCallback(); - TestTetheringEventCallback callback2 = new TestTetheringEventCallback(); - - // 1. Register one callback before running any tethering. - mTethering.registerTetheringEventCallback(callback); - mLooper.dispatchAll(); - callback.expectUpstreamChanged(new Network[] {null}); - callback.expectConfigurationChanged( - mTethering.getTetheringConfiguration().toStableParcelable()); - TetherStatesParcel tetherState = callback.pollTetherStatesChanged(); - assertTetherStatesNotNullButEmpty(tetherState); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED); - // 2. Enable wifi tethering. - UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState(); - initTetheringUpstream(upstreamState); - when(mWifiManager.startTetheredHotspot(any(SoftApConfiguration.class))).thenReturn(true); - mTethering.interfaceStatusChanged(TEST_WLAN_IFNAME, true); - mLooper.dispatchAll(); - tetherState = callback.pollTetherStatesChanged(); - assertArrayEquals(tetherState.availableList, new String[] {TEST_WLAN_IFNAME}); - - mTethering.startTethering(createTetheringRequestParcel(TETHERING_WIFI), null); - sendWifiApStateChanged(WIFI_AP_STATE_ENABLED, TEST_WLAN_IFNAME, IFACE_IP_MODE_TETHERED); - mLooper.dispatchAll(); - tetherState = callback.pollTetherStatesChanged(); - assertArrayEquals(tetherState.tetheredList, new String[] {TEST_WLAN_IFNAME}); - callback.expectUpstreamChanged(upstreamState.network); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STARTED); - - // 3. Register second callback. - mTethering.registerTetheringEventCallback(callback2); - mLooper.dispatchAll(); - callback2.expectUpstreamChanged(upstreamState.network); - callback2.expectConfigurationChanged( - mTethering.getTetheringConfiguration().toStableParcelable()); - tetherState = callback2.pollTetherStatesChanged(); - assertEquals(tetherState.tetheredList, new String[] {TEST_WLAN_IFNAME}); - callback2.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STARTED); - - // 4. Unregister first callback and disable wifi tethering - mTethering.unregisterTetheringEventCallback(callback); - mLooper.dispatchAll(); - mTethering.stopTethering(TETHERING_WIFI); - sendWifiApStateChanged(WifiManager.WIFI_AP_STATE_DISABLED); - mLooper.dispatchAll(); - tetherState = callback2.pollTetherStatesChanged(); - assertArrayEquals(tetherState.availableList, new String[] {TEST_WLAN_IFNAME}); - mLooper.dispatchAll(); - callback2.expectUpstreamChanged(new Network[] {null}); - callback2.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED); - callback.assertNoCallback(); - } - - @Test - public void testReportFailCallbackIfOffloadNotSupported() throws Exception { - final UpstreamNetworkState upstreamState = buildMobileDualStackUpstreamState(); - TestTetheringEventCallback callback = new TestTetheringEventCallback(); - mTethering.registerTetheringEventCallback(callback); - mLooper.dispatchAll(); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED); - - // 1. Offload fail if no OffloadConfig. - initOffloadConfiguration(false /* offloadConfig */, true /* offloadControl */, - 0 /* defaultDisabled */); - runUsbTethering(upstreamState); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED); - runStopUSBTethering(); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED); - reset(mUsbManager); - // 2. Offload fail if no OffloadControl. - initOffloadConfiguration(true /* offloadConfig */, false /* offloadControl */, - 0 /* defaultDisabled */); - runUsbTethering(upstreamState); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED); - runStopUSBTethering(); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED); - reset(mUsbManager); - // 3. Offload fail if disabled by settings. - initOffloadConfiguration(true /* offloadConfig */, true /* offloadControl */, - 1 /* defaultDisabled */); - runUsbTethering(upstreamState); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_FAILED); - runStopUSBTethering(); - callback.expectOffloadStatusChanged(TETHER_HARDWARE_OFFLOAD_STOPPED); - } - - private void runStopUSBTethering() { - mTethering.stopTethering(TETHERING_USB); - mLooper.dispatchAll(); - mTethering.interfaceRemoved(TEST_USB_IFNAME); - mLooper.dispatchAll(); - } - - private void initOffloadConfiguration(final boolean offloadConfig, - final boolean offloadControl, final int defaultDisabled) { - when(mOffloadHardwareInterface.initOffloadConfig()).thenReturn(offloadConfig); - when(mOffloadHardwareInterface.initOffloadControl(any())).thenReturn(offloadControl); - when(mOffloadHardwareInterface.getDefaultTetherOffloadDisabled()).thenReturn( - defaultDisabled); - } - - @Test - public void testMultiSimAware() throws Exception { - final TetheringConfiguration initailConfig = mTethering.getTetheringConfiguration(); - assertEquals(INVALID_SUBSCRIPTION_ID, initailConfig.activeDataSubId); - - final int fakeSubId = 1234; - mPhoneStateListener.onActiveDataSubscriptionIdChanged(fakeSubId); - final TetheringConfiguration newConfig = mTethering.getTetheringConfiguration(); - assertEquals(fakeSubId, newConfig.activeDataSubId); - verify(mNotificationUpdater, times(1)).onActiveDataSubscriptionIdChanged(eq(fakeSubId)); - } - - @Test - public void testNoDuplicatedEthernetRequest() throws Exception { - final TetheredInterfaceRequest mockRequest = mock(TetheredInterfaceRequest.class); - when(mEm.requestTetheredInterface(any(), any())).thenReturn(mockRequest); - mTethering.startTethering(createTetheringRequestParcel(TETHERING_ETHERNET), null); - mLooper.dispatchAll(); - verify(mEm, times(1)).requestTetheredInterface(any(), any()); - mTethering.startTethering(createTetheringRequestParcel(TETHERING_ETHERNET), null); - mLooper.dispatchAll(); - verifyNoMoreInteractions(mEm); - mTethering.stopTethering(TETHERING_ETHERNET); - mLooper.dispatchAll(); - verify(mockRequest, times(1)).release(); - mTethering.stopTethering(TETHERING_ETHERNET); - mLooper.dispatchAll(); - verifyNoMoreInteractions(mEm); - } - - private void workingWifiP2pGroupOwner( - boolean emulateInterfaceStatusChanged) throws Exception { - if (emulateInterfaceStatusChanged) { - mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true); - } - sendWifiP2pConnectionChanged(true, true, TEST_P2P_IFNAME); - mLooper.dispatchAll(); - - verifyInterfaceServingModeStarted(TEST_P2P_IFNAME); - verifyTetheringBroadcast(TEST_P2P_IFNAME, EXTRA_AVAILABLE_TETHER); - verify(mNetd, times(1)).ipfwdEnableForwarding(TETHERING_NAME); - verify(mNetd, times(1)).tetherStartWithConfiguration(any()); - verifyNoMoreInteractions(mNetd); - verifyTetheringBroadcast(TEST_P2P_IFNAME, EXTRA_ACTIVE_LOCAL_ONLY); - verify(mUpstreamNetworkMonitor, times(1)).startObserveAllNetworks(); - // There are 2 IpServer state change events: STATE_AVAILABLE -> STATE_LOCAL_ONLY - verify(mNotificationUpdater, times(2)).onDownstreamChanged(DOWNSTREAM_NONE); - - assertEquals(TETHER_ERROR_NO_ERROR, mTethering.getLastTetherError(TEST_P2P_IFNAME)); - - // Emulate externally-visible WifiP2pManager effects, when wifi p2p group - // is being removed. - sendWifiP2pConnectionChanged(false, true, TEST_P2P_IFNAME); - mTethering.interfaceRemoved(TEST_P2P_IFNAME); - mLooper.dispatchAll(); - - verify(mNetd, times(1)).tetherApplyDnsInterfaces(); - verify(mNetd, times(1)).tetherInterfaceRemove(TEST_P2P_IFNAME); - verify(mNetd, times(1)).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME); - // interfaceSetCfg() called once for enabling and twice for disabling IPv4. - verify(mNetd, times(3)).interfaceSetCfg(any(InterfaceConfigurationParcel.class)); - verify(mNetd, times(1)).tetherStop(); - verify(mNetd, times(1)).ipfwdDisableForwarding(TETHERING_NAME); - verify(mUpstreamNetworkMonitor, never()).getCurrentPreferredUpstream(); - verify(mUpstreamNetworkMonitor, never()).selectPreferredUpstreamType(any()); - verifyNoMoreInteractions(mNetd); - // Asking for the last error after the per-interface state machine - // has been reaped yields an unknown interface error. - assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME)); - } - - private void workingWifiP2pGroupClient( - boolean emulateInterfaceStatusChanged) throws Exception { - if (emulateInterfaceStatusChanged) { - mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true); - } - sendWifiP2pConnectionChanged(true, false, TEST_P2P_IFNAME); - mLooper.dispatchAll(); - - verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class)); - verify(mNetd, never()).tetherInterfaceAdd(TEST_P2P_IFNAME); - verify(mNetd, never()).networkAddInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME); - verify(mNetd, never()).ipfwdEnableForwarding(TETHERING_NAME); - verify(mNetd, never()).tetherStartWithConfiguration(any()); - - // Emulate externally-visible WifiP2pManager effects, when wifi p2p group - // is being removed. - sendWifiP2pConnectionChanged(false, false, TEST_P2P_IFNAME); - mTethering.interfaceRemoved(TEST_P2P_IFNAME); - mLooper.dispatchAll(); - - verify(mNetd, never()).tetherApplyDnsInterfaces(); - verify(mNetd, never()).tetherInterfaceRemove(TEST_P2P_IFNAME); - verify(mNetd, never()).networkRemoveInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME); - verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class)); - verify(mNetd, never()).tetherStop(); - verify(mNetd, never()).ipfwdDisableForwarding(TETHERING_NAME); - verifyNoMoreInteractions(mNetd); - // Asking for the last error after the per-interface state machine - // has been reaped yields an unknown interface error. - assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME)); - } - - @Test - public void workingWifiP2pGroupOwnerWithIfaceChanged() throws Exception { - workingWifiP2pGroupOwner(true); - } - - @Test - public void workingWifiP2pGroupOwnerSansIfaceChanged() throws Exception { - workingWifiP2pGroupOwner(false); - } - - private void workingWifiP2pGroupOwnerLegacyMode( - boolean emulateInterfaceStatusChanged) throws Exception { - // change to legacy mode and update tethering information by chaning SIM - when(mResources.getStringArray(R.array.config_tether_wifi_p2p_regexs)) - .thenReturn(new String[]{}); - final int fakeSubId = 1234; - mPhoneStateListener.onActiveDataSubscriptionIdChanged(fakeSubId); - - if (emulateInterfaceStatusChanged) { - mTethering.interfaceStatusChanged(TEST_P2P_IFNAME, true); - } - sendWifiP2pConnectionChanged(true, true, TEST_P2P_IFNAME); - mLooper.dispatchAll(); - - verify(mNetd, never()).interfaceSetCfg(any(InterfaceConfigurationParcel.class)); - verify(mNetd, never()).tetherInterfaceAdd(TEST_P2P_IFNAME); - verify(mNetd, never()).networkAddInterface(INetd.LOCAL_NET_ID, TEST_P2P_IFNAME); - verify(mNetd, never()).ipfwdEnableForwarding(TETHERING_NAME); - verify(mNetd, never()).tetherStartWithConfiguration(any()); - assertEquals(TETHER_ERROR_UNKNOWN_IFACE, mTethering.getLastTetherError(TEST_P2P_IFNAME)); - } - @Test - public void workingWifiP2pGroupOwnerLegacyModeWithIfaceChanged() throws Exception { - workingWifiP2pGroupOwnerLegacyMode(true); - } - - @Test - public void workingWifiP2pGroupOwnerLegacyModeSansIfaceChanged() throws Exception { - workingWifiP2pGroupOwnerLegacyMode(false); - } - - @Test - public void workingWifiP2pGroupClientWithIfaceChanged() throws Exception { - workingWifiP2pGroupClient(true); - } - - @Test - public void workingWifiP2pGroupClientSansIfaceChanged() throws Exception { - workingWifiP2pGroupClient(false); - } - - private void setDataSaverEnabled(boolean enabled) { - final Intent intent = new Intent(ACTION_RESTRICT_BACKGROUND_CHANGED); - mServiceContext.sendBroadcastAsUser(intent, UserHandle.ALL); - - final int status = enabled ? RESTRICT_BACKGROUND_STATUS_ENABLED - : RESTRICT_BACKGROUND_STATUS_DISABLED; - when(mCm.getRestrictBackgroundStatus()).thenReturn(status); - mLooper.dispatchAll(); - } - - @Test - public void testDataSaverChanged() { - // Start Tethering. - final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState(); - runUsbTethering(upstreamState); - assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME); - // Data saver is ON. - setDataSaverEnabled(true); - // Verify that tethering should be disabled. - verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NONE); - mTethering.interfaceRemoved(TEST_USB_IFNAME); - mLooper.dispatchAll(); - assertEquals(mTethering.getTetheredIfaces(), new String[0]); - reset(mUsbManager); - - runUsbTethering(upstreamState); - // Verify that user can start tethering again without turning OFF data saver. - assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME); - - // If data saver is keep ON with change event, tethering should not be OFF this time. - setDataSaverEnabled(true); - verify(mUsbManager, times(0)).setCurrentFunctions(UsbManager.FUNCTION_NONE); - assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME); - - // If data saver is turned OFF, it should not change tethering. - setDataSaverEnabled(false); - verify(mUsbManager, times(0)).setCurrentFunctions(UsbManager.FUNCTION_NONE); - assertContains(Arrays.asList(mTethering.getTetheredIfaces()), TEST_USB_IFNAME); - } - - private static <T> void assertContains(Collection<T> collection, T element) { - assertTrue(element + " not found in " + collection, collection.contains(element)); - } - - private class ResultListener extends IIntResultListener.Stub { - private final int mExpectedResult; - private boolean mHasResult = false; - ResultListener(final int expectedResult) { - mExpectedResult = expectedResult; - } - - @Override - public void onResult(final int resultCode) { - mHasResult = true; - if (resultCode != mExpectedResult) { - fail("expected result: " + mExpectedResult + " but actual result: " + resultCode); - } - } - - public void assertHasResult() { - if (!mHasResult) fail("No callback result"); - } - } - - @Test - public void testMultipleStartTethering() throws Exception { - final LinkAddress serverLinkAddr = new LinkAddress("192.168.20.1/24"); - final LinkAddress clientLinkAddr = new LinkAddress("192.168.20.42/24"); - final String serverAddr = "192.168.20.1"; - final ResultListener firstResult = new ResultListener(TETHER_ERROR_NO_ERROR); - final ResultListener secondResult = new ResultListener(TETHER_ERROR_NO_ERROR); - final ResultListener thirdResult = new ResultListener(TETHER_ERROR_NO_ERROR); - - // Enable USB tethering and check that Tethering starts USB. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB, - null, null, false), firstResult); - mLooper.dispatchAll(); - firstResult.assertHasResult(); - verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); - verifyNoMoreInteractions(mUsbManager); - - // Enable USB tethering again with the same request and expect no change to USB. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB, - null, null, false), secondResult); - mLooper.dispatchAll(); - secondResult.assertHasResult(); - verify(mUsbManager, never()).setCurrentFunctions(UsbManager.FUNCTION_NONE); - reset(mUsbManager); - - // Enable USB tethering with a different request and expect that USB is stopped and - // started. - mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB, - serverLinkAddr, clientLinkAddr, false), thirdResult); - mLooper.dispatchAll(); - thirdResult.assertHasResult(); - verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_NONE); - verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); - - // Expect that when USB comes up, the DHCP server is configured with the requested address. - mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true); - sendUsbBroadcast(true, true, true, TETHERING_USB); - mLooper.dispatchAll(); - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - verify(mNetd).interfaceSetCfg(argThat(cfg -> serverAddr.equals(cfg.ipv4Addr))); - } - - @Test - public void testRequestStaticIp() throws Exception { - final LinkAddress serverLinkAddr = new LinkAddress("192.168.0.123/24"); - final LinkAddress clientLinkAddr = new LinkAddress("192.168.0.42/24"); - final String serverAddr = "192.168.0.123"; - final int clientAddrParceled = 0xc0a8002a; - final ArgumentCaptor<DhcpServingParamsParcel> dhcpParamsCaptor = - ArgumentCaptor.forClass(DhcpServingParamsParcel.class); - mTethering.startTethering(createTetheringRequestParcel(TETHERING_USB, - serverLinkAddr, clientLinkAddr, false), null); - mLooper.dispatchAll(); - verify(mUsbManager, times(1)).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); - mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true); - sendUsbBroadcast(true, true, true, TETHERING_USB); - mLooper.dispatchAll(); - verify(mNetd).interfaceSetCfg(argThat(cfg -> serverAddr.equals(cfg.ipv4Addr))); - verify(mIpServerDependencies, times(1)).makeDhcpServer(any(), dhcpParamsCaptor.capture(), - any()); - final DhcpServingParamsParcel params = dhcpParamsCaptor.getValue(); - assertEquals(serverAddr, intToInet4AddressHTH(params.serverAddr).getHostAddress()); - assertEquals(24, params.serverAddrPrefixLength); - assertEquals(clientAddrParceled, params.singleClientAddr); - } - - @Test - public void testUpstreamNetworkChanged() { - final Tethering.TetherMasterSM stateMachine = (Tethering.TetherMasterSM) - mTetheringDependencies.mUpstreamNetworkMonitorMasterSM; - final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState(); - initTetheringUpstream(upstreamState); - stateMachine.chooseUpstreamType(true); - - verify(mUpstreamNetworkMonitor, times(1)).setCurrentUpstream(eq(upstreamState.network)); - verify(mNotificationUpdater, times(1)).onUpstreamCapabilitiesChanged(any()); - } - - @Test - public void testUpstreamCapabilitiesChanged() { - final Tethering.TetherMasterSM stateMachine = (Tethering.TetherMasterSM) - mTetheringDependencies.mUpstreamNetworkMonitorMasterSM; - final UpstreamNetworkState upstreamState = buildMobileIPv4UpstreamState(); - initTetheringUpstream(upstreamState); - stateMachine.chooseUpstreamType(true); - - stateMachine.handleUpstreamNetworkMonitorCallback(EVENT_ON_CAPABILITIES, upstreamState); - // Should have two onUpstreamCapabilitiesChanged(). - // One is called by reportUpstreamChanged(). One is called by EVENT_ON_CAPABILITIES. - verify(mNotificationUpdater, times(2)).onUpstreamCapabilitiesChanged(any()); - reset(mNotificationUpdater); - - // Verify that onUpstreamCapabilitiesChanged won't be called if not current upstream network - // capabilities changed. - final UpstreamNetworkState upstreamState2 = new UpstreamNetworkState( - upstreamState.linkProperties, upstreamState.networkCapabilities, new Network(101)); - stateMachine.handleUpstreamNetworkMonitorCallback(EVENT_ON_CAPABILITIES, upstreamState2); - verify(mNotificationUpdater, never()).onUpstreamCapabilitiesChanged(any()); - } - - @Test - public void testDumpTetheringLog() throws Exception { - final FileDescriptor mockFd = mock(FileDescriptor.class); - final PrintWriter mockPw = mock(PrintWriter.class); - runUsbTethering(null); - mLooper.startAutoDispatch(); - mTethering.dump(mockFd, mockPw, new String[0]); - verify(mConfig).dump(any()); - verify(mEntitleMgr).dump(any()); - verify(mOffloadCtrl).dump(any()); - mLooper.stopAutoDispatch(); - } - - @Test - public void testExemptFromEntitlementCheck() throws Exception { - setupForRequiredProvisioning(); - final TetheringRequestParcel wifiNotExemptRequest = - createTetheringRequestParcel(TETHERING_WIFI, null, null, false); - mTethering.startTethering(wifiNotExemptRequest, null); - mLooper.dispatchAll(); - verify(mEntitleMgr).startProvisioningIfNeeded(TETHERING_WIFI, false); - verify(mEntitleMgr, never()).setExemptedDownstreamType(TETHERING_WIFI); - assertFalse(mEntitleMgr.isCellularUpstreamPermitted()); - mTethering.stopTethering(TETHERING_WIFI); - mLooper.dispatchAll(); - verify(mEntitleMgr).stopProvisioningIfNeeded(TETHERING_WIFI); - reset(mEntitleMgr); - - setupForRequiredProvisioning(); - final TetheringRequestParcel wifiExemptRequest = - createTetheringRequestParcel(TETHERING_WIFI, null, null, true); - mTethering.startTethering(wifiExemptRequest, null); - mLooper.dispatchAll(); - verify(mEntitleMgr, never()).startProvisioningIfNeeded(TETHERING_WIFI, false); - verify(mEntitleMgr).setExemptedDownstreamType(TETHERING_WIFI); - assertTrue(mEntitleMgr.isCellularUpstreamPermitted()); - mTethering.stopTethering(TETHERING_WIFI); - mLooper.dispatchAll(); - verify(mEntitleMgr).stopProvisioningIfNeeded(TETHERING_WIFI); - reset(mEntitleMgr); - - // If one app enables tethering without provisioning check first, then another app enables - // tethering of the same type but does not disable the provisioning check. - setupForRequiredProvisioning(); - mTethering.startTethering(wifiExemptRequest, null); - mLooper.dispatchAll(); - verify(mEntitleMgr, never()).startProvisioningIfNeeded(TETHERING_WIFI, false); - verify(mEntitleMgr).setExemptedDownstreamType(TETHERING_WIFI); - assertTrue(mEntitleMgr.isCellularUpstreamPermitted()); - reset(mEntitleMgr); - setupForRequiredProvisioning(); - mTethering.startTethering(wifiNotExemptRequest, null); - mLooper.dispatchAll(); - verify(mEntitleMgr).startProvisioningIfNeeded(TETHERING_WIFI, false); - verify(mEntitleMgr, never()).setExemptedDownstreamType(TETHERING_WIFI); - assertFalse(mEntitleMgr.isCellularUpstreamPermitted()); - mTethering.stopTethering(TETHERING_WIFI); - mLooper.dispatchAll(); - verify(mEntitleMgr).stopProvisioningIfNeeded(TETHERING_WIFI); - reset(mEntitleMgr); - } - - private void setupForRequiredProvisioning() { - // Produce some acceptable looking provision app setting if requested. - when(mResources.getStringArray(R.array.config_mobile_hotspot_provision_app)) - .thenReturn(PROVISIONING_APP_NAME); - when(mResources.getString(R.string.config_mobile_hotspot_provision_app_no_ui)) - .thenReturn(PROVISIONING_NO_UI_APP_NAME); - // Act like the CarrierConfigManager is present and ready unless told otherwise. - when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE)) - .thenReturn(mCarrierConfigManager); - when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mCarrierConfig); - mCarrierConfig.putBoolean(CarrierConfigManager.KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true); - mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true); - sendConfigurationChanged(); - } - - private static UpstreamNetworkState buildV4WifiUpstreamState(final String ipv4Address, - final int prefixLength, final Network network) { - final LinkProperties prop = new LinkProperties(); - prop.setInterfaceName(TEST_WIFI_IFNAME); - - prop.addLinkAddress( - new LinkAddress(InetAddresses.parseNumericAddress(ipv4Address), - prefixLength)); - - final NetworkCapabilities capabilities = new NetworkCapabilities() - .addTransportType(NetworkCapabilities.TRANSPORT_WIFI); - return new UpstreamNetworkState(prop, capabilities, network); - } - - @Test - public void testHandleIpConflict() throws Exception { - final Network wifiNetwork = new Network(200); - final Network[] allNetworks = { wifiNetwork }; - when(mCm.getAllNetworks()).thenReturn(allNetworks); - UpstreamNetworkState upstreamNetwork = null; - runUsbTethering(upstreamNetwork); - final ArgumentCaptor<InterfaceConfigurationParcel> ifaceConfigCaptor = - ArgumentCaptor.forClass(InterfaceConfigurationParcel.class); - verify(mNetd).interfaceSetCfg(ifaceConfigCaptor.capture()); - final String ipv4Address = ifaceConfigCaptor.getValue().ipv4Addr; - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - reset(mNetd, mUsbManager); - upstreamNetwork = buildV4WifiUpstreamState(ipv4Address, 30, wifiNetwork); - mTetheringDependencies.mUpstreamNetworkMonitorMasterSM.sendMessage( - Tethering.TetherMasterSM.EVENT_UPSTREAM_CALLBACK, - UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES, - 0, - upstreamNetwork); - mLooper.dispatchAll(); - // verify trun off usb tethering - verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_NONE); - mTethering.interfaceRemoved(TEST_USB_IFNAME); - mLooper.dispatchAll(); - // verify restart usb tethering - verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); - } - - @Test - public void testNoAddressAvailable() throws Exception { - final Network wifiNetwork = new Network(200); - final Network[] allNetworks = { wifiNetwork }; - when(mCm.getAllNetworks()).thenReturn(allNetworks); - final String upstreamAddress = "192.168.0.100"; - runUsbTethering(null); - verify(mDhcpServer, timeout(DHCPSERVER_START_TIMEOUT_MS).times(1)).startWithCallbacks( - any(), any()); - reset(mUsbManager); - final TetheredInterfaceRequest mockRequest = mock(TetheredInterfaceRequest.class); - when(mEm.requestTetheredInterface(any(), any())).thenReturn(mockRequest); - final ArgumentCaptor<TetheredInterfaceCallback> callbackCaptor = - ArgumentCaptor.forClass(TetheredInterfaceCallback.class); - mTethering.startTethering(createTetheringRequestParcel(TETHERING_ETHERNET), null); - mLooper.dispatchAll(); - verify(mEm).requestTetheredInterface(any(), callbackCaptor.capture()); - TetheredInterfaceCallback ethCallback = callbackCaptor.getValue(); - ethCallback.onAvailable(TEST_ETH_IFNAME); - mLooper.dispatchAll(); - reset(mUsbManager, mEm); - - final UpstreamNetworkState upstreamNetwork = buildV4WifiUpstreamState( - upstreamAddress, 16, wifiNetwork); - mTetheringDependencies.mUpstreamNetworkMonitorMasterSM.sendMessage( - Tethering.TetherMasterSM.EVENT_UPSTREAM_CALLBACK, - UpstreamNetworkMonitor.EVENT_ON_LINKPROPERTIES, - 0, - upstreamNetwork); - mLooper.dispatchAll(); - // verify trun off usb tethering - verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_NONE); - // verify trun off ethernet tethering - verify(mockRequest).release(); - mTethering.interfaceRemoved(TEST_USB_IFNAME); - ethCallback.onUnavailable(); - mLooper.dispatchAll(); - // verify restart usb tethering - verify(mUsbManager).setCurrentFunctions(UsbManager.FUNCTION_RNDIS); - // verify restart ethernet tethering - verify(mEm).requestTetheredInterface(any(), callbackCaptor.capture()); - ethCallback = callbackCaptor.getValue(); - ethCallback.onAvailable(TEST_ETH_IFNAME); - - reset(mUsbManager, mEm); - when(mNetd.interfaceGetList()) - .thenReturn(new String[] { - TEST_MOBILE_IFNAME, TEST_WLAN_IFNAME, TEST_USB_IFNAME, TEST_P2P_IFNAME, - TEST_NCM_IFNAME, TEST_ETH_IFNAME}); - - mTethering.interfaceStatusChanged(TEST_USB_IFNAME, true); - sendUsbBroadcast(true, true, true, TETHERING_USB); - mLooper.dispatchAll(); - assertContains(Arrays.asList(mTethering.getTetherableIfaces()), TEST_USB_IFNAME); - assertContains(Arrays.asList(mTethering.getTetherableIfaces()), TEST_ETH_IFNAME); - assertEquals(TETHER_ERROR_IFACE_CFG_ERROR, mTethering.getLastTetherError(TEST_USB_IFNAME)); - assertEquals(TETHER_ERROR_IFACE_CFG_ERROR, mTethering.getLastTetherError(TEST_ETH_IFNAME)); - } - - @Test - public void testProvisioningNeededButUnavailable() throws Exception { - assertTrue(mTethering.isTetheringSupported()); - verify(mPackageManager, never()).getPackageInfo(PROVISIONING_APP_NAME[0], GET_ACTIVITIES); - - setupForRequiredProvisioning(); - assertTrue(mTethering.isTetheringSupported()); - verify(mPackageManager).getPackageInfo(PROVISIONING_APP_NAME[0], GET_ACTIVITIES); - reset(mPackageManager); - - doThrow(PackageManager.NameNotFoundException.class).when(mPackageManager).getPackageInfo( - PROVISIONING_APP_NAME[0], GET_ACTIVITIES); - setupForRequiredProvisioning(); - assertFalse(mTethering.isTetheringSupported()); - verify(mPackageManager).getPackageInfo(PROVISIONING_APP_NAME[0], GET_ACTIVITIES); - } - - // TODO: Test that a request for hotspot mode doesn't interfere with an - // already operating tethering mode interface. -} diff --git a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/UpstreamNetworkMonitorTest.java b/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/UpstreamNetworkMonitorTest.java deleted file mode 100644 index 232588c7eec0..000000000000 --- a/packages/Tethering/tests/unit/src/com/android/networkstack/tethering/UpstreamNetworkMonitorTest.java +++ /dev/null @@ -1,800 +0,0 @@ -/* - * Copyright (C) 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 com.android.networkstack.tethering; - -import static android.net.ConnectivityManager.TYPE_MOBILE_DUN; -import static android.net.ConnectivityManager.TYPE_MOBILE_HIPRI; -import static android.net.ConnectivityManager.TYPE_WIFI; -import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; -import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; -import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; -import static android.net.NetworkCapabilities.TRANSPORT_WIFI; - -import static com.android.networkstack.tethering.UpstreamNetworkMonitor.TYPE_NONE; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.anyInt; -import static org.mockito.Mockito.anyString; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.ConnectivityManager.NetworkCallback; -import android.net.IConnectivityManager; -import android.net.IpPrefix; -import android.net.LinkAddress; -import android.net.LinkProperties; -import android.net.Network; -import android.net.NetworkCapabilities; -import android.net.NetworkRequest; -import android.net.util.SharedLog; -import android.os.Handler; -import android.os.Message; - -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.internal.util.State; -import com.android.internal.util.StateMachine; - -import org.junit.After; -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; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Objects; -import java.util.Set; - -@RunWith(AndroidJUnit4.class) -@SmallTest -public class UpstreamNetworkMonitorTest { - private static final int EVENT_UNM_UPDATE = 1; - - private static final boolean INCLUDES = true; - private static final boolean EXCLUDES = false; - - // Actual contents of the request don't matter for this test. The lack of - // any specific TRANSPORT_* is sufficient to identify this request. - private static final NetworkRequest sDefaultRequest = new NetworkRequest.Builder().build(); - - @Mock private Context mContext; - @Mock private EntitlementManager mEntitleMgr; - @Mock private IConnectivityManager mCS; - @Mock private SharedLog mLog; - - private TestStateMachine mSM; - private TestConnectivityManager mCM; - private UpstreamNetworkMonitor mUNM; - - @Before public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - reset(mContext); - reset(mCS); - reset(mLog); - when(mLog.forSubComponent(anyString())).thenReturn(mLog); - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true); - - mCM = spy(new TestConnectivityManager(mContext, mCS)); - mSM = new TestStateMachine(); - mUNM = new UpstreamNetworkMonitor( - (ConnectivityManager) mCM, mSM, mLog, EVENT_UNM_UPDATE); - } - - @After public void tearDown() throws Exception { - if (mSM != null) { - mSM.quit(); - mSM = null; - } - } - - @Test - public void testStopWithoutStartIsNonFatal() { - mUNM.stop(); - mUNM.stop(); - mUNM.stop(); - } - - @Test - public void testDoesNothingBeforeTrackDefaultAndStarted() throws Exception { - assertTrue(mCM.hasNoCallbacks()); - assertFalse(mUNM.mobileNetworkRequested()); - - mUNM.updateMobileRequiresDun(true); - assertTrue(mCM.hasNoCallbacks()); - mUNM.updateMobileRequiresDun(false); - assertTrue(mCM.hasNoCallbacks()); - } - - @Test - public void testDefaultNetworkIsTracked() throws Exception { - assertTrue(mCM.hasNoCallbacks()); - mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr); - - mUNM.startObserveAllNetworks(); - assertEquals(1, mCM.trackingDefault.size()); - - mUNM.stop(); - assertTrue(mCM.onlyHasDefaultCallbacks()); - } - - @Test - public void testListensForAllNetworks() throws Exception { - assertTrue(mCM.listening.isEmpty()); - - mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr); - mUNM.startObserveAllNetworks(); - assertFalse(mCM.listening.isEmpty()); - assertTrue(mCM.isListeningForAll()); - - mUNM.stop(); - assertTrue(mCM.onlyHasDefaultCallbacks()); - } - - @Test - public void testCallbacksRegistered() { - mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr); - verify(mCM, times(1)).requestNetwork( - eq(sDefaultRequest), any(NetworkCallback.class), any(Handler.class)); - mUNM.startObserveAllNetworks(); - verify(mCM, times(1)).registerNetworkCallback( - any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class)); - - mUNM.stop(); - verify(mCM, times(1)).unregisterNetworkCallback(any(NetworkCallback.class)); - } - - @Test - public void testRequestsMobileNetwork() throws Exception { - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.startObserveAllNetworks(); - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.updateMobileRequiresDun(false); - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.registerMobileNetworkRequest(); - assertTrue(mUNM.mobileNetworkRequested()); - assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI); - assertFalse(isDunRequested()); - - mUNM.stop(); - assertFalse(mUNM.mobileNetworkRequested()); - assertTrue(mCM.hasNoCallbacks()); - } - - @Test - public void testDuplicateMobileRequestsIgnored() throws Exception { - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.startObserveAllNetworks(); - verify(mCM, times(1)).registerNetworkCallback( - any(NetworkRequest.class), any(NetworkCallback.class), any(Handler.class)); - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.updateMobileRequiresDun(true); - mUNM.registerMobileNetworkRequest(); - verify(mCM, times(1)).requestNetwork( - any(NetworkRequest.class), anyInt(), anyInt(), any(Handler.class), - any(NetworkCallback.class)); - - assertTrue(mUNM.mobileNetworkRequested()); - assertUpstreamTypeRequested(TYPE_MOBILE_DUN); - assertTrue(isDunRequested()); - - // Try a few things that must not result in any state change. - mUNM.registerMobileNetworkRequest(); - mUNM.updateMobileRequiresDun(true); - mUNM.registerMobileNetworkRequest(); - - assertTrue(mUNM.mobileNetworkRequested()); - assertUpstreamTypeRequested(TYPE_MOBILE_DUN); - assertTrue(isDunRequested()); - - mUNM.stop(); - verify(mCM, times(2)).unregisterNetworkCallback(any(NetworkCallback.class)); - - verifyNoMoreInteractions(mCM); - } - - @Test - public void testRequestsDunNetwork() throws Exception { - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.startObserveAllNetworks(); - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.updateMobileRequiresDun(true); - assertFalse(mUNM.mobileNetworkRequested()); - assertEquals(0, mCM.requested.size()); - - mUNM.registerMobileNetworkRequest(); - assertTrue(mUNM.mobileNetworkRequested()); - assertUpstreamTypeRequested(TYPE_MOBILE_DUN); - assertTrue(isDunRequested()); - - mUNM.stop(); - assertFalse(mUNM.mobileNetworkRequested()); - assertTrue(mCM.hasNoCallbacks()); - } - - @Test - public void testUpdateMobileRequiresDun() throws Exception { - mUNM.startObserveAllNetworks(); - - // Test going from no-DUN to DUN correctly re-registers callbacks. - mUNM.updateMobileRequiresDun(false); - mUNM.registerMobileNetworkRequest(); - assertTrue(mUNM.mobileNetworkRequested()); - assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI); - assertFalse(isDunRequested()); - mUNM.updateMobileRequiresDun(true); - assertTrue(mUNM.mobileNetworkRequested()); - assertUpstreamTypeRequested(TYPE_MOBILE_DUN); - assertTrue(isDunRequested()); - - // Test going from DUN to no-DUN correctly re-registers callbacks. - mUNM.updateMobileRequiresDun(false); - assertTrue(mUNM.mobileNetworkRequested()); - assertUpstreamTypeRequested(TYPE_MOBILE_HIPRI); - assertFalse(isDunRequested()); - - mUNM.stop(); - assertFalse(mUNM.mobileNetworkRequested()); - } - - @Test - public void testSelectPreferredUpstreamType() throws Exception { - final Collection<Integer> preferredTypes = new ArrayList<>(); - preferredTypes.add(TYPE_WIFI); - - mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr); - mUNM.startObserveAllNetworks(); - // There are no networks, so there is nothing to select. - assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes)); - - final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI); - wifiAgent.fakeConnect(); - // WiFi is up, we should prefer it. - assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes)); - wifiAgent.fakeDisconnect(); - // There are no networks, so there is nothing to select. - assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes)); - - final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR); - cellAgent.fakeConnect(); - assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes)); - - preferredTypes.add(TYPE_MOBILE_DUN); - // This is coupled with preferred types in TetheringConfiguration. - mUNM.updateMobileRequiresDun(true); - // DUN is available, but only use regular cell: no upstream selected. - assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes)); - preferredTypes.remove(TYPE_MOBILE_DUN); - // No WiFi, but our preferred flavour of cell is up. - preferredTypes.add(TYPE_MOBILE_HIPRI); - // This is coupled with preferred types in TetheringConfiguration. - mUNM.updateMobileRequiresDun(false); - assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI, - mUNM.selectPreferredUpstreamType(preferredTypes)); - // Check to see we filed an explicit request. - assertEquals(1, mCM.requested.size()); - NetworkRequest netReq = (NetworkRequest) mCM.requested.values().toArray()[0]; - assertTrue(netReq.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)); - assertFalse(netReq.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)); - // mobile is not permitted, we should not use HIPRI. - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false); - assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes)); - assertEquals(0, mCM.requested.size()); - // mobile change back to permitted, HIRPI should come back - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true); - assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI, - mUNM.selectPreferredUpstreamType(preferredTypes)); - - wifiAgent.fakeConnect(); - // WiFi is up, and we should prefer it over cell. - assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes)); - assertEquals(0, mCM.requested.size()); - - preferredTypes.remove(TYPE_MOBILE_HIPRI); - preferredTypes.add(TYPE_MOBILE_DUN); - // This is coupled with preferred types in TetheringConfiguration. - mUNM.updateMobileRequiresDun(true); - assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes)); - - final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR); - dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN); - dunAgent.fakeConnect(); - - // WiFi is still preferred. - assertSatisfiesLegacyType(TYPE_WIFI, mUNM.selectPreferredUpstreamType(preferredTypes)); - - // WiFi goes down, cell and DUN are still up but only DUN is preferred. - wifiAgent.fakeDisconnect(); - assertSatisfiesLegacyType(TYPE_MOBILE_DUN, - mUNM.selectPreferredUpstreamType(preferredTypes)); - // Check to see we filed an explicit request. - assertEquals(1, mCM.requested.size()); - netReq = (NetworkRequest) mCM.requested.values().toArray()[0]; - assertTrue(netReq.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)); - assertTrue(netReq.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)); - // mobile is not permitted, we should not use DUN. - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false); - assertSatisfiesLegacyType(TYPE_NONE, mUNM.selectPreferredUpstreamType(preferredTypes)); - assertEquals(0, mCM.requested.size()); - // mobile change back to permitted, DUN should come back - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true); - assertSatisfiesLegacyType(TYPE_MOBILE_DUN, - mUNM.selectPreferredUpstreamType(preferredTypes)); - } - - @Test - public void testGetCurrentPreferredUpstream() throws Exception { - mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr); - mUNM.startObserveAllNetworks(); - mUNM.updateMobileRequiresDun(false); - - // [0] Mobile connects, DUN not required -> mobile selected. - final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR); - cellAgent.fakeConnect(); - mCM.makeDefaultNetwork(cellAgent); - assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network); - - // [1] Mobile connects but not permitted -> null selected - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false); - assertEquals(null, mUNM.getCurrentPreferredUpstream()); - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(true); - - // [2] WiFi connects but not validated/promoted to default -> mobile selected. - final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI); - wifiAgent.fakeConnect(); - assertEquals(cellAgent.networkId, mUNM.getCurrentPreferredUpstream().network); - - // [3] WiFi validates and is promoted to the default network -> WiFi selected. - mCM.makeDefaultNetwork(wifiAgent); - assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network); - - // [4] DUN required, no other changes -> WiFi still selected - mUNM.updateMobileRequiresDun(true); - assertEquals(wifiAgent.networkId, mUNM.getCurrentPreferredUpstream().network); - - // [5] WiFi no longer validated, mobile becomes default, DUN required -> null selected. - mCM.makeDefaultNetwork(cellAgent); - assertEquals(null, mUNM.getCurrentPreferredUpstream()); - // TODO: make sure that a DUN request has been filed. This is currently - // triggered by code over in Tethering, but once that has been moved - // into UNM we should test for this here. - - // [6] DUN network arrives -> DUN selected - final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR); - dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN); - dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET); - dunAgent.fakeConnect(); - assertEquals(dunAgent.networkId, mUNM.getCurrentPreferredUpstream().network); - - // [7] Mobile is not permitted -> null selected - when(mEntitleMgr.isCellularUpstreamPermitted()).thenReturn(false); - assertEquals(null, mUNM.getCurrentPreferredUpstream()); - } - - @Test - public void testLocalPrefixes() throws Exception { - mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr); - mUNM.startObserveAllNetworks(); - - // [0] Test minimum set of local prefixes. - Set<IpPrefix> local = mUNM.getLocalPrefixes(); - assertTrue(local.isEmpty()); - - final Set<String> alreadySeen = new HashSet<>(); - - // [1] Pretend Wi-Fi connects. - final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI); - final LinkProperties wifiLp = wifiAgent.linkProperties; - wifiLp.setInterfaceName("wlan0"); - final String[] wifi_addrs = { - "fe80::827a:bfff:fe6f:374d", "100.112.103.18", - "2001:db8:4:fd00:827a:bfff:fe6f:374d", - "2001:db8:4:fd00:6dea:325a:fdae:4ef4", - "fd6a:a640:60bf:e985::123", // ULA address for good measure. - }; - for (String addrStr : wifi_addrs) { - final String cidr = addrStr.contains(":") ? "/64" : "/20"; - wifiLp.addLinkAddress(new LinkAddress(addrStr + cidr)); - } - wifiAgent.fakeConnect(); - wifiAgent.sendLinkProperties(); - - local = mUNM.getLocalPrefixes(); - assertPrefixSet(local, INCLUDES, alreadySeen); - final String[] wifiLinkPrefixes = { - // Link-local prefixes are excluded and dealt with elsewhere. - "100.112.96.0/20", "2001:db8:4:fd00::/64", "fd6a:a640:60bf:e985::/64", - }; - assertPrefixSet(local, INCLUDES, wifiLinkPrefixes); - Collections.addAll(alreadySeen, wifiLinkPrefixes); - assertEquals(alreadySeen.size(), local.size()); - - // [2] Pretend mobile connects. - final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR); - final LinkProperties cellLp = cellAgent.linkProperties; - cellLp.setInterfaceName("rmnet_data0"); - final String[] cell_addrs = { - "10.102.211.48", "2001:db8:0:1:b50e:70d9:10c9:433d", - }; - for (String addrStr : cell_addrs) { - final String cidr = addrStr.contains(":") ? "/64" : "/27"; - cellLp.addLinkAddress(new LinkAddress(addrStr + cidr)); - } - cellAgent.fakeConnect(); - cellAgent.sendLinkProperties(); - - local = mUNM.getLocalPrefixes(); - assertPrefixSet(local, INCLUDES, alreadySeen); - final String[] cellLinkPrefixes = { "10.102.211.32/27", "2001:db8:0:1::/64" }; - assertPrefixSet(local, INCLUDES, cellLinkPrefixes); - Collections.addAll(alreadySeen, cellLinkPrefixes); - assertEquals(alreadySeen.size(), local.size()); - - // [3] Pretend DUN connects. - final TestNetworkAgent dunAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR); - dunAgent.networkCapabilities.addCapability(NET_CAPABILITY_DUN); - dunAgent.networkCapabilities.removeCapability(NET_CAPABILITY_INTERNET); - final LinkProperties dunLp = dunAgent.linkProperties; - dunLp.setInterfaceName("rmnet_data1"); - final String[] dun_addrs = { - "192.0.2.48", "2001:db8:1:2:b50e:70d9:10c9:433d", - }; - for (String addrStr : dun_addrs) { - final String cidr = addrStr.contains(":") ? "/64" : "/27"; - dunLp.addLinkAddress(new LinkAddress(addrStr + cidr)); - } - dunAgent.fakeConnect(); - dunAgent.sendLinkProperties(); - - local = mUNM.getLocalPrefixes(); - assertPrefixSet(local, INCLUDES, alreadySeen); - final String[] dunLinkPrefixes = { "192.0.2.32/27", "2001:db8:1:2::/64" }; - assertPrefixSet(local, INCLUDES, dunLinkPrefixes); - Collections.addAll(alreadySeen, dunLinkPrefixes); - assertEquals(alreadySeen.size(), local.size()); - - // [4] Pretend Wi-Fi disconnected. It's addresses/prefixes should no - // longer be included (should be properly removed). - wifiAgent.fakeDisconnect(); - local = mUNM.getLocalPrefixes(); - assertPrefixSet(local, EXCLUDES, wifiLinkPrefixes); - assertPrefixSet(local, INCLUDES, cellLinkPrefixes); - assertPrefixSet(local, INCLUDES, dunLinkPrefixes); - - // [5] Pretend mobile disconnected. - cellAgent.fakeDisconnect(); - local = mUNM.getLocalPrefixes(); - assertPrefixSet(local, EXCLUDES, wifiLinkPrefixes); - assertPrefixSet(local, EXCLUDES, cellLinkPrefixes); - assertPrefixSet(local, INCLUDES, dunLinkPrefixes); - - // [6] Pretend DUN disconnected. - dunAgent.fakeDisconnect(); - local = mUNM.getLocalPrefixes(); - assertTrue(local.isEmpty()); - } - - @Test - public void testSelectMobileWhenMobileIsNotDefault() { - final Collection<Integer> preferredTypes = new ArrayList<>(); - // Mobile has higher pirority than wifi. - preferredTypes.add(TYPE_MOBILE_HIPRI); - preferredTypes.add(TYPE_WIFI); - mUNM.startTrackDefaultNetwork(sDefaultRequest, mEntitleMgr); - mUNM.startObserveAllNetworks(); - // Setup wifi and make wifi as default network. - final TestNetworkAgent wifiAgent = new TestNetworkAgent(mCM, TRANSPORT_WIFI); - wifiAgent.fakeConnect(); - mCM.makeDefaultNetwork(wifiAgent); - // Setup mobile network. - final TestNetworkAgent cellAgent = new TestNetworkAgent(mCM, TRANSPORT_CELLULAR); - cellAgent.fakeConnect(); - - assertSatisfiesLegacyType(TYPE_MOBILE_HIPRI, - mUNM.selectPreferredUpstreamType(preferredTypes)); - verify(mEntitleMgr, times(1)).maybeRunProvisioning(); - } - - private void assertSatisfiesLegacyType(int legacyType, UpstreamNetworkState ns) { - if (legacyType == TYPE_NONE) { - assertTrue(ns == null); - return; - } - - final NetworkCapabilities nc = - UpstreamNetworkMonitor.networkCapabilitiesForType(legacyType); - assertTrue(nc.satisfiedByNetworkCapabilities(ns.networkCapabilities)); - } - - private void assertUpstreamTypeRequested(int upstreamType) throws Exception { - assertEquals(1, mCM.requested.size()); - assertEquals(1, mCM.legacyTypeMap.size()); - assertEquals(Integer.valueOf(upstreamType), - mCM.legacyTypeMap.values().iterator().next()); - } - - private boolean isDunRequested() { - for (NetworkRequest req : mCM.requested.values()) { - if (req.networkCapabilities.hasCapability(NET_CAPABILITY_DUN)) { - return true; - } - } - return false; - } - - public static class TestConnectivityManager extends ConnectivityManager { - public Map<NetworkCallback, Handler> allCallbacks = new HashMap<>(); - public Set<NetworkCallback> trackingDefault = new HashSet<>(); - public TestNetworkAgent defaultNetwork = null; - public Map<NetworkCallback, NetworkRequest> listening = new HashMap<>(); - public Map<NetworkCallback, NetworkRequest> requested = new HashMap<>(); - public Map<NetworkCallback, Integer> legacyTypeMap = new HashMap<>(); - - private int mNetworkId = 100; - - public TestConnectivityManager(Context ctx, IConnectivityManager svc) { - super(ctx, svc); - } - - boolean hasNoCallbacks() { - return allCallbacks.isEmpty() - && trackingDefault.isEmpty() - && listening.isEmpty() - && requested.isEmpty() - && legacyTypeMap.isEmpty(); - } - - boolean onlyHasDefaultCallbacks() { - return (allCallbacks.size() == 1) - && (trackingDefault.size() == 1) - && listening.isEmpty() - && requested.isEmpty() - && legacyTypeMap.isEmpty(); - } - - boolean isListeningForAll() { - final NetworkCapabilities empty = new NetworkCapabilities(); - empty.clearAll(); - - for (NetworkRequest req : listening.values()) { - if (req.networkCapabilities.equalRequestableCapabilities(empty)) { - return true; - } - } - return false; - } - - int getNetworkId() { - return ++mNetworkId; - } - - void makeDefaultNetwork(TestNetworkAgent agent) { - if (Objects.equals(defaultNetwork, agent)) return; - - final TestNetworkAgent formerDefault = defaultNetwork; - defaultNetwork = agent; - - for (NetworkCallback cb : trackingDefault) { - if (defaultNetwork != null) { - cb.onAvailable(defaultNetwork.networkId); - cb.onCapabilitiesChanged( - defaultNetwork.networkId, defaultNetwork.networkCapabilities); - cb.onLinkPropertiesChanged( - defaultNetwork.networkId, defaultNetwork.linkProperties); - } - } - } - - @Override - public void requestNetwork(NetworkRequest req, NetworkCallback cb, Handler h) { - assertFalse(allCallbacks.containsKey(cb)); - allCallbacks.put(cb, h); - if (sDefaultRequest.equals(req)) { - assertFalse(trackingDefault.contains(cb)); - trackingDefault.add(cb); - } else { - assertFalse(requested.containsKey(cb)); - requested.put(cb, req); - } - } - - @Override - public void requestNetwork(NetworkRequest req, NetworkCallback cb) { - fail("Should never be called."); - } - - @Override - public void requestNetwork(NetworkRequest req, - int timeoutMs, int legacyType, Handler h, NetworkCallback cb) { - assertFalse(allCallbacks.containsKey(cb)); - allCallbacks.put(cb, h); - assertFalse(requested.containsKey(cb)); - requested.put(cb, req); - assertFalse(legacyTypeMap.containsKey(cb)); - if (legacyType != ConnectivityManager.TYPE_NONE) { - legacyTypeMap.put(cb, legacyType); - } - } - - @Override - public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb, Handler h) { - assertFalse(allCallbacks.containsKey(cb)); - allCallbacks.put(cb, h); - assertFalse(listening.containsKey(cb)); - listening.put(cb, req); - } - - @Override - public void registerNetworkCallback(NetworkRequest req, NetworkCallback cb) { - fail("Should never be called."); - } - - @Override - public void registerDefaultNetworkCallback(NetworkCallback cb, Handler h) { - fail("Should never be called."); - } - - @Override - public void registerDefaultNetworkCallback(NetworkCallback cb) { - fail("Should never be called."); - } - - @Override - public void unregisterNetworkCallback(NetworkCallback cb) { - if (trackingDefault.contains(cb)) { - trackingDefault.remove(cb); - } else if (listening.containsKey(cb)) { - listening.remove(cb); - } else if (requested.containsKey(cb)) { - requested.remove(cb); - legacyTypeMap.remove(cb); - } else { - fail("Unexpected callback removed"); - } - allCallbacks.remove(cb); - - assertFalse(allCallbacks.containsKey(cb)); - assertFalse(trackingDefault.contains(cb)); - assertFalse(listening.containsKey(cb)); - assertFalse(requested.containsKey(cb)); - } - } - - public static class TestNetworkAgent { - public final TestConnectivityManager cm; - public final Network networkId; - public final int transportType; - public final NetworkCapabilities networkCapabilities; - public final LinkProperties linkProperties; - - public TestNetworkAgent(TestConnectivityManager cm, int transportType) { - this.cm = cm; - this.networkId = new Network(cm.getNetworkId()); - this.transportType = transportType; - networkCapabilities = new NetworkCapabilities(); - networkCapabilities.addTransportType(transportType); - networkCapabilities.addCapability(NET_CAPABILITY_INTERNET); - linkProperties = new LinkProperties(); - } - - public void fakeConnect() { - for (NetworkCallback cb : cm.listening.keySet()) { - cb.onAvailable(networkId); - cb.onCapabilitiesChanged(networkId, copy(networkCapabilities)); - cb.onLinkPropertiesChanged(networkId, copy(linkProperties)); - } - } - - public void fakeDisconnect() { - for (NetworkCallback cb : cm.listening.keySet()) { - cb.onLost(networkId); - } - } - - public void sendLinkProperties() { - for (NetworkCallback cb : cm.listening.keySet()) { - cb.onLinkPropertiesChanged(networkId, copy(linkProperties)); - } - } - - @Override - public String toString() { - return String.format("TestNetworkAgent: %s %s", networkId, networkCapabilities); - } - } - - public static class TestStateMachine extends StateMachine { - public final ArrayList<Message> messages = new ArrayList<>(); - private final State mLoggingState = new LoggingState(); - - class LoggingState extends State { - @Override public void enter() { - messages.clear(); - } - - @Override public void exit() { - messages.clear(); - } - - @Override public boolean processMessage(Message msg) { - messages.add(msg); - return true; - } - } - - public TestStateMachine() { - super("UpstreamNetworkMonitor.TestStateMachine"); - addState(mLoggingState); - setInitialState(mLoggingState); - super.start(); - } - } - - static NetworkCapabilities copy(NetworkCapabilities nc) { - return new NetworkCapabilities(nc); - } - - static LinkProperties copy(LinkProperties lp) { - return new LinkProperties(lp); - } - - static void assertPrefixSet(Set<IpPrefix> prefixes, boolean expectation, String... expected) { - final Set<String> expectedSet = new HashSet<>(); - Collections.addAll(expectedSet, expected); - assertPrefixSet(prefixes, expectation, expectedSet); - } - - static void assertPrefixSet(Set<IpPrefix> prefixes, boolean expectation, Set<String> expected) { - for (String expectedPrefix : expected) { - final String errStr = expectation ? "did not find" : "found"; - assertEquals( - String.format("Failed expectation: %s prefix: %s", errStr, expectedPrefix), - expectation, prefixes.contains(new IpPrefix(expectedPrefix))); - } - } -} diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index a927fa2c4bd4..3ab3fd504ddc 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -38,6 +38,10 @@ "file_patterns": ["NotificationManagerService\\.java"] }, { + "name": "CtsScopedStorageCoreHostTest", + "file_patterns": ["StorageManagerService\\.java"] + }, + { "name": "CtsScopedStorageHostTest", "file_patterns": ["StorageManagerService\\.java"] } diff --git a/services/net/Android.bp b/services/net/Android.bp index afea1a073cab..6bc0eaff5459 100644 --- a/services/net/Android.bp +++ b/services/net/Android.bp @@ -66,5 +66,5 @@ filegroup { ":framework-annotations", "java/android/net/util/NetworkConstants.java", ], - visibility: ["//frameworks/base/packages/Tethering"], + visibility: ["//packages/modules/Connectivity/Tethering"], } diff --git a/services/tests/servicestests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java b/services/tests/servicestests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java index 7b88a0e012de..4f0cb324f17f 100644 --- a/services/tests/servicestests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/display/color/GlobalSaturationTintControllerTest.java @@ -32,9 +32,11 @@ public class GlobalSaturationTintControllerTest { public void setAndGetMatrix() { final GlobalSaturationTintController tintController = new GlobalSaturationTintController(); tintController.setMatrix(50); - assertThat(tintController.getMatrix()).hasValuesWithin(0.00001f) - .of(new float[]{0.6155f, 0.1155f, 0.1155f, 0.0f, 0.3575f, 0.85749996f, 0.3575f, - 0.0f, 0.036f, 0.036f, 0.536f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}); + assertThat(tintController.getMatrix()).usingTolerance(0.00001f) + .containsExactly( + 0.6155f, 0.1155f, 0.1155f, 0.0f, 0.3575f, 0.85749996f, 0.3575f, + 0.0f, 0.036f, 0.036f, 0.536f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f) + .inOrder(); } @Test @@ -43,6 +45,7 @@ public class GlobalSaturationTintControllerTest { tintController.setMatrix(100); final float[] matrix = new float[16]; Matrix.setIdentityM(matrix, 0); - assertThat(tintController.getMatrix()).hasValuesWithin(0.00001f).of(matrix); + assertThat(tintController.getMatrix()).usingTolerance(0.00001f) + .containsExactly(matrix).inOrder(); } } diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 3365ab740cde..6f6b04138e3d 100755 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -1654,7 +1654,6 @@ public final class Call { * @hide */ @SystemApi - @TestApi public void enterBackgroundAudioProcessing() { if (mState != STATE_ACTIVE && mState != STATE_RINGING) { throw new IllegalStateException("Call must be active or ringing"); @@ -1675,7 +1674,6 @@ public final class Call { * @hide */ @SystemApi - @TestApi public void exitBackgroundAudioProcessing(boolean shouldRing) { if (mState != STATE_AUDIO_PROCESSING) { throw new IllegalStateException("Call must in the audio processing state"); diff --git a/telecomm/java/android/telecom/CallScreeningService.java b/telecomm/java/android/telecom/CallScreeningService.java index 8abab90f775f..097a00d890c7 100644 --- a/telecomm/java/android/telecom/CallScreeningService.java +++ b/telecomm/java/android/telecom/CallScreeningService.java @@ -19,7 +19,6 @@ package android.telecom; import android.annotation.NonNull; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.ComponentName; import android.content.Intent; @@ -301,7 +300,6 @@ public abstract class CallScreeningService extends Service { * @hide */ @SystemApi - @TestApi public @NonNull Builder setShouldScreenCallViaAudioProcessing( boolean shouldScreenCallViaAudioProcessing) { mShouldScreenCallViaAudioProcessing = shouldScreenCallViaAudioProcessing; diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java index d9605522b3b0..2b09dee50653 100644 --- a/telecomm/java/android/telecom/Conference.java +++ b/telecomm/java/android/telecom/Conference.java @@ -24,7 +24,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; @@ -137,7 +136,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @NonNull String getTelecomCallId() { return mTelecomCallId; } @@ -614,7 +612,6 @@ public abstract class Conference extends Conferenceable { * @return The primary connection. * @hide */ - @TestApi @SystemApi public Connection getPrimaryConnection() { if (mUnmodifiableChildConnections == null || mUnmodifiableChildConnections.isEmpty()) { @@ -1018,7 +1015,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public void setConferenceState(boolean isConference) { mIsMultiparty = isConference; @@ -1073,7 +1069,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public final void setAddress(@NonNull Uri address, @TelecomManager.Presentation int presentation) { @@ -1161,7 +1156,6 @@ public abstract class Conference extends Conferenceable { * @hide */ @SystemApi - @TestApi public final void setCallerDisplayName(@NonNull String callerDisplayName, @TelecomManager.Presentation int presentation) { Log.d(this, "setCallerDisplayName %s", callerDisplayName); diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index fa9909547fc4..7e824fceb392 100755..100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -25,7 +25,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Notification; import android.bluetooth.BluetoothDevice; import android.compat.annotation.UnsupportedAppUsage; @@ -307,7 +306,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int CAPABILITY_SPEED_UP_MT_AUDIO = 0x00040000; /** @@ -345,7 +343,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int CAPABILITY_CONFERENCE_HAS_NO_CHILDREN = 0x00200000; /** @@ -415,7 +412,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 1<<0; /** @@ -426,7 +422,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_GENERIC_CONFERENCE = 1<<1; /** @@ -478,7 +473,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_IS_DOWNGRADED_CONFERENCE = 1<<6; /** @@ -522,7 +516,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final int PROPERTY_REMOTELY_HOSTED = 1 << 11; /** @@ -701,7 +694,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public static final String EXTRA_DISABLE_ADD_CALL = "android.telecom.extra.DISABLE_ADD_CALL"; @@ -2053,7 +2045,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @Nullable String getTelecomCallId() { return mTelecomCallId; } @@ -2170,7 +2161,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @IntRange(from = 0) long getConnectTimeMillis() { return mConnectTimeMillis; } @@ -2195,7 +2185,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final @ElapsedRealtimeLong long getConnectionStartElapsedRealtimeMillis() { return mConnectElapsedTimeMillis; } @@ -2278,7 +2267,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public void setTelecomCallId(@NonNull String callId) { mTelecomCallId = callId; } @@ -2627,7 +2615,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public final void setConnectTimeMillis(@IntRange(from = 0) long connectTimeMillis) { mConnectTimeMillis = connectTimeMillis; @@ -2650,7 +2637,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public final void setConnectionStartElapsedRealtimeMillis( @ElapsedRealtimeLong long connectElapsedTimeMillis) { @@ -2721,7 +2707,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public final void resetConnectionTime() { for (Listener l : mListeners) { l.onConnectionTimeReset(this); @@ -3505,7 +3490,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public void setPhoneAccountHandle(@NonNull PhoneAccountHandle phoneAccountHandle) { if (mPhoneAccountHandle != phoneAccountHandle) { mPhoneAccountHandle = phoneAccountHandle; @@ -3524,7 +3508,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public @Nullable PhoneAccountHandle getPhoneAccountHandle() { return mPhoneAccountHandle; } @@ -3590,7 +3573,6 @@ public abstract class Connection extends Conferenceable { * @hide */ @SystemApi - @TestApi public void setCallDirection(@Call.Details.CallDirection int callDirection) { mCallDirection = callDirection; } diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java index 6d7ceca0a2cd..b73ef9b794e4 100644 --- a/telecomm/java/android/telecom/ConnectionRequest.java +++ b/telecomm/java/android/telecom/ConnectionRequest.java @@ -327,7 +327,6 @@ public final class ConnectionRequest implements Parcelable { * @hide */ @SystemApi - @TestApi public @Nullable String getTelecomCallId() { return mTelecomCallId; } diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index 768c8eebf067..1cb8b2e59a5f 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -21,7 +21,6 @@ import static android.Manifest.permission.MODIFY_PHONE_STATE; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.graphics.drawable.Icon; import android.net.Uri; @@ -619,7 +618,6 @@ public final class PhoneAccount implements Parcelable { * @hide */ @SystemApi - @TestApi @RequiresPermission(MODIFY_PHONE_STATE) public @NonNull Builder setGroupId(@NonNull String groupId) { if (groupId != null) { diff --git a/telecomm/java/android/telecom/PhoneAccountSuggestionService.java b/telecomm/java/android/telecom/PhoneAccountSuggestionService.java index ba3822cb9951..8a91b9e9ee81 100644 --- a/telecomm/java/android/telecom/PhoneAccountSuggestionService.java +++ b/telecomm/java/android/telecom/PhoneAccountSuggestionService.java @@ -19,7 +19,6 @@ package android.telecom; import android.annotation.NonNull; import android.annotation.SdkConstant; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.IBinder; @@ -57,7 +56,6 @@ import java.util.Map; * @hide */ @SystemApi -@TestApi public class PhoneAccountSuggestionService extends Service { /** * The {@link Intent} that must be declared in the {@code intent-filter} element of the diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index f2f14125ef6b..76d95f6ca013 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -25,7 +25,6 @@ import android.annotation.SuppressAutoDoc; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -691,7 +690,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_OFF = 0; @@ -701,7 +699,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_FULL = 1; @@ -712,7 +709,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_HCO = 2; @@ -723,7 +719,6 @@ public class TelecomManager { * * @hide */ - @TestApi @SystemApi public static final int TTY_MODE_VCO = 3; @@ -1016,7 +1011,6 @@ public class TelecomManager { * @hide */ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) - @TestApi @SystemApi public void setUserSelectedOutgoingPhoneAccount(@Nullable PhoneAccountHandle accountHandle) { try { @@ -1190,7 +1184,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_PRIVILEGED_PHONE_STATE) public @NonNull List<PhoneAccountHandle> getCallCapablePhoneAccounts( boolean includeDisabledAccounts) { @@ -1421,7 +1414,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_PRIVILEGED_PHONE_STATE) public @Nullable String getDefaultDialerPackage(@NonNull UserHandle userHandle) { try { @@ -1802,7 +1794,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(READ_PRIVILEGED_PHONE_STATE) public @TtyMode int getCurrentTtyMode() { try { @@ -2215,7 +2206,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @NonNull public Intent createLaunchEmergencyDialerIntent(@Nullable String number) { ITelecomService service = getTelecomService(); @@ -2368,7 +2358,6 @@ public class TelecomManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean isInEmergencyCall() { try { diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java index 39a754389254..d01297147fdb 100644 --- a/telephony/java/android/telephony/AccessNetworkConstants.java +++ b/telephony/java/android/telephony/AccessNetworkConstants.java @@ -18,7 +18,6 @@ package android.telephony; import android.annotation.IntDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.hardware.radio.V1_1.GeranBands; import android.hardware.radio.V1_5.AccessNetwork; import android.hardware.radio.V1_5.EutranBands; @@ -49,7 +48,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int TRANSPORT_TYPE_INVALID = -1; /** @@ -438,7 +436,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int FREQUENCY_RANGE_GROUP_UNKNOWN = 0; /** @@ -447,7 +444,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int FREQUENCY_RANGE_GROUP_1 = 1; /** @@ -456,7 +452,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static final int FREQUENCY_RANGE_GROUP_2 = 2; /** @@ -481,7 +476,6 @@ public final class AccessNetworkConstants { * @hide */ @SystemApi - @TestApi public static @FrequencyRangeGroup int getFrequencyRangeGroup(@NgranBand int band) { switch (band) { case BAND_1: diff --git a/telephony/java/android/telephony/BarringInfo.java b/telephony/java/android/telephony/BarringInfo.java index 92423a2f2218..e9698adc0356 100644 --- a/telephony/java/android/telephony/BarringInfo.java +++ b/telephony/java/android/telephony/BarringInfo.java @@ -252,7 +252,6 @@ public final class BarringInfo implements Parcelable { private SparseArray<BarringServiceInfo> mBarringServiceInfos; /** @hide */ - @TestApi @SystemApi public BarringInfo() { mBarringServiceInfos = new SparseArray<>(); diff --git a/telephony/java/android/telephony/CallQuality.java b/telephony/java/android/telephony/CallQuality.java index 1c82e96a0183..ff6a9bb5ba4b 100644 --- a/telephony/java/android/telephony/CallQuality.java +++ b/telephony/java/android/telephony/CallQuality.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -41,7 +40,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class CallQuality implements Parcelable { // Constants representing the call quality level (see #CallQuality); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 3d455d51dd7f..11af8e05955d 100755..100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -23,7 +23,6 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -4426,7 +4425,6 @@ public class CarrierConfigManager { */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) @SystemApi - @TestApi public void overrideConfig(int subscriptionId, @Nullable PersistableBundle overrideValues) { overrideConfig(subscriptionId, overrideValues, false); } diff --git a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java index c667165e7a0e..0e30225a3321 100644 --- a/telephony/java/android/telephony/DataSpecificRegistrationInfo.java +++ b/telephony/java/android/telephony/DataSpecificRegistrationInfo.java @@ -19,7 +19,6 @@ package android.telephony; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -31,7 +30,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class DataSpecificRegistrationInfo implements Parcelable { /** * @hide diff --git a/telephony/java/android/telephony/LteVopsSupportInfo.java b/telephony/java/android/telephony/LteVopsSupportInfo.java index 7994c1b05977..83e41bf3df3b 100644 --- a/telephony/java/android/telephony/LteVopsSupportInfo.java +++ b/telephony/java/android/telephony/LteVopsSupportInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import java.util.Objects; * @hide */ @SystemApi -@TestApi public final class LteVopsSupportInfo implements Parcelable { /**@hide*/ diff --git a/telephony/java/android/telephony/NetworkRegistrationInfo.java b/telephony/java/android/telephony/NetworkRegistrationInfo.java index 93fbb00ff9d5..622ef137f494 100644 --- a/telephony/java/android/telephony/NetworkRegistrationInfo.java +++ b/telephony/java/android/telephony/NetworkRegistrationInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.telephony.AccessNetworkConstants.TransportType; @@ -71,37 +70,37 @@ public final class NetworkRegistrationInfo implements Parcelable { * Not registered. The device is not currently searching a new operator to register. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING = 0; /** * Registered on home network. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_HOME = 1; /** * Not registered. The device is currently searching a new operator to register. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_NOT_REGISTERED_SEARCHING = 2; /** * Registration denied. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_DENIED = 3; /** * Registration state is unknown. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_UNKNOWN = 4; /** * Registered on roaming network. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int REGISTRATION_STATE_ROAMING = 5; /** @hide */ @@ -383,7 +382,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * * @hide */ - @SystemApi @TestApi + @SystemApi public @RegistrationState int getRegistrationState() { return mRegistrationState; } @@ -448,7 +447,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return the current network roaming type. * @hide */ - @SystemApi @TestApi + @SystemApi public @ServiceState.RoamingType int getRoamingType() { return mRoamingType; } @@ -457,7 +456,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return Whether emergency is enabled. * @hide */ - @SystemApi @TestApi + @SystemApi public boolean isEmergencyEnabled() { return mEmergencyOnly; } /** @@ -497,7 +496,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * 10.5.3.6 for UMTS, 3GPP TS 24.301 9.9.3.9 for LTE, and 3GPP2 A.S0001 6.2.2.44 for CDMA * @hide */ - @SystemApi @TestApi + @SystemApi public int getRejectCause() { return mRejectCause; } @@ -523,7 +522,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @hide */ @Nullable - @SystemApi @TestApi + @SystemApi public DataSpecificRegistrationInfo getDataSpecificInfo() { return mDataSpecificInfo; } @@ -654,7 +653,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mDomain); dest.writeInt(mTransportType); @@ -745,7 +744,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * </code></pre> * @hide */ - @SystemApi @TestApi + @SystemApi public static final class Builder { @Domain private int mDomain; @@ -850,7 +849,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return The same instance of the builder. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull Builder setEmergencyOnly(boolean emergencyOnly) { mEmergencyOnly = emergencyOnly; return this; @@ -864,7 +863,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return The same instance of the builder. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull Builder setAvailableServices( @NonNull @ServiceType List<Integer> availableServices) { mAvailableServices = availableServices; @@ -879,7 +878,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return The same instance of the builder. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull Builder setCellIdentity(@Nullable CellIdentity cellIdentity) { mCellIdentity = cellIdentity; return this; @@ -902,7 +901,7 @@ public final class NetworkRegistrationInfo implements Parcelable { * @return the NetworkRegistrationInfo object. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull NetworkRegistrationInfo build() { return new NetworkRegistrationInfo(mDomain, mTransportType, mRegistrationState, mAccessNetworkTechnology, mRejectCause, mEmergencyOnly, mAvailableServices, diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index ec9940836afe..58e368bcc444 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -2239,7 +2239,6 @@ public class PhoneNumberUtils { * @hide */ @SystemApi - @TestApi public static boolean isVoiceMailNumber(@NonNull Context context, int subId, @Nullable String number) { String vmNumber, mdn; @@ -2728,7 +2727,6 @@ public class PhoneNumberUtils { * @return true if number contains @ */ @SystemApi - @TestApi public static boolean isUriNumber(@Nullable String number) { // Note we allow either "@" or "%40" to indicate a URI, in case // the passed-in string is URI-escaped. (Neither "@" nor "%40" @@ -2747,7 +2745,6 @@ public class PhoneNumberUtils { * @hide */ @SystemApi - @TestApi public static @NonNull String getUsernameFromUriNumber(@NonNull String number) { // The delimiter between username and domain name can be // either "@" or "%40" (the URI-escaped equivalent.) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index e9ee06c246ba..45070f672483 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -32,7 +32,6 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressAutoDoc; import android.annotation.SystemApi; import android.annotation.SystemService; -import android.annotation.TestApi; import android.app.PendingIntent; import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; @@ -280,7 +279,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_ENABLED_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc"); /** @@ -300,7 +298,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri ADVANCED_CALLING_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "advanced_calling"); @@ -319,7 +316,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_MODE_CONTENT_URI = Uri.withAppendedPath(CONTENT_URI, "wfc_mode"); /** @@ -337,7 +333,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_ROAMING_MODE_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "wfc_roaming_mode"); @@ -357,7 +352,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri VT_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "vt_enabled"); @@ -376,7 +370,6 @@ public class SubscriptionManager { */ @NonNull @SystemApi - @TestApi public static final Uri WFC_ROAMING_ENABLED_CONTENT_URI = Uri.withAppendedPath( CONTENT_URI, "wfc_roaming_enabled"); @@ -1963,7 +1956,6 @@ public class SubscriptionManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int subscriptionId) { if (VDBG) logd("setDefaultVoiceSubId sub id = " + subscriptionId); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 3d51d7cf7af7..975fe41cdeaa 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -8508,13 +8508,13 @@ public class TelephonyManager { /** * Values used to return status for hasCarrierPrivileges call. */ - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_HAS_ACCESS = 1; - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_NO_ACCESS = 0; - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_RULES_NOT_LOADED = -1; - /** @hide */ @SystemApi @TestApi + /** @hide */ @SystemApi public static final int CARRIER_PRIVILEGE_STATUS_ERROR_LOADING_RULES = -2; /** @@ -8716,7 +8716,6 @@ public class TelephonyManager { /** @hide */ @SystemApi - @TestApi @SuppressLint("Doclava125") public int checkCarrierPrivilegesForPackage(String pkgName) { try { @@ -8749,7 +8748,6 @@ public class TelephonyManager { /** @hide */ @SystemApi - @TestApi public List<String> getCarrierPackageNamesForIntent(Intent intent) { return getCarrierPackageNamesForIntentAndPhone(intent, getPhoneId()); } @@ -10258,7 +10256,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS) public @Nullable ComponentName getAndUpdateDefaultRespondViaMessageApplication() { return SmsApplication.getDefaultRespondViaMessageApplication(mContext, true); @@ -10271,7 +10268,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.INTERACT_ACROSS_USERS) public @Nullable ComponentName getDefaultRespondViaMessageApplication() { return SmsApplication.getDefaultRespondViaMessageApplication(mContext, false); @@ -11886,7 +11882,6 @@ public class TelephonyManager { * * @hide */ - @TestApi @SystemApi public static final int INVALID_EMERGENCY_NUMBER_DB_VERSION = -1; @@ -11926,7 +11921,6 @@ public class TelephonyManager { */ @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) @SystemApi - @TestApi public void updateOtaEmergencyNumberDbFilePath( @NonNull ParcelFileDescriptor otaParcelFileDescriptor) { try { @@ -11952,7 +11946,6 @@ public class TelephonyManager { */ @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) @SystemApi - @TestApi public void resetOtaEmergencyNumberDbFilePath() { try { ITelephony telephony = getITelephony(); @@ -12173,7 +12166,6 @@ public class TelephonyManager { * * @hide */ - @TestApi @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getEmergencyNumberDbVersion() { @@ -12901,7 +12893,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull List<RadioAccessSpecifier> specifiers, @NonNull @CallbackExecutor Executor executor, @@ -12919,7 +12910,6 @@ public class TelephonyManager { * @hide */ @SystemApi - @TestApi @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSystemSelectionChannels(@NonNull List<RadioAccessSpecifier> specifiers) { Objects.requireNonNull(specifiers, "Specifiers must not be null."); diff --git a/telephony/java/android/telephony/ims/ImsCallForwardInfo.java b/telephony/java/android/telephony/ims/ImsCallForwardInfo.java index d53a2e6591a2..3f9c8d26ca91 100644 --- a/telephony/java/android/telephony/ims/ImsCallForwardInfo.java +++ b/telephony/java/android/telephony/ims/ImsCallForwardInfo.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -33,7 +32,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ImsCallForwardInfo implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/ImsCallProfile.java b/telephony/java/android/telephony/ims/ImsCallProfile.java index f31fcf4050ea..47a0ab61f970 100644 --- a/telephony/java/android/telephony/ims/ImsCallProfile.java +++ b/telephony/java/android/telephony/ims/ImsCallProfile.java @@ -48,7 +48,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public final class ImsCallProfile implements Parcelable { private static final String TAG = "ImsCallProfile"; diff --git a/telephony/java/android/telephony/ims/ImsCallSessionListener.java b/telephony/java/android/telephony/ims/ImsCallSessionListener.java index 81af99fb40b7..b3907ff7c066 100644 --- a/telephony/java/android/telephony/ims/ImsCallSessionListener.java +++ b/telephony/java/android/telephony/ims/ImsCallSessionListener.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.telephony.Annotation; import android.telephony.CallQuality; @@ -40,7 +39,6 @@ import com.android.ims.internal.IImsCallSession; // TODO: APIs in here do not conform to API guidelines yet. This can be changed if // ImsCallSessionListenerConverter is also changed. @SystemApi -@TestApi public class ImsCallSessionListener { private final IImsCallSessionListener mListener; diff --git a/telephony/java/android/telephony/ims/ImsConferenceState.java b/telephony/java/android/telephony/ims/ImsConferenceState.java index 21bef001efae..13f1a79c1040 100644 --- a/telephony/java/android/telephony/ims/ImsConferenceState.java +++ b/telephony/java/android/telephony/ims/ImsConferenceState.java @@ -18,7 +18,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -38,7 +37,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi public final class ImsConferenceState implements Parcelable { private static final String TAG = "ImsConferenceState"; /** diff --git a/telephony/java/android/telephony/ims/ImsException.java b/telephony/java/android/telephony/ims/ImsException.java index 1c3d58d98b4a..50fb828ea217 100644 --- a/telephony/java/android/telephony/ims/ImsException.java +++ b/telephony/java/android/telephony/ims/ImsException.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.IntDef; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.pm.PackageManager; import android.telephony.SubscriptionManager; import android.text.TextUtils; @@ -83,7 +82,6 @@ public final class ImsException extends Exception { * @hide */ @SystemApi - @TestApi public ImsException(@Nullable String message) { super(getMessage(message, CODE_ERROR_UNSPECIFIED)); } @@ -94,7 +92,6 @@ public final class ImsException extends Exception { * @hide */ @SystemApi - @TestApi public ImsException(@Nullable String message, @ImsErrorCode int code) { super(getMessage(message, code)); mCode = code; @@ -108,7 +105,6 @@ public final class ImsException extends Exception { * @hide */ @SystemApi - @TestApi public ImsException(@Nullable String message, @ImsErrorCode int code, @Nullable Throwable cause) { super(getMessage(message, code), cause); diff --git a/telephony/java/android/telephony/ims/ImsExternalCallState.java b/telephony/java/android/telephony/ims/ImsExternalCallState.java index 7d73165d4540..fdf636c323b6 100644 --- a/telephony/java/android/telephony/ims/ImsExternalCallState.java +++ b/telephony/java/android/telephony/ims/ImsExternalCallState.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -35,7 +34,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ImsExternalCallState implements Parcelable { private static final String TAG = "ImsExternalCallState"; diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java index f6c14e67306b..9300a1cbc55c 100644 --- a/telephony/java/android/telephony/ims/ImsMmTelManager.java +++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java @@ -25,7 +25,6 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressAutoDoc; import android.annotation.SuppressLint; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Binder; import android.os.RemoteException; import android.os.ServiceSpecificException; @@ -96,7 +95,7 @@ public class ImsMmTelManager implements RegistrationManager { */ // Do not add to this class, add to RegistrationManager.RegistrationCallback instead. @Deprecated - @SystemApi @TestApi + @SystemApi public static class RegistrationCallback extends RegistrationManager.RegistrationCallback { /** @@ -230,7 +229,6 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @SystemApi - @TestApi @Deprecated @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236). @RequiresPermission(anyOf = { @@ -279,7 +277,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @Deprecated - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull @CallbackExecutor Executor executor, @NonNull RegistrationCallback c) throws ImsException { @@ -365,7 +363,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @Deprecated - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull RegistrationCallback c) { if (c == null) { @@ -421,7 +419,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @Override - @SystemApi @TestApi + @SystemApi @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull @CallbackExecutor Executor executor, @NonNull @ImsRegistrationState Consumer<Integer> stateCallback) { @@ -680,7 +678,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) - @SystemApi @TestApi + @SystemApi public void setAdvancedCallingSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); if (iTelephony == null) { @@ -724,7 +722,7 @@ public class ImsMmTelManager implements RegistrationManager { * @hide */ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) - @SystemApi @TestApi + @SystemApi public boolean isCapable(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int imsRegTech) { ITelephony iTelephony = getITelephony(); @@ -757,7 +755,7 @@ public class ImsMmTelManager implements RegistrationManager { * otherwise. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int imsRegTech) { @@ -789,7 +787,7 @@ public class ImsMmTelManager implements RegistrationManager { * available. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void isSupported(@MmTelFeature.MmTelCapabilities.MmTelCapability int capability, @AccessNetworkConstants.TransportType int transportType, @@ -878,7 +876,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #isVtSettingEnabled() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVtSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -953,7 +951,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #isVoWiFiSettingEnabled() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -1031,7 +1029,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #isVoWiFiRoamingSettingEnabled() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingSettingEnabled(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -1068,7 +1066,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #setVoWiFiSettingEnabled(boolean) * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiNonPersistent(boolean isCapable, int mode) { ITelephony iTelephony = getITelephony(); @@ -1151,7 +1149,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #getVoWiFiModeSetting() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiModeSetting(@WiFiCallingMode int mode) { ITelephony iTelephony = getITelephony(); @@ -1187,7 +1185,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #setVoWiFiRoamingSettingEnabled(boolean) * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public @WiFiCallingMode int getVoWiFiRoamingModeSetting() { ITelephony iTelephony = getITelephony(); @@ -1223,7 +1221,7 @@ public class ImsMmTelManager implements RegistrationManager { * @see #getVoWiFiRoamingModeSetting() * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setVoWiFiRoamingModeSetting(@WiFiCallingMode int mode) { ITelephony iTelephony = getITelephony(); @@ -1257,7 +1255,7 @@ public class ImsMmTelManager implements RegistrationManager { * @param isEnabled if true RTT should be enabled during calls made on this subscription. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setRttCapabilitySetting(boolean isEnabled) { ITelephony iTelephony = getITelephony(); @@ -1337,7 +1335,7 @@ public class ImsMmTelManager implements RegistrationManager { * the IMS service is not available. * @hide */ - @SystemApi @TestApi + @SystemApi @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getFeatureState(@NonNull @CallbackExecutor Executor executor, @NonNull @ImsFeature.ImsState Consumer<Integer> callback) throws ImsException { diff --git a/telephony/java/android/telephony/ims/ImsService.java b/telephony/java/android/telephony/ims/ImsService.java index 2b3072eefe2e..20736ee3287f 100644 --- a/telephony/java/android/telephony/ims/ImsService.java +++ b/telephony/java/android/telephony/ims/ImsService.java @@ -17,7 +17,6 @@ package android.telephony.ims; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.IBinder; @@ -92,7 +91,6 @@ import com.android.internal.annotations.VisibleForTesting; * @hide */ @SystemApi -@TestApi public class ImsService extends Service { private static final String LOG_TAG = "ImsService"; @@ -369,4 +367,4 @@ public class ImsService extends Service { public ImsRegistrationImplBase getRegistration(int slotId) { return new ImsRegistrationImplBase(); } -}
\ No newline at end of file +} diff --git a/telephony/java/android/telephony/ims/ImsSsData.java b/telephony/java/android/telephony/ims/ImsSsData.java index 70bf0c57366d..fb8e5d37875b 100644 --- a/telephony/java/android/telephony/ims/ImsSsData.java +++ b/telephony/java/android/telephony/ims/ImsSsData.java @@ -19,7 +19,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -37,7 +36,6 @@ import java.util.List; * {@hide} */ @SystemApi -@TestApi public final class ImsSsData implements Parcelable { private static final String TAG = ImsSsData.class.getCanonicalName(); diff --git a/telephony/java/android/telephony/ims/ImsSsInfo.java b/telephony/java/android/telephony/ims/ImsSsInfo.java index 9cce95fc67f8..27b56b8c5b47 100644 --- a/telephony/java/android/telephony/ims/ImsSsInfo.java +++ b/telephony/java/android/telephony/ims/ImsSsInfo.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -38,7 +37,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public final class ImsSsInfo implements Parcelable { /**@hide*/ diff --git a/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java b/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java index b70fd649ab79..131cb1a505fb 100644 --- a/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java +++ b/telephony/java/android/telephony/ims/ImsStreamMediaProfile.java @@ -18,7 +18,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.os.Parcel; import android.os.Parcelable; @@ -30,7 +29,6 @@ import android.os.Parcelable; * @hide */ @SystemApi -@TestApi public final class ImsStreamMediaProfile implements Parcelable { private static final String TAG = "ImsStreamMediaProfile"; diff --git a/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java b/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java index f67f68e2e425..16303685d0a3 100644 --- a/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java +++ b/telephony/java/android/telephony/ims/ImsSuppServiceNotification.java @@ -19,7 +19,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -32,7 +31,6 @@ import java.util.Arrays; * @hide */ @SystemApi -@TestApi public final class ImsSuppServiceNotification implements Parcelable { private static final String TAG = "ImsSuppServiceNotification"; diff --git a/telephony/java/android/telephony/ims/ImsUtListener.java b/telephony/java/android/telephony/ims/ImsUtListener.java index 460a032ce7e0..baa0576cdf13 100644 --- a/telephony/java/android/telephony/ims/ImsUtListener.java +++ b/telephony/java/android/telephony/ims/ImsUtListener.java @@ -18,7 +18,6 @@ package android.telephony.ims; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.RemoteException; import android.telephony.ims.stub.ImsUtImplBase; @@ -34,7 +33,6 @@ import com.android.ims.internal.IImsUtListener; // DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you // will break other implementations of ImsUt maintained by other ImsServices. @SystemApi -@TestApi public class ImsUtListener { /** diff --git a/telephony/java/android/telephony/ims/ImsVideoCallProvider.java b/telephony/java/android/telephony/ims/ImsVideoCallProvider.java index 569c6d5a4e4d..2fca4096f447 100644 --- a/telephony/java/android/telephony/ims/ImsVideoCallProvider.java +++ b/telephony/java/android/telephony/ims/ImsVideoCallProvider.java @@ -17,14 +17,12 @@ package android.telephony.ims; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.compat.annotation.UnsupportedAppUsage; import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.RemoteException; -import android.telecom.Connection; import android.telecom.VideoProfile; import android.telecom.VideoProfile.CameraCapabilities; import android.view.Surface; @@ -37,7 +35,6 @@ import com.android.internal.os.SomeArgs; * @hide */ @SystemApi -@TestApi public abstract class ImsVideoCallProvider { private static final int MSG_SET_CALLBACK = 1; private static final int MSG_SET_CAMERA = 2; diff --git a/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java index 1a606b7ae6a7..48d14b13854b 100644 --- a/telephony/java/android/telephony/ims/ProvisioningManager.java +++ b/telephony/java/android/telephony/ims/ProvisioningManager.java @@ -23,7 +23,6 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.StringDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.annotation.WorkerThread; import android.os.Binder; import android.os.RemoteException; @@ -59,7 +58,6 @@ import java.util.concurrent.Executor; * @hide */ @SystemApi -@TestApi public class ProvisioningManager { /**@hide*/ diff --git a/telephony/java/android/telephony/ims/RcsUceAdapter.java b/telephony/java/android/telephony/ims/RcsUceAdapter.java index ec112790a144..94113b4d9702 100644 --- a/telephony/java/android/telephony/ims/RcsUceAdapter.java +++ b/telephony/java/android/telephony/ims/RcsUceAdapter.java @@ -22,7 +22,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.net.Uri; import android.os.Binder; @@ -31,7 +30,6 @@ import android.os.RemoteException; import android.telephony.TelephonyFrameworkInitializer; import android.telephony.ims.aidl.IImsRcsController; import android.telephony.ims.aidl.IRcsUceControllerCallback; -import android.telephony.ims.feature.RcsFeature; import android.util.Log; import java.lang.annotation.Retention; @@ -380,7 +378,6 @@ public class RcsUceAdapter { * @hide */ @SystemApi - @TestApi @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean isEnabled) throws ImsException { IImsRcsController imsRcsController = getIImsRcsController(); diff --git a/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java b/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java index 1918bcb00733..87a5094a95f3 100644 --- a/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java +++ b/telephony/java/android/telephony/ims/feature/CapabilityChangeRequest.java @@ -18,7 +18,6 @@ package android.telephony.ims.feature; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.telephony.ims.stub.ImsRegistrationImplBase; @@ -34,7 +33,6 @@ import java.util.Set; * {@hide} */ @SystemApi -@TestApi public final class CapabilityChangeRequest implements Parcelable { /** diff --git a/telephony/java/android/telephony/ims/feature/ImsFeature.java b/telephony/java/android/telephony/ims/feature/ImsFeature.java index e5779b315c93..b0a7b62c88ab 100644 --- a/telephony/java/android/telephony/ims/feature/ImsFeature.java +++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java @@ -44,7 +44,6 @@ import java.util.Map; * @hide */ @SystemApi -@TestApi public abstract class ImsFeature { private static final String LOG_TAG = "ImsFeature"; @@ -62,19 +61,19 @@ public abstract class ImsFeature { * CSFB for emergency calling. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int FEATURE_EMERGENCY_MMTEL = 0; /** * This feature supports the MMTEL feature. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int FEATURE_MMTEL = 1; /** * This feature supports the RCS feature. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int FEATURE_RCS = 2; /** * Total number of features defined @@ -124,7 +123,7 @@ public abstract class ImsFeature { * during this time will result in an {@link IllegalStateException}. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int STATE_UNAVAILABLE = 0; /** * This {@link ImsFeature} state is initializing and should not be communicated with. This will @@ -132,14 +131,14 @@ public abstract class ImsFeature { * during this time will result in an {@link IllegalStateException}. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int STATE_INITIALIZING = 1; /** * This {@link ImsFeature} is ready for communication. Do not attempt to call framework methods * until {@see #onFeatureReady()} is called. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int STATE_READY = 2; /** @@ -169,13 +168,13 @@ public abstract class ImsFeature { * The capability was unable to be changed. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int CAPABILITY_ERROR_GENERIC = -1; /** * The capability was able to be changed. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int CAPABILITY_SUCCESS = 0; /** @@ -349,7 +348,7 @@ public abstract class ImsFeature { * subscription IDs associated with this slot. * @hide */ - @SystemApi @TestApi + @SystemApi public final int getSlotIndex() { return mSlotId; } @@ -359,7 +358,7 @@ public abstract class ImsFeature { * or {@link #STATE_UNAVAILABLE} if it has not been updated yet. * @hide */ - @SystemApi @TestApi + @SystemApi public @ImsState int getFeatureState() { synchronized (mLock) { return mState; @@ -373,7 +372,7 @@ public abstract class ImsFeature { * {@link #STATE_INITIALIZING}, or {@link #STATE_READY}. * @hide */ - @SystemApi @TestApi + @SystemApi public final void setFeatureState(@ImsState int state) { synchronized (mLock) { if (mState != state) { diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java index b3b7b200816a..d3d194bc1355 100644 --- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java +++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.Message; import android.os.RemoteException; @@ -60,7 +59,7 @@ public class MmTelFeature extends ImsFeature { /** * @hide */ - @SystemApi @TestApi + @SystemApi public MmTelFeature() { } @@ -228,7 +227,7 @@ public class MmTelFeature extends ImsFeature { * @see #removeCapabilities(int) * @hide */ - @SystemApi @TestApi + @SystemApi public MmTelCapabilities() { super(); } @@ -237,7 +236,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Deprecated - @SystemApi @TestApi + @SystemApi public MmTelCapabilities(Capabilities c) { mCapabilities = c.mCapabilities; } @@ -248,7 +247,7 @@ public class MmTelFeature extends ImsFeature { * bitfield. * @hide */ - @SystemApi @TestApi + @SystemApi public MmTelCapabilities(@MmTelCapability int capabilities) { super(capabilities); } @@ -288,7 +287,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public final void addCapabilities(@MmTelCapability int capabilities) { super.addCapabilities(capabilities); } @@ -297,7 +296,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public final void removeCapabilities(@MmTelCapability int capability) { super.removeCapabilities(capability); } @@ -306,7 +305,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public final boolean isCapable(@MmTelCapability int capabilities) { return super.isCapable(capabilities); } @@ -343,7 +342,6 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi public void onIncomingCall(IImsCallSession c, Bundle extras) { } @@ -355,7 +353,6 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi public void onRejectedCall(ImsCallProfile callProfile, ImsReasonInfo reason) { } @@ -366,7 +363,6 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi public void onVoiceMessageCountUpdate(int count) { } @@ -377,14 +373,14 @@ public class MmTelFeature extends ImsFeature { * outgoing call as IMS. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int PROCESS_CALL_IMS = 0; /** * To be returned by {@link #shouldProcessCall(String[])} when the telephony framework should * not process the outgoing call as IMS and should instead use circuit switch. * @hide */ - @SystemApi @TestApi + @SystemApi public static final int PROCESS_CALL_CSFB = 1; /** @hide */ @@ -402,7 +398,7 @@ public class MmTelFeature extends ImsFeature { * This is an optional boolean flag. * @hide */ - @SystemApi @TestApi + @SystemApi public static final String EXTRA_IS_USSD = "android.telephony.ims.feature.extra.IS_USSD"; /** @@ -415,7 +411,7 @@ public class MmTelFeature extends ImsFeature { * This is an optional boolean flag. * @hide */ - @SystemApi @TestApi + @SystemApi public static final String EXTRA_IS_UNKNOWN_CALL = "android.telephony.ims.feature.extra.IS_UNKNOWN_CALL"; @@ -455,7 +451,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public @NonNull final MmTelCapabilities queryCapabilityStatus() { return new MmTelCapabilities(super.queryCapabilityStatus()); } @@ -470,7 +466,7 @@ public class MmTelFeature extends ImsFeature { * {@link #changeEnabledCapabilities}) should also show the status as disabled. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyCapabilitiesStatusChanged(@NonNull MmTelCapabilities c) { if (c == null) { throw new IllegalArgumentException("MmTelCapabilities must be non-null!"); @@ -485,7 +481,7 @@ public class MmTelFeature extends ImsFeature { * {@link #EXTRA_IS_UNKNOWN_CALL} and {@link #EXTRA_IS_USSD} above. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyIncomingCall(@NonNull ImsCallSessionImplBase c, @NonNull Bundle extras) { if (c == null || extras == null) { @@ -511,7 +507,7 @@ public class MmTelFeature extends ImsFeature { * @param reason The {@link ImsReasonInfo} call rejection reason. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyRejectedCall(@NonNull ImsCallProfile callProfile, @NonNull ImsReasonInfo reason) { if (callProfile == null || reason == null) { @@ -550,7 +546,7 @@ public class MmTelFeature extends ImsFeature { * @link count the new Voice Message count. * @hide */ - @SystemApi @TestApi + @SystemApi public final void notifyVoiceMessageCountUpdate(int count) { IImsMmTelListener listener = getListener(); if (listener == null) { @@ -573,7 +569,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public boolean queryCapabilityConfiguration(@MmTelCapabilities.MmTelCapability int capability, @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) { // Base implementation - Override to provide functionality @@ -594,7 +590,7 @@ public class MmTelFeature extends ImsFeature { * * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void changeEnabledCapabilities(@NonNull CapabilityChangeRequest request, @NonNull CapabilityCallbackProxy c) { // Base implementation, no-op @@ -619,7 +615,7 @@ public class MmTelFeature extends ImsFeature { * @return a {@link ImsCallProfile} object * @hide */ - @SystemApi @TestApi + @SystemApi public @Nullable ImsCallProfile createCallProfile(int callSessionType, int callType) { // Base Implementation - Should be overridden return null; @@ -642,7 +638,7 @@ public class MmTelFeature extends ImsFeature { * @param profile a call profile to make the call * @hide */ - @SystemApi @TestApi + @SystemApi public @Nullable ImsCallSessionImplBase createCallSession(@NonNull ImsCallProfile profile) { // Base Implementation - Should be overridden return null; @@ -661,7 +657,7 @@ public class MmTelFeature extends ImsFeature { * call will be placed over IMS or via CSFB. * @hide */ - @SystemApi @TestApi + @SystemApi public @ProcessCallResult int shouldProcessCall(@NonNull String[] numbers) { return PROCESS_CALL_IMS; } @@ -696,7 +692,7 @@ public class MmTelFeature extends ImsFeature { * configuration. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsUtImplBase getUt() { // Base Implementation - Should be overridden return new ImsUtImplBase(); @@ -707,7 +703,7 @@ public class MmTelFeature extends ImsFeature { * calls that support it. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsEcbmImplBase getEcbm() { // Base Implementation - Should be overridden return new ImsEcbmImplBase(); @@ -718,7 +714,7 @@ public class MmTelFeature extends ImsFeature { * package processing for multi-endpoint. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsMultiEndpointImplBase getMultiEndpoint() { // Base Implementation - Should be overridden return new ImsMultiEndpointImplBase(); @@ -746,7 +742,7 @@ public class MmTelFeature extends ImsFeature { * } * @hide */ - @SystemApi @TestApi + @SystemApi public void setUiTtyMode(int mode, @Nullable Message onCompleteMessage) { // Base Implementation - Should be overridden } @@ -782,7 +778,7 @@ public class MmTelFeature extends ImsFeature { * Provider. * @hide */ - @SystemApi @TestApi + @SystemApi public @NonNull ImsSmsImplBase getSmsImplementation() { return new ImsSmsImplBase(); } @@ -796,7 +792,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void onFeatureRemoved() { // Base Implementation - Should be overridden } @@ -806,7 +802,7 @@ public class MmTelFeature extends ImsFeature { * @hide */ @Override - @SystemApi @TestApi + @SystemApi public void onFeatureReady() { // Base Implementation - Should be overridden } diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java index 98b0bcf6075b..b8ae146784d4 100644 --- a/telephony/java/android/telephony/ims/feature/RcsFeature.java +++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java @@ -20,7 +20,6 @@ import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.RemoteException; import android.telephony.ims.RcsContactUceCapability; @@ -50,7 +49,6 @@ import java.util.function.Supplier; * @hide */ @SystemApi -@TestApi public class RcsFeature extends ImsFeature { private static final String LOG_TAG = "RcsFeature"; diff --git a/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java index 73ba0e393e78..48bc0d675ed5 100644 --- a/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsCallSessionImplBase.java @@ -18,7 +18,6 @@ package android.telephony.ims.stub; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Message; import android.os.RemoteException; import android.telephony.ims.ImsCallProfile; @@ -39,7 +38,6 @@ import com.android.ims.internal.IImsVideoCallProvider; * @hide */ @SystemApi -@TestApi // DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you // will break other implementations of ImsCallSession maintained by other ImsServices. public class ImsCallSessionImplBase implements AutoCloseable { diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java index 6a2638bc7221..dc72a228f8f5 100644 --- a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java @@ -19,7 +19,6 @@ package android.telephony.ims.stub; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Context; import android.os.PersistableBundle; import android.os.RemoteException; @@ -51,7 +50,6 @@ import java.util.HashMap; * @hide */ @SystemApi -@TestApi public class ImsConfigImplBase { private static final String TAG = "ImsConfigImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java index 4a3a2eaf4225..06c35eaec6dd 100644 --- a/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsEcbmImplBase.java @@ -17,7 +17,6 @@ package android.telephony.ims.stub; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.util.Log; @@ -34,7 +33,6 @@ import com.android.ims.internal.IImsEcbmListener; * @hide */ @SystemApi -@TestApi public class ImsEcbmImplBase { private static final String TAG = "ImsEcbmImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java b/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java index 4e7307e2fa0c..cd9ebbf38e35 100644 --- a/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java +++ b/telephony/java/android/telephony/ims/stub/ImsFeatureConfiguration.java @@ -19,7 +19,6 @@ package android.telephony.ims.stub; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; import android.telephony.ims.feature.ImsFeature; @@ -36,7 +35,6 @@ import java.util.Set; * @hide */ @SystemApi -@TestApi public final class ImsFeatureConfiguration implements Parcelable { public static final class FeatureSlotPair { diff --git a/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java index 0ae5bba5d722..d002903a11b6 100644 --- a/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsMultiEndpointImplBase.java @@ -17,7 +17,6 @@ package android.telephony.ims.stub; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.telephony.ims.ImsExternalCallState; import android.util.Log; @@ -38,7 +37,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class ImsMultiEndpointImplBase { private static final String TAG = "MultiEndpointImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java index 7069e0ab9b1e..aff92b59a63d 100644 --- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java @@ -18,7 +18,6 @@ package android.telephony.ims.stub; import android.annotation.IntDef; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.RemoteException; import android.telephony.ims.ImsReasonInfo; @@ -39,7 +38,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public class ImsRegistrationImplBase { private static final String LOG_TAG = "ImsRegistrationImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java index ce9a73a21657..36ece958d501 100644 --- a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java @@ -19,7 +19,6 @@ package android.telephony.ims.stub; import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.RemoteException; import android.telephony.SmsManager; import android.telephony.SmsMessage; @@ -38,7 +37,6 @@ import java.lang.annotation.RetentionPolicy; * @hide */ @SystemApi -@TestApi public class ImsSmsImplBase { private static final String LOG_TAG = "SmsImplBase"; diff --git a/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java index 8564f7affd6d..f5219d5b49e8 100644 --- a/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsUtImplBase.java @@ -20,7 +20,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Bundle; import android.os.RemoteException; import android.telephony.ims.ImsUtListener; @@ -40,7 +39,6 @@ import java.lang.annotation.RetentionPolicy; // DO NOT remove or change the existing APIs, only add new ones to this Base implementation or you // will break other implementations of ImsUt maintained by other ImsServices. @SystemApi -@TestApi public class ImsUtImplBase { /** * Bar all incoming calls. (See 3GPP TS 24.611) diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java index ac258cd40d65..eb59f87a6c02 100644 --- a/telephony/java/android/telephony/mbms/DownloadRequest.java +++ b/telephony/java/android/telephony/mbms/DownloadRequest.java @@ -19,7 +19,6 @@ package android.telephony.mbms; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.net.Uri; import android.os.Parcel; @@ -186,7 +185,6 @@ public final class DownloadRequest implements Parcelable { * @hide */ @SystemApi - @TestApi public Builder setServiceId(String serviceId) { fileServiceId = serviceId; return this; diff --git a/telephony/java/android/telephony/mbms/FileInfo.java b/telephony/java/android/telephony/mbms/FileInfo.java index ada2872874f5..e52b2ce0c505 100644 --- a/telephony/java/android/telephony/mbms/FileInfo.java +++ b/telephony/java/android/telephony/mbms/FileInfo.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; @@ -50,7 +49,6 @@ public final class FileInfo implements Parcelable { * @hide */ @SystemApi - @TestApi public FileInfo(Uri uri, String mimeType) { this.uri = uri; this.mimeType = mimeType; diff --git a/telephony/java/android/telephony/mbms/FileServiceInfo.java b/telephony/java/android/telephony/mbms/FileServiceInfo.java index 8c79ab63b131..8777e7f59e3f 100644 --- a/telephony/java/android/telephony/mbms/FileServiceInfo.java +++ b/telephony/java/android/telephony/mbms/FileServiceInfo.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -36,7 +35,6 @@ public final class FileServiceInfo extends ServiceInfo implements Parcelable { /** @hide */ @SystemApi - @TestApi public FileServiceInfo(Map<Locale, String> newNames, String newClassName, List<Locale> newLocales, String newServiceId, Date start, Date end, List<FileInfo> newFiles) { diff --git a/telephony/java/android/telephony/mbms/StreamingServiceInfo.java b/telephony/java/android/telephony/mbms/StreamingServiceInfo.java index 8ad1d8940ca7..316e86568213 100644 --- a/telephony/java/android/telephony/mbms/StreamingServiceInfo.java +++ b/telephony/java/android/telephony/mbms/StreamingServiceInfo.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -42,7 +41,6 @@ public final class StreamingServiceInfo extends ServiceInfo implements Parcelabl * @hide */ @SystemApi - @TestApi public StreamingServiceInfo(Map<Locale, String> names, String className, List<Locale> locales, String serviceId, Date start, Date end) { super(names, className, locales, serviceId, start, end); diff --git a/telephony/java/android/telephony/mbms/UriPathPair.java b/telephony/java/android/telephony/mbms/UriPathPair.java index f53d7e0287f3..9258919919b7 100644 --- a/telephony/java/android/telephony/mbms/UriPathPair.java +++ b/telephony/java/android/telephony/mbms/UriPathPair.java @@ -17,7 +17,6 @@ package android.telephony.mbms; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ContentResolver; import android.net.Uri; import android.os.Parcel; @@ -30,7 +29,6 @@ import android.telephony.mbms.vendor.VendorUtils; * @hide */ @SystemApi -@TestApi public final class UriPathPair implements Parcelable { private final Uri mFilePathUri; private final Uri mContentUri; diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java index 9f22d0a49806..4e6fc0b3c1a3 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -18,7 +18,6 @@ package android.telephony.mbms.vendor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.os.Binder; import android.os.IBinder; @@ -45,7 +44,6 @@ import java.util.Map; * @hide */ @SystemApi -@TestApi public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { private final Map<IBinder, DownloadStatusListener> mDownloadStatusListenerBinderMap = new HashMap<>(); @@ -553,7 +551,6 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { // Following two methods exist to workaround b/124210145 /** @hide */ @SystemApi - @TestApi @Override public android.os.IBinder asBinder() { return super.asBinder(); @@ -561,7 +558,6 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub { /** @hide */ @SystemApi - @TestApi @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws RemoteException { diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java index 1335b52673d2..e5b18bb5d644 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsGroupCallServiceBase.java @@ -18,7 +18,6 @@ package android.telephony.mbms.vendor; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.app.Service; import android.content.Intent; import android.os.Binder; @@ -41,7 +40,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class MbmsGroupCallServiceBase extends Service { private final IBinder mInterface = new Stub() { @Override diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java index cced44759527..e169b16ca958 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java @@ -18,7 +18,6 @@ package android.telephony.mbms.vendor; import android.annotation.Nullable; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.Intent; import android.net.Uri; import android.os.Binder; @@ -39,7 +38,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { /** * Initialize streaming service for this app and subId, registering the listener. @@ -299,7 +297,6 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { // Following two methods exist to workaround b/124210145 /** @hide */ @SystemApi - @TestApi @Override public android.os.IBinder asBinder() { return super.asBinder(); @@ -307,7 +304,6 @@ public class MbmsStreamingServiceBase extends IMbmsStreamingService.Stub { /** @hide */ @SystemApi - @TestApi @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws RemoteException { diff --git a/telephony/java/android/telephony/mbms/vendor/VendorUtils.java b/telephony/java/android/telephony/mbms/vendor/VendorUtils.java index f1cac8cf8286..a43f12244168 100644 --- a/telephony/java/android/telephony/mbms/vendor/VendorUtils.java +++ b/telephony/java/android/telephony/mbms/vendor/VendorUtils.java @@ -17,7 +17,6 @@ package android.telephony.mbms.vendor; import android.annotation.SystemApi; -import android.annotation.TestApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -35,7 +34,6 @@ import java.util.List; * @hide */ @SystemApi -@TestApi public class VendorUtils { /** diff --git a/test-mock/api/test-current.txt b/test-mock/api/test-current.txt index 32ca250b6c74..79d746a57cc5 100644 --- a/test-mock/api/test-current.txt +++ b/test-mock/api/test-current.txt @@ -6,21 +6,12 @@ package android.test.mock { } @Deprecated public class MockPackageManager extends android.content.pm.PackageManager { - method public void addOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); - method public boolean arePermissionsIndividuallyControlled(); - method public String getDefaultBrowserPackageNameAsUser(int); method public int getInstallReason(String, android.os.UserHandle); method public java.util.List<android.content.pm.ApplicationInfo> getInstalledApplicationsAsUser(int, int); - method public java.util.List<android.content.pm.PackageInfo> getInstalledPackagesAsUser(int, int); method public String[] getNamesForUids(int[]); method public String getPermissionControllerPackageName(); - method public int getPermissionFlags(String, String, android.os.UserHandle); method @NonNull public String getServicesSystemSharedLibraryPackageName(); method @NonNull public String getSharedSystemSharedLibraryPackageName(); - method public void grantRuntimePermission(String, String, android.os.UserHandle); - method public void removeOnPermissionsChangeListener(android.content.pm.PackageManager.OnPermissionsChangedListener); - method public void revokeRuntimePermission(String, String, android.os.UserHandle); - method public void updatePermissionFlags(String, String, int, int, android.os.UserHandle); } } diff --git a/tests/net/Android.bp b/tests/net/Android.bp index 124b6609f687..464505ec6136 100644 --- a/tests/net/Android.bp +++ b/tests/net/Android.bp @@ -42,6 +42,10 @@ java_defaults { android_test { name: "FrameworksNetTests", + // Not built on module branch because these tests depend + // on net-tests-utils (frameworks/libs/net), which could + // be newer than frameworks/base. + enabled: false, defaults: ["FrameworksNetTests-jni-defaults"], srcs: [ "java/**/*.java", diff --git a/tests/net/common/Android.bp b/tests/net/common/Android.bp index 46d680fc4511..373aac604b2a 100644 --- a/tests/net/common/Android.bp +++ b/tests/net/common/Android.bp @@ -25,6 +25,7 @@ java_library { "junit", "mockito-target-minus-junit4", "net-tests-utils", + "net-utils-framework-common", "platform-test-annotations", ], libs: [ diff --git a/tests/net/common/java/android/net/DhcpInfoTest.java b/tests/net/common/java/android/net/DhcpInfoTest.java index 4d45ad72a9b8..ab4726bab573 100644 --- a/tests/net/common/java/android/net/DhcpInfoTest.java +++ b/tests/net/common/java/android/net/DhcpInfoTest.java @@ -17,8 +17,8 @@ package android.net; import static com.android.net.module.util.Inet4AddressUtils.inet4AddressToIntHTL; -import static com.android.testutils.MiscAssertsKt.assertFieldCountEquals; -import static com.android.testutils.ParcelUtilsKt.parcelingRoundTrip; +import static com.android.testutils.MiscAsserts.assertFieldCountEquals; +import static com.android.testutils.ParcelUtils.parcelingRoundTrip; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/tests/net/common/java/android/net/IpPrefixTest.java b/tests/net/common/java/android/net/IpPrefixTest.java index 985e10df3961..9c0fc7ce7881 100644 --- a/tests/net/common/java/android/net/IpPrefixTest.java +++ b/tests/net/common/java/android/net/IpPrefixTest.java @@ -16,10 +16,10 @@ package android.net; -import static com.android.testutils.MiscAssertsKt.assertEqualBothWays; -import static com.android.testutils.MiscAssertsKt.assertFieldCountEquals; -import static com.android.testutils.MiscAssertsKt.assertNotEqualEitherWay; -import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless; +import static com.android.testutils.MiscAsserts.assertEqualBothWays; +import static com.android.testutils.MiscAsserts.assertFieldCountEquals; +import static com.android.testutils.MiscAsserts.assertNotEqualEitherWay; +import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; diff --git a/tests/net/common/java/android/net/LinkAddressTest.java b/tests/net/common/java/android/net/LinkAddressTest.java index c74c112490f8..60308e32b88d 100644 --- a/tests/net/common/java/android/net/LinkAddressTest.java +++ b/tests/net/common/java/android/net/LinkAddressTest.java @@ -27,10 +27,10 @@ import static android.system.OsConstants.RT_SCOPE_LINK; import static android.system.OsConstants.RT_SCOPE_SITE; import static android.system.OsConstants.RT_SCOPE_UNIVERSE; -import static com.android.testutils.MiscAssertsKt.assertEqualBothWays; -import static com.android.testutils.MiscAssertsKt.assertFieldCountEquals; -import static com.android.testutils.MiscAssertsKt.assertNotEqualEitherWay; -import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless; +import static com.android.testutils.MiscAsserts.assertEqualBothWays; +import static com.android.testutils.MiscAsserts.assertFieldCountEquals; +import static com.android.testutils.MiscAsserts.assertNotEqualEitherWay; +import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/tests/net/common/java/android/net/LinkPropertiesTest.java b/tests/net/common/java/android/net/LinkPropertiesTest.java index 6eba62e63740..f52ab5b40fda 100644 --- a/tests/net/common/java/android/net/LinkPropertiesTest.java +++ b/tests/net/common/java/android/net/LinkPropertiesTest.java @@ -20,9 +20,9 @@ import static android.net.RouteInfo.RTN_THROW; import static android.net.RouteInfo.RTN_UNICAST; import static android.net.RouteInfo.RTN_UNREACHABLE; -import static com.android.testutils.ParcelUtilsKt.assertParcelSane; -import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless; -import static com.android.testutils.ParcelUtilsKt.parcelingRoundTrip; +import static com.android.testutils.ParcelUtils.assertParcelSane; +import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; +import static com.android.testutils.ParcelUtils.parcelingRoundTrip; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -32,7 +32,6 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.net.LinkProperties.ProvisioningChange; -import android.net.util.LinkPropertiesUtils.CompareResult; import android.os.Build; import android.system.OsConstants; import android.util.ArraySet; @@ -41,6 +40,7 @@ import androidx.core.os.BuildCompat; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.net.module.util.LinkPropertiesUtils.CompareResult; import com.android.testutils.DevSdkIgnoreRule; import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter; import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo; @@ -447,23 +447,21 @@ public class LinkPropertiesTest { assertEquals(3, lp.getRoutes().size()); assertAllRoutesHaveInterface("wlan0", lp); - // Check comparisons work. + // Check routes are updated correctly when calling setInterfaceName. LinkProperties lp2 = new LinkProperties(lp); assertAllRoutesHaveInterface("wlan0", lp2); - // LinkProperties#compareAllRoutes exists both in R and before R, but the return type - // changed in R, so a test compiled with the R version of LinkProperties cannot run on Q. - if (isAtLeastR()) { - assertEquals(0, lp.compareAllRoutes(lp2).added.size()); - assertEquals(0, lp.compareAllRoutes(lp2).removed.size()); - } + final CompareResult<RouteInfo> cr1 = + new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes()); + assertEquals(0, cr1.added.size()); + assertEquals(0, cr1.removed.size()); lp2.setInterfaceName("p2p0"); assertAllRoutesHaveInterface("p2p0", lp2); assertAllRoutesNotHaveInterface("wlan0", lp2); - if (isAtLeastR()) { - assertEquals(3, lp.compareAllRoutes(lp2).added.size()); - assertEquals(3, lp.compareAllRoutes(lp2).removed.size()); - } + final CompareResult<RouteInfo> cr2 = + new CompareResult<>(lp.getAllRoutes(), lp2.getAllRoutes()); + assertEquals(3, cr2.added.size()); + assertEquals(3, cr2.removed.size()); // Remove route with incorrect interface, no route removed. lp.removeRoute(new RouteInfo(prefix2, null, null)); diff --git a/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt b/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt index ef15b668e24c..a5e44d59fcab 100644 --- a/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt +++ b/tests/net/common/java/android/net/MatchAllNetworkSpecifierTest.kt @@ -19,13 +19,19 @@ package android.net import android.net.wifi.aware.DiscoverySession import android.net.wifi.aware.PeerHandle import android.net.wifi.aware.WifiAwareNetworkSpecifier +import android.os.Build import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import com.android.testutils.assertParcelSane +import com.android.testutils.DevSdkIgnoreRule +import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter +import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo import java.lang.IllegalStateException +import org.junit.Assert.assertFalse +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito @@ -33,18 +39,37 @@ import org.mockito.Mockito @RunWith(AndroidJUnit4::class) @SmallTest class MatchAllNetworkSpecifierTest { + @Rule @JvmField + val ignoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule() + + private val specifier = MatchAllNetworkSpecifier() + private val discoverySession = Mockito.mock(DiscoverySession::class.java) + private val peerHandle = Mockito.mock(PeerHandle::class.java) + private val wifiAwareNetworkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, + peerHandle).build() + @Test fun testParcel() { assertParcelSane(MatchAllNetworkSpecifier(), 0) } + @Test + @IgnoreUpTo(Build.VERSION_CODES.Q) + @IgnoreAfter(Build.VERSION_CODES.R) + // Only run this test on Android R. + // The method - satisfiedBy() has changed to canBeSatisfiedBy() starting from Android R, so the + // method - canBeSatisfiedBy() cannot be found when running this test on Android Q. + fun testCanBeSatisfiedBy_OnlyForR() { + // MatchAllNetworkSpecifier didn't follow its parent class to change the satisfiedBy() to + // canBeSatisfiedBy(), so if a caller calls MatchAllNetworkSpecifier#canBeSatisfiedBy(), the + // NetworkSpecifier#canBeSatisfiedBy() will be called actually, and false will be returned. + // Although it's not meeting the expectation, the behavior still needs to be verified. + assertFalse(specifier.canBeSatisfiedBy(wifiAwareNetworkSpecifier)) + } + @Test(expected = IllegalStateException::class) - fun testSatisfiedBy() { - val specifier = MatchAllNetworkSpecifier() - val discoverySession = Mockito.mock(DiscoverySession::class.java) - val peerHandle = Mockito.mock(PeerHandle::class.java) - val wifiAwareNetworkSpecifier = WifiAwareNetworkSpecifier.Builder(discoverySession, - peerHandle).build() - specifier.satisfiedBy(wifiAwareNetworkSpecifier) + @IgnoreUpTo(Build.VERSION_CODES.R) + fun testCanBeSatisfiedBy() { + specifier.canBeSatisfiedBy(wifiAwareNetworkSpecifier) } } diff --git a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java index 3f8261d5ad7f..e1693129892f 100644 --- a/tests/net/common/java/android/net/NetworkCapabilitiesTest.java +++ b/tests/net/common/java/android/net/NetworkCapabilitiesTest.java @@ -42,8 +42,8 @@ import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE; import static android.net.NetworkCapabilities.UNRESTRICTED_CAPABILITIES; -import static com.android.testutils.ParcelUtilsKt.assertParcelSane; -import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless; +import static com.android.testutils.ParcelUtils.assertParcelSane; +import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; diff --git a/tests/net/common/java/android/net/NetworkProviderTest.kt b/tests/net/common/java/android/net/NetworkProviderTest.kt index b7c47c2bc223..dd3f5bebdb8e 100644 --- a/tests/net/common/java/android/net/NetworkProviderTest.kt +++ b/tests/net/common/java/android/net/NetworkProviderTest.kt @@ -19,23 +19,23 @@ package android.net import android.app.Instrumentation import android.content.Context import android.net.NetworkCapabilities.TRANSPORT_TEST +import android.net.NetworkProviderTest.TestNetworkCallback.CallbackEntry.OnUnavailable +import android.net.NetworkProviderTest.TestNetworkProvider.CallbackEntry.OnNetworkRequestWithdrawn +import android.net.NetworkProviderTest.TestNetworkProvider.CallbackEntry.OnNetworkRequested import android.os.Build import android.os.HandlerThread import android.os.Looper -import android.net.NetworkProviderTest.TestNetworkCallback.CallbackEntry.OnUnavailable -import android.net.NetworkProviderTest.TestNetworkProvider.CallbackEntry.OnNetworkRequested -import android.net.NetworkProviderTest.TestNetworkProvider.CallbackEntry.OnNetworkRequestWithdrawn import androidx.test.InstrumentationRegistry -import com.android.testutils.ArrayTrackRecord +import com.android.net.module.util.ArrayTrackRecord import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo import com.android.testutils.DevSdkIgnoreRunner -import java.util.UUID -import kotlin.test.assertEquals -import kotlin.test.assertNotEquals import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import java.util.UUID +import kotlin.test.assertEquals +import kotlin.test.assertNotEquals private const val DEFAULT_TIMEOUT_MS = 5000L private val instrumentation: Instrumentation diff --git a/tests/net/common/java/android/net/RouteInfoTest.java b/tests/net/common/java/android/net/RouteInfoTest.java index 60cac0b6b0f5..71689f919726 100644 --- a/tests/net/common/java/android/net/RouteInfoTest.java +++ b/tests/net/common/java/android/net/RouteInfoTest.java @@ -18,10 +18,10 @@ package android.net; import static android.net.RouteInfo.RTN_UNREACHABLE; -import static com.android.testutils.MiscAssertsKt.assertEqualBothWays; -import static com.android.testutils.MiscAssertsKt.assertFieldCountEquals; -import static com.android.testutils.MiscAssertsKt.assertNotEqualEitherWay; -import static com.android.testutils.ParcelUtilsKt.assertParcelingIsLossless; +import static com.android.testutils.MiscAsserts.assertEqualBothWays; +import static com.android.testutils.MiscAsserts.assertFieldCountEquals; +import static com.android.testutils.MiscAsserts.assertNotEqualEitherWay; +import static com.android.testutils.ParcelUtils.assertParcelingIsLossless; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java b/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java index 84805442e5c7..d50406fd3a1c 100644 --- a/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java +++ b/tests/net/common/java/android/net/apf/ApfCapabilitiesTest.java @@ -16,7 +16,7 @@ package android.net.apf; -import static com.android.testutils.ParcelUtilsKt.assertParcelSane; +import static com.android.testutils.ParcelUtils.assertParcelSane; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/tests/net/deflake/Android.bp b/tests/net/deflake/Android.bp index b1b017131c64..828f59bd8279 100644 --- a/tests/net/deflake/Android.bp +++ b/tests/net/deflake/Android.bp @@ -16,6 +16,10 @@ java_test_host { name: "FrameworksNetDeflakeTest", + // Not built on module branch because these tests depend indirectly + // on net-tests-utils (frameworks/libs/net), which could be newer + // than frameworks/base. + enabled: false, srcs: ["src/**/*.kt"], libs: [ "junit", diff --git a/tests/net/integration/util/com/android/server/ConnectivityServiceTestUtils.kt b/tests/net/integration/util/com/android/server/ConnectivityServiceTestUtils.kt index fa2b99ce5cc6..165fd3728281 100644 --- a/tests/net/integration/util/com/android/server/ConnectivityServiceTestUtils.kt +++ b/tests/net/integration/util/com/android/server/ConnectivityServiceTestUtils.kt @@ -14,6 +14,8 @@ * limitations under the License */ +@file:JvmName("ConnectivityServiceTestUtils") + package com.android.server import android.net.ConnectivityManager.TYPE_BLUETOOTH diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java index 0ffafd45613a..9f0b41fa0cdf 100644 --- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java +++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java @@ -24,7 +24,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE; -import static com.android.server.ConnectivityServiceTestUtilsKt.transportToLegacyType; +import static com.android.server.ConnectivityServiceTestUtils.transportToLegacyType; import static junit.framework.Assert.assertTrue; @@ -49,7 +49,7 @@ import android.os.Message; import android.util.Log; import com.android.server.connectivity.ConnectivityConstants; -import com.android.testutils.HandlerUtilsKt; +import com.android.testutils.HandlerUtils; import com.android.testutils.TestableNetworkCallback; import java.util.Set; @@ -265,6 +265,6 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { } public void waitForIdle(long timeoutMs) { - HandlerUtilsKt.waitForIdle(mHandlerThread, timeoutMs); + HandlerUtils.waitForIdle(mHandlerThread, timeoutMs); } } diff --git a/tests/net/java/com/android/server/NetIdManagerTest.kt b/tests/net/java/com/android/server/NetIdManagerTest.kt index 045f89f85e3b..6f5e740d344c 100644 --- a/tests/net/java/com/android/server/NetIdManagerTest.kt +++ b/tests/net/java/com/android/server/NetIdManagerTest.kt @@ -19,8 +19,8 @@ package com.android.server import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import com.android.server.NetIdManager.MIN_NET_ID -import com.android.testutils.ExceptionUtils.ThrowingRunnable import com.android.testutils.assertThrows +import com.android.testutils.ExceptionUtils.ThrowingRunnable import org.junit.Test import org.junit.runner.RunWith import kotlin.test.assertEquals diff --git a/tests/utils/hostutils/src/com/android/tests/rollback/host/AbandonSessionsRule.java b/tests/utils/hostutils/src/com/android/tests/rollback/host/AbandonSessionsRule.java new file mode 100644 index 000000000000..b08621314ee0 --- /dev/null +++ b/tests/utils/hostutils/src/com/android/tests/rollback/host/AbandonSessionsRule.java @@ -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.tests.rollback.host; + +import com.android.tradefed.device.ITestDevice; +import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; + +import org.junit.rules.ExternalResource; + +public class AbandonSessionsRule extends ExternalResource { + private final BaseHostJUnit4Test mHost; + + public AbandonSessionsRule(BaseHostJUnit4Test host) { + mHost = host; + } + + @Override + protected void before() throws Throwable { + abandonSessions(mHost.getDevice()); + } + + @Override + protected void after() { + try { + abandonSessions(mHost.getDevice()); + } catch (Exception ignore) { + } + } + + /** + * Abandons all sessions to prevent interference in our tests. + */ + private static void abandonSessions(ITestDevice device) throws Exception { + // No point in abandoning applied or failed sessions. We care about ready sessions only. + String cmdListReadySessions = + "pm list staged-sessions --only-sessionid --only-parent --only-ready"; + String output = device.executeShellCommand(cmdListReadySessions); + if (output.trim().isEmpty()) { + // No sessions to abandon + return; + } + // Ensure we have sufficient privilege to abandon sessions from other apps + device.enableAdbRoot(); + device.executeShellCommand("for i in $(" + cmdListReadySessions + + "); do pm install-abandon $i; done"); + device.disableAdbRoot(); + } +} diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index 3a3fb2826b74..72cb41a1b172 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -1272,7 +1272,8 @@ class Linker { return false; } - ClassDefinition::WriteJavaFile(manifest_class.get(), package_utf8, true, &fout); + ClassDefinition::WriteJavaFile(manifest_class.get(), package_utf8, true, + false /* strip_api_annotations */, &fout); fout.Flush(); if (fout.HadError()) { diff --git a/tools/aapt2/java/AnnotationProcessor.cpp b/tools/aapt2/java/AnnotationProcessor.cpp index cec59e75831d..482d91aeb491 100644 --- a/tools/aapt2/java/AnnotationProcessor.cpp +++ b/tools/aapt2/java/AnnotationProcessor.cpp @@ -123,7 +123,7 @@ void AnnotationProcessor::AppendNewLine() { } } -void AnnotationProcessor::Print(Printer* printer) const { +void AnnotationProcessor::Print(Printer* printer, bool strip_api_annotations) const { if (has_comments_) { std::string result = comment_.str(); for (const StringPiece& line : util::Tokenize(result, '\n')) { @@ -137,6 +137,9 @@ void AnnotationProcessor::Print(Printer* printer) const { printer->Println("@Deprecated"); } + if (strip_api_annotations) { + return; + } for (const AnnotationRule& rule : sAnnotationRules) { const auto& it = annotation_parameter_map_.find(rule.bit_mask); if (it != annotation_parameter_map_.end()) { diff --git a/tools/aapt2/java/AnnotationProcessor.h b/tools/aapt2/java/AnnotationProcessor.h index fdb58468d995..f217afb16f32 100644 --- a/tools/aapt2/java/AnnotationProcessor.h +++ b/tools/aapt2/java/AnnotationProcessor.h @@ -65,7 +65,7 @@ class AnnotationProcessor { void AppendNewLine(); // Writes the comments and annotations to the Printer. - void Print(text::Printer* printer) const; + void Print(text::Printer* printer, bool strip_api_annotations = false) const; private: std::stringstream comment_; diff --git a/tools/aapt2/java/AnnotationProcessor_test.cpp b/tools/aapt2/java/AnnotationProcessor_test.cpp index 7d0a4e9af632..6bc8902a6dcf 100644 --- a/tools/aapt2/java/AnnotationProcessor_test.cpp +++ b/tools/aapt2/java/AnnotationProcessor_test.cpp @@ -91,6 +91,21 @@ TEST(AnnotationProcessorTest, EmitsTestApiAnnotationAndRemovesFromComment) { EXPECT_THAT(annotations, HasSubstr("This is a test API")); } +TEST(AnnotationProcessorTest, NotEmitSystemApiAnnotation) { + AnnotationProcessor processor; + processor.AppendComment("@SystemApi This is a system API"); + + std::string annotations; + StringOutputStream out(&annotations); + Printer printer(&out); + processor.Print(&printer, true /* strip_api_annotations */); + out.Flush(); + + EXPECT_THAT(annotations, Not(HasSubstr("@android.annotation.SystemApi"))); + EXPECT_THAT(annotations, Not(HasSubstr("@SystemApi"))); + EXPECT_THAT(annotations, HasSubstr("This is a system API")); +} + TEST(AnnotationProcessor, ExtractsFirstSentence) { EXPECT_THAT(AnnotationProcessor::ExtractFirstSentence("This is the only sentence"), Eq("This is the only sentence")); diff --git a/tools/aapt2/java/ClassDefinition.cpp b/tools/aapt2/java/ClassDefinition.cpp index f5f5b05491bb..3163497f0da6 100644 --- a/tools/aapt2/java/ClassDefinition.cpp +++ b/tools/aapt2/java/ClassDefinition.cpp @@ -23,15 +23,15 @@ using ::android::StringPiece; namespace aapt { -void ClassMember::Print(bool /*final*/, Printer* printer) const { - processor_.Print(printer); +void ClassMember::Print(bool /*final*/, Printer* printer, bool strip_api_annotations) const { + processor_.Print(printer, strip_api_annotations); } void MethodDefinition::AppendStatement(const StringPiece& statement) { statements_.push_back(statement.to_string()); } -void MethodDefinition::Print(bool final, Printer* printer) const { +void MethodDefinition::Print(bool final, Printer* printer, bool) const { printer->Print(signature_).Println(" {"); printer->Indent(); for (const auto& statement : statements_) { @@ -74,12 +74,12 @@ bool ClassDefinition::empty() const { return true; } -void ClassDefinition::Print(bool final, Printer* printer) const { +void ClassDefinition::Print(bool final, Printer* printer, bool strip_api_annotations) const { if (empty() && !create_if_empty_) { return; } - ClassMember::Print(final, printer); + ClassMember::Print(final, printer, strip_api_annotations); printer->Print("public "); if (qualifier_ == ClassQualifier::kStatic) { @@ -93,7 +93,7 @@ void ClassDefinition::Print(bool final, Printer* printer) const { // and takes precedence over a previous member with the same name. The overridden member is // set to nullptr. if (member != nullptr) { - member->Print(final, printer); + member->Print(final, printer, strip_api_annotations); printer->Println(); } } @@ -111,11 +111,11 @@ constexpr static const char* sWarningHeader = " */\n\n"; void ClassDefinition::WriteJavaFile(const ClassDefinition* def, const StringPiece& package, - bool final, io::OutputStream* out) { + bool final, bool strip_api_annotations, io::OutputStream* out) { Printer printer(out); printer.Print(sWarningHeader).Print("package ").Print(package).Println(";"); printer.Println(); - def->Print(final, &printer); + def->Print(final, &printer, strip_api_annotations); } } // namespace aapt diff --git a/tools/aapt2/java/ClassDefinition.h b/tools/aapt2/java/ClassDefinition.h index fb11266f1761..1e4b6816075a 100644 --- a/tools/aapt2/java/ClassDefinition.h +++ b/tools/aapt2/java/ClassDefinition.h @@ -50,7 +50,7 @@ class ClassMember { // Writes the class member to the Printer. Subclasses should derive this method // to write their own data. Call this base method from the subclass to write out // this member's comments/annotations. - virtual void Print(bool final, text::Printer* printer) const; + virtual void Print(bool final, text::Printer* printer, bool strip_api_annotations = false) const; private: AnnotationProcessor processor_; @@ -70,10 +70,11 @@ class PrimitiveMember : public ClassMember { return name_; } - void Print(bool final, text::Printer* printer) const override { + void Print(bool final, text::Printer* printer, bool strip_api_annotations = false) + const override { using std::to_string; - ClassMember::Print(final, printer); + ClassMember::Print(final, printer, strip_api_annotations); printer->Print("public static "); if (final) { @@ -104,8 +105,9 @@ class PrimitiveMember<std::string> : public ClassMember { return name_; } - void Print(bool final, text::Printer* printer) const override { - ClassMember::Print(final, printer); + void Print(bool final, text::Printer* printer, bool strip_api_annotations = false) + const override { + ClassMember::Print(final, printer, strip_api_annotations); printer->Print("public static "); if (final) { @@ -142,8 +144,9 @@ class PrimitiveArrayMember : public ClassMember { return name_; } - void Print(bool final, text::Printer* printer) const override { - ClassMember::Print(final, printer); + void Print(bool final, text::Printer* printer, bool strip_api_annotations = false) + const override { + ClassMember::Print(final, printer, strip_api_annotations); printer->Print("public static final int[] ").Print(name_).Print("={"); printer->Indent(); @@ -195,7 +198,7 @@ class MethodDefinition : public ClassMember { return false; } - void Print(bool final, text::Printer* printer) const override; + void Print(bool final, text::Printer* printer, bool strip_api_annotations = false) const override; private: DISALLOW_COPY_AND_ASSIGN(MethodDefinition); @@ -209,7 +212,7 @@ enum class ClassQualifier { kNone, kStatic }; class ClassDefinition : public ClassMember { public: static void WriteJavaFile(const ClassDefinition* def, const android::StringPiece& package, - bool final, io::OutputStream* out); + bool final, bool strip_api_annotations, io::OutputStream* out); ClassDefinition(const android::StringPiece& name, ClassQualifier qualifier, bool createIfEmpty) : name_(name.to_string()), qualifier_(qualifier), create_if_empty_(createIfEmpty) {} @@ -227,7 +230,7 @@ class ClassDefinition : public ClassMember { return name_; } - void Print(bool final, text::Printer* printer) const override; + void Print(bool final, text::Printer* printer, bool strip_api_annotations = false) const override; private: DISALLOW_COPY_AND_ASSIGN(ClassDefinition); diff --git a/tools/aapt2/java/JavaClassGenerator.cpp b/tools/aapt2/java/JavaClassGenerator.cpp index bb541fe2490b..dffad3b99c06 100644 --- a/tools/aapt2/java/JavaClassGenerator.cpp +++ b/tools/aapt2/java/JavaClassGenerator.cpp @@ -604,6 +604,8 @@ bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate, rewrite_method->AppendStatement("final int packageIdBits = p << 24;"); } + const bool is_public = (options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic); + for (const auto& package : table_->packages) { for (const auto& type : package->types) { if (type->type == ResourceType::kAttrPrivate) { @@ -612,8 +614,7 @@ bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate, } // Stay consistent with AAPT and generate an empty type class if the R class is public. - const bool force_creation_if_empty = - (options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic); + const bool force_creation_if_empty = is_public; std::unique_ptr<ClassDefinition> class_def; if (out != nullptr) { @@ -637,8 +638,7 @@ bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate, } } - if (out != nullptr && type->type == ResourceType::kStyleable && - options_.types == JavaClassGeneratorOptions::SymbolTypes::kPublic) { + if (out != nullptr && type->type == ResourceType::kStyleable && is_public) { // When generating a public R class, we don't want Styleable to be part // of the API. It is only emitted for documentation purposes. class_def->GetCommentBuilder()->AppendComment("@doconly"); @@ -657,7 +657,7 @@ bool JavaClassGenerator::Generate(const StringPiece& package_name_to_generate, if (out != nullptr) { AppendJavaDocAnnotations(options_.javadoc_annotations, r_class.GetCommentBuilder()); - ClassDefinition::WriteJavaFile(&r_class, out_package_name, options_.use_final, out); + ClassDefinition::WriteJavaFile(&r_class, out_package_name, options_.use_final, !is_public, out); } return true; } diff --git a/tools/aapt2/java/ManifestClassGenerator_test.cpp b/tools/aapt2/java/ManifestClassGenerator_test.cpp index ab7f9a11d971..3858fc7f765e 100644 --- a/tools/aapt2/java/ManifestClassGenerator_test.cpp +++ b/tools/aapt2/java/ManifestClassGenerator_test.cpp @@ -26,6 +26,7 @@ using ::testing::Not; namespace aapt { static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, + bool strip_api_annotations, std::string* out_str); TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { @@ -39,7 +40,8 @@ TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { </manifest>)"); std::string actual; - ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), + false /* strip_api_annotations */, &actual)); ASSERT_THAT(actual, HasSubstr("public static final class permission {")); ASSERT_THAT(actual, HasSubstr("public static final class permission_group {")); @@ -91,7 +93,8 @@ TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { </manifest>)"); std::string actual; - ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), + false /* strip_api_annotations */, &actual)); const char* expected_access_internet = R"( /** * Required to access the internet. @@ -123,6 +126,55 @@ TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { EXPECT_THAT(actual, HasSubstr(expected_test)); } +TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresentButNoApiAnnotations) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"( + <manifest xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- Required to access the internet. + Added in API 1. --> + <permission android:name="android.permission.ACCESS_INTERNET" /> + <!-- @deprecated This permission is for playing outside. --> + <permission android:name="android.permission.PLAY_OUTSIDE" /> + <!-- This is a private permission for system only! + @hide + @SystemApi --> + <permission android:name="android.permission.SECRET" /> + <!-- @TestApi This is a test only permission. --> + <permission android:name="android.permission.TEST_ONLY" /> + </manifest>)"); + + std::string actual; + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), + true /* strip_api_annotations */, &actual)); + + const char* expected_access_internet = R"( /** + * Required to access the internet. + * Added in API 1. + */ + public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)"; + EXPECT_THAT(actual, HasSubstr(expected_access_internet)); + + const char* expected_play_outside = R"( /** + * @deprecated This permission is for playing outside. + */ + @Deprecated + public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)"; + EXPECT_THAT(actual, HasSubstr(expected_play_outside)); + + const char* expected_secret = R"( /** + * This is a private permission for system only! + * @hide + */ + public static final String SECRET="android.permission.SECRET";)"; + EXPECT_THAT(actual, HasSubstr(expected_secret)); + + const char* expected_test = R"( /** + * This is a test only permission. + */ + public static final String TEST_ONLY="android.permission.TEST_ONLY";)"; + EXPECT_THAT(actual, HasSubstr(expected_test)); +} + // This is bad but part of public API behaviour so we need to preserve it. TEST(ManifestClassGeneratorTest, LastSeenPermissionWithSameLeafNameTakesPrecedence) { std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); @@ -135,7 +187,8 @@ TEST(ManifestClassGeneratorTest, LastSeenPermissionWithSameLeafNameTakesPreceden </manifest>)"); std::string actual; - ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), + false /* strip_api_annotations */, &actual)); EXPECT_THAT(actual, HasSubstr("ACCESS_INTERNET=\"com.android.aapt.test.ACCESS_INTERNET\";")); EXPECT_THAT(actual, Not(HasSubstr("ACCESS_INTERNET=\"android.permission.ACCESS_INTERNET\";"))); EXPECT_THAT(actual, Not(HasSubstr("ACCESS_INTERNET=\"com.android.sample.ACCESS_INTERNET\";"))); @@ -149,11 +202,13 @@ TEST(ManifestClassGeneratorTest, NormalizePermissionNames) { </manifest>)"); std::string actual; - ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); + ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), + false /* strip_api_annotations */, &actual)); EXPECT_THAT(actual, HasSubstr("access_internet=\"android.permission.access-internet\";")); } static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, + bool strip_api_annotations, std::string* out_str) { std::unique_ptr<ClassDefinition> manifest_class = GenerateManifestClass(context->GetDiagnostics(), res); @@ -162,7 +217,7 @@ static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xm } StringOutputStream out(out_str); - manifest_class->WriteJavaFile(manifest_class.get(), "android", true, &out); + manifest_class->WriteJavaFile(manifest_class.get(), "android", true, strip_api_annotations, &out); out.Flush(); return ::testing::AssertionSuccess(); } diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp index a230de46dcf3..2608097a359a 100644 --- a/tools/stats_log_api_gen/Collation.cpp +++ b/tools/stats_log_api_gen/Collation.cpp @@ -20,7 +20,7 @@ #include <map> -#include "frameworks/base/cmds/statsd/src/atoms.pb.h" +#include "frameworks/proto_logging/stats/atoms.pb.h" namespace android { namespace stats_log_api_gen { diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h index 10b34ecf5f54..3deb3ae189a4 100644 --- a/tools/stats_log_api_gen/Collation.h +++ b/tools/stats_log_api_gen/Collation.h @@ -24,7 +24,7 @@ #include <set> #include <vector> -#include "frameworks/base/cmds/statsd/src/atom_field_options.pb.h" +#include "frameworks/proto_logging/stats/atom_field_options.pb.h" namespace android { namespace stats_log_api_gen { diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp index b888ce904b31..416dfdd1ae10 100644 --- a/tools/stats_log_api_gen/main.cpp +++ b/tools/stats_log_api_gen/main.cpp @@ -9,7 +9,7 @@ #include <vector> #include "Collation.h" -#include "frameworks/base/cmds/statsd/src/atoms.pb.h" +#include "frameworks/proto_logging/stats/atoms.pb.h" #include "java_writer.h" #include "java_writer_q.h" #include "native_writer.h" diff --git a/tools/stats_log_api_gen/test.proto b/tools/stats_log_api_gen/test.proto index aaa488e44fee..a3ea78533a5e 100644 --- a/tools/stats_log_api_gen/test.proto +++ b/tools/stats_log_api_gen/test.proto @@ -16,8 +16,8 @@ syntax = "proto2"; -import "frameworks/base/cmds/statsd/src/atoms.proto"; -import "frameworks/base/cmds/statsd/src/atom_field_options.proto"; +import "frameworks/proto_logging/stats/atoms.proto"; +import "frameworks/proto_logging/stats/atom_field_options.proto"; package android.stats_log_api_gen; diff --git a/wifi/Android.bp b/wifi/Android.bp index 941ff61b3ba5..3040041038cb 100644 --- a/wifi/Android.bp +++ b/wifi/Android.bp @@ -129,12 +129,8 @@ java_sdk_library { }, hostdex: true, // for hiddenapi check - // Allow access to the stubs from anywhere. - visibility: ["//visibility:public"], - // Restrict access to implementation library. impl_library_visibility: [ - "//visibility:override", // Ignore the visibility property. "//frameworks/opt/net/wifi/service:__subpackages__", ] + test_access_hidden_api_whitelist, diff --git a/wifi/TEST_MAPPING b/wifi/TEST_MAPPING new file mode 100644 index 000000000000..bb5e24166a1c --- /dev/null +++ b/wifi/TEST_MAPPING @@ -0,0 +1,16 @@ +{ + "mainline-presubmit": [ + { + // Install com.google.android.wifi.apex and run FrameworksWifiApiTests. + "name": "FrameworksWifiApiTests[com.google.android.wifi.apex]" + }, + { + "name": "CtsWifiTestCases[com.google.android.wifi.apex]", + "options": [ + { + "exclude-annotation": "android.net.wifi.cts.VirtualDeviceNotSupported" + } + ] + } + ] +} diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java index aa3a13925894..b276f2ed4761 100644 --- a/wifi/java/android/net/wifi/ScanResult.java +++ b/wifi/java/android/net/wifi/ScanResult.java @@ -581,12 +581,18 @@ public final class ScanResult implements Parcelable { * 6 GHz band frequency of first channel in MHz * @hide */ - public static final int BAND_6_GHZ_START_FREQ_MHZ = 5945; + public static final int BAND_6_GHZ_START_FREQ_MHZ = 5955; /** * 6 GHz band frequency of last channel in MHz * @hide */ - public static final int BAND_6_GHZ_END_FREQ_MHZ = 7105; + public static final int BAND_6_GHZ_END_FREQ_MHZ = 7115; + + /** + * 6 GHz band operating class 136 channel 2 center frequency in MHz + * @hide + */ + public static final int BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ = 5935; /** * Utility function to check if a frequency within 2.4 GHz band @@ -618,7 +624,10 @@ public final class ScanResult implements Parcelable { * @hide */ public static boolean is6GHz(int freqMhz) { - return freqMhz >= BAND_6_GHZ_START_FREQ_MHZ && freqMhz <= BAND_6_GHZ_END_FREQ_MHZ; + if (freqMhz == BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ) { + return true; + } + return (freqMhz >= BAND_6_GHZ_START_FREQ_MHZ && freqMhz <= BAND_6_GHZ_END_FREQ_MHZ); } /** @@ -649,6 +658,9 @@ public final class ScanResult implements Parcelable { } if (band == WifiScanner.WIFI_BAND_6_GHZ) { if (channel >= BAND_6_GHZ_FIRST_CH_NUM && channel <= BAND_6_GHZ_LAST_CH_NUM) { + if (channel == 2) { + return BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ; + } return ((channel - BAND_6_GHZ_FIRST_CH_NUM) * 5) + BAND_6_GHZ_START_FREQ_MHZ; } else { return UNSPECIFIED; @@ -673,6 +685,9 @@ public final class ScanResult implements Parcelable { } else if (is5GHz(freqMhz)) { return ((freqMhz - BAND_5_GHZ_START_FREQ_MHZ) / 5) + BAND_5_GHZ_FIRST_CH_NUM; } else if (is6GHz(freqMhz)) { + if (freqMhz == BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ) { + return 2; + } return ((freqMhz - BAND_6_GHZ_START_FREQ_MHZ) / 5) + BAND_6_GHZ_FIRST_CH_NUM; } diff --git a/wifi/java/android/net/wifi/SoftApConfiguration.java b/wifi/java/android/net/wifi/SoftApConfiguration.java index a5e76e6c92ee..6086f68f63cf 100644 --- a/wifi/java/android/net/wifi/SoftApConfiguration.java +++ b/wifi/java/android/net/wifi/SoftApConfiguration.java @@ -32,7 +32,6 @@ import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.nio.charset.CharsetEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -533,6 +532,7 @@ public final class SoftApConfiguration implements Parcelable { wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); break; case SECURITY_TYPE_WPA2_PSK: + case SECURITY_TYPE_WPA3_SAE_TRANSITION: wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK); break; default: @@ -711,10 +711,6 @@ public final class SoftApConfiguration implements Parcelable { } } else { Preconditions.checkStringNotEmpty(passphrase); - final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder(); - if (!asciiEncoder.canEncode(passphrase)) { - throw new IllegalArgumentException("passphrase not ASCII encodable"); - } if (securityType == SECURITY_TYPE_WPA2_PSK || securityType == SECURITY_TYPE_WPA3_SAE_TRANSITION) { if (passphrase.length() < PSK_MIN_LEN || passphrase.length() > PSK_MAX_LEN) { diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 71f0ab8087ab..7352dae06af9 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -2491,7 +2491,18 @@ public class WifiConfiguration implements Parcelable { @KeyMgmt.KeyMgmtScheme public int getAuthType() { if (allowedKeyManagement.cardinality() > 1) { - throw new IllegalStateException("More than one auth type set"); + if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) { + if (allowedKeyManagement.cardinality() == 2 + && allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { + return KeyMgmt.WPA_EAP; + } + if (allowedKeyManagement.cardinality() == 3 + && allowedKeyManagement.get(KeyMgmt.IEEE8021X) + && allowedKeyManagement.get(KeyMgmt.SUITE_B_192)) { + return KeyMgmt.SUITE_B_192; + } + } + throw new IllegalStateException("Invalid auth type set: " + allowedKeyManagement); } if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { return KeyMgmt.WPA_PSK; diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java index 77fa673f1960..90edc4523b7b 100644 --- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java +++ b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java @@ -30,6 +30,9 @@ import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.security.PrivateKey; import java.security.cert.X509Certificate; +import java.security.interfaces.ECPublicKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.ECParameterSpec; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -1442,4 +1445,50 @@ public class WifiEnterpriseConfig implements Parcelable { } return TextUtils.isEmpty(getCaPath()); } + + /** + * Check if a given certificate Get the Suite-B cipher from the certificate + * + * @param x509Certificate Certificate to process + * @return true if the certificate OID matches the Suite-B requirements for RSA or ECDSA + * certificates, or false otherwise. + * @hide + */ + public static boolean isSuiteBCipherCert(@Nullable X509Certificate x509Certificate) { + if (x509Certificate == null) { + return false; + } + final String sigAlgOid = x509Certificate.getSigAlgOID(); + + // Wi-Fi alliance requires the use of both ECDSA secp384r1 and RSA 3072 certificates + // in WPA3-Enterprise 192-bit security networks, which are also known as Suite-B-192 + // networks, even though NSA Suite-B-192 mandates ECDSA only. The use of the term + // Suite-B was already coined in the IEEE 802.11-2016 specification for + // AKM 00-0F-AC but the test plan for WPA3-Enterprise 192-bit for APs mandates + // support for both RSA and ECDSA, and for STAs it mandates ECDSA and optionally + // RSA. In order to be compatible with all WPA3-Enterprise 192-bit deployments, + // we are supporting both types here. + if (sigAlgOid.equals("1.2.840.113549.1.1.12")) { + // sha384WithRSAEncryption + if (x509Certificate.getPublicKey() instanceof RSAPublicKey) { + final RSAPublicKey rsaPublicKey = (RSAPublicKey) x509Certificate.getPublicKey(); + if (rsaPublicKey.getModulus() != null + && rsaPublicKey.getModulus().bitLength() >= 3072) { + return true; + } + } + } else if (sigAlgOid.equals("1.2.840.10045.4.3.3")) { + // ecdsa-with-SHA384 + if (x509Certificate.getPublicKey() instanceof ECPublicKey) { + final ECPublicKey ecPublicKey = (ECPublicKey) x509Certificate.getPublicKey(); + final ECParameterSpec ecParameterSpec = ecPublicKey.getParams(); + + if (ecParameterSpec != null && ecParameterSpec.getOrder() != null + && ecParameterSpec.getOrder().bitLength() >= 384) { + return true; + } + } + } + return false; + } } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index fb6af5b550b0..4a61db894b89 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -1054,8 +1054,8 @@ public class WifiManager { /** * Broadcast intent action indicating that the link configuration changed on wifi. * <br />Included Extras: - * <br />{@link #EXTRA_LINK_PROPERTIES}: {@link android.net.LinkProperties} object associated - * with the Wi-Fi network. + * <br />{@link #EXTRA_LINK_PROPERTIES}: may not be set starting in Android 11. Check for + * <br /> null before reading its value. * <br /> No permissions are required to listen to this broadcast. * @hide */ @@ -1071,6 +1071,10 @@ public class WifiManager { * Included in the {@link #ACTION_LINK_CONFIGURATION_CHANGED} broadcast. * * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}. + * + * Note: this extra may not be set starting in Android 11. Check for null before reading its + * value. + * * @hide */ @SystemApi diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java index b0213b0ef502..e12bb9178235 100644 --- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java +++ b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java @@ -78,12 +78,12 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc private @Nullable String mWpa3SaePassphrase; /** * The enterprise configuration details specifying the EAP method, - * certificates and other settings associated with the WPA-EAP networks. + * certificates and other settings associated with the WPA/WPA2-Enterprise networks. */ private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig; /** * The enterprise configuration details specifying the EAP method, - * certificates and other settings associated with the SuiteB networks. + * certificates and other settings associated with the WPA3-Enterprise networks. */ private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig; /** @@ -243,7 +243,11 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc /** * Set the associated enterprise configuration for this network. Needed for authenticating - * to WPA3-SuiteB networks. See {@link WifiEnterpriseConfig} for description. + * to WPA3-Enterprise networks (standard and 192-bit security). See + * {@link WifiEnterpriseConfig} for description. For 192-bit security networks, both the + * client and CA certificates must be provided, and must be of type of either + * sha384WithRSAEncryption (OID 1.2.840.113549.1.1.12) or ecdsa-with-SHA384 + * (OID 1.2.840.10045.4.3.3). * * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}. * @return Instance of {@link Builder} to enable chaining of the builder method. @@ -284,8 +288,25 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc } else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); configuration.enterpriseConfig = mWpa2EnterpriseConfig; - } else if (mWpa3EnterpriseConfig != null) { // WPA3-SuiteB network - configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B); + } else if (mWpa3EnterpriseConfig != null) { // WPA3-Enterprise + if (mWpa3EnterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS + && WifiEnterpriseConfig.isSuiteBCipherCert( + mWpa3EnterpriseConfig.getClientCertificate()) + && WifiEnterpriseConfig.isSuiteBCipherCert( + mWpa3EnterpriseConfig.getCaCertificate())) { + // WPA3-Enterprise in 192-bit security mode (Suite-B) + configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B); + } else { + // WPA3-Enterprise + configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); + configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN); + configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); + configuration.allowedPairwiseCiphers.set( + WifiConfiguration.PairwiseCipher.GCMP_256); + configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); + configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256); + configuration.requirePmf = true; + } configuration.enterpriseConfig = mWpa3EnterpriseConfig; } else if (mIsEnhancedOpen) { // OWE network configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE); diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java index 4d3a2c02c686..d8be1d2c853c 100644 --- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java +++ b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java @@ -72,12 +72,12 @@ public final class WifiNetworkSuggestion implements Parcelable { private @Nullable String mWpa3SaePassphrase; /** * The enterprise configuration details specifying the EAP method, - * certificates and other settings associated with the WPA-EAP networks. + * certificates and other settings associated with the WPA/WPA2-Enterprise networks. */ private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig; /** * The enterprise configuration details specifying the EAP method, - * certificates and other settings associated with the SuiteB networks. + * certificates and other settings associated with the WPA3-Enterprise networks. */ private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig; /** @@ -276,7 +276,11 @@ public final class WifiNetworkSuggestion implements Parcelable { /** * Set the associated enterprise configuration for this network. Needed for authenticating - * to WPA3 enterprise networks. See {@link WifiEnterpriseConfig} for description. + * to WPA3-Enterprise networks (standard and 192-bit security). See + * {@link WifiEnterpriseConfig} for description. For 192-bit security networks, both the + * client and CA certificates must be provided, and must be of type of either + * sha384WithRSAEncryption (OID 1.2.840.113549.1.1.12) or ecdsa-with-SHA384 + * (OID 1.2.840.10045.4.3.3). * * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}. * @return Instance of {@link Builder} to enable chaining of the builder method. @@ -522,8 +526,25 @@ public final class WifiNetworkSuggestion implements Parcelable { } else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); configuration.enterpriseConfig = mWpa2EnterpriseConfig; - } else if (mWpa3EnterpriseConfig != null) { // WPA3-SuiteB network - configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B); + } else if (mWpa3EnterpriseConfig != null) { // WPA3-Enterprise + if (mWpa3EnterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS + && WifiEnterpriseConfig.isSuiteBCipherCert( + mWpa3EnterpriseConfig.getClientCertificate()) + && WifiEnterpriseConfig.isSuiteBCipherCert( + mWpa3EnterpriseConfig.getCaCertificate())) { + // WPA3-Enterprise in 192-bit security mode (Suite-B) + configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B); + } else { + // WPA3-Enterprise + configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP); + configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN); + configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); + configuration.allowedPairwiseCiphers.set( + WifiConfiguration.PairwiseCipher.GCMP_256); + configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); + configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256); + configuration.requirePmf = true; + } configuration.enterpriseConfig = mWpa3EnterpriseConfig; } else if (mIsEnhancedOpen) { // OWE network configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE); @@ -943,6 +964,9 @@ public final class WifiNetworkSuggestion implements Parcelable { */ @Nullable public WifiEnterpriseConfig getEnterpriseConfig() { + if (!wifiConfiguration.isEnterprise()) { + return null; + } return wifiConfiguration.enterpriseConfig; } diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java index fa806e7797cd..282757ac5a14 100644 --- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java +++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java @@ -448,6 +448,16 @@ public final class Credential implements Parcelable { return new UserCredential[size]; } }; + + /** + * Get a unique identifier for UserCredential. + * + * @hide + * @return a Unique identifier for a UserCredential object + */ + public int getUniqueId() { + return Objects.hash(mUsername); + } } private UserCredential mUserCredential = null; /** @@ -1037,7 +1047,8 @@ public final class Credential implements Parcelable { * @return a Unique identifier for a Credential object */ public int getUniqueId() { - return Objects.hash(mUserCredential, mCertCredential, mSimCredential, mRealm); + return Objects.hash(mUserCredential != null ? mUserCredential.getUniqueId() : 0, + mCertCredential, mSimCredential, mRealm); } @Override diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java index 224c4bed9d5b..8f34579f6a5d 100644 --- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java +++ b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java @@ -313,9 +313,7 @@ public final class HomeSp implements Parcelable { * @return a Unique identifier for a HomeSp object */ public int getUniqueId() { - return Objects.hash(mFqdn, mFriendlyName, mHomeNetworkIds, Arrays.hashCode(mMatchAllOis), - Arrays.hashCode(mMatchAnyOis), Arrays.hashCode(mOtherHomePartners), - Arrays.hashCode(mRoamingConsortiumOis)); + return Objects.hash(mFqdn); } diff --git a/wifi/tests/Android.bp b/wifi/tests/Android.bp index 6a39959e8cfd..cb9693d3869e 100644 --- a/wifi/tests/Android.bp +++ b/wifi/tests/Android.bp @@ -44,7 +44,7 @@ android_test { ], test_suites: [ - "device-tests", + "general-tests", "mts", ], } diff --git a/wifi/tests/AndroidTest.xml b/wifi/tests/AndroidTest.xml index 34e2e3af9cda..5d0839b83dc6 100644 --- a/wifi/tests/AndroidTest.xml +++ b/wifi/tests/AndroidTest.xml @@ -20,6 +20,8 @@ <option name="test-suite-tag" value="apct" /> <option name="test-tag" value="FrameworksWifiApiTests" /> + <option name="config-descriptor:metadata" key="mainline-param" + value="com.google.android.wifi.apex" /> <test class="com.android.tradefed.testtype.AndroidJUnitTest" > <option name="package" value="android.net.wifi.test" /> <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> diff --git a/wifi/tests/src/android/net/wifi/FakeKeys.java b/wifi/tests/src/android/net/wifi/FakeKeys.java index c0d60c33f99c..8aa6add4a4e4 100644 --- a/wifi/tests/src/android/net/wifi/FakeKeys.java +++ b/wifi/tests/src/android/net/wifi/FakeKeys.java @@ -212,7 +212,443 @@ public class FakeKeys { (byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1, (byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51 }; - public static final PrivateKey RSA_KEY1 = loadPrivateRSAKey(FAKE_RSA_KEY_1); + public static final PrivateKey RSA_KEY1 = loadPrivateKey("RSA", FAKE_RSA_KEY_1); + + private static final String CA_SUITE_B_RSA3072_CERT_STRING = + "-----BEGIN CERTIFICATE-----\n" + + "MIIEnTCCAwWgAwIBAgIUD87Y8fFLzLr1HQ/64aEnjNq2R/4wDQYJKoZIhvcNAQEM\n" + + "BQAwXjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAO\n" + + "BgNVBAoMB0FuZHJvaWQxDjAMBgNVBAsMBVdpLUZpMRIwEAYDVQQDDAl1bml0ZXN0\n" + + "Q0EwHhcNMjAwNzIxMDIxNzU0WhcNMzAwNTMwMDIxNzU0WjBeMQswCQYDVQQGEwJV\n" + + "UzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA01UVjEQMA4GA1UECgwHQW5kcm9pZDEO\n" + + "MAwGA1UECwwFV2ktRmkxEjAQBgNVBAMMCXVuaXRlc3RDQTCCAaIwDQYJKoZIhvcN\n" + + "AQEBBQADggGPADCCAYoCggGBAMtrsT0otlxh0QS079KpRRbU1PQjCihSoltXnrxF\n" + + "sTWZs2weVEeYVyYU5LaauCDDgISCMtjtfbfylMBeYjpWB5hYzYQOiTzo0anWhMyb\n" + + "Ngb7gpMVZuIl6lwMYRyVRKwHWnTo2EUg1ZzW5rGe5fs/KHj6//hoNFm+3Oju0TQd\n" + + "nraQULpoERPF5B7p85Cssk8uNbviBfZXvtCuJ4N6w7PNceOY/9bbwc1mC+pPZmzV\n" + + "SOAg0vvbIQRzChm63C3jBC3xmxSOOZVrKN4zKDG2s8P0oCNGt0NlgRMrgbPRekzg\n" + + "4avkbA0vTuc2AyriTEYkdea/Mt4EpRg9XuOb43U/GJ/d/vQv2/9fsxhXmsZrn8kr\n" + + "Qo5MMHJFUd96GgHmvYSU3Mf/5r8gF626lvqHioGuTAuHUSnr02ri1WUxZ15LDRgY\n" + + "quMjDCFZfucjJPDAdtiHcFSej/4SLJlN39z8oKKNPn3aL9Gv49oAKs9S8tfDVzMk\n" + + "fDLROQFHFuW715GnnMgEAoOpRwIDAQABo1MwUTAdBgNVHQ4EFgQUeVuGmSVN4ARs\n" + + "mesUMWSJ2qWLbxUwHwYDVR0jBBgwFoAUeVuGmSVN4ARsmesUMWSJ2qWLbxUwDwYD\n" + + "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQwFAAOCAYEAit1Lo/hegZpPuT9dlWZJ\n" + + "bC8JvAf95O8lnn6LFb69pgYOHCLgCIlvYXu9rdBUJgZo+V1MzJJljiO6RxWRfKbQ\n" + + "8WBYkoqR1EqriR3Kn8q/SjIZCdFSaznTyU1wQMveBQ6RJWXSUhYVfE9RjyFTp7B4\n" + + "UyH2uCluR/0T06HQNGfH5XpIYQqCk1Zgng5lmEmheLDPoJpa92lKeQFJMC6eYz9g\n" + + "lF1GHxPxkPfbMJ6ZDp5X6Yopu6Q6uEXhVKM/iQVcgzRkx9rid+xTYl+nOKyK/XfC\n" + + "z8P0/TFIoPTW02DLge5wKagdoCpy1B7HdrAXyUjoH4B8MsUkq3kYPFSjPzScuTtV\n" + + "kUuDw5ipCNeXCRnhbYqRDk6PX5GUu2cmN9jtaH3tbgm3fKNOsd/BO1fLIl7qjXlR\n" + + "27HHbC0JXjNvlm2DLp23v4NTxS7WZGYsxyUj5DZrxBxqCsTXu/01w1BrQKWKh9FM\n" + + "aVrlA8omfVODK2CSuw+KhEMHepRv/AUgsLl4L4+RMoa+\n" + + "-----END CERTIFICATE-----\n"; + public static final X509Certificate CA_SUITE_B_RSA3072_CERT = + loadCertificate(CA_SUITE_B_RSA3072_CERT_STRING); + + private static final String CA_SUITE_B_ECDSA_CERT_STRING = + "-----BEGIN CERTIFICATE-----\n" + + "MIICTzCCAdSgAwIBAgIUdnLttwNPnQzFufplGOr9bTrGCqMwCgYIKoZIzj0EAwMw\n" + + "XjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNV\n" + + "BAoMB0FuZHJvaWQxDjAMBgNVBAsMBVdpLUZpMRIwEAYDVQQDDAl1bml0ZXN0Q0Ew\n" + + "HhcNMjAwNzIxMDIyNDA1WhcNMzAwNTMwMDIyNDA1WjBeMQswCQYDVQQGEwJVUzEL\n" + + "MAkGA1UECAwCQ0ExDDAKBgNVBAcMA01UVjEQMA4GA1UECgwHQW5kcm9pZDEOMAwG\n" + + "A1UECwwFV2ktRmkxEjAQBgNVBAMMCXVuaXRlc3RDQTB2MBAGByqGSM49AgEGBSuB\n" + + "BAAiA2IABFmntXwk9icqhDQFUP1xy04WyEpaGW4q6Q+8pujlSl/X3iotPZ++GZfp\n" + + "Mfv3YDHDBl6sELPQ2BEjyPXmpsKjOUdiUe69e88oGEdeqT2xXiQ6uzpTfJD4170i\n" + + "O/TwLrQGKKNTMFEwHQYDVR0OBBYEFCjptsX3g4g5W0L4oEP6N3gfyiZXMB8GA1Ud\n" + + "IwQYMBaAFCjptsX3g4g5W0L4oEP6N3gfyiZXMA8GA1UdEwEB/wQFMAMBAf8wCgYI\n" + + "KoZIzj0EAwMDaQAwZgIxAK61brUYRbLmQKiaEboZgrHtnPAcGo7Yzx3MwHecx3Dm\n" + + "5soIeLVYc8bPYN1pbhXW1gIxALdEe2sh03nBHyQH4adYoZungoCwt8mp/7sJFxou\n" + + "9UnRegyBgGzf74ROWdpZHzh+Pg==\n" + + "-----END CERTIFICATE-----\n"; + public static final X509Certificate CA_SUITE_B_ECDSA_CERT = + loadCertificate(CA_SUITE_B_ECDSA_CERT_STRING); + + private static final String CLIENT_SUITE_B_RSA3072_CERT_STRING = + "-----BEGIN CERTIFICATE-----\n" + + "MIIERzCCAq8CFDopjyNgaj+c2TN2k06h7okEWpHJMA0GCSqGSIb3DQEBDAUAMF4x\n" + + "CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDTVRWMRAwDgYDVQQK\n" + + "DAdBbmRyb2lkMQ4wDAYDVQQLDAVXaS1GaTESMBAGA1UEAwwJdW5pdGVzdENBMB4X\n" + + "DTIwMDcyMTAyMjkxMVoXDTMwMDUzMDAyMjkxMVowYjELMAkGA1UEBhMCVVMxCzAJ\n" + + "BgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNVBAoMB0FuZHJvaWQxDjAMBgNV\n" + + "BAsMBVdpLUZpMRYwFAYDVQQDDA11bml0ZXN0Q2xpZW50MIIBojANBgkqhkiG9w0B\n" + + "AQEFAAOCAY8AMIIBigKCAYEAwSK3C5K5udtCKTnE14e8z2cZvwmB4Xe+a8+7QLud\n" + + "Hooc/lQzClgK4MbVUC0D3FE+U32C78SxKoTaRWtvPmNm+UaFT8KkwyUno/dv+2XD\n" + + "pd/zARQ+3FwAfWopAhEyCVSxwsCa+slQ4juRIMIuUC1Mm0NaptZyM3Tj/ICQEfpk\n" + + "o9qVIbiK6eoJMTkY8EWfAn7RTFdfR1OLuO0mVOjgLW9/+upYv6hZ19nAMAxw4QTJ\n" + + "x7lLwALX7B+tDYNEZHDqYL2zyvQWAj2HClere8QYILxkvktgBg2crEJJe4XbDH7L\n" + + "A3rrXmsiqf1ZbfFFEzK9NFqovL+qGh+zIP+588ShJFO9H/RDnDpiTnAFTWXQdTwg\n" + + "szSS0Vw2PB+JqEABAa9DeMvXT1Oy+NY3ItPHyy63nQZVI2rXANw4NhwS0Z6DF+Qs\n" + + "TNrj+GU7e4SG/EGR8SvldjYfQTWFLg1l/UT1hOOkQZwdsaW1zgKyeuiFB2KdMmbA\n" + + "Sq+Ux1L1KICo0IglwWcB/8nnAgMBAAEwDQYJKoZIhvcNAQEMBQADggGBAMYwJkNw\n" + + "BaCviKFmReDTMwWPRy4AMNViEeqAXgERwDEKwM7efjsaj5gctWfKsxX6UdLzkhgg\n" + + "6S/T6PxVWKzJ6l7SoOuTa6tMQOZp+h3R1mdfEQbw8B5cXBxZ+batzAai6Fiy1FKS\n" + + "/ka3INbcGfYuIYghfTrb4/NJKN06ZaQ1bpPwq0e4gN7800T2nbawvSf7r+8ZLcG3\n" + + "6bGCjRMwDSIipNvOwoj3TG315XC7TccX5difQ4sKOY+d2MkVJ3RiO0Ciw2ZbEW8d\n" + + "1FH5vUQJWnBUfSFznosGzLwH3iWfqlP+27jNE+qB2igEwCRFgVAouURx5ou43xuX\n" + + "qf6JkdI3HTJGLIWxkp7gOeln4dEaYzKjYw+P0VqJvKVqQ0IXiLjHgE0J9p0vgyD6\n" + + "HVVcP7U8RgqrbIjL1QgHU4KBhGi+WSUh/mRplUCNvHgcYdcHi/gHpj/j6ubwqIGV\n" + + "z4iSolAHYTmBWcLyE0NgpzE6ntp+53r2KaUJA99l2iGVzbWTwqPSm0XAVw==\n" + + "-----END CERTIFICATE-----\n"; + public static final X509Certificate CLIENT_SUITE_B_RSA3072_CERT = + loadCertificate(CLIENT_SUITE_B_RSA3072_CERT_STRING); + + private static final byte[] CLIENT_SUITE_B_RSA3072_KEY_DATA = new byte[]{ + (byte) 0x30, (byte) 0x82, (byte) 0x06, (byte) 0xfe, (byte) 0x02, (byte) 0x01, + (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, + (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, + (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82, + (byte) 0x06, (byte) 0xe8, (byte) 0x30, (byte) 0x82, (byte) 0x06, (byte) 0xe4, + (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x82, (byte) 0x01, + (byte) 0x81, (byte) 0x00, (byte) 0xc1, (byte) 0x22, (byte) 0xb7, (byte) 0x0b, + (byte) 0x92, (byte) 0xb9, (byte) 0xb9, (byte) 0xdb, (byte) 0x42, (byte) 0x29, + (byte) 0x39, (byte) 0xc4, (byte) 0xd7, (byte) 0x87, (byte) 0xbc, (byte) 0xcf, + (byte) 0x67, (byte) 0x19, (byte) 0xbf, (byte) 0x09, (byte) 0x81, (byte) 0xe1, + (byte) 0x77, (byte) 0xbe, (byte) 0x6b, (byte) 0xcf, (byte) 0xbb, (byte) 0x40, + (byte) 0xbb, (byte) 0x9d, (byte) 0x1e, (byte) 0x8a, (byte) 0x1c, (byte) 0xfe, + (byte) 0x54, (byte) 0x33, (byte) 0x0a, (byte) 0x58, (byte) 0x0a, (byte) 0xe0, + (byte) 0xc6, (byte) 0xd5, (byte) 0x50, (byte) 0x2d, (byte) 0x03, (byte) 0xdc, + (byte) 0x51, (byte) 0x3e, (byte) 0x53, (byte) 0x7d, (byte) 0x82, (byte) 0xef, + (byte) 0xc4, (byte) 0xb1, (byte) 0x2a, (byte) 0x84, (byte) 0xda, (byte) 0x45, + (byte) 0x6b, (byte) 0x6f, (byte) 0x3e, (byte) 0x63, (byte) 0x66, (byte) 0xf9, + (byte) 0x46, (byte) 0x85, (byte) 0x4f, (byte) 0xc2, (byte) 0xa4, (byte) 0xc3, + (byte) 0x25, (byte) 0x27, (byte) 0xa3, (byte) 0xf7, (byte) 0x6f, (byte) 0xfb, + (byte) 0x65, (byte) 0xc3, (byte) 0xa5, (byte) 0xdf, (byte) 0xf3, (byte) 0x01, + (byte) 0x14, (byte) 0x3e, (byte) 0xdc, (byte) 0x5c, (byte) 0x00, (byte) 0x7d, + (byte) 0x6a, (byte) 0x29, (byte) 0x02, (byte) 0x11, (byte) 0x32, (byte) 0x09, + (byte) 0x54, (byte) 0xb1, (byte) 0xc2, (byte) 0xc0, (byte) 0x9a, (byte) 0xfa, + (byte) 0xc9, (byte) 0x50, (byte) 0xe2, (byte) 0x3b, (byte) 0x91, (byte) 0x20, + (byte) 0xc2, (byte) 0x2e, (byte) 0x50, (byte) 0x2d, (byte) 0x4c, (byte) 0x9b, + (byte) 0x43, (byte) 0x5a, (byte) 0xa6, (byte) 0xd6, (byte) 0x72, (byte) 0x33, + (byte) 0x74, (byte) 0xe3, (byte) 0xfc, (byte) 0x80, (byte) 0x90, (byte) 0x11, + (byte) 0xfa, (byte) 0x64, (byte) 0xa3, (byte) 0xda, (byte) 0x95, (byte) 0x21, + (byte) 0xb8, (byte) 0x8a, (byte) 0xe9, (byte) 0xea, (byte) 0x09, (byte) 0x31, + (byte) 0x39, (byte) 0x18, (byte) 0xf0, (byte) 0x45, (byte) 0x9f, (byte) 0x02, + (byte) 0x7e, (byte) 0xd1, (byte) 0x4c, (byte) 0x57, (byte) 0x5f, (byte) 0x47, + (byte) 0x53, (byte) 0x8b, (byte) 0xb8, (byte) 0xed, (byte) 0x26, (byte) 0x54, + (byte) 0xe8, (byte) 0xe0, (byte) 0x2d, (byte) 0x6f, (byte) 0x7f, (byte) 0xfa, + (byte) 0xea, (byte) 0x58, (byte) 0xbf, (byte) 0xa8, (byte) 0x59, (byte) 0xd7, + (byte) 0xd9, (byte) 0xc0, (byte) 0x30, (byte) 0x0c, (byte) 0x70, (byte) 0xe1, + (byte) 0x04, (byte) 0xc9, (byte) 0xc7, (byte) 0xb9, (byte) 0x4b, (byte) 0xc0, + (byte) 0x02, (byte) 0xd7, (byte) 0xec, (byte) 0x1f, (byte) 0xad, (byte) 0x0d, + (byte) 0x83, (byte) 0x44, (byte) 0x64, (byte) 0x70, (byte) 0xea, (byte) 0x60, + (byte) 0xbd, (byte) 0xb3, (byte) 0xca, (byte) 0xf4, (byte) 0x16, (byte) 0x02, + (byte) 0x3d, (byte) 0x87, (byte) 0x0a, (byte) 0x57, (byte) 0xab, (byte) 0x7b, + (byte) 0xc4, (byte) 0x18, (byte) 0x20, (byte) 0xbc, (byte) 0x64, (byte) 0xbe, + (byte) 0x4b, (byte) 0x60, (byte) 0x06, (byte) 0x0d, (byte) 0x9c, (byte) 0xac, + (byte) 0x42, (byte) 0x49, (byte) 0x7b, (byte) 0x85, (byte) 0xdb, (byte) 0x0c, + (byte) 0x7e, (byte) 0xcb, (byte) 0x03, (byte) 0x7a, (byte) 0xeb, (byte) 0x5e, + (byte) 0x6b, (byte) 0x22, (byte) 0xa9, (byte) 0xfd, (byte) 0x59, (byte) 0x6d, + (byte) 0xf1, (byte) 0x45, (byte) 0x13, (byte) 0x32, (byte) 0xbd, (byte) 0x34, + (byte) 0x5a, (byte) 0xa8, (byte) 0xbc, (byte) 0xbf, (byte) 0xaa, (byte) 0x1a, + (byte) 0x1f, (byte) 0xb3, (byte) 0x20, (byte) 0xff, (byte) 0xb9, (byte) 0xf3, + (byte) 0xc4, (byte) 0xa1, (byte) 0x24, (byte) 0x53, (byte) 0xbd, (byte) 0x1f, + (byte) 0xf4, (byte) 0x43, (byte) 0x9c, (byte) 0x3a, (byte) 0x62, (byte) 0x4e, + (byte) 0x70, (byte) 0x05, (byte) 0x4d, (byte) 0x65, (byte) 0xd0, (byte) 0x75, + (byte) 0x3c, (byte) 0x20, (byte) 0xb3, (byte) 0x34, (byte) 0x92, (byte) 0xd1, + (byte) 0x5c, (byte) 0x36, (byte) 0x3c, (byte) 0x1f, (byte) 0x89, (byte) 0xa8, + (byte) 0x40, (byte) 0x01, (byte) 0x01, (byte) 0xaf, (byte) 0x43, (byte) 0x78, + (byte) 0xcb, (byte) 0xd7, (byte) 0x4f, (byte) 0x53, (byte) 0xb2, (byte) 0xf8, + (byte) 0xd6, (byte) 0x37, (byte) 0x22, (byte) 0xd3, (byte) 0xc7, (byte) 0xcb, + (byte) 0x2e, (byte) 0xb7, (byte) 0x9d, (byte) 0x06, (byte) 0x55, (byte) 0x23, + (byte) 0x6a, (byte) 0xd7, (byte) 0x00, (byte) 0xdc, (byte) 0x38, (byte) 0x36, + (byte) 0x1c, (byte) 0x12, (byte) 0xd1, (byte) 0x9e, (byte) 0x83, (byte) 0x17, + (byte) 0xe4, (byte) 0x2c, (byte) 0x4c, (byte) 0xda, (byte) 0xe3, (byte) 0xf8, + (byte) 0x65, (byte) 0x3b, (byte) 0x7b, (byte) 0x84, (byte) 0x86, (byte) 0xfc, + (byte) 0x41, (byte) 0x91, (byte) 0xf1, (byte) 0x2b, (byte) 0xe5, (byte) 0x76, + (byte) 0x36, (byte) 0x1f, (byte) 0x41, (byte) 0x35, (byte) 0x85, (byte) 0x2e, + (byte) 0x0d, (byte) 0x65, (byte) 0xfd, (byte) 0x44, (byte) 0xf5, (byte) 0x84, + (byte) 0xe3, (byte) 0xa4, (byte) 0x41, (byte) 0x9c, (byte) 0x1d, (byte) 0xb1, + (byte) 0xa5, (byte) 0xb5, (byte) 0xce, (byte) 0x02, (byte) 0xb2, (byte) 0x7a, + (byte) 0xe8, (byte) 0x85, (byte) 0x07, (byte) 0x62, (byte) 0x9d, (byte) 0x32, + (byte) 0x66, (byte) 0xc0, (byte) 0x4a, (byte) 0xaf, (byte) 0x94, (byte) 0xc7, + (byte) 0x52, (byte) 0xf5, (byte) 0x28, (byte) 0x80, (byte) 0xa8, (byte) 0xd0, + (byte) 0x88, (byte) 0x25, (byte) 0xc1, (byte) 0x67, (byte) 0x01, (byte) 0xff, + (byte) 0xc9, (byte) 0xe7, (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00, + (byte) 0x01, (byte) 0x02, (byte) 0x82, (byte) 0x01, (byte) 0x80, (byte) 0x04, + (byte) 0xb1, (byte) 0xcc, (byte) 0x53, (byte) 0x3a, (byte) 0xb0, (byte) 0xcb, + (byte) 0x04, (byte) 0xba, (byte) 0x59, (byte) 0xf8, (byte) 0x2e, (byte) 0x81, + (byte) 0xb2, (byte) 0xa9, (byte) 0xf3, (byte) 0x3c, (byte) 0xa5, (byte) 0x52, + (byte) 0x90, (byte) 0x6f, (byte) 0x98, (byte) 0xc4, (byte) 0x69, (byte) 0x5b, + (byte) 0x83, (byte) 0x84, (byte) 0x20, (byte) 0xb1, (byte) 0xae, (byte) 0xc3, + (byte) 0x04, (byte) 0x46, (byte) 0x6a, (byte) 0x24, (byte) 0x2f, (byte) 0xcd, + (byte) 0x6b, (byte) 0x90, (byte) 0x70, (byte) 0x20, (byte) 0x45, (byte) 0x25, + (byte) 0x1a, (byte) 0xc3, (byte) 0x02, (byte) 0x42, (byte) 0xf3, (byte) 0x49, + (byte) 0xe2, (byte) 0x3e, (byte) 0x21, (byte) 0x87, (byte) 0xdd, (byte) 0x6a, + (byte) 0x94, (byte) 0x2a, (byte) 0x1e, (byte) 0x0f, (byte) 0xdb, (byte) 0x77, + (byte) 0x5f, (byte) 0xc1, (byte) 0x2c, (byte) 0x03, (byte) 0xfb, (byte) 0xcf, + (byte) 0x91, (byte) 0x82, (byte) 0xa1, (byte) 0xbf, (byte) 0xb0, (byte) 0x73, + (byte) 0xfa, (byte) 0xda, (byte) 0xbc, (byte) 0xf8, (byte) 0x9f, (byte) 0x45, + (byte) 0xd3, (byte) 0xe8, (byte) 0xbb, (byte) 0x38, (byte) 0xfb, (byte) 0xc2, + (byte) 0x2d, (byte) 0x76, (byte) 0x51, (byte) 0x96, (byte) 0x18, (byte) 0x03, + (byte) 0x15, (byte) 0xd9, (byte) 0xea, (byte) 0x82, (byte) 0x25, (byte) 0x83, + (byte) 0xff, (byte) 0x5c, (byte) 0x85, (byte) 0x06, (byte) 0x09, (byte) 0xb2, + (byte) 0x46, (byte) 0x12, (byte) 0x64, (byte) 0x02, (byte) 0x74, (byte) 0x4f, + (byte) 0xbc, (byte) 0x9a, (byte) 0x25, (byte) 0x18, (byte) 0x01, (byte) 0x07, + (byte) 0x17, (byte) 0x25, (byte) 0x55, (byte) 0x7c, (byte) 0xdc, (byte) 0xe1, + (byte) 0xd1, (byte) 0x5a, (byte) 0x2f, (byte) 0x25, (byte) 0xaf, (byte) 0xf6, + (byte) 0x8f, (byte) 0xa4, (byte) 0x9a, (byte) 0x5a, (byte) 0x3a, (byte) 0xfe, + (byte) 0x2e, (byte) 0x93, (byte) 0x24, (byte) 0xa0, (byte) 0x27, (byte) 0xac, + (byte) 0x07, (byte) 0x75, (byte) 0x33, (byte) 0x01, (byte) 0x54, (byte) 0x23, + (byte) 0x0f, (byte) 0xe8, (byte) 0x9f, (byte) 0xfa, (byte) 0x36, (byte) 0xe6, + (byte) 0x3a, (byte) 0xd5, (byte) 0x78, (byte) 0xb0, (byte) 0xe4, (byte) 0x6a, + (byte) 0x16, (byte) 0x50, (byte) 0xbd, (byte) 0x0f, (byte) 0x9f, (byte) 0x32, + (byte) 0xa1, (byte) 0x6b, (byte) 0xf5, (byte) 0xa4, (byte) 0x34, (byte) 0x58, + (byte) 0xb6, (byte) 0xa4, (byte) 0xb3, (byte) 0xc3, (byte) 0x83, (byte) 0x08, + (byte) 0x18, (byte) 0xc7, (byte) 0xef, (byte) 0x95, (byte) 0xe2, (byte) 0x1b, + (byte) 0xba, (byte) 0x35, (byte) 0x61, (byte) 0xa3, (byte) 0xb4, (byte) 0x30, + (byte) 0xe0, (byte) 0xd1, (byte) 0xc1, (byte) 0xa2, (byte) 0x3a, (byte) 0xc6, + (byte) 0xb4, (byte) 0xd2, (byte) 0x80, (byte) 0x5a, (byte) 0xaf, (byte) 0xa4, + (byte) 0x54, (byte) 0x3c, (byte) 0x66, (byte) 0x5a, (byte) 0x1c, (byte) 0x4d, + (byte) 0xe1, (byte) 0xd9, (byte) 0x98, (byte) 0x44, (byte) 0x01, (byte) 0x1b, + (byte) 0x8c, (byte) 0xe9, (byte) 0x80, (byte) 0x54, (byte) 0x83, (byte) 0x3d, + (byte) 0x96, (byte) 0x25, (byte) 0x41, (byte) 0x1c, (byte) 0xad, (byte) 0xae, + (byte) 0x3b, (byte) 0x7a, (byte) 0xd7, (byte) 0x9d, (byte) 0x10, (byte) 0x7c, + (byte) 0xd1, (byte) 0xa7, (byte) 0x96, (byte) 0x39, (byte) 0xa5, (byte) 0x2f, + (byte) 0xbe, (byte) 0xc3, (byte) 0x2c, (byte) 0x64, (byte) 0x01, (byte) 0xfe, + (byte) 0xa2, (byte) 0xd1, (byte) 0x6a, (byte) 0xcf, (byte) 0x4c, (byte) 0x76, + (byte) 0x3b, (byte) 0xc8, (byte) 0x35, (byte) 0x21, (byte) 0xda, (byte) 0x98, + (byte) 0xcf, (byte) 0xf9, (byte) 0x29, (byte) 0xff, (byte) 0x30, (byte) 0x59, + (byte) 0x36, (byte) 0x53, (byte) 0x0b, (byte) 0xbb, (byte) 0xfa, (byte) 0xba, + (byte) 0xc4, (byte) 0x03, (byte) 0x23, (byte) 0xe0, (byte) 0xd3, (byte) 0x33, + (byte) 0xff, (byte) 0x32, (byte) 0xdb, (byte) 0x30, (byte) 0x64, (byte) 0xc7, + (byte) 0x56, (byte) 0xca, (byte) 0x55, (byte) 0x14, (byte) 0xee, (byte) 0x58, + (byte) 0xfe, (byte) 0x96, (byte) 0x7e, (byte) 0x1c, (byte) 0x34, (byte) 0x16, + (byte) 0xeb, (byte) 0x76, (byte) 0x26, (byte) 0x48, (byte) 0xe2, (byte) 0xe5, + (byte) 0x5c, (byte) 0xd5, (byte) 0x83, (byte) 0x37, (byte) 0xd9, (byte) 0x09, + (byte) 0x71, (byte) 0xbc, (byte) 0x54, (byte) 0x25, (byte) 0xca, (byte) 0x2e, + (byte) 0xdb, (byte) 0x36, (byte) 0x39, (byte) 0xcc, (byte) 0x3a, (byte) 0x81, + (byte) 0x95, (byte) 0x9e, (byte) 0xf4, (byte) 0x01, (byte) 0xa7, (byte) 0xc0, + (byte) 0x20, (byte) 0xce, (byte) 0x70, (byte) 0x55, (byte) 0x2c, (byte) 0xe0, + (byte) 0x93, (byte) 0x72, (byte) 0xa6, (byte) 0x25, (byte) 0xda, (byte) 0x64, + (byte) 0x19, (byte) 0x18, (byte) 0xd2, (byte) 0x31, (byte) 0xe2, (byte) 0x7c, + (byte) 0xf2, (byte) 0x30, (byte) 0x9e, (byte) 0x8d, (byte) 0xc6, (byte) 0x14, + (byte) 0x8a, (byte) 0x38, (byte) 0xf0, (byte) 0x94, (byte) 0xeb, (byte) 0xf4, + (byte) 0x64, (byte) 0x92, (byte) 0x3d, (byte) 0x67, (byte) 0xa6, (byte) 0x2c, + (byte) 0x52, (byte) 0xfc, (byte) 0x60, (byte) 0xca, (byte) 0x2a, (byte) 0xcf, + (byte) 0x24, (byte) 0xd5, (byte) 0x42, (byte) 0x5f, (byte) 0xc7, (byte) 0x9f, + (byte) 0xf3, (byte) 0xb4, (byte) 0xdf, (byte) 0x76, (byte) 0x6e, (byte) 0x53, + (byte) 0xa1, (byte) 0x7b, (byte) 0xae, (byte) 0xa5, (byte) 0x84, (byte) 0x1f, + (byte) 0xfa, (byte) 0xc0, (byte) 0xb4, (byte) 0x6c, (byte) 0xc9, (byte) 0x02, + (byte) 0x81, (byte) 0xc1, (byte) 0x00, (byte) 0xf3, (byte) 0x17, (byte) 0xd9, + (byte) 0x48, (byte) 0x17, (byte) 0x87, (byte) 0x84, (byte) 0x16, (byte) 0xea, + (byte) 0x2d, (byte) 0x31, (byte) 0x1b, (byte) 0xce, (byte) 0xec, (byte) 0xaf, + (byte) 0xdc, (byte) 0x6b, (byte) 0xaf, (byte) 0xc8, (byte) 0xf1, (byte) 0x40, + (byte) 0xa7, (byte) 0x4f, (byte) 0xef, (byte) 0x48, (byte) 0x08, (byte) 0x5e, + (byte) 0x9a, (byte) 0xd1, (byte) 0xc0, (byte) 0xb1, (byte) 0xfe, (byte) 0xe7, + (byte) 0x03, (byte) 0xd5, (byte) 0x96, (byte) 0x01, (byte) 0xe8, (byte) 0x40, + (byte) 0xca, (byte) 0x78, (byte) 0xcb, (byte) 0xb3, (byte) 0x28, (byte) 0x1a, + (byte) 0xf0, (byte) 0xe5, (byte) 0xf6, (byte) 0x46, (byte) 0xef, (byte) 0xcd, + (byte) 0x1a, (byte) 0x0f, (byte) 0x13, (byte) 0x2d, (byte) 0x38, (byte) 0xf8, + (byte) 0xf7, (byte) 0x88, (byte) 0x21, (byte) 0x15, (byte) 0xce, (byte) 0x48, + (byte) 0xf4, (byte) 0x92, (byte) 0x7e, (byte) 0x9b, (byte) 0x2e, (byte) 0x2f, + (byte) 0x22, (byte) 0x3e, (byte) 0x5c, (byte) 0x67, (byte) 0xd7, (byte) 0x58, + (byte) 0xf6, (byte) 0xef, (byte) 0x1f, (byte) 0xb4, (byte) 0x04, (byte) 0xc7, + (byte) 0xfd, (byte) 0x8c, (byte) 0x4e, (byte) 0x27, (byte) 0x9e, (byte) 0xb9, + (byte) 0xef, (byte) 0x0f, (byte) 0xf7, (byte) 0x4a, (byte) 0xc2, (byte) 0xf4, + (byte) 0x64, (byte) 0x6b, (byte) 0xe0, (byte) 0xfb, (byte) 0xe3, (byte) 0x45, + (byte) 0xd5, (byte) 0x37, (byte) 0xa0, (byte) 0x2a, (byte) 0xc6, (byte) 0xf3, + (byte) 0xf6, (byte) 0xcc, (byte) 0xb5, (byte) 0x94, (byte) 0xbf, (byte) 0x56, + (byte) 0xa0, (byte) 0x61, (byte) 0x36, (byte) 0x88, (byte) 0x35, (byte) 0xd5, + (byte) 0xa5, (byte) 0xad, (byte) 0x20, (byte) 0x48, (byte) 0xda, (byte) 0x70, + (byte) 0x35, (byte) 0xd9, (byte) 0x75, (byte) 0x66, (byte) 0xa5, (byte) 0xac, + (byte) 0x86, (byte) 0x7a, (byte) 0x75, (byte) 0x49, (byte) 0x88, (byte) 0x40, + (byte) 0xce, (byte) 0xb0, (byte) 0x6f, (byte) 0x57, (byte) 0x15, (byte) 0x54, + (byte) 0xd3, (byte) 0x2f, (byte) 0x11, (byte) 0x9b, (byte) 0xe3, (byte) 0x87, + (byte) 0xc8, (byte) 0x8d, (byte) 0x98, (byte) 0xc6, (byte) 0xe0, (byte) 0xbc, + (byte) 0x85, (byte) 0xb9, (byte) 0x04, (byte) 0x43, (byte) 0xa9, (byte) 0x41, + (byte) 0xce, (byte) 0x42, (byte) 0x1a, (byte) 0x57, (byte) 0x10, (byte) 0xd8, + (byte) 0xe4, (byte) 0x6a, (byte) 0x51, (byte) 0x10, (byte) 0x0a, (byte) 0xec, + (byte) 0xe4, (byte) 0x57, (byte) 0xc7, (byte) 0xee, (byte) 0xe9, (byte) 0xd6, + (byte) 0xcb, (byte) 0x3e, (byte) 0xba, (byte) 0xfa, (byte) 0xe9, (byte) 0x0e, + (byte) 0xed, (byte) 0x87, (byte) 0x04, (byte) 0x9a, (byte) 0x48, (byte) 0xba, + (byte) 0xaf, (byte) 0x08, (byte) 0xf5, (byte) 0x02, (byte) 0x81, (byte) 0xc1, + (byte) 0x00, (byte) 0xcb, (byte) 0x63, (byte) 0xd6, (byte) 0x54, (byte) 0xb6, + (byte) 0xf3, (byte) 0xf3, (byte) 0x8c, (byte) 0xf8, (byte) 0xd0, (byte) 0xd2, + (byte) 0x84, (byte) 0xc1, (byte) 0xf5, (byte) 0x12, (byte) 0xe0, (byte) 0x02, + (byte) 0x80, (byte) 0x42, (byte) 0x92, (byte) 0x4e, (byte) 0xa4, (byte) 0x5c, + (byte) 0xa5, (byte) 0x64, (byte) 0xec, (byte) 0xb7, (byte) 0xdc, (byte) 0xe0, + (byte) 0x2d, (byte) 0x5d, (byte) 0xac, (byte) 0x0e, (byte) 0x24, (byte) 0x48, + (byte) 0x13, (byte) 0x05, (byte) 0xe8, (byte) 0xff, (byte) 0x96, (byte) 0x93, + (byte) 0xba, (byte) 0x3c, (byte) 0x88, (byte) 0xcc, (byte) 0x80, (byte) 0xf9, + (byte) 0xdb, (byte) 0xa8, (byte) 0x4d, (byte) 0x86, (byte) 0x47, (byte) 0xc8, + (byte) 0xbf, (byte) 0x34, (byte) 0x2d, (byte) 0xda, (byte) 0xb6, (byte) 0x28, + (byte) 0xf0, (byte) 0x1e, (byte) 0xd2, (byte) 0x46, (byte) 0x0d, (byte) 0x6f, + (byte) 0x36, (byte) 0x8e, (byte) 0x84, (byte) 0xd8, (byte) 0xaf, (byte) 0xf7, + (byte) 0x69, (byte) 0x23, (byte) 0x77, (byte) 0xfb, (byte) 0xc5, (byte) 0x04, + (byte) 0x08, (byte) 0x18, (byte) 0xac, (byte) 0x85, (byte) 0x80, (byte) 0x87, + (byte) 0x1c, (byte) 0xfe, (byte) 0x8e, (byte) 0x5d, (byte) 0x00, (byte) 0x7f, + (byte) 0x5b, (byte) 0x33, (byte) 0xf5, (byte) 0xdf, (byte) 0x70, (byte) 0x81, + (byte) 0xad, (byte) 0x81, (byte) 0xf4, (byte) 0x5a, (byte) 0x37, (byte) 0x8a, + (byte) 0x79, (byte) 0x09, (byte) 0xc5, (byte) 0x55, (byte) 0xab, (byte) 0x58, + (byte) 0x7c, (byte) 0x47, (byte) 0xca, (byte) 0xa5, (byte) 0x80, (byte) 0x49, + (byte) 0x5f, (byte) 0x71, (byte) 0x83, (byte) 0xfb, (byte) 0x3b, (byte) 0x06, + (byte) 0xec, (byte) 0x75, (byte) 0x23, (byte) 0xc4, (byte) 0x32, (byte) 0xc7, + (byte) 0x18, (byte) 0xf6, (byte) 0x82, (byte) 0x95, (byte) 0x98, (byte) 0x39, + (byte) 0xf7, (byte) 0x92, (byte) 0x31, (byte) 0xc0, (byte) 0x89, (byte) 0xba, + (byte) 0xd4, (byte) 0xd4, (byte) 0x58, (byte) 0x4e, (byte) 0x38, (byte) 0x35, + (byte) 0x10, (byte) 0xb9, (byte) 0xf1, (byte) 0x27, (byte) 0xdc, (byte) 0xff, + (byte) 0xc7, (byte) 0xb2, (byte) 0xba, (byte) 0x1f, (byte) 0x27, (byte) 0xaf, + (byte) 0x99, (byte) 0xd5, (byte) 0xb0, (byte) 0x39, (byte) 0xe7, (byte) 0x43, + (byte) 0x88, (byte) 0xd3, (byte) 0xce, (byte) 0x38, (byte) 0xc2, (byte) 0x99, + (byte) 0x43, (byte) 0xfc, (byte) 0x8a, (byte) 0xe3, (byte) 0x60, (byte) 0x0d, + (byte) 0x0a, (byte) 0xb8, (byte) 0xc4, (byte) 0x29, (byte) 0xca, (byte) 0x0d, + (byte) 0x30, (byte) 0xaf, (byte) 0xca, (byte) 0xd0, (byte) 0xaa, (byte) 0x67, + (byte) 0xb1, (byte) 0xdd, (byte) 0xdb, (byte) 0x7a, (byte) 0x11, (byte) 0xad, + (byte) 0xeb, (byte) 0x02, (byte) 0x81, (byte) 0xc0, (byte) 0x71, (byte) 0xb8, + (byte) 0xcf, (byte) 0x72, (byte) 0x35, (byte) 0x67, (byte) 0xb5, (byte) 0x38, + (byte) 0x8f, (byte) 0x16, (byte) 0xd3, (byte) 0x29, (byte) 0x82, (byte) 0x35, + (byte) 0x21, (byte) 0xd4, (byte) 0x49, (byte) 0x20, (byte) 0x74, (byte) 0x2d, + (byte) 0xc0, (byte) 0xa4, (byte) 0x44, (byte) 0xf5, (byte) 0xd8, (byte) 0xc9, + (byte) 0xe9, (byte) 0x90, (byte) 0x1d, (byte) 0xde, (byte) 0x3a, (byte) 0xa6, + (byte) 0xd7, (byte) 0xe5, (byte) 0xe8, (byte) 0x4e, (byte) 0x83, (byte) 0xd7, + (byte) 0xe6, (byte) 0x2f, (byte) 0x92, (byte) 0x31, (byte) 0x21, (byte) 0x3f, + (byte) 0xfa, (byte) 0xd2, (byte) 0x85, (byte) 0x92, (byte) 0x1f, (byte) 0xff, + (byte) 0x61, (byte) 0x00, (byte) 0xf6, (byte) 0xda, (byte) 0x6e, (byte) 0xc6, + (byte) 0x7f, (byte) 0x5a, (byte) 0x35, (byte) 0x79, (byte) 0xdc, (byte) 0xdc, + (byte) 0xa3, (byte) 0x2e, (byte) 0x9f, (byte) 0x35, (byte) 0xd1, (byte) 0x5c, + (byte) 0xda, (byte) 0xb9, (byte) 0xf7, (byte) 0x58, (byte) 0x7d, (byte) 0x4f, + (byte) 0xb6, (byte) 0x13, (byte) 0xd7, (byte) 0x2c, (byte) 0x0a, (byte) 0xa8, + (byte) 0x4d, (byte) 0xf2, (byte) 0xe4, (byte) 0x67, (byte) 0x4f, (byte) 0x8b, + (byte) 0xa6, (byte) 0xca, (byte) 0x1a, (byte) 0xbb, (byte) 0x02, (byte) 0x63, + (byte) 0x8f, (byte) 0xb7, (byte) 0x46, (byte) 0xec, (byte) 0x7a, (byte) 0x8a, + (byte) 0x09, (byte) 0x0a, (byte) 0x45, (byte) 0x3a, (byte) 0x8d, (byte) 0xa8, + (byte) 0x83, (byte) 0x4b, (byte) 0x0a, (byte) 0xdb, (byte) 0x4b, (byte) 0x99, + (byte) 0xf3, (byte) 0x69, (byte) 0x95, (byte) 0xf0, (byte) 0xcf, (byte) 0xe9, + (byte) 0xf7, (byte) 0x67, (byte) 0xc9, (byte) 0x45, (byte) 0x18, (byte) 0x2f, + (byte) 0xf0, (byte) 0x5c, (byte) 0x90, (byte) 0xbd, (byte) 0xa6, (byte) 0x66, + (byte) 0x8c, (byte) 0xfe, (byte) 0x60, (byte) 0x5d, (byte) 0x6c, (byte) 0x27, + (byte) 0xec, (byte) 0xc1, (byte) 0x84, (byte) 0xb2, (byte) 0xa1, (byte) 0x97, + (byte) 0x9e, (byte) 0x16, (byte) 0x29, (byte) 0xa7, (byte) 0xe0, (byte) 0x38, + (byte) 0xa2, (byte) 0x36, (byte) 0x05, (byte) 0x5f, (byte) 0xda, (byte) 0x72, + (byte) 0x1a, (byte) 0x5f, (byte) 0xa8, (byte) 0x7d, (byte) 0x41, (byte) 0x35, + (byte) 0xf6, (byte) 0x4e, (byte) 0x0a, (byte) 0x88, (byte) 0x8e, (byte) 0x00, + (byte) 0x98, (byte) 0xa6, (byte) 0xca, (byte) 0xc1, (byte) 0xdf, (byte) 0x72, + (byte) 0x6c, (byte) 0xfe, (byte) 0x29, (byte) 0xbe, (byte) 0xa3, (byte) 0x9b, + (byte) 0x0b, (byte) 0x5c, (byte) 0x0b, (byte) 0x9d, (byte) 0xa7, (byte) 0x71, + (byte) 0xce, (byte) 0x04, (byte) 0xfa, (byte) 0xac, (byte) 0x01, (byte) 0x8d, + (byte) 0x52, (byte) 0xa0, (byte) 0x3d, (byte) 0xdd, (byte) 0x02, (byte) 0x81, + (byte) 0xc1, (byte) 0x00, (byte) 0xc1, (byte) 0xc0, (byte) 0x2e, (byte) 0xa9, + (byte) 0xee, (byte) 0xca, (byte) 0xff, (byte) 0xe4, (byte) 0xf8, (byte) 0x15, + (byte) 0xfd, (byte) 0xa5, (byte) 0x68, (byte) 0x1b, (byte) 0x2d, (byte) 0x4a, + (byte) 0xe6, (byte) 0x37, (byte) 0x06, (byte) 0xb3, (byte) 0xd7, (byte) 0x64, + (byte) 0xad, (byte) 0xb9, (byte) 0x05, (byte) 0x26, (byte) 0x97, (byte) 0x94, + (byte) 0x3a, (byte) 0x9e, (byte) 0x1c, (byte) 0xd0, (byte) 0xcd, (byte) 0x7b, + (byte) 0xf4, (byte) 0x88, (byte) 0xe2, (byte) 0xa5, (byte) 0x6d, (byte) 0xed, + (byte) 0x24, (byte) 0x77, (byte) 0x52, (byte) 0x39, (byte) 0x43, (byte) 0x0f, + (byte) 0x4e, (byte) 0x75, (byte) 0xd8, (byte) 0xa3, (byte) 0x59, (byte) 0x5a, + (byte) 0xc2, (byte) 0xba, (byte) 0x9a, (byte) 0x5b, (byte) 0x60, (byte) 0x31, + (byte) 0x0d, (byte) 0x58, (byte) 0x89, (byte) 0x13, (byte) 0xe8, (byte) 0x95, + (byte) 0xdd, (byte) 0xae, (byte) 0xcc, (byte) 0x1f, (byte) 0x73, (byte) 0x48, + (byte) 0x55, (byte) 0xd8, (byte) 0xfb, (byte) 0x67, (byte) 0xce, (byte) 0x18, + (byte) 0x85, (byte) 0x59, (byte) 0xad, (byte) 0x1f, (byte) 0x93, (byte) 0xe1, + (byte) 0xb7, (byte) 0x54, (byte) 0x80, (byte) 0x8e, (byte) 0x5f, (byte) 0xbc, + (byte) 0x1c, (byte) 0x96, (byte) 0x66, (byte) 0x2e, (byte) 0x40, (byte) 0x17, + (byte) 0x2e, (byte) 0x01, (byte) 0x7a, (byte) 0x7d, (byte) 0xaa, (byte) 0xff, + (byte) 0xa3, (byte) 0xd2, (byte) 0xdf, (byte) 0xe2, (byte) 0xf3, (byte) 0x54, + (byte) 0x51, (byte) 0xeb, (byte) 0xba, (byte) 0x7c, (byte) 0x2a, (byte) 0x22, + (byte) 0xc6, (byte) 0x42, (byte) 0xbc, (byte) 0xa1, (byte) 0x6c, (byte) 0xcf, + (byte) 0x73, (byte) 0x2e, (byte) 0x07, (byte) 0xfc, (byte) 0xf5, (byte) 0x67, + (byte) 0x25, (byte) 0xd0, (byte) 0xfa, (byte) 0xeb, (byte) 0xb4, (byte) 0xd4, + (byte) 0x19, (byte) 0xcc, (byte) 0x64, (byte) 0xa1, (byte) 0x2e, (byte) 0x78, + (byte) 0x45, (byte) 0xd9, (byte) 0x7f, (byte) 0x1b, (byte) 0x4c, (byte) 0x10, + (byte) 0x31, (byte) 0x44, (byte) 0xe8, (byte) 0xcc, (byte) 0xf9, (byte) 0x1b, + (byte) 0x87, (byte) 0x31, (byte) 0xd6, (byte) 0x69, (byte) 0x85, (byte) 0x4a, + (byte) 0x49, (byte) 0xf6, (byte) 0xb2, (byte) 0xe0, (byte) 0xb8, (byte) 0x98, + (byte) 0x3c, (byte) 0xf6, (byte) 0x78, (byte) 0x46, (byte) 0xc8, (byte) 0x3d, + (byte) 0x60, (byte) 0xc1, (byte) 0xaa, (byte) 0x2f, (byte) 0x28, (byte) 0xa1, + (byte) 0x14, (byte) 0x6b, (byte) 0x75, (byte) 0x4d, (byte) 0xb1, (byte) 0x3d, + (byte) 0x80, (byte) 0x49, (byte) 0x33, (byte) 0xfd, (byte) 0x71, (byte) 0xc0, + (byte) 0x13, (byte) 0x1e, (byte) 0x16, (byte) 0x69, (byte) 0x80, (byte) 0xa4, + (byte) 0x9c, (byte) 0xd7, (byte) 0x02, (byte) 0x81, (byte) 0xc1, (byte) 0x00, + (byte) 0x8c, (byte) 0x33, (byte) 0x2d, (byte) 0xd9, (byte) 0xf3, (byte) 0x42, + (byte) 0x4d, (byte) 0xca, (byte) 0x5e, (byte) 0x60, (byte) 0x14, (byte) 0x10, + (byte) 0xf6, (byte) 0xf3, (byte) 0x71, (byte) 0x15, (byte) 0x88, (byte) 0x54, + (byte) 0x84, (byte) 0x21, (byte) 0x04, (byte) 0xb1, (byte) 0xaf, (byte) 0x02, + (byte) 0x11, (byte) 0x7f, (byte) 0x42, (byte) 0x3e, (byte) 0x86, (byte) 0xcb, + (byte) 0x6c, (byte) 0xf5, (byte) 0x57, (byte) 0x78, (byte) 0x4a, (byte) 0x03, + (byte) 0x9b, (byte) 0x80, (byte) 0xc2, (byte) 0x04, (byte) 0x3a, (byte) 0x6b, + (byte) 0xb3, (byte) 0x30, (byte) 0x31, (byte) 0x7e, (byte) 0xc3, (byte) 0x89, + (byte) 0x09, (byte) 0x4e, (byte) 0x86, (byte) 0x59, (byte) 0x41, (byte) 0xb5, + (byte) 0xae, (byte) 0xd5, (byte) 0xc6, (byte) 0x38, (byte) 0xbc, (byte) 0xd7, + (byte) 0xd7, (byte) 0x8e, (byte) 0xa3, (byte) 0x1a, (byte) 0xde, (byte) 0x32, + (byte) 0xad, (byte) 0x8d, (byte) 0x15, (byte) 0x81, (byte) 0xfe, (byte) 0xac, + (byte) 0xbd, (byte) 0xd0, (byte) 0xca, (byte) 0xbc, (byte) 0xd8, (byte) 0x6a, + (byte) 0xe1, (byte) 0xfe, (byte) 0xda, (byte) 0xc4, (byte) 0xd8, (byte) 0x62, + (byte) 0x71, (byte) 0x20, (byte) 0xa3, (byte) 0xd3, (byte) 0x06, (byte) 0x11, + (byte) 0xa9, (byte) 0x53, (byte) 0x7a, (byte) 0x44, (byte) 0x89, (byte) 0x3d, + (byte) 0x28, (byte) 0x5e, (byte) 0x7d, (byte) 0xf0, (byte) 0x60, (byte) 0xeb, + (byte) 0xb5, (byte) 0xdf, (byte) 0xed, (byte) 0x4f, (byte) 0x6d, (byte) 0x05, + (byte) 0x59, (byte) 0x06, (byte) 0xb0, (byte) 0x62, (byte) 0x50, (byte) 0x1c, + (byte) 0xb7, (byte) 0x2c, (byte) 0x44, (byte) 0xa4, (byte) 0x49, (byte) 0xf8, + (byte) 0x4f, (byte) 0x4b, (byte) 0xab, (byte) 0x71, (byte) 0x5b, (byte) 0xcb, + (byte) 0x31, (byte) 0x10, (byte) 0x41, (byte) 0xe0, (byte) 0x1a, (byte) 0x15, + (byte) 0xdc, (byte) 0x4c, (byte) 0x5d, (byte) 0x4f, (byte) 0x62, (byte) 0x83, + (byte) 0xa4, (byte) 0x80, (byte) 0x06, (byte) 0x36, (byte) 0xba, (byte) 0xc9, + (byte) 0xe2, (byte) 0xa4, (byte) 0x11, (byte) 0x98, (byte) 0x6b, (byte) 0x4c, + (byte) 0xe9, (byte) 0x90, (byte) 0x55, (byte) 0x18, (byte) 0xde, (byte) 0xe1, + (byte) 0x42, (byte) 0x38, (byte) 0x28, (byte) 0xa3, (byte) 0x54, (byte) 0x56, + (byte) 0x31, (byte) 0xaf, (byte) 0x5a, (byte) 0xd6, (byte) 0xf0, (byte) 0x26, + (byte) 0xe0, (byte) 0x7a, (byte) 0xd9, (byte) 0x6c, (byte) 0x64, (byte) 0xca, + (byte) 0x5d, (byte) 0x6d, (byte) 0x3d, (byte) 0x9a, (byte) 0xfe, (byte) 0x36, + (byte) 0x93, (byte) 0x9e, (byte) 0x62, (byte) 0x94, (byte) 0xc6, (byte) 0x07, + (byte) 0x83, (byte) 0x96, (byte) 0xd6, (byte) 0x27, (byte) 0xa6, (byte) 0xd8 + }; + public static final PrivateKey CLIENT_SUITE_B_RSA3072_KEY = + loadPrivateKey("RSA", CLIENT_SUITE_B_RSA3072_KEY_DATA); + + private static final String CLIENT_SUITE_B_ECDSA_CERT_STRING = + "-----BEGIN CERTIFICATE-----\n" + + "MIIB9zCCAX4CFDpfSZh3AH07BEfGWuMDa7Ynz6y+MAoGCCqGSM49BAMDMF4xCzAJ\n" + + "BgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDTVRWMRAwDgYDVQQKDAdB\n" + + "bmRyb2lkMQ4wDAYDVQQLDAVXaS1GaTESMBAGA1UEAwwJdW5pdGVzdENBMB4XDTIw\n" + + "MDcyMTAyMjk1MFoXDTMwMDUzMDAyMjk1MFowYjELMAkGA1UEBhMCVVMxCzAJBgNV\n" + + "BAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNVBAoMB0FuZHJvaWQxDjAMBgNVBAsM\n" + + "BVdpLUZpMRYwFAYDVQQDDA11bml0ZXN0Q2xpZW50MHYwEAYHKoZIzj0CAQYFK4EE\n" + + "ACIDYgAEhxhVJ7dcSqrto0X+dgRxtd8BWG8cWmPjBji3MIxDLfpcMDoIB84ae1Ew\n" + + "gJn4YUYHrWsUDiVNihv8j7a/Ol1qcIY2ybH7tbezefLmagqA4vXEUXZXoUyL4ZNC\n" + + "DWcdw6LrMAoGCCqGSM49BAMDA2cAMGQCMH4aP73HrriRUJRguiuRic+X4Cqj/7YQ\n" + + "ueJmP87KF92/thhoQ9OrRo8uJITPmNDswwIwP2Q1AZCSL4BI9dYrqu07Ar+pSkXE\n" + + "R7oOqGdZR+d/MvXcFSrbIaLKEoHXmQamIHLe\n" + + "-----END CERTIFICATE-----\n"; + public static final X509Certificate CLIENT_SUITE_B_ECDSA_CERT = + loadCertificate(CLIENT_SUITE_B_ECDSA_CERT_STRING); + + private static final byte[] CLIENT_SUITE_B_ECC_KEY_DATA = new byte[]{ + (byte) 0x30, (byte) 0x81, (byte) 0xb6, (byte) 0x02, (byte) 0x01, (byte) 0x00, + (byte) 0x30, (byte) 0x10, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86, + (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06, + (byte) 0x05, (byte) 0x2b, (byte) 0x81, (byte) 0x04, (byte) 0x00, (byte) 0x22, + (byte) 0x04, (byte) 0x81, (byte) 0x9e, (byte) 0x30, (byte) 0x81, (byte) 0x9b, + (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x30, (byte) 0xea, + (byte) 0x6c, (byte) 0x4b, (byte) 0x6d, (byte) 0x43, (byte) 0xf9, (byte) 0x6c, + (byte) 0x91, (byte) 0xdc, (byte) 0x2d, (byte) 0x6e, (byte) 0x87, (byte) 0x4f, + (byte) 0x0a, (byte) 0x0b, (byte) 0x97, (byte) 0x25, (byte) 0x1c, (byte) 0x79, + (byte) 0xa2, (byte) 0x07, (byte) 0xdc, (byte) 0x94, (byte) 0xc2, (byte) 0xee, + (byte) 0x64, (byte) 0x51, (byte) 0x6d, (byte) 0x4e, (byte) 0x35, (byte) 0x1c, + (byte) 0x22, (byte) 0x2f, (byte) 0xc0, (byte) 0xea, (byte) 0x09, (byte) 0x47, + (byte) 0x3e, (byte) 0xb9, (byte) 0xb6, (byte) 0xb8, (byte) 0x83, (byte) 0x9e, + (byte) 0xed, (byte) 0x59, (byte) 0xe5, (byte) 0xe7, (byte) 0x0f, (byte) 0xa1, + (byte) 0x64, (byte) 0x03, (byte) 0x62, (byte) 0x00, (byte) 0x04, (byte) 0x87, + (byte) 0x18, (byte) 0x55, (byte) 0x27, (byte) 0xb7, (byte) 0x5c, (byte) 0x4a, + (byte) 0xaa, (byte) 0xed, (byte) 0xa3, (byte) 0x45, (byte) 0xfe, (byte) 0x76, + (byte) 0x04, (byte) 0x71, (byte) 0xb5, (byte) 0xdf, (byte) 0x01, (byte) 0x58, + (byte) 0x6f, (byte) 0x1c, (byte) 0x5a, (byte) 0x63, (byte) 0xe3, (byte) 0x06, + (byte) 0x38, (byte) 0xb7, (byte) 0x30, (byte) 0x8c, (byte) 0x43, (byte) 0x2d, + (byte) 0xfa, (byte) 0x5c, (byte) 0x30, (byte) 0x3a, (byte) 0x08, (byte) 0x07, + (byte) 0xce, (byte) 0x1a, (byte) 0x7b, (byte) 0x51, (byte) 0x30, (byte) 0x80, + (byte) 0x99, (byte) 0xf8, (byte) 0x61, (byte) 0x46, (byte) 0x07, (byte) 0xad, + (byte) 0x6b, (byte) 0x14, (byte) 0x0e, (byte) 0x25, (byte) 0x4d, (byte) 0x8a, + (byte) 0x1b, (byte) 0xfc, (byte) 0x8f, (byte) 0xb6, (byte) 0xbf, (byte) 0x3a, + (byte) 0x5d, (byte) 0x6a, (byte) 0x70, (byte) 0x86, (byte) 0x36, (byte) 0xc9, + (byte) 0xb1, (byte) 0xfb, (byte) 0xb5, (byte) 0xb7, (byte) 0xb3, (byte) 0x79, + (byte) 0xf2, (byte) 0xe6, (byte) 0x6a, (byte) 0x0a, (byte) 0x80, (byte) 0xe2, + (byte) 0xf5, (byte) 0xc4, (byte) 0x51, (byte) 0x76, (byte) 0x57, (byte) 0xa1, + (byte) 0x4c, (byte) 0x8b, (byte) 0xe1, (byte) 0x93, (byte) 0x42, (byte) 0x0d, + (byte) 0x67, (byte) 0x1d, (byte) 0xc3, (byte) 0xa2, (byte) 0xeb + }; + public static final PrivateKey CLIENT_SUITE_B_ECC_KEY = + loadPrivateKey("EC", CLIENT_SUITE_B_ECC_KEY_DATA); private static X509Certificate loadCertificate(String blob) { try { @@ -226,9 +662,9 @@ public class FakeKeys { } } - private static PrivateKey loadPrivateRSAKey(byte[] fakeKey) { + private static PrivateKey loadPrivateKey(String algorithm, byte[] fakeKey) { try { - KeyFactory kf = KeyFactory.getInstance("RSA"); + KeyFactory kf = KeyFactory.getInstance(algorithm); return kf.generatePrivate(new PKCS8EncodedKeySpec(fakeKey)); } catch (InvalidKeySpecException | NoSuchAlgorithmException e) { return null; diff --git a/wifi/tests/src/android/net/wifi/ScanResultTest.java b/wifi/tests/src/android/net/wifi/ScanResultTest.java index 5516f433070f..f1ec5e829316 100644 --- a/wifi/tests/src/android/net/wifi/ScanResultTest.java +++ b/wifi/tests/src/android/net/wifi/ScanResultTest.java @@ -102,9 +102,10 @@ public class ScanResultTest { 5845, WifiScanner.WIFI_BAND_5_GHZ, 169, 5865, WifiScanner.WIFI_BAND_5_GHZ, 173, /* Now some 6GHz channels */ - 5945, WifiScanner.WIFI_BAND_6_GHZ, 1, - 5960, WifiScanner.WIFI_BAND_6_GHZ, 4, - 6100, WifiScanner.WIFI_BAND_6_GHZ, 32 + 5955, WifiScanner.WIFI_BAND_6_GHZ, 1, + 5935, WifiScanner.WIFI_BAND_6_GHZ, 2, + 5970, WifiScanner.WIFI_BAND_6_GHZ, 4, + 6110, WifiScanner.WIFI_BAND_6_GHZ, 32 }; /** diff --git a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java b/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java index 1a4427034756..d78c942d55e2 100644 --- a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java @@ -282,12 +282,6 @@ public class SoftApConfigurationTest { .build(); assertNull(band_6g_config.toWifiConfiguration()); - SoftApConfiguration sae_transition_config = new SoftApConfiguration.Builder() - .setPassphrase("secretsecret", - SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) - .build(); - - assertNull(sae_transition_config.toWifiConfiguration()); } @Test @@ -330,5 +324,16 @@ public class SoftApConfigurationTest { assertThat(wifiConfig_2g5g.apBand).isEqualTo(WifiConfiguration.AP_BAND_ANY); assertThat(wifiConfig_2g5g.apChannel).isEqualTo(0); assertThat(wifiConfig_2g5g.hiddenSSID).isEqualTo(true); + + SoftApConfiguration softApConfig_sae_transition = new SoftApConfiguration.Builder() + .setPassphrase("secretsecret", + SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION) + .build(); + + WifiConfiguration wifiConfig_sae_transition = + softApConfig_sae_transition.toWifiConfiguration(); + assertThat(wifiConfig_sae_transition.getAuthType()) + .isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK); + assertThat(wifiConfig_sae_transition.preSharedKey).isEqualTo("secretsecret"); } } diff --git a/wifi/tests/src/android/net/wifi/WifiClientTest.java b/wifi/tests/src/android/net/wifi/WifiClientTest.java index 42cab55305b9..7a3baf9ebaf2 100644 --- a/wifi/tests/src/android/net/wifi/WifiClientTest.java +++ b/wifi/tests/src/android/net/wifi/WifiClientTest.java @@ -16,8 +16,8 @@ package android.net.wifi; -import static com.android.testutils.MiscAssertsKt.assertFieldCountEquals; -import static com.android.testutils.ParcelUtilsKt.assertParcelSane; +import static com.android.testutils.MiscAsserts.assertFieldCountEquals; +import static com.android.testutils.ParcelUtils.assertParcelSane; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java index a7b6765e886a..62220a6237b1 100644 --- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java @@ -22,6 +22,7 @@ import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_OPEN; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_OWE; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_PSK; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_SAE; +import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_WAPI_CERT; import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_WAPI_PSK; import static org.junit.Assert.assertArrayEquals; @@ -537,4 +538,52 @@ public class WifiConfigurationTest { configuration.setSecurityParams(SECURITY_TYPE_EAP_SUITE_B); assertFalse(configuration.needsPreSharedKey()); } + + @Test + public void testGetAuthType() throws Exception { + WifiConfiguration configuration = new WifiConfiguration(); + + configuration.setSecurityParams(SECURITY_TYPE_PSK); + assertEquals(KeyMgmt.WPA_PSK, configuration.getAuthType()); + + configuration.setSecurityParams(SECURITY_TYPE_SAE); + assertEquals(KeyMgmt.SAE, configuration.getAuthType()); + + configuration.setSecurityParams(SECURITY_TYPE_WAPI_PSK); + assertEquals(KeyMgmt.WAPI_PSK, configuration.getAuthType()); + + configuration.setSecurityParams(SECURITY_TYPE_OPEN); + assertEquals(KeyMgmt.NONE, configuration.getAuthType()); + + configuration.setSecurityParams(SECURITY_TYPE_OWE); + assertEquals(KeyMgmt.OWE, configuration.getAuthType()); + + configuration.setSecurityParams(SECURITY_TYPE_EAP); + assertEquals(KeyMgmt.WPA_EAP, configuration.getAuthType()); + + configuration.setSecurityParams(SECURITY_TYPE_EAP_SUITE_B); + assertEquals(KeyMgmt.SUITE_B_192, configuration.getAuthType()); + + configuration.setSecurityParams(SECURITY_TYPE_WAPI_CERT); + assertEquals(KeyMgmt.WAPI_CERT, configuration.getAuthType()); + } + + @Test (expected = IllegalStateException.class) + public void testGetAuthTypeFailure1() throws Exception { + WifiConfiguration configuration = new WifiConfiguration(); + + configuration.setSecurityParams(SECURITY_TYPE_PSK); + configuration.allowedKeyManagement.set(KeyMgmt.IEEE8021X); + configuration.getAuthType(); + } + + @Test (expected = IllegalStateException.class) + public void testGetAuthTypeFailure2() throws Exception { + WifiConfiguration configuration = new WifiConfiguration(); + + configuration.allowedKeyManagement.set(KeyMgmt.IEEE8021X); + configuration.allowedKeyManagement.set(KeyMgmt.WPA_EAP); + configuration.allowedKeyManagement.set(KeyMgmt.SAE); + configuration.getAuthType(); + } } diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java index fc0ef469ad80..6f47f3da710f 100644 --- a/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java +++ b/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java @@ -22,6 +22,8 @@ import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import android.net.MacAddress; @@ -35,6 +37,8 @@ import androidx.test.filters.SmallTest; import org.junit.Test; +import java.security.cert.X509Certificate; + /** * Unit tests for {@link android.net.wifi.WifiNetworkSpecifier}. */ @@ -45,6 +49,7 @@ public class WifiNetworkSpecifierTest { private static final String TEST_BSSID_OUI_MASK = "ff:ff:ff:00:00:00"; private static final String TEST_BSSID = "12:12:12:12:12:12"; private static final String TEST_PRESHARED_KEY = "\"Test123\""; + private static final String TEST_DOMAIN_SUFFIX_MATCH = "domainSuffixMatch"; /** * Validate correctness of WifiNetworkSpecifier object created by @@ -135,6 +140,106 @@ public class WifiNetworkSpecifierTest { wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getPhase2Method()); } + /** + * Validate correctness of WifiNetworkSuggestion object created by + * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise network. + */ + @Test + public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() { + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); + enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0); + enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); + + NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() + .setSsid(TEST_SSID) + .setWpa3EnterpriseConfig(enterpriseConfig) + .build(); + + assertTrue(specifier instanceof WifiNetworkSpecifier); + WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier; + + assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.IEEE8021X)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.WPA_EAP)); + assertFalse(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.SUITE_B_192)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers + .get(WifiConfiguration.GroupCipher.CCMP)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf); + assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey); + assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig); + } + + /** + * Validate correctness of WifiNetworkSuggestion object created by + * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network. + */ + @Test + public void testWifiNetworkSuggestionBuilderForWpa3SuiteBRsaEapNetwork() { + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); + enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT); + enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY, + new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT}); + + enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); + + NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() + .setSsid(TEST_SSID) + .setWpa3EnterpriseConfig(enterpriseConfig) + .build(); + + assertTrue(specifier instanceof WifiNetworkSpecifier); + WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier; + + assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.SUITE_B_192)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers + .get(WifiConfiguration.GroupCipher.GCMP_256)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers + .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf); + assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey); + assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig); + } + + /** + * Validate correctness of WifiNetworkSuggestion object created by + * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network. + */ + @Test + public void testWifiNetworkSuggestionBuilderForWpa3SuiteBEccEapNetwork() { + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); + enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT); + enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY, + new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT}); + + enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); + + NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder() + .setSsid(TEST_SSID) + .setWpa3EnterpriseConfig(enterpriseConfig) + .build(); + + assertTrue(specifier instanceof WifiNetworkSpecifier); + WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier; + + assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.SUITE_B_192)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers + .get(WifiConfiguration.GroupCipher.GCMP_256)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers + .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256)); + assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf); + assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey); + assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig); + } /** * Ensure {@link WifiNetworkSpecifier.Builder#setSsid(String)} throws an exception diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java index 16b4ad08a830..6d5b9b9f9ec2 100644 --- a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java +++ b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java @@ -27,6 +27,8 @@ import androidx.test.filters.SmallTest; import org.junit.Test; +import java.security.cert.X509Certificate; + /** * Unit tests for {@link android.net.wifi.WifiNetworkSuggestion}. */ @@ -62,6 +64,7 @@ public class WifiNetworkSuggestionTest { assertEquals(-1, suggestion.wifiConfiguration.priority); assertFalse(suggestion.isUserAllowedToManuallyConnect); assertTrue(suggestion.isInitialAutoJoinEnabled); + assertNull(suggestion.getEnterpriseConfig()); } /** @@ -92,6 +95,7 @@ public class WifiNetworkSuggestionTest { assertEquals(0, suggestion.wifiConfiguration.priority); assertFalse(suggestion.isUserAllowedToManuallyConnect); assertTrue(suggestion.isInitialAutoJoinEnabled); + assertNull(suggestion.getEnterpriseConfig()); } /** @@ -122,6 +126,7 @@ public class WifiNetworkSuggestionTest { assertEquals(-1, suggestion.wifiConfiguration.priority); assertTrue(suggestion.isUserAllowedToManuallyConnect); assertFalse(suggestion.isInitialAutoJoinEnabled); + assertNull(suggestion.getEnterpriseConfig()); } /** @@ -152,6 +157,7 @@ public class WifiNetworkSuggestionTest { assertEquals(-1, suggestion.wifiConfiguration.priority); assertTrue(suggestion.isUserAllowedToManuallyConnect); assertFalse(suggestion.isInitialAutoJoinEnabled); + assertNull(suggestion.getEnterpriseConfig()); } /** @@ -174,6 +180,7 @@ public class WifiNetworkSuggestionTest { assertTrue(suggestion.wifiConfiguration.requirePmf); assertFalse(suggestion.isUserAllowedToManuallyConnect); assertTrue(suggestion.isInitialAutoJoinEnabled); + assertNull(suggestion.getEnterpriseConfig()); } /** @@ -197,18 +204,17 @@ public class WifiNetworkSuggestionTest { assertTrue(suggestion.wifiConfiguration.requirePmf); assertTrue(suggestion.isUserAllowedToManuallyConnect); assertFalse(suggestion.isInitialAutoJoinEnabled); + assertNull(suggestion.getEnterpriseConfig()); } - /** * Validate correctness of WifiNetworkSuggestion object created by - * {@link WifiNetworkSuggestion.Builder#build()} for SuiteB network. + * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise network. */ @Test public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() { WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); - enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC); enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0); enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); @@ -219,6 +225,78 @@ public class WifiNetworkSuggestionTest { assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); assertTrue(suggestion.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.IEEE8021X)); + assertTrue(suggestion.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.WPA_EAP)); + assertFalse(suggestion.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.SUITE_B_192)); + assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers + .get(WifiConfiguration.GroupCipher.CCMP)); + assertTrue(suggestion.wifiConfiguration.requirePmf); + assertNull(suggestion.wifiConfiguration.preSharedKey); + // allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested + // here. + assertTrue(suggestion.isUserAllowedToManuallyConnect); + assertTrue(suggestion.isInitialAutoJoinEnabled); + assertNotNull(suggestion.getEnterpriseConfig()); + } + + /** + * Validate correctness of WifiNetworkSuggestion object created by + * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network. + */ + @Test + public void testWifiNetworkSuggestionBuilderForWpa3SuiteBRsaEapNetwork() { + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); + enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT); + enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY, + new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT}); + + enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); + + WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() + .setSsid(TEST_SSID) + .setWpa3EnterpriseConfig(enterpriseConfig) + .build(); + + assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); + assertTrue(suggestion.wifiConfiguration.allowedKeyManagement + .get(WifiConfiguration.KeyMgmt.SUITE_B_192)); + assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers + .get(WifiConfiguration.GroupCipher.GCMP_256)); + assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers + .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256)); + assertTrue(suggestion.wifiConfiguration.requirePmf); + assertNull(suggestion.wifiConfiguration.preSharedKey); + // allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested + // here. + assertTrue(suggestion.isUserAllowedToManuallyConnect); + assertTrue(suggestion.isInitialAutoJoinEnabled); + assertNotNull(suggestion.getEnterpriseConfig()); + } + + /** + * Validate correctness of WifiNetworkSuggestion object created by + * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network. + */ + @Test + public void testWifiNetworkSuggestionBuilderForWpa3SuiteBEccEapNetwork() { + WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); + enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); + enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT); + enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY, + new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT}); + + enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); + + WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() + .setSsid(TEST_SSID) + .setWpa3EnterpriseConfig(enterpriseConfig) + .build(); + + assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); + assertTrue(suggestion.wifiConfiguration.allowedKeyManagement .get(WifiConfiguration.KeyMgmt.SUITE_B_192)); assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers .get(WifiConfiguration.GroupCipher.GCMP_256)); @@ -230,6 +308,7 @@ public class WifiNetworkSuggestionTest { // here. assertTrue(suggestion.isUserAllowedToManuallyConnect); assertTrue(suggestion.isInitialAutoJoinEnabled); + assertNotNull(suggestion.getEnterpriseConfig()); } /** @@ -286,6 +365,7 @@ public class WifiNetworkSuggestionTest { .get(WifiConfiguration.GroupCipher.SMS4)); assertEquals("\"" + TEST_PRESHARED_KEY + "\"", suggestion.wifiConfiguration.preSharedKey); + assertNull(suggestion.getEnterpriseConfig()); } @@ -316,6 +396,7 @@ public class WifiNetworkSuggestionTest { suggestion.wifiConfiguration.enterpriseConfig.getEapMethod()); assertEquals(TEST_WAPI_CERT_SUITE, suggestion.wifiConfiguration.enterpriseConfig.getWapiCertSuite()); + assertNotNull(suggestion.getEnterpriseConfig()); } /** @@ -345,6 +426,7 @@ public class WifiNetworkSuggestionTest { suggestion.wifiConfiguration.enterpriseConfig.getEapMethod()); assertEquals("", suggestion.wifiConfiguration.enterpriseConfig.getWapiCertSuite()); + assertNotNull(suggestion.getEnterpriseConfig()); } /** @@ -367,6 +449,7 @@ public class WifiNetworkSuggestionTest { assertEquals(suggestion.getPasspointConfig().getMeteredOverride(), WifiConfiguration.METERED_OVERRIDE_METERED); assertTrue(suggestion.isUserAllowedToManuallyConnect); + assertNull(suggestion.getEnterpriseConfig()); } /** diff --git a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java index 638efb9f14ee..8270d643ca65 100644 --- a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java +++ b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java @@ -23,6 +23,8 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; +import android.net.wifi.EAPConstants; +import android.net.wifi.FakeKeys; import android.net.wifi.hotspot2.pps.Credential; import android.net.wifi.hotspot2.pps.HomeSp; import android.os.Parcel; @@ -32,6 +34,11 @@ import androidx.test.filters.SmallTest; import org.junit.Test; import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.cert.CertificateEncodingException; +import java.security.cert.X509Certificate; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -383,19 +390,39 @@ public class PasspointConfigurationTest { } /** - * Verify that the unique identifier generated is different for two instances with different - * HomeSp node + * Verify that the unique identifier generated is the same for two instances with different + * HomeSp node but same FQDN * * @throws Exception */ @Test - public void validateUniqueIdDifferentHomeSp() throws Exception { + public void validateUniqueIdDifferentHomeSpSameFqdn() throws Exception { PasspointConfiguration config1 = PasspointTestUtils.createConfig(); - // Modify config2's RCOIs to a different set of values + // Modify config2's RCOIs and friendly name to a different set of values PasspointConfiguration config2 = PasspointTestUtils.createConfig(); HomeSp homeSp = config2.getHomeSp(); homeSp.setRoamingConsortiumOis(new long[] {0xaa, 0xbb}); + homeSp.setFriendlyName("Some other name"); + config2.setHomeSp(homeSp); + + assertEquals(config1.getUniqueId(), config2.getUniqueId()); + } + + /** + * Verify that the unique identifier generated is different for two instances with the same + * HomeSp node but different FQDN + * + * @throws Exception + */ + @Test + public void validateUniqueIdSameHomeSpDifferentFqdn() throws Exception { + PasspointConfiguration config1 = PasspointTestUtils.createConfig(); + + // Modify config2's FQDN to a different value + PasspointConfiguration config2 = PasspointTestUtils.createConfig(); + HomeSp homeSp = config2.getHomeSp(); + homeSp.setFqdn("fqdn2.com"); config2.setHomeSp(homeSp); assertNotEquals(config1.getUniqueId(), config2.getUniqueId()); @@ -403,15 +430,15 @@ public class PasspointConfigurationTest { /** * Verify that the unique identifier generated is different for two instances with different - * Credential node + * SIM Credential node * * @throws Exception */ @Test - public void validateUniqueIdDifferentCredential() throws Exception { + public void validateUniqueIdDifferentSimCredential() throws Exception { PasspointConfiguration config1 = PasspointTestUtils.createConfig(); - // Modify config2's RCOIs to a different set of values + // Modify config2's realm and SIM credential to a different set of values PasspointConfiguration config2 = PasspointTestUtils.createConfig(); Credential credential = config2.getCredential(); credential.setRealm("realm2.example.com"); @@ -422,6 +449,157 @@ public class PasspointConfigurationTest { } /** + * Verify that the unique identifier generated is different for two instances with different + * Realm in the Credential node + * + * @throws Exception + */ + @Test + public void validateUniqueIdDifferentRealm() throws Exception { + PasspointConfiguration config1 = PasspointTestUtils.createConfig(); + + // Modify config2's realm to a different set of values + PasspointConfiguration config2 = PasspointTestUtils.createConfig(); + Credential credential = config2.getCredential(); + credential.setRealm("realm2.example.com"); + config2.setCredential(credential); + + assertNotEquals(config1.getUniqueId(), config2.getUniqueId()); + } + + /** + * Verify that the unique identifier generated is the same for two instances with different + * password and same username in the User Credential node + * + * @throws Exception + */ + @Test + public void validateUniqueIdSameUserInUserCredential() throws Exception { + PasspointConfiguration config1 = PasspointTestUtils.createConfig(); + Credential credential = createCredentialWithUserCredential("user", "passwd"); + config1.setCredential(credential); + + // Modify config2's Passpowrd to a different set of values + PasspointConfiguration config2 = PasspointTestUtils.createConfig(); + credential = createCredentialWithUserCredential("user", "newpasswd"); + config2.setCredential(credential); + + assertEquals(config1.getUniqueId(), config2.getUniqueId()); + } + + /** + * Verify that the unique identifier generated is different for two instances with different + * username in the User Credential node + * + * @throws Exception + */ + @Test + public void validateUniqueIdDifferentUserCredential() throws Exception { + PasspointConfiguration config1 = PasspointTestUtils.createConfig(); + Credential credential = createCredentialWithUserCredential("user", "passwd"); + config1.setCredential(credential); + + // Modify config2's username to a different value + PasspointConfiguration config2 = PasspointTestUtils.createConfig(); + credential = createCredentialWithUserCredential("user2", "passwd"); + config2.setCredential(credential); + + assertNotEquals(config1.getUniqueId(), config2.getUniqueId()); + } + + /** + * Verify that the unique identifier generated is different for two instances with different + * Cert Credential node + * + * @throws Exception + */ + @Test + public void validateUniqueIdDifferentCertCredential() throws Exception { + PasspointConfiguration config1 = PasspointTestUtils.createConfig(); + Credential credential = createCredentialWithCertificateCredential(true, true); + config1.setCredential(credential); + + // Modify config2's cert credential to a different set of values + PasspointConfiguration config2 = PasspointTestUtils.createConfig(); + credential = createCredentialWithCertificateCredential(false, false); + config2.setCredential(credential); + + assertNotEquals(config1.getUniqueId(), config2.getUniqueId()); + } + + /** + * Helper function for generating certificate credential for testing. + * + * @return {@link Credential} + */ + private static Credential createCredentialWithCertificateCredential(Boolean useCaCert0, + Boolean useCert0) + throws NoSuchAlgorithmException, CertificateEncodingException { + Credential.CertificateCredential certCred = new Credential.CertificateCredential(); + certCred.setCertType("x509v3"); + if (useCert0) { + certCred.setCertSha256Fingerprint( + MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded())); + } else { + certCred.setCertSha256Fingerprint(MessageDigest.getInstance("SHA-256") + .digest(FakeKeys.CLIENT_SUITE_B_RSA3072_CERT.getEncoded())); + } + return createCredential(null, certCred, null, new X509Certificate[] {FakeKeys.CLIENT_CERT}, + FakeKeys.RSA_KEY1, useCaCert0 ? FakeKeys.CA_CERT0 : FakeKeys.CA_CERT1); + } + + /** + * Helper function for generating user credential for testing. + * + * @return {@link Credential} + */ + private static Credential createCredentialWithUserCredential(String username, String password) { + Credential.UserCredential userCred = new Credential.UserCredential(); + userCred.setUsername(username); + userCred.setPassword(password); + userCred.setMachineManaged(true); + userCred.setAbleToShare(true); + userCred.setSoftTokenApp("TestApp"); + userCred.setEapType(EAPConstants.EAP_TTLS); + userCred.setNonEapInnerMethod("MS-CHAP"); + return createCredential(userCred, null, null, null, null, FakeKeys.CA_CERT0); + } + + /** + * Helper function for generating Credential for testing. + * + * @param userCred Instance of UserCredential + * @param certCred Instance of CertificateCredential + * @param simCred Instance of SimCredential + * @param clientCertificateChain Chain of client certificates + * @param clientPrivateKey Client private key + * @param caCerts CA certificates + * @return {@link Credential} + */ + private static Credential createCredential(Credential.UserCredential userCred, + Credential.CertificateCredential certCred, + Credential.SimCredential simCred, + X509Certificate[] clientCertificateChain, PrivateKey clientPrivateKey, + X509Certificate... caCerts) { + Credential cred = new Credential(); + cred.setCreationTimeInMillis(123455L); + cred.setExpirationTimeInMillis(2310093L); + cred.setRealm("realm"); + cred.setCheckAaaServerCertStatus(true); + cred.setUserCredential(userCred); + cred.setCertCredential(certCred); + cred.setSimCredential(simCred); + if (caCerts != null && caCerts.length == 1) { + cred.setCaCertificate(caCerts[0]); + } else { + cred.setCaCertificates(caCerts); + } + cred.setClientCertificateChain(clientCertificateChain); + cred.setClientPrivateKey(clientPrivateKey); + return cred; + } + + /** * Verify that the unique identifier API generates an exception if HomeSP is not initialized. * * @throws Exception diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java index 829d8f0a9a3a..a44df40a8e97 100644 --- a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java +++ b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java @@ -593,10 +593,10 @@ public class CredentialTest { } /** - * Verify that unique identifiers are different for a credential with different values + * Verify that unique identifiers are different for a credential with different username */ @Test - public void testUniqueIdDifferentForUserCredentialsWithDifferentValues() throws Exception { + public void testUniqueIdDifferentForUserCredentialsWithDifferentUsername() throws Exception { Credential userCred1 = createCredentialWithUserCredential(); Credential userCred2 = createCredentialWithUserCredential(); userCred2.getUserCredential().setUsername("anotheruser"); @@ -605,7 +605,24 @@ public class CredentialTest { } /** - * Verify that unique identifiers are different for a credential with different values + * Verify that unique identifiers are different for a credential with different password and + * other values other than username + */ + @Test + public void testUniqueIdSameForUserCredentialsWithDifferentPassword() throws Exception { + Credential userCred1 = createCredentialWithUserCredential(); + Credential userCred2 = createCredentialWithUserCredential(); + userCred2.getUserCredential().setPassword("someotherpassword!"); + userCred2.getUserCredential().setMachineManaged(false); + userCred2.getUserCredential().setAbleToShare(false); + userCred2.getUserCredential().setSoftTokenApp("TestApp2"); + userCred2.getUserCredential().setNonEapInnerMethod("PAP"); + + assertEquals(userCred1.getUniqueId(), userCred2.getUniqueId()); + } + + /** + * Verify that unique identifiers are different for a cert credential with different values */ @Test public void testUniqueIdDifferentForCertCredentialsWithDifferentValues() throws Exception { |