diff options
1264 files changed, 14840 insertions, 9231 deletions
diff --git a/.clang-format b/.clang-format index d60d33c08f3f..0f6b166ecdd5 100644 --- a/.clang-format +++ b/.clang-format @@ -2,7 +2,7 @@ BasedOnStyle: Google AccessModifierOffset: -4 AlignOperands: false -AllowShortFunctionsOnASingleLine: Inline +AllowShortFunctionsOnASingleLine: Empty AlwaysBreakBeforeMultilineStrings: false ColumnLimit: 100 CommentPragmas: NOLINT:.* diff --git a/ADPF_OWNERS b/ADPF_OWNERS new file mode 100644 index 000000000000..e6ca8f4bd48a --- /dev/null +++ b/ADPF_OWNERS @@ -0,0 +1,3 @@ +lpy@google.com +mattbuckley@google.com +xwxw@google.com diff --git a/AconfigFlags.bp b/AconfigFlags.bp new file mode 100644 index 000000000000..f0b759878e20 --- /dev/null +++ b/AconfigFlags.bp @@ -0,0 +1,159 @@ +// Copyright (C) 2023 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +aconfig_srcjars = [ + ":android.hardware.biometrics.flags-aconfig-java{.generated_srcjars}", + ":android.nfc.flags-aconfig-java{.generated_srcjars}", + ":android.os.flags-aconfig-java{.generated_srcjars}", + ":android.security.flags-aconfig-java{.generated_srcjars}", + ":com.android.hardware.camera2-aconfig-java{.generated_srcjars}", + ":com.android.window.flags.window-aconfig-java{.generated_srcjars}", + ":com.android.hardware.input-aconfig-java{.generated_srcjars}", + ":com.android.text.flags-aconfig-java{.generated_srcjars}", +] + +filegroup { + name: "framework-minus-apex-aconfig-srcjars", + srcs: aconfig_srcjars, +} + +// Aconfig declarations and libraries for the core framework +java_defaults { + name: "framework-minus-apex-aconfig-libraries", + + // Add java_aconfig_libraries to here to add them to the core framework + // Add aconfig-annotations-lib as a dependency for the optimization + srcs: aconfig_srcjars, + libs: ["aconfig-annotations-lib"], +} + +// Default flags for java_aconfig_libraries that go into framework-minus-apex +// These libraries will not work standalone +java_defaults { + name: "framework-minus-apex-aconfig-java-defaults", + sdk_version: "core_platform", + libs: ["fake_device_config"], +} + +// Camera +aconfig_declarations { + name: "com.android.hardware.camera2-aconfig", + package: "com.android.hardware.camera2", + srcs: ["core/java/android/hardware/camera2/camera_platform.aconfig"], +} + +java_aconfig_library { + name: "com.android.hardware.camera2-aconfig-java", + aconfig_declarations: "com.android.hardware.camera2-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +// Window +aconfig_declarations { + name: "com.android.window.flags.window-aconfig", + package: "com.android.window.flags", + srcs: ["core/java/android/window/flags/*.aconfig"], +} + +java_aconfig_library { + name: "com.android.window.flags.window-aconfig-java", + aconfig_declarations: "com.android.window.flags.window-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +// Input +aconfig_declarations { + name: "com.android.hardware.input.input-aconfig", + package: "com.android.hardware.input", + srcs: ["core/java/android/hardware/input/*.aconfig"], +} + +java_aconfig_library { + name: "com.android.hardware.input-aconfig-java", + aconfig_declarations: "com.android.hardware.input.input-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +// Text +aconfig_declarations { + name: "com.android.text.flags-aconfig", + package: "com.android.text.flags", + srcs: ["core/java/android/text/flags/*.aconfig"], +} + +java_aconfig_library { + name: "com.android.text.flags-aconfig-java", + aconfig_declarations: "com.android.text.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +// OS +aconfig_declarations { + name: "android.os.flags-aconfig", + package: "android.os", + srcs: ["core/java/android/os/*.aconfig"], +} + +java_aconfig_library { + name: "android.os.flags-aconfig-java", + aconfig_declarations: "android.os.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +// NFC +aconfig_declarations { + name: "android.nfc.flags-aconfig", + package: "android.nfc", + srcs: ["core/java/android/nfc/*.aconfig"], +} + +java_aconfig_library { + name: "android.nfc.flags-aconfig-java", + aconfig_declarations: "android.nfc.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +// Security +aconfig_declarations { + name: "android.security.flags-aconfig", + package: "android.security", + srcs: ["core/java/android/security/*.aconfig"], +} + +java_aconfig_library { + name: "android.security.flags-aconfig-java", + aconfig_declarations: "android.security.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +java_aconfig_library { + name: "android.security.flags-aconfig-java-host", + aconfig_declarations: "android.security.flags-aconfig", + host_supported: true, + test: true, + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} + +// Biometrics +aconfig_declarations { + name: "android.hardware.biometrics.flags-aconfig", + package: "android.hardware.biometrics", + srcs: ["core/java/android/hardware/biometrics/flags.aconfig"], +} + +java_aconfig_library { + name: "android.hardware.biometrics.flags-aconfig-java", + aconfig_declarations: "android.hardware.biometrics.flags-aconfig", + defaults: ["framework-minus-apex-aconfig-java-defaults"], +} diff --git a/Android.bp b/Android.bp index 4473d9458d25..ccff26fb70d2 100644 --- a/Android.bp +++ b/Android.bp @@ -269,6 +269,7 @@ java_defaults { defaults: [ "framework-aidl-export-defaults", "latest_android_hardware_soundtrigger3_java_static", + "framework-minus-apex-aconfig-libraries", ], srcs: [ ":framework-non-updatable-sources", @@ -579,7 +580,6 @@ metalava_framework_docs_args = "" + "--hide RequiresPermission " + "--hide SdkConstant " + "--hide Todo " + - "--hide Typo " + "--hide UnavailableSymbol " + "--manifest $(location :frameworks-base-core-AndroidManifest.xml) " @@ -690,6 +690,7 @@ stubs_defaults { } build = [ + "AconfigFlags.bp", "ProtoLibraries.bp", "TestProtoLibraries.bp", ] diff --git a/INTENT_OWNERS b/INTENT_OWNERS new file mode 100644 index 000000000000..58b5f2a61be0 --- /dev/null +++ b/INTENT_OWNERS @@ -0,0 +1,3 @@ +include /PACKAGE_MANAGER_OWNERS +include /services/core/java/com/android/server/wm/OWNERS +include /services/core/java/com/android/server/am/OWNERS @@ -16,8 +16,6 @@ narayan@google.com #{LAST_RESORT_SUGGESTION} ogunwale@google.com #{LAST_RESORT_SUGGESTION} roosa@google.com #{LAST_RESORT_SUGGESTION} smoreland@google.com #{LAST_RESORT_SUGGESTION} -svetoslavganov@android.com #{LAST_RESORT_SUGGESTION} -svetoslavganov@google.com #{LAST_RESORT_SUGGESTION} yamasani@google.com #{LAST_RESORT_SUGGESTION} # API changes are already covered by API-Review+1 (http://mdb/android-api-council) @@ -30,11 +28,9 @@ per-file */TEST_MAPPING = * # Support bulk translation updates per-file */res*/values*/*.xml = byi@google.com, delphij@google.com -per-file **.bp,**.mk = hansson@google.com -per-file *.bp = file:platform/build/soong:/OWNERS #{LAST_RESORT_SUGGESTION} -per-file Android.mk = file:platform/build/soong:/OWNERS #{LAST_RESORT_SUGGESTION} -per-file framework-jarjar-rules.txt = file:platform/build/soong:/OWNERS #{LAST_RESORT_SUGGESTION} +per-file **.bp,**.mk = hansson@google.com, joeo@google.com, lamontjones@google.com per-file TestProtoLibraries.bp = file:platform/platform_testing:/libraries/health/OWNERS per-file TestProtoLibraries.bp = file:platform/tools/tradefederation:/OWNERS per-file ZYGOTE_OWNERS = file:/ZYGOTE_OWNERS +per-file SQLITE_OWNERS = file:/SQLITE_OWNERS diff --git a/ProtoLibraries.bp b/ProtoLibraries.bp index fcff58187e8d..45bb16184069 100644 --- a/ProtoLibraries.bp +++ b/ProtoLibraries.bp @@ -21,10 +21,6 @@ gensrcs { "soong_zip", ], - tool_files: [ - ":libprotobuf-internal-protos", - ], - cmd: "mkdir -p $(genDir)/$(in) " + "&& $(location aprotoc) " + " --plugin=$(location protoc-gen-javastream) " + @@ -42,6 +38,11 @@ gensrcs { "core/proto/**/*.proto", "libs/incident/**/*.proto", ], + + data: [ + ":libprotobuf-internal-protos", + ], + output_extension: "srcjar", } @@ -53,10 +54,6 @@ gensrcs { "protoc-gen-cppstream", ], - tool_files: [ - ":libprotobuf-internal-protos", - ], - cmd: "mkdir -p $(genDir) " + "&& $(location aprotoc) " + " --plugin=$(location protoc-gen-cppstream) " + @@ -73,6 +70,10 @@ gensrcs { "libs/incident/**/*.proto", ], + data: [ + ":libprotobuf-internal-protos", + ], + output_extension: "proto.h", } diff --git a/SQLITE_OWNERS b/SQLITE_OWNERS new file mode 100644 index 000000000000..1ff72e7689a7 --- /dev/null +++ b/SQLITE_OWNERS @@ -0,0 +1,2 @@ +shayba@google.com +shombert@google.com diff --git a/apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java b/apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java index a5d1e00139b5..59f08f645def 100644 --- a/apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java +++ b/apct-tests/perftests/autofill/src/android/view/autofill/LoginTest.java @@ -140,7 +140,7 @@ public class LoginTest extends AbstractAutofillPerfTestCase { state.resumeTiming(); } - // Sanity check + // Check for no errors callback.assertNoAsyncErrors(); } finally { mAfm.unregisterCallback(callback); @@ -190,7 +190,7 @@ public class LoginTest extends AbstractAutofillPerfTestCase { state.resumeTiming(); } - // Sanity check + // Check for no errors callback.assertNoAsyncErrors(); } finally { mAfm.unregisterCallback(callback); @@ -303,7 +303,7 @@ public class LoginTest extends AbstractAutofillPerfTestCase { callback.expectEvent(mPassword, EVENT_INPUT_SHOWN); } - // Sanity check + // Check for no errors callback.assertNoAsyncErrors(); } finally { mAfm.unregisterCallback(callback); diff --git a/apct-tests/perftests/core/OWNERS b/apct-tests/perftests/core/OWNERS index 6abab6e27f8e..f8fe51c4fde9 100644 --- a/apct-tests/perftests/core/OWNERS +++ b/apct-tests/perftests/core/OWNERS @@ -12,3 +12,5 @@ per-file /apct-tests/perftests/core/src/android/content/res/* = file:/core/java/ per-file /apct-tests/perftests/core/src/android/content/om/* = felkachang@google.com per-file /apct-tests/perftests/core/src/android/content/om/* = file:/core/java/android/content/om/OWNERS +# Bug component: 44215 +per-file **Accessibility* = file:/core/java/android/view/accessibility/OWNERS
\ No newline at end of file diff --git a/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt b/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt index 9482591c65b5..aadbc2319a62 100644 --- a/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt +++ b/apct-tests/perftests/core/src/android/input/MotionPredictorBenchmark.kt @@ -130,7 +130,7 @@ class MotionPredictorBenchmark { eventTime, ACTION_MOVE, /*x=*/eventPosition, /*y=*/eventPosition) predictor.record(moveEvent) val predictionTime = eventTime + eventInterval - val predicted = predictor.predict(predictionTime.toNanos()) + val predicted = checkNotNull(predictor.predict(predictionTime.toNanos())) assertTrue(predicted.eventTime <= (predictionTime + offset).toMillis()) } } diff --git a/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java b/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java index b995b0688970..7712aeef4161 100644 --- a/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java +++ b/apct-tests/perftests/core/src/android/libcore/regression/ExpensiveObjectsPerfTest.java @@ -52,7 +52,7 @@ public class ExpensiveObjectsPerfTest { } } - @Test + @Test(timeout = 900000) public void timeClonedDateFormatTimeInstance() { DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT); BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); @@ -72,7 +72,7 @@ public class ExpensiveObjectsPerfTest { } } - @Test + @Test(timeout = 900000) public void timeNewCollator() { BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); while (state.keepRunning()) { diff --git a/apct-tests/perftests/core/src/android/os/OWNERS b/apct-tests/perftests/core/src/android/os/OWNERS index a1719c9c31d1..76ab30334634 100644 --- a/apct-tests/perftests/core/src/android/os/OWNERS +++ b/apct-tests/perftests/core/src/android/os/OWNERS @@ -1 +1,4 @@ -per-file PackageParsingPerfTest.kt = file:/services/core/java/com/android/server/pm/OWNERS
\ No newline at end of file +per-file PackageParsingPerfTest.kt = file:/services/core/java/com/android/server/pm/OWNERS + +# Bug component: 345036 +per-file VibratorPerfTest.java = file:/services/core/java/com/android/server/vibrator/OWNERS
\ No newline at end of file diff --git a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java index 6dba5b3517f7..a2c67bc3c2e5 100644 --- a/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java +++ b/apct-tests/perftests/multiuser/src/android/multiuser/UserLifecycleTests.java @@ -104,16 +104,16 @@ public class UserLifecycleTests { /** Name of users/profiles in the test. Users with this name may be freely removed. */ private static final String TEST_USER_NAME = "UserLifecycleTests_test_user"; - /** Name of dummy package used when timing how long app launches take. */ + /** Name of placeholder package used when timing how long app launches take. */ private static final String DUMMY_PACKAGE_NAME = "perftests.multiuser.apps.dummyapp"; - // Copy of UserSystemPackageInstaller whitelist mode constants. - private static final String PACKAGE_WHITELIST_MODE_PROP = + // Copy of UserSystemPackageInstaller allowlist mode constants. + private static final String PACKAGE_ALLOWLIST_MODE_PROP = "persist.debug.user.package_whitelist_mode"; - private static final int USER_TYPE_PACKAGE_WHITELIST_MODE_DISABLE = 0; - private static final int USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE = 0b001; - private static final int USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST = 0b100; - private static final int USER_TYPE_PACKAGE_WHITELIST_MODE_DEVICE_DEFAULT = -1; + private static final int USER_TYPE_PACKAGE_ALLOWLIST_MODE_DISABLE = 0; + private static final int USER_TYPE_PACKAGE_ALLOWLIST_MODE_ENFORCE = 0b001; + private static final int USER_TYPE_PACKAGE_ALLOWLIST_MODE_IMPLICIT_ALLOWLIST = 0b100; + private static final int USER_TYPE_PACKAGE_ALLOWLIST_MODE_DEVICE_DEFAULT = -1; private UserManager mUm; private ActivityManager mAm; @@ -1178,13 +1178,13 @@ public class UserLifecycleTests { } // TODO: This is just a POC. Do this properly and add more. - /** Tests starting (unlocking) a newly-created profile using the user-type-pkg-whitelist. */ + /** Tests starting (unlocking) a newly-created profile using the user-type-pkg-allowlist. */ @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS) public void managedProfileUnlock_usingWhitelist() throws RemoteException { assumeTrue(mHasManagedUserFeature); - final int origMode = getUserTypePackageWhitelistMode(); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE - | USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST); + final int origMode = getUserTypePackageAllowlistMode(); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_ALLOWLIST_MODE_ENFORCE + | USER_TYPE_PACKAGE_ALLOWLIST_MODE_IMPLICIT_ALLOWLIST); try { while (mRunner.keepRunning()) { @@ -1201,15 +1201,15 @@ public class UserLifecycleTests { mRunner.resumeTimingForNextIteration(); } } finally { - setUserTypePackageWhitelistMode(origMode); + setUserTypePackageAllowlistMode(origMode); } } - /** Tests starting (unlocking) a newly-created profile NOT using the user-type-pkg-whitelist. */ + /** Tests starting (unlocking) a newly-created profile NOT using the user-type-pkg-allowlist. */ @Test(timeout = TIMEOUT_MAX_TEST_TIME_MS) public void managedProfileUnlock_notUsingWhitelist() throws RemoteException { assumeTrue(mHasManagedUserFeature); - final int origMode = getUserTypePackageWhitelistMode(); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_DISABLE); + final int origMode = getUserTypePackageAllowlistMode(); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_ALLOWLIST_MODE_DISABLE); try { while (mRunner.keepRunning()) { @@ -1226,7 +1226,7 @@ public class UserLifecycleTests { mRunner.resumeTimingForNextIteration(); } } finally { - setUserTypePackageWhitelistMode(origMode); + setUserTypePackageAllowlistMode(origMode); } } @@ -1456,17 +1456,17 @@ public class UserLifecycleTests { attestTrue(errMsg, success); } - /** Gets the PACKAGE_WHITELIST_MODE_PROP System Property. */ - private int getUserTypePackageWhitelistMode() { - return SystemProperties.getInt(PACKAGE_WHITELIST_MODE_PROP, - USER_TYPE_PACKAGE_WHITELIST_MODE_DEVICE_DEFAULT); + /** Gets the PACKAGE_ALLOWLIST_MODE_PROP System Property. */ + private int getUserTypePackageAllowlistMode() { + return SystemProperties.getInt(PACKAGE_ALLOWLIST_MODE_PROP, + USER_TYPE_PACKAGE_ALLOWLIST_MODE_DEVICE_DEFAULT); } - /** Sets the PACKAGE_WHITELIST_MODE_PROP System Property to the given value. */ - private void setUserTypePackageWhitelistMode(int mode) { + /** Sets the PACKAGE_ALLOWLIST_MODE_PROP System Property to the given value. */ + private void setUserTypePackageAllowlistMode(int mode) { String result = ShellHelper.runShellCommand( - String.format("setprop %s %d", PACKAGE_WHITELIST_MODE_PROP, mode)); - attestFalse("Failed to set sysprop " + PACKAGE_WHITELIST_MODE_PROP + ": " + result, + String.format("setprop %s %d", PACKAGE_ALLOWLIST_MODE_PROP, mode)); + attestFalse("Failed to set sysprop " + PACKAGE_ALLOWLIST_MODE_PROP + ": " + result, result != null && result.contains("Failed")); } diff --git a/apct-tests/perftests/windowmanager/src/android/wm/RelayoutPerfTest.java b/apct-tests/perftests/windowmanager/src/android/wm/RelayoutPerfTest.java index b0da7d1e2870..c42c7ca25133 100644 --- a/apct-tests/perftests/windowmanager/src/android/wm/RelayoutPerfTest.java +++ b/apct-tests/perftests/windowmanager/src/android/wm/RelayoutPerfTest.java @@ -111,7 +111,7 @@ public class RelayoutPerfTest extends WindowManagerPerfTestBase stopProfiling(); } - /** A dummy view to get IWindow. */ + /** A placeholder view to get IWindow. */ private static class ContentView extends LinearLayout { ContentView(Context context) { super(context); diff --git a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java index 526e63cf7e29..8c47767d13ea 100644 --- a/apex/jobscheduler/framework/java/android/app/job/JobInfo.java +++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java @@ -371,7 +371,7 @@ public class JobInfo implements Parcelable { /** * Allows this job to run despite doze restrictions as long as the app is in the foreground - * or on the temporary whitelist + * or on the temporary allowlist * @hide */ public static final int FLAG_IMPORTANT_WHILE_FOREGROUND = 1 << 1; @@ -2042,13 +2042,13 @@ public class JobInfo implements Parcelable { /** * Setting this to true indicates that this job is important while the scheduling app - * is in the foreground or on the temporary whitelist for background restrictions. + * is in the foreground or on the temporary allowlist for background restrictions. * This means that the system will relax doze restrictions on this job during this time. * * Apps should use this flag only for short jobs that are essential for the app to function * properly in the foreground. * - * Note that once the scheduling app is no longer whitelisted from background restrictions + * Note that once the scheduling app is no longer allowlisted from background restrictions * and in the background, or the job failed due to unsatisfied constraints, * this job should be expected to behave like other jobs without this flag. * diff --git a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java index 4ce31e96208c..20da1718abb0 100644 --- a/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java +++ b/apex/jobscheduler/framework/java/android/os/PowerWhitelistManager.java @@ -29,10 +29,10 @@ import java.lang.annotation.RetentionPolicy; import java.util.List; /** - * Interface to access and modify the permanent and temporary power save whitelist. The two lists - * are kept separately. Apps placed on the permanent whitelist are only removed via an explicit - * removeFromWhitelist call. Apps whitelisted by default by the system cannot be removed. Apps - * placed on the temporary whitelist are removed from that whitelist after a predetermined amount of + * Interface to access and modify the permanent and temporary power save allowlist. The two lists + * are kept separately. Apps placed on the permanent allowlist are only removed via an explicit + * removeFromAllowlist call. Apps whitelisted by default by the system cannot be removed. Apps + * placed on the temporary allowlist are removed from that allowlist after a predetermined amount of * time. * * @deprecated Use {@link PowerExemptionManager} instead @@ -50,18 +50,18 @@ public class PowerWhitelistManager { private final PowerExemptionManager mPowerExemptionManager; /** - * Indicates that an unforeseen event has occurred and the app should be whitelisted to handle + * Indicates that an unforeseen event has occurred and the app should be allowlisted to handle * it. */ public static final int EVENT_UNSPECIFIED = PowerExemptionManager.EVENT_UNSPECIFIED; /** - * Indicates that an SMS event has occurred and the app should be whitelisted to handle it. + * Indicates that an SMS event has occurred and the app should be allowlisted to handle it. */ public static final int EVENT_SMS = PowerExemptionManager.EVENT_SMS; /** - * Indicates that an MMS event has occurred and the app should be whitelisted to handle it. + * Indicates that an MMS event has occurred and the app should be allowlisted to handle it. */ public static final int EVENT_MMS = PowerExemptionManager.EVENT_MMS; @@ -381,7 +381,7 @@ public class PowerWhitelistManager { } /** - * Add the specified package to the permanent power save whitelist. + * Add the specified package to the permanent power save allowlist. * * @deprecated Use {@link PowerExemptionManager#addToPermanentAllowList(String)} instead */ @@ -392,7 +392,7 @@ public class PowerWhitelistManager { } /** - * Add the specified packages to the permanent power save whitelist. + * Add the specified packages to the permanent power save allowlist. * * @deprecated Use {@link PowerExemptionManager#addToPermanentAllowList(List)} instead */ @@ -403,10 +403,10 @@ public class PowerWhitelistManager { } /** - * Get a list of app IDs of app that are whitelisted. This does not include temporarily - * whitelisted apps. + * Get a list of app IDs of app that are allowlisted. This does not include temporarily + * allowlisted apps. * - * @param includingIdle Set to true if the app should be whitelisted from device idle as well + * @param includingIdle Set to true if the app should be allowlisted from device idle as well * as other power save restrictions * @deprecated Use {@link PowerExemptionManager#getAllowListedAppIds(boolean)} instead * @hide @@ -418,10 +418,10 @@ public class PowerWhitelistManager { } /** - * Returns true if the app is whitelisted from power save restrictions. This does not include - * temporarily whitelisted apps. + * Returns true if the app is allowlisted from power save restrictions. This does not include + * temporarily allowlisted apps. * - * @param includingIdle Set to true if the app should be whitelisted from device + * @param includingIdle Set to true if the app should be allowlisted from device * idle as well as other power save restrictions * @deprecated Use {@link PowerExemptionManager#isAllowListed(String, boolean)} instead * @hide @@ -432,11 +432,11 @@ public class PowerWhitelistManager { } /** - * Remove an app from the permanent power save whitelist. Only apps that were added via + * Remove an app from the permanent power save allowlist. Only apps that were added via * {@link #addToWhitelist(String)} or {@link #addToWhitelist(List)} will be removed. Apps - * whitelisted by default by the system cannot be removed. + * allowlisted by default by the system cannot be removed. * - * @param packageName The app to remove from the whitelist + * @param packageName The app to remove from the allowlist * @deprecated Use {@link PowerExemptionManager#removeFromPermanentAllowList(String)} instead */ @Deprecated @@ -446,10 +446,10 @@ public class PowerWhitelistManager { } /** - * Add an app to the temporary whitelist for a short amount of time. + * Add an app to the temporary allowlist for a short amount of time. * - * @param packageName The package to add to the temp whitelist - * @param durationMs How long to keep the app on the temp whitelist for (in milliseconds) + * @param packageName The package to add to the temp allowlist + * @param durationMs How long to keep the app on the temp allowlist for (in milliseconds) * @param reasonCode one of {@link ReasonCode}, use {@link #REASON_UNKNOWN} if not sure. * @param reason a optional human readable reason string, could be null or empty string. * @deprecated Use {@link PowerExemptionManager#addToTemporaryAllowList( @@ -463,10 +463,10 @@ public class PowerWhitelistManager { } /** - * Add an app to the temporary whitelist for a short amount of time. + * Add an app to the temporary allowlist for a short amount of time. * - * @param packageName The package to add to the temp whitelist - * @param durationMs How long to keep the app on the temp whitelist for (in milliseconds) + * @param packageName The package to add to the temp allowlist + * @param durationMs How long to keep the app on the temp allowlist for (in milliseconds) * @deprecated Use {@link PowerExemptionManager#addToTemporaryAllowList( * String, int, String, long)} instead */ @@ -478,15 +478,15 @@ public class PowerWhitelistManager { } /** - * Add an app to the temporary whitelist for a short amount of time for a specific reason. The - * temporary whitelist is kept separately from the permanent whitelist and apps are - * automatically removed from the temporary whitelist after a predetermined amount of time. + * Add an app to the temporary allowlist for a short amount of time for a specific reason. The + * temporary allowlist is kept separately from the permanent allowlist and apps are + * automatically removed from the temporary allowlist after a predetermined amount of time. * - * @param packageName The package to add to the temp whitelist - * @param event The reason to add the app to the temp whitelist - * @param reason A human-readable reason explaining why the app is temp whitelisted. Only + * @param packageName The package to add to the temp allowlist + * @param event The reason to add the app to the temp allowlist + * @param reason A human-readable reason explaining why the app is temp allowlisted. Only * used for logging purposes. Could be null or empty string. - * @return The duration (in milliseconds) that the app is whitelisted for + * @return The duration (in milliseconds) that the app is allowlisted for * @deprecated Use {@link PowerExemptionManager#addToTemporaryAllowListForEvent( * String, int, String, int)} instead */ @@ -499,16 +499,16 @@ public class PowerWhitelistManager { } /** - * Add an app to the temporary whitelist for a short amount of time for a specific reason. The - * temporary whitelist is kept separately from the permanent whitelist and apps are - * automatically removed from the temporary whitelist after a predetermined amount of time. + * Add an app to the temporary allowlist for a short amount of time for a specific reason. The + * temporary allowlist is kept separately from the permanent allowlist and apps are + * automatically removed from the temporary allowlist after a predetermined amount of time. * - * @param packageName The package to add to the temp whitelist - * @param event The reason to add the app to the temp whitelist + * @param packageName The package to add to the temp allowlist + * @param event The reason to add the app to the temp allowlist * @param reasonCode one of {@link ReasonCode}, use {@link #REASON_UNKNOWN} if not sure. - * @param reason A human-readable reason explaining why the app is temp whitelisted. Only + * @param reason A human-readable reason explaining why the app is temp allowlisted. Only * used for logging purposes. Could be null or empty string. - * @return The duration (in milliseconds) that the app is whitelisted for + * @return The duration (in milliseconds) that the app is allowlisted for * @deprecated Use {@link PowerExemptionManager#addToTemporaryAllowListForEvent( * String, int, String, int)} instead */ diff --git a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java index df1b66612ea2..b96354c396a7 100644 --- a/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java +++ b/apex/jobscheduler/service/java/com/android/server/alarm/AlarmManagerService.java @@ -755,7 +755,7 @@ public class AlarmManagerService extends SystemService { private static final long DEFAULT_MIN_INTERVAL = 60 * 1000; private static final long DEFAULT_MAX_INTERVAL = 365 * INTERVAL_DAY; private static final long DEFAULT_MIN_WINDOW = 10 * 60 * 1000; - private static final long DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION = 10 * 1000; + private static final long DEFAULT_ALLOW_WHILE_IDLE_ALLOWLIST_DURATION = 10 * 1000; private static final long DEFAULT_LISTENER_TIMEOUT = 5 * 1000; private static final int DEFAULT_MAX_ALARMS_PER_UID = 500; private static final long DEFAULT_APP_STANDBY_WINDOW = 60 * 60 * 1000; // 1 hr @@ -811,7 +811,7 @@ public class AlarmManagerService extends SystemService { // BroadcastOptions.setTemporaryAppWhitelistDuration() to use for FLAG_ALLOW_WHILE_IDLE. public long ALLOW_WHILE_IDLE_WHITELIST_DURATION - = DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION; + = DEFAULT_ALLOW_WHILE_IDLE_ALLOWLIST_DURATION; // Direct alarm listener callback timeout public long LISTENER_TIMEOUT = DEFAULT_LISTENER_TIMEOUT; @@ -1018,7 +1018,7 @@ public class AlarmManagerService extends SystemService { case KEY_ALLOW_WHILE_IDLE_WHITELIST_DURATION: ALLOW_WHILE_IDLE_WHITELIST_DURATION = properties.getLong( KEY_ALLOW_WHILE_IDLE_WHITELIST_DURATION, - DEFAULT_ALLOW_WHILE_IDLE_WHITELIST_DURATION); + DEFAULT_ALLOW_WHILE_IDLE_ALLOWLIST_DURATION); updateAllowWhileIdleWhitelistDurationLocked(); break; case KEY_LISTENER_TIMEOUT: @@ -1635,7 +1635,7 @@ public class AlarmManagerService extends SystemService { * Check all alarms in {@link #mPendingBackgroundAlarms} and send the ones that are not * restricted. * - * This is only called when the power save whitelist changes, so it's okay to be slow. + * This is only called when the power save allowlist changes, so it's okay to be slow. */ @GuardedBy("mLock") void sendAllUnrestrictedPendingBackgroundAlarmsLocked() { @@ -1925,6 +1925,7 @@ public class AlarmManagerService extends SystemService { mActivityOptsRestrictBal.setPendingIntentBackgroundActivityLaunchAllowed(false); mBroadcastOptsRestrictBal.setPendingIntentBackgroundActivityLaunchAllowed(false); mMetricsHelper = new MetricsHelper(getContext(), mLock); + mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mListenerDeathRecipient = new IBinder.DeathRecipient() { @Override @@ -2024,7 +2025,6 @@ public class AlarmManagerService extends SystemService { Slog.w(TAG, "Failed to open alarm driver. Falling back to a handler."); } } - mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); publishLocalService(AlarmManagerInternal.class, new LocalService()); publishBinderService(Context.ALARM_SERVICE, mService); } @@ -2290,7 +2290,7 @@ public class AlarmManagerService extends SystemService { } } - // Sanity check the recurrence interval. This will catch people who supply + // Validate the recurrence interval. This will catch people who supply // seconds when the API expects milliseconds, or apps trying shenanigans // around intentional period overflow, etc. final long minInterval = mConstants.MIN_INTERVAL; diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java index 109686d76b2f..e636f604ddb0 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java @@ -456,6 +456,7 @@ public final class JobServiceContext implements ServiceConnection { if (DEBUG) { Slog.d(TAG, job.getServiceComponent().getShortClassName() + " unavailable."); } + mContext.unbindService(this); mRunningJob = null; mRunningJobWorkType = WORK_TYPE_NONE; mRunningCallback = null; diff --git a/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java b/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java index fb342b9ba9b3..913a76a65026 100644 --- a/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java +++ b/apex/jobscheduler/service/java/com/android/server/usage/AppIdleHistory.java @@ -61,6 +61,7 @@ import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; @@ -802,6 +803,9 @@ public class AppIdleHistory { } } } + } catch (FileNotFoundException e) { + // Expected on first boot + Slog.d(TAG, "App idle file for user " + userId + " does not exist"); } catch (IOException | XmlPullParserException e) { Slog.e(TAG, "Unable to read app idle file for user " + userId, e); } finally { diff --git a/api/Android.bp b/api/Android.bp index f5bafe8bf8da..c16bce5a1aea 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -60,14 +60,14 @@ python_test_host { metalava_cmd = "$(location metalava)" // Silence reflection warnings. See b/168689341 metalava_cmd += " -J--add-opens=java.base/java.util=ALL-UNNAMED " -metalava_cmd += " --quiet --no-banner --format=v2 " +metalava_cmd += " --quiet " genrule { name: "current-api-xml", tools: ["metalava"], srcs: [":frameworks-base-api-current.txt"], out: ["current.api"], - cmd: metalava_cmd + "-convert2xmlnostrip $(in) $(out)", + cmd: metalava_cmd + "signature-to-jdiff $(in) $(out)", visibility: ["//visibility:public"], } diff --git a/api/StubLibraries.bp b/api/StubLibraries.bp index f08745b5cd2c..05521e6fa23a 100644 --- a/api/StubLibraries.bp +++ b/api/StubLibraries.bp @@ -29,6 +29,9 @@ droidstubs { name: "api-stubs-docs-non-updatable", + srcs: [ + ":framework-minus-apex-aconfig-srcjars", + ], defaults: [ "android-non-updatable-stubs-defaults", "module-classpath-stubs-defaults", @@ -63,6 +66,7 @@ droidstubs { tag: ".removed-api.txt", }, ], + api_surface: "public", } priv_apps = " --show-annotation android.annotation.SystemApi\\(" + @@ -116,6 +120,7 @@ droidstubs { tag: ".removed-api.txt", }, ], + api_surface: "system", } droidstubs { @@ -161,6 +166,7 @@ droidstubs { tag: ".removed-api.txt", }, ], + api_surface: "test", } droidstubs { @@ -200,6 +206,7 @@ droidstubs { tag: ".removed-api.txt", }, ], + api_surface: "module-lib", } ///////////////////////////////////////////////////////////////////// @@ -213,30 +220,106 @@ java_defaults { system_modules: "none", java_version: "1.8", compile_dex: true, - defaults_visibility: ["//visibility:private"], visibility: ["//visibility:public"], } java_defaults { - name: "android-non-updatable_defaults_stubs_current", - libs: ["stub-annotations"], - static_libs: ["framework-res-package-jar"], // Export package of framework-res + name: "android-non-updatable_defaults", sdk_version: "none", system_modules: "none", java_version: "1.8", compile_dex: true, +} + +java_defaults { + name: "android-non-updatable_from_source_defaults", + libs: ["stub-annotations"], + static_libs: ["framework-res-package-jar"], // Export package of framework-res dist: { targets: ["sdk"], tag: ".jar", dest: "android-non-updatable.jar", }, - defaults_visibility: ["//visibility:private"], - visibility: ["//visibility:private"], } java_library { name: "android-non-updatable.stubs", - defaults: ["android-non-updatable_defaults_stubs_current"], + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.system", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.system.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.system.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.system.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.module_lib", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.module_lib.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.module_lib.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.module_lib.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.test", + defaults: ["android-non-updatable_defaults"], + static_libs: [ + "android-non-updatable.stubs.test.from-source", + ], + product_variables: { + build_from_text_stub: { + static_libs: [ + "android-non-updatable.stubs.test.from-text", + ], + exclude_static_libs: [ + "android-non-updatable.stubs.test.from-source", + ], + }, + }, +} + +java_library { + name: "android-non-updatable.stubs.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":api-stubs-docs-non-updatable"], libs: ["all-modules-public-stubs"], dist: { @@ -245,8 +328,11 @@ java_library { } java_library { - name: "android-non-updatable.stubs.system", - defaults: ["android-non-updatable_defaults_stubs_current"], + name: "android-non-updatable.stubs.system.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":system-api-stubs-docs-non-updatable"], libs: ["all-modules-system-stubs"], dist: { @@ -255,8 +341,11 @@ java_library { } java_library { - name: "android-non-updatable.stubs.module_lib", - defaults: ["android-non-updatable_defaults_stubs_current"], + name: "android-non-updatable.stubs.module_lib.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":module-lib-api-stubs-docs-non-updatable"], libs: [ "sdk_module-lib_current_framework-tethering", @@ -273,8 +362,11 @@ java_library { } java_library { - name: "android-non-updatable.stubs.test", - defaults: ["android-non-updatable_defaults_stubs_current"], + name: "android-non-updatable.stubs.test.from-source", + defaults: [ + "android-non-updatable_defaults", + "android-non-updatable_from_source_defaults", + ], srcs: [":test-api-stubs-docs-non-updatable"], libs: ["all-modules-system-stubs"], dist: { @@ -283,6 +375,57 @@ java_library { } java_defaults { + name: "android-non-updatable_from_text_defaults", + static_libs: ["framework-res-package-jar"], + libs: ["stub-annotations"], +} + +java_api_library { + name: "android-non-updatable.stubs.from-text", + api_surface: "public", + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_stubs_current.from-text", +} + +java_api_library { + name: "android-non-updatable.stubs.system.from-text", + api_surface: "system", + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_system_stubs_current.from-text", +} + +java_api_library { + name: "android-non-updatable.stubs.test.from-text", + api_surface: "test", + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "test-api-stubs-docs-non-updatable.api.contribution", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_test_stubs_current.from-text", +} + +java_api_library { + name: "android-non-updatable.stubs.module_lib.from-text", + api_surface: "module_lib", + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "module-lib-api-stubs-docs-non-updatable.api.contribution", + ], + defaults: ["android-non-updatable_from_text_defaults"], + full_api_surface_stub: "android_module_lib_stubs_current_full.from-text", +} + +java_defaults { name: "android_stubs_dists_default", dist: { targets: ["sdk"], @@ -293,7 +436,7 @@ java_defaults { } java_library { - name: "android_stubs_current", + name: "android_stubs_current.from-source", static_libs: [ "all-modules-public-stubs", "android-non-updatable.stubs", @@ -303,7 +446,7 @@ java_library { } java_library { - name: "android_system_stubs_current", + name: "android_system_stubs_current.from-source", static_libs: [ "all-modules-system-stubs", "android-non-updatable.stubs.system", @@ -327,7 +470,7 @@ java_library { } java_library { - name: "android_test_stubs_current", + name: "android_test_stubs_current.from-source", static_libs: [ // Updatable modules do not have test APIs, but we want to include their SystemApis, like we // include the SystemApi of framework-non-updatable-sources. @@ -347,7 +490,7 @@ java_library { } java_library { - name: "android_module_lib_stubs_current", + name: "android_module_lib_stubs_current.from-source", defaults: [ "android.jar_defaults", "android_stubs_dists_default", @@ -363,7 +506,7 @@ java_library { } java_library { - name: "android_system_server_stubs_current", + name: "android_system_server_stubs_current.from-source", defaults: [ "android.jar_defaults", "android_stubs_dists_default", @@ -371,7 +514,7 @@ java_library { srcs: [":services-non-updatable-stubs"], installable: false, static_libs: [ - "android_module_lib_stubs_current", + "android_module_lib_stubs_current.from-source", ], dist: { dir: "apistubs/android/system-server", @@ -402,7 +545,6 @@ java_library { java_genrule { name: "android_stubs_private_hjar", - visibility: ["//visibility:private"], srcs: [":android_stubs_private_jar{.hjar}"], out: ["android_stubs_private.jar"], cmd: "cp $(in) $(out)", @@ -411,7 +553,6 @@ java_genrule { java_library { name: "android_stubs_private", defaults: ["android_stubs_dists_default"], - visibility: ["//visibility:private"], sdk_version: "none", system_modules: "none", static_libs: ["android_stubs_private_hjar"], @@ -422,7 +563,6 @@ java_library { java_genrule { name: "android_stubs_private_framework_aidl", - visibility: ["//visibility:private"], tools: ["sdkparcelables"], srcs: [":android_stubs_private"], out: ["framework.aidl"], @@ -439,6 +579,170 @@ java_genrule { }, } +// +// Java API defaults and libraries for single tree build +// + +java_defaults { + name: "stub-annotation-defaults", + libs: [ + "stub-annotations", + ], + static_libs: [ + // stub annotations do not contribute to the API surfaces but are statically + // linked in the stubs for API surfaces (see frameworks/base/StubLibraries.bp). + // This is because annotation processors insist on loading the classes for any + // annotations found, thus should exist inside android.jar. + "private-stub-annotations-jar", + ], +} + +// Listing of API domains contribution and dependencies per API surfaces +java_defaults { + name: "android_test_stubs_current_contributions", + api_surface: "test", + api_contributions: [ + "framework-virtualization.stubs.source.test.api.contribution", + ], +} + +java_defaults { + name: "android_test_frameworks_core_stubs_current_contributions", + api_surface: "test", + api_contributions: [ + "test-api-stubs-docs-non-updatable.api.contribution", + ], +} + +java_defaults { + name: "android_module_lib_stubs_current_contributions", + api_surface: "module-lib", + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "module-lib-api-stubs-docs-non-updatable.api.contribution", + "art.module.public.api.stubs.source.api.contribution", + "art.module.public.api.stubs.source.system.api.contribution", + "art.module.public.api.stubs.source.module_lib.api.contribution", + "i18n.module.public.api.stubs.source.api.contribution", + "i18n.module.public.api.stubs.source.system.api.contribution", + "i18n.module.public.api.stubs.source.module_lib.api.contribution", + ], +} + +// Java API library definitions per API surface +java_api_library { + name: "android_stubs_current.from-text", + api_surface: "public", + defaults: [ + // This module is dynamically created at frameworks/base/api/api.go + // instead of being written out, in order to minimize edits in the codebase + // when there is a change in the list of modules. + // that contributes to an api surface. + "android_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_system_stubs_current.from-text", + api_surface: "system", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_test_stubs_current.from-text", + api_surface: "test", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "android_test_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "test-api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_test_frameworks_core_stubs_current.from-text", + api_surface: "test", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "android_test_frameworks_core_stubs_current_contributions", + "stub-annotation-defaults", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + ], +} + +java_api_library { + name: "android_module_lib_stubs_current_full.from-text", + api_surface: "module-lib", + defaults: [ + "android_stubs_current_contributions", + "android_system_stubs_current_contributions", + "android_module_lib_stubs_current_contributions_full", + ], + libs: [ + "stub-annotations", + ], + api_contributions: [ + "api-stubs-docs-non-updatable.api.contribution", + "system-api-stubs-docs-non-updatable.api.contribution", + "module-lib-api-stubs-docs-non-updatable.api.contribution", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_module_lib_stubs_current.from-text", + api_surface: "module-lib", + defaults: [ + "android_module_lib_stubs_current_contributions", + ], + libs: [ + "android_module_lib_stubs_current_full.from-text", + "stub-annotations", + ], + visibility: ["//visibility:public"], +} + +java_api_library { + name: "android_system_server_stubs_current.from-text", + api_surface: "system-server", + api_contributions: [ + "services-non-updatable-stubs.api.contribution", + ], + libs: [ + "android_module_lib_stubs_current.from-text", + "stub-annotations", + ], + static_libs: [ + "android_module_lib_stubs_current.from-text", + ], + visibility: ["//visibility:public"], +} + //////////////////////////////////////////////////////////////////////// // api-versions.xml generation, for public and system. This API database // also contains the android.test.* APIs. @@ -586,7 +890,6 @@ droidstubs { "metalava-manual", ], args: priv_apps, - visibility: ["//visibility:private"], } java_library { diff --git a/api/api.go b/api/api.go index 09c238336a39..431d6d8d06ff 100644 --- a/api/api.go +++ b/api/api.go @@ -15,7 +15,9 @@ package api import ( + "fmt" "sort" + "strings" "github.com/google/blueprint/proptools" @@ -94,6 +96,7 @@ type libraryProps struct { Sdk_version *string Static_libs []string Visibility []string + Defaults []string } type fgProps struct { @@ -102,6 +105,14 @@ type fgProps struct { Visibility []string } +type defaultsProps struct { + Name *string + Api_surface *string + Api_contributions []string + Defaults_visibility []string + Previous_api *string +} + type Bazel_module struct { Bp2build_available *bool } @@ -135,7 +146,7 @@ func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition) { metalavaCmd := "$(location metalava)" // Silence reflection warnings. See b/168689341 metalavaCmd += " -J--add-opens=java.base/java.util=ALL-UNNAMED " - metalavaCmd += " --quiet --no-banner --format=v2 " + metalavaCmd += " --quiet merge-signatures --format=v2 " filename := txt.TxtFilename if txt.Scope != "public" { @@ -145,7 +156,7 @@ func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition) { props.Name = proptools.StringPtr(ctx.ModuleName() + "-" + filename) props.Tools = []string{"metalava"} props.Out = []string{filename} - props.Cmd = proptools.StringPtr(metalavaCmd + "$(in) --api $(out)") + props.Cmd = proptools.StringPtr(metalavaCmd + "$(in) --out $(out)") props.Srcs = append([]string{txt.BaseTxt}, createSrcs(txt.Modules, txt.ModuleTag)...) props.Dists = []android.Dist{ { @@ -164,26 +175,26 @@ func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition) { } func createMergedAnnotationsFilegroups(ctx android.LoadHookContext, modules, system_server_modules []string) { - for _, i := range []struct{ + for _, i := range []struct { name string tag string modules []string }{ { - name: "all-modules-public-annotations", - tag: "{.public.annotations.zip}", + name: "all-modules-public-annotations", + tag: "{.public.annotations.zip}", modules: modules, }, { - name: "all-modules-system-annotations", - tag: "{.system.annotations.zip}", + name: "all-modules-system-annotations", + tag: "{.system.annotations.zip}", modules: modules, }, { - name: "all-modules-module-lib-annotations", - tag: "{.module-lib.annotations.zip}", + name: "all-modules-module-lib-annotations", + tag: "{.module-lib.annotations.zip}", modules: modules, }, { - name: "all-modules-system-server-annotations", - tag: "{.system-server.annotations.zip}", + name: "all-modules-system-server-annotations", + tag: "{.system-server.annotations.zip}", modules: system_server_modules, }, } { @@ -329,6 +340,55 @@ func createMergedTxts(ctx android.LoadHookContext, bootclasspath, system_server_ } } +func createApiContributionDefaults(ctx android.LoadHookContext, modules []string) { + defaultsSdkKinds := []android.SdkKind{ + android.SdkPublic, android.SdkSystem, android.SdkModule, + } + for _, sdkKind := range defaultsSdkKinds { + props := defaultsProps{} + props.Name = proptools.StringPtr( + sdkKind.DefaultJavaLibraryName() + "_contributions") + if sdkKind == android.SdkModule { + props.Name = proptools.StringPtr( + sdkKind.DefaultJavaLibraryName() + "_contributions_full") + } + props.Api_surface = proptools.StringPtr(sdkKind.String()) + apiSuffix := "" + if sdkKind != android.SdkPublic { + apiSuffix = "." + strings.ReplaceAll(sdkKind.String(), "-", "_") + } + props.Api_contributions = transformArray( + modules, "", fmt.Sprintf(".stubs.source%s.api.contribution", apiSuffix)) + props.Defaults_visibility = []string{"//visibility:public"} + props.Previous_api = proptools.StringPtr(":android.api.public.latest") + ctx.CreateModule(java.DefaultsFactory, &props) + } +} + +func createFullApiLibraries(ctx android.LoadHookContext) { + javaLibraryNames := []string{ + "android_stubs_current", + "android_system_stubs_current", + "android_test_stubs_current", + "android_module_lib_stubs_current", + "android_system_server_stubs_current", + } + + for _, libraryName := range javaLibraryNames { + props := libraryProps{} + props.Name = proptools.StringPtr(libraryName) + staticLib := libraryName + ".from-source" + if ctx.Config().BuildFromTextStub() { + staticLib = libraryName + ".from-text" + } + props.Static_libs = []string{staticLib} + props.Defaults = []string{"android.jar_defaults"} + props.Visibility = []string{"//visibility:public"} + + ctx.CreateModule(java.LibraryFactory, &props) + } +} + func (a *CombinedApis) createInternalModules(ctx android.LoadHookContext) { bootclasspath := a.properties.Bootclasspath system_server_classpath := a.properties.System_server_classpath @@ -347,6 +407,10 @@ func (a *CombinedApis) createInternalModules(ctx android.LoadHookContext) { createMergedAnnotationsFilegroups(ctx, bootclasspath, system_server_classpath) createPublicStubsSourceFilegroup(ctx, bootclasspath) + + createApiContributionDefaults(ctx, bootclasspath) + + createFullApiLibraries(ctx) } func combinedApisModuleFactory() android.Module { @@ -365,7 +429,7 @@ type bazelCombinedApisAttributes struct { } // combined_apis bp2build converter -func (a *CombinedApis) ConvertWithBp2build(ctx android.TopDownMutatorContext) { +func (a *CombinedApis) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { basePrefix := "non-updatable" scopeToSuffix := map[string]string{ "public": "-current.txt", @@ -374,7 +438,7 @@ func (a *CombinedApis) ConvertWithBp2build(ctx android.TopDownMutatorContext) { "system-server": "-system-server-current.txt", } - for scopeName, suffix := range scopeToSuffix{ + for scopeName, suffix := range scopeToSuffix { name := a.Name() + suffix var scope bazel.StringAttribute diff --git a/api/api_test.go b/api/api_test.go index 15b695ca0d36..1f4c2af32493 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -19,6 +19,7 @@ import ( "android/soong/android" "android/soong/bp2build" + "android/soong/java" ) func runCombinedApisTestCaseWithRegistrationCtxFunc(t *testing.T, tc bp2build.Bp2buildTestCase, registrationCtxFunc func(ctx android.RegistrationContext)) { @@ -30,7 +31,9 @@ func runCombinedApisTestCaseWithRegistrationCtxFunc(t *testing.T, tc bp2build.Bp func runCombinedApisTestCase(t *testing.T, tc bp2build.Bp2buildTestCase) { t.Helper() - runCombinedApisTestCaseWithRegistrationCtxFunc(t, tc, func(ctx android.RegistrationContext) {}) + runCombinedApisTestCaseWithRegistrationCtxFunc(t, tc, func(ctx android.RegistrationContext) { + ctx.RegisterModuleType("java_defaults", java.DefaultsFactory) + }) } func TestCombinedApisGeneral(t *testing.T) { @@ -42,6 +45,13 @@ func TestCombinedApisGeneral(t *testing.T) { system_server_classpath: ["ssc"], } `, + Filesystem: map[string]string{ + "a/Android.bp": ` + java_defaults { + name: "android.jar_defaults", + } + `, + }, ExpectedBazelTargets: []string{ bp2build.MakeBazelTargetNoRestrictions("merged_txts", "foo-current.txt", bp2build.AttrNameToString{ "scope": `"public"`, diff --git a/api/gen_combined_removed_dex.sh b/api/gen_combined_removed_dex.sh index 9225fe8dfe85..71f366a6aae2 100755 --- a/api/gen_combined_removed_dex.sh +++ b/api/gen_combined_removed_dex.sh @@ -6,6 +6,6 @@ shift 2 # Convert each removed.txt to the "dex format" equivalent, and print all output. for f in "$@"; do - "$metalava_path" --no-banner "$f" --dex-api "${tmp_dir}/tmp" + "$metalava_path" "$f" --dex-api "${tmp_dir}/tmp" cat "${tmp_dir}/tmp" done diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp index 28db61f7d98a..4e41f2c1ac35 100644 --- a/cmds/app_process/app_main.cpp +++ b/cmds/app_process/app_main.cpp @@ -49,7 +49,7 @@ public: virtual void onVmCreated(JNIEnv* env) { - if (mClassName.isEmpty()) { + if (mClassName.empty()) { return; // Zygote. Nothing to do here. } @@ -66,10 +66,10 @@ public: * executing boot class Java code and thereby deny ourselves access to * non-boot classes. */ - char* slashClassName = toSlashClassName(mClassName.string()); + char* slashClassName = toSlashClassName(mClassName.c_str()); mClass = env->FindClass(slashClassName); if (mClass == NULL) { - ALOGE("ERROR: could not find class '%s'\n", mClassName.string()); + ALOGE("ERROR: could not find class '%s'\n", mClassName.c_str()); } free(slashClassName); @@ -98,7 +98,7 @@ public: virtual void onExit(int code) { - if (mClassName.isEmpty()) { + if (mClassName.empty()) { // if zygote IPCThreadState::self()->stopProcess(); hardware::IPCThreadState::self()->stopProcess(); @@ -179,7 +179,7 @@ int main(int argc, char* const argv[]) argv_String.append(argv[i]); argv_String.append("\" "); } - ALOGV("app_process main with argv: %s", argv_String.string()); + ALOGV("app_process main with argv: %s", argv_String.c_str()); } AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv)); @@ -271,9 +271,9 @@ int main(int argc, char* const argv[]) } else if (strcmp(arg, "--application") == 0) { application = true; } else if (strncmp(arg, "--nice-name=", 12) == 0) { - niceName.setTo(arg + 12); + niceName = (arg + 12); } else if (strncmp(arg, "--", 2) != 0) { - className.setTo(arg); + className = arg; break; } else { --i; @@ -282,7 +282,7 @@ int main(int argc, char* const argv[]) } Vector<String8> args; - if (!className.isEmpty()) { + if (!className.empty()) { // We're not in zygote mode, the only argument we need to pass // to RuntimeInit is the application argument. // @@ -300,7 +300,7 @@ int main(int argc, char* const argv[]) restOfArgs.append(argv_new[k]); restOfArgs.append("\" "); } - ALOGV("Class name = %s, args = %s", className.string(), restOfArgs.string()); + ALOGV("Class name = %s, args = %s", className.c_str(), restOfArgs.c_str()); } } else { // We're in zygote mode. @@ -328,13 +328,13 @@ int main(int argc, char* const argv[]) } } - if (!niceName.isEmpty()) { - runtime.setArgv0(niceName.string(), true /* setProcName */); + if (!niceName.empty()) { + runtime.setArgv0(niceName.c_str(), true /* setProcName */); } if (zygote) { runtime.start("com.android.internal.os.ZygoteInit", args, zygote); - } else if (!className.isEmpty()) { + } else if (!className.empty()) { runtime.start("com.android.internal.os.RuntimeInit", args, zygote); } else { fprintf(stderr, "Error: no class name or --zygote supplied.\n"); diff --git a/cmds/backup/backup.cpp b/cmds/backup/backup.cpp index 8d9b528ae6a9..c2ce69011d92 100644 --- a/cmds/backup/backup.cpp +++ b/cmds/backup/backup.cpp @@ -75,7 +75,7 @@ static int perform_list(const char* filename) size_t dataSize; err = reader.ReadEntityHeader(&key, &dataSize); if (err == 0) { - printf(" entity: %s (%zu bytes)\n", key.string(), dataSize); + printf(" entity: %s (%zu bytes)\n", key.c_str(), dataSize); } else { printf(" Error reading entity header\n"); } diff --git a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java index b6dc32a29f04..9dedf7025143 100644 --- a/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java +++ b/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java @@ -192,7 +192,7 @@ public class Bmgr { } if ("whitelist".equals(op)) { - doPrintWhitelist(); + doPrintAllowlist(); return; } @@ -911,7 +911,7 @@ public class Bmgr { } } - private void doPrintWhitelist() { + private void doPrintAllowlist() { try { final String[] whitelist = mBmgr.getTransportWhitelist(); if (whitelist != null) { diff --git a/cmds/bootanimation/Android.bp b/cmds/bootanimation/Android.bp index 3534624a58a2..98767ee733ad 100644 --- a/cmds/bootanimation/Android.bp +++ b/cmds/bootanimation/Android.bp @@ -74,4 +74,7 @@ cc_library_shared { "libGLESv2", "libgui", ], + whole_static_libs: [ + "libc++fs", + ], } diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index a8b6c0b70804..681f8e9f44a0 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -17,6 +17,7 @@ #define LOG_NDEBUG 0 #define LOG_TAG "BootAnimation" +#include <filesystem> #include <vector> #include <stdint.h> @@ -705,7 +706,7 @@ void BootAnimation::resizeSurface(int newWidth, int newHeight) { bool BootAnimation::preloadAnimation() { findBootAnimationFile(); - if (!mZipFileName.isEmpty()) { + if (!mZipFileName.empty()) { mAnimation = loadAnimation(mZipFileName); return (mAnimation != nullptr); } @@ -818,7 +819,7 @@ bool BootAnimation::threadLoop() { // We have no bootanimation file, so we use the stock android logo // animation. - if (mZipFileName.isEmpty()) { + if (mZipFileName.empty()) { ALOGD("No animation file"); result = android(); } else { @@ -1009,7 +1010,7 @@ static bool readFile(ZipFileRO* zip, const char* name, String8& outString) { return false; } - outString.setTo((char const*)entryMap->getDataPtr(), entryMap->getDataLength()); + outString = String8((char const*)entryMap->getDataPtr(), entryMap->getDataLength()); delete entryMap; return true; } @@ -1134,7 +1135,7 @@ bool BootAnimation::parseAnimationDesc(Animation& animation) { if (!readFile(animation.zip, "desc.txt", desString)) { return false; } - char const* s = desString.string(); + char const* s = desString.c_str(); std::string dynamicColoringPartName = ""; bool postDynamicColoring = false; @@ -1143,7 +1144,7 @@ bool BootAnimation::parseAnimationDesc(Animation& animation) { const char* endl = strstr(s, "\n"); if (endl == nullptr) break; String8 line(s, endl - s); - const char* l = line.string(); + const char* l = line.c_str(); int fps = 0; int width = 0; int height = 0; @@ -1269,10 +1270,10 @@ bool BootAnimation::preloadZip(Animation& animation) { continue; } - const String8 entryName(name); - const String8 path(entryName.getPathDir()); - const String8 leaf(entryName.getPathLeaf()); - if (leaf.size() > 0) { + const std::filesystem::path entryName(name); + const std::filesystem::path path(entryName.parent_path()); + const std::filesystem::path leaf(entryName.filename()); + if (!leaf.empty()) { if (entryName == CLOCK_FONT_ZIP_NAME) { FileMap* map = zip->createEntryFileMap(entry); if (map) { @@ -1290,7 +1291,7 @@ bool BootAnimation::preloadZip(Animation& animation) { } for (size_t j = 0; j < pcount; j++) { - if (path == animation.parts[j].path) { + if (path.string() == animation.parts[j].path.c_str()) { uint16_t method; // supports only stored png files if (zip->getEntryInfo(entry, &method, nullptr, nullptr, nullptr, nullptr, nullptr)) { @@ -1303,11 +1304,11 @@ bool BootAnimation::preloadZip(Animation& animation) { part.audioData = (uint8_t *)map->getDataPtr(); part.audioLength = map->getDataLength(); } else if (leaf == "trim.txt") { - part.trimData.setTo((char const*)map->getDataPtr(), + part.trimData = String8((char const*)map->getDataPtr(), map->getDataLength()); } else { Animation::Frame frame; - frame.name = leaf; + frame.name = leaf.c_str(); frame.map = map; frame.trimWidth = animation.width; frame.trimHeight = animation.height; @@ -1327,7 +1328,7 @@ bool BootAnimation::preloadZip(Animation& animation) { // If there is trimData present, override the positioning defaults. for (Animation::Part& part : animation.parts) { - const char* trimDataStr = part.trimData.string(); + const char* trimDataStr = part.trimData.c_str(); for (size_t frameIdx = 0; frameIdx < part.frames.size(); frameIdx++) { const char* endl = strstr(trimDataStr, "\n"); // No more trimData for this part. @@ -1335,7 +1336,7 @@ bool BootAnimation::preloadZip(Animation& animation) { break; } String8 line(trimDataStr, endl - trimDataStr); - const char* lineStr = line.string(); + const char* lineStr = line.c_str(); trimDataStr = ++endl; int width = 0, height = 0, x = 0, y = 0; if (sscanf(lineStr, "%dx%d+%d+%d", &width, &height, &x, &y) == 4) { @@ -1393,7 +1394,7 @@ bool BootAnimation::movie() { if (!exts) { glGetError(); } else { - gl_extensions.setTo(exts); + gl_extensions = exts; if ((gl_extensions.find("GL_ARB_texture_non_power_of_two") != -1) || (gl_extensions.find("GL_OES_texture_npot") != -1)) { mUseNpotTextures = true; @@ -1523,6 +1524,7 @@ bool BootAnimation::playAnimation(const Animation& animation) { for (size_t i=0 ; i<pcount ; i++) { const Animation::Part& part(animation.parts[i]); const size_t fcount = part.frames.size(); + glBindTexture(GL_TEXTURE_2D, 0); // Handle animation package if (part.animation != nullptr) { @@ -1562,7 +1564,7 @@ bool BootAnimation::playAnimation(const Animation& animation) { 1.0f); ALOGD("Playing files = %s/%s, Requested repeat = %d, playUntilComplete = %s", - animation.fileName.string(), part.path.string(), part.count, + animation.fileName.c_str(), part.path.c_str(), part.count, part.playUntilComplete ? "true" : "false"); // For the last animation, if we have progress indicator from @@ -1599,8 +1601,10 @@ bool BootAnimation::playAnimation(const Animation& animation) { if (r > 0) { glBindTexture(GL_TEXTURE_2D, frame.tid); } else { - glGenTextures(1, &frame.tid); - glBindTexture(GL_TEXTURE_2D, frame.tid); + if (part.count != 1) { + glGenTextures(1, &frame.tid); + glBindTexture(GL_TEXTURE_2D, frame.tid); + } int w, h; // Set decoding option to alpha unpremultiplied so that the R, G, B channels // of transparent pixels are preserved. @@ -1781,17 +1785,17 @@ void BootAnimation::releaseAnimation(Animation* animation) const { BootAnimation::Animation* BootAnimation::loadAnimation(const String8& fn) { if (mLoadedFiles.indexOf(fn) >= 0) { SLOGE("File \"%s\" is already loaded. Cyclic ref is not allowed", - fn.string()); + fn.c_str()); return nullptr; } - ZipFileRO *zip = ZipFileRO::open(fn); + ZipFileRO *zip = ZipFileRO::open(fn.c_str()); if (zip == nullptr) { SLOGE("Failed to open animation zip \"%s\": %s", - fn.string(), strerror(errno)); + fn.c_str(), strerror(errno)); return nullptr; } - ALOGD("%s is loaded successfully", fn.string()); + ALOGD("%s is loaded successfully", fn.c_str()); Animation *animation = new Animation; animation->fileName = fn; diff --git a/cmds/bootanimation/FORMAT.md b/cmds/bootanimation/FORMAT.md index 988685e23443..01e8fe13fdf6 100644 --- a/cmds/bootanimation/FORMAT.md +++ b/cmds/bootanimation/FORMAT.md @@ -152,14 +152,14 @@ based on animation progression. To enable it, add the following line as the second line of desc.txt: - dynamic_colors PATH #RGBHEX0 #RGBHEX1 #RGBHEX2 #RGBHEX3 + dynamic_colors PATH #RGBHEX1 #RGBHEX2 #RGBHEX3 #RGBHEX4 * **PATH:** file path of the part to apply dynamic color transition to. Any part before this part will be rendered in the start colors. Any part after will be rendered in the end colors. * **RGBHEX1:** the first start color (masked by the R channel), specified as `#RRGGBB`. * **RGBHEX2:** the second start color (masked by the G channel), specified as `#RRGGBB`. - * **RGBHEX3:** the thrid start color (masked by the B channel), specified as `#RRGGBB`. + * **RGBHEX3:** the third start color (masked by the B channel), specified as `#RRGGBB`. * **RGBHEX4:** the forth start color (masked by the A channel), specified as `#RRGGBB`. The end colors will be read from the following system properties: diff --git a/cmds/gpu_counter_producer/Android.bp b/cmds/gpu_counter_producer/Android.bp index 5b118ce62679..2232345ce4fa 100644 --- a/cmds/gpu_counter_producer/Android.bp +++ b/cmds/gpu_counter_producer/Android.bp @@ -18,8 +18,6 @@ cc_binary { "-Werror", "-Wunused", "-Wunreachable-code", - "-fPIE", - "-pie", ], soc_specific: true, diff --git a/cmds/idmap2/idmap2/Lookup.cpp b/cmds/idmap2/idmap2/Lookup.cpp index f41e57cc66d6..0862fbe78936 100644 --- a/cmds/idmap2/idmap2/Lookup.cpp +++ b/cmds/idmap2/idmap2/Lookup.cpp @@ -94,7 +94,7 @@ void PrintValue(AssetManager2* const am, const AssetManager2::SelectedValue& val const ResStringPool* pool = am->GetStringPoolForCookie(value.cookie); out->append("\""); if (auto str = pool->string8ObjectAt(value.data); str.ok()) { - out->append(*str); + out->append(str->c_str()); } } break; default: diff --git a/cmds/idmap2/libidmap2/CommandLineOptions.cpp b/cmds/idmap2/libidmap2/CommandLineOptions.cpp index 8129d99650f7..b1edc1891541 100644 --- a/cmds/idmap2/libidmap2/CommandLineOptions.cpp +++ b/cmds/idmap2/libidmap2/CommandLineOptions.cpp @@ -20,6 +20,7 @@ #include <cassert> #include <iomanip> #include <iostream> +#include <iterator> #include <memory> #include <set> #include <sstream> diff --git a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp index 3531cd7c2f36..bbef5bff13f4 100644 --- a/cmds/idmap2/libidmap2/RawPrintVisitor.cpp +++ b/cmds/idmap2/libidmap2/RawPrintVisitor.cpp @@ -96,7 +96,7 @@ void RawPrintVisitor::visit(const IdmapData& data ATTRIBUTE_UNUSED) { auto value = target_entry_value.second; print(target_entry_value.first.to_string(), false, "config: %s", - target_entry_value.first.toString().string()); + target_entry_value.first.toString().c_str()); print(value.data_type, "type: %s", utils::DataTypeToString(value.data_type).data()); diff --git a/cmds/idmap2/libidmap2/XmlParser.cpp b/cmds/idmap2/libidmap2/XmlParser.cpp index 70822c890288..f71e6b95ba32 100644 --- a/cmds/idmap2/libidmap2/XmlParser.cpp +++ b/cmds/idmap2/libidmap2/XmlParser.cpp @@ -111,7 +111,7 @@ Result<std::string> GetStringValue(const ResXMLParser& parser, const Res_value& switch (value.dataType) { case Res_value::TYPE_STRING: { if (auto str = parser.getStrings().string8ObjectAt(value.data); str.ok()) { - return std::string(str->string()); + return std::string(str->c_str()); } break; } diff --git a/cmds/incident/main.cpp b/cmds/incident/main.cpp index 6e0bd0629274..0d9f4e92662b 100644 --- a/cmds/incident/main.cpp +++ b/cmds/incident/main.cpp @@ -83,8 +83,8 @@ StatusListener::onReportSectionStatus(int32_t section, int32_t status) Status StatusListener::onReportServiceStatus(const String16& service, int32_t status) { - fprintf(stderr, "service '%s' status %d\n", String8(service).string(), status); - ALOGD("service '%s' status %d\n", String8(service).string(), status); + fprintf(stderr, "service '%s' status %d\n", String8(service).c_str(), status); + ALOGD("service '%s' status %d\n", String8(service).c_str(), status); return Status::ok(); } @@ -384,7 +384,7 @@ main(int argc, char** argv) status = service->reportIncidentToStream(args, listener, std::move(writeEnd)); if (!status.isOk()) { - fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string()); + fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().c_str()); return 1; } @@ -396,14 +396,14 @@ main(int argc, char** argv) sp<StatusListener> listener(new StatusListener()); status = service->reportIncidentToDumpstate(std::move(writeEnd), listener); if (!status.isOk()) { - fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string()); + fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().c_str()); return 1; } return listener->getExitCodeOrElse(stream_output(fds[0], STDOUT_FILENO)); } else { status = service->reportIncident(args); if (!status.isOk()) { - fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().string()); + fprintf(stderr, "reportIncident returned \"%s\"\n", status.toString8().c_str()); return 1; } else { return 0; diff --git a/cmds/incident_helper/src/TextParserBase.cpp b/cmds/incident_helper/src/TextParserBase.cpp index e9bc70f37026..e625afa626ec 100644 --- a/cmds/incident_helper/src/TextParserBase.cpp +++ b/cmds/incident_helper/src/TextParserBase.cpp @@ -27,11 +27,11 @@ status_t NoopParser::Parse(const int in, const int out) const { string content; if (!ReadFdToString(in, &content)) { - fprintf(stderr, "[%s]Failed to read data from incidentd\n", this->name.string()); + fprintf(stderr, "[%s]Failed to read data from incidentd\n", this->name.c_str()); return -1; } if (!WriteStringToFd(content, out)) { - fprintf(stderr, "[%s]Failed to write data to incidentd\n", this->name.string()); + fprintf(stderr, "[%s]Failed to write data to incidentd\n", this->name.c_str()); return -1; } return NO_ERROR; @@ -42,13 +42,13 @@ status_t ReverseParser::Parse(const int in, const int out) const { string content; if (!ReadFdToString(in, &content)) { - fprintf(stderr, "[%s]Failed to read data from incidentd\n", this->name.string()); + fprintf(stderr, "[%s]Failed to read data from incidentd\n", this->name.c_str()); return -1; } // reverse the content reverse(content.begin(), content.end()); if (!WriteStringToFd(content, out)) { - fprintf(stderr, "[%s]Failed to write data to incidentd\n", this->name.string()); + fprintf(stderr, "[%s]Failed to write data to incidentd\n", this->name.c_str()); return -1; } return NO_ERROR; diff --git a/cmds/incident_helper/src/main.cpp b/cmds/incident_helper/src/main.cpp index ff5fd86cf11e..cc03d4a65f17 100644 --- a/cmds/incident_helper/src/main.cpp +++ b/cmds/incident_helper/src/main.cpp @@ -101,7 +101,7 @@ int main(int argc, char** argv) { fprintf(stderr, "Pasring section %d...\n", sectionID); TextParserBase* parser = selectParser(sectionID); if (parser != nullptr) { - fprintf(stderr, "Running parser: %s\n", parser->name.string()); + fprintf(stderr, "Running parser: %s\n", parser->name.c_str()); status_t err = parser->Parse(STDIN_FILENO, STDOUT_FILENO); if (err != NO_ERROR) { fprintf(stderr, "Parse error in section %d: %s\n", sectionID, strerror(-err)); diff --git a/cmds/incident_helper/src/parsers/BatteryTypeParser.cpp b/cmds/incident_helper/src/parsers/BatteryTypeParser.cpp index ced6cf807e0d..2a032fbf3aa6 100644 --- a/cmds/incident_helper/src/parsers/BatteryTypeParser.cpp +++ b/cmds/incident_helper/src/parsers/BatteryTypeParser.cpp @@ -52,9 +52,9 @@ BatteryTypeParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/CpuFreqParser.cpp b/cmds/incident_helper/src/parsers/CpuFreqParser.cpp index 43a12f603ba3..c9bf4c528109 100644 --- a/cmds/incident_helper/src/parsers/CpuFreqParser.cpp +++ b/cmds/incident_helper/src/parsers/CpuFreqParser.cpp @@ -82,9 +82,9 @@ CpuFreqParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/CpuInfoParser.cpp b/cmds/incident_helper/src/parsers/CpuInfoParser.cpp index 5d525e6c7f3e..77751a2fdfc0 100644 --- a/cmds/incident_helper/src/parsers/CpuInfoParser.cpp +++ b/cmds/incident_helper/src/parsers/CpuInfoParser.cpp @@ -130,11 +130,11 @@ CpuInfoParser::Parse(const int in, const int out) const record = parseRecordByColumns(line, columnIndices); diff = record.size() - header.size(); if (diff < 0) { - fprintf(stderr, "[%s]Line %d has %d missing fields\n%s\n", this->name.string(), nline, -diff, line.c_str()); + fprintf(stderr, "[%s]Line %d has %d missing fields\n%s\n", this->name.c_str(), nline, -diff, line.c_str()); printRecord(record); continue; } else if (diff > 0) { - fprintf(stderr, "[%s]Line %d has %d extra fields\n%s\n", this->name.string(), nline, diff, line.c_str()); + fprintf(stderr, "[%s]Line %d has %d extra fields\n%s\n", this->name.c_str(), nline, diff, line.c_str()); printRecord(record); continue; } @@ -143,7 +143,7 @@ CpuInfoParser::Parse(const int in, const int out) const for (int i=0; i<(int)record.size(); i++) { if (!table.insertField(&proto, header[i], record[i])) { fprintf(stderr, "[%s]Line %d fails to insert field %s with value %s\n", - this->name.string(), nline, header[i].c_str(), record[i].c_str()); + this->name.c_str(), nline, header[i].c_str(), record[i].c_str()); } } proto.end(token); @@ -155,9 +155,9 @@ CpuInfoParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp b/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp index 4fd6b068cf1e..0474a5055bf2 100644 --- a/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp +++ b/cmds/incident_helper/src/parsers/EventLogTagsParser.cpp @@ -76,9 +76,9 @@ EventLogTagsParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/KernelWakesParser.cpp b/cmds/incident_helper/src/parsers/KernelWakesParser.cpp index 85beaf06eeb8..d16c23cce29b 100644 --- a/cmds/incident_helper/src/parsers/KernelWakesParser.cpp +++ b/cmds/incident_helper/src/parsers/KernelWakesParser.cpp @@ -51,11 +51,11 @@ KernelWakesParser::Parse(const int in, const int out) const if (record.size() < header.size()) { // TODO: log this to incident report! - fprintf(stderr, "[%s]Line %d has missing fields\n%s\n", this->name.string(), nline, line.c_str()); + fprintf(stderr, "[%s]Line %d has missing fields\n%s\n", this->name.c_str(), nline, line.c_str()); continue; } else if (record.size() > header.size()) { // TODO: log this to incident report! - fprintf(stderr, "[%s]Line %d has extra fields\n%s\n", this->name.string(), nline, line.c_str()); + fprintf(stderr, "[%s]Line %d has extra fields\n%s\n", this->name.c_str(), nline, line.c_str()); continue; } @@ -63,7 +63,7 @@ KernelWakesParser::Parse(const int in, const int out) const for (int i=0; i<(int)record.size(); i++) { if (!table.insertField(&proto, header[i], record[i])) { fprintf(stderr, "[%s]Line %d has bad value %s of %s\n", - this->name.string(), nline, header[i].c_str(), record[i].c_str()); + this->name.c_str(), nline, header[i].c_str(), record[i].c_str()); } } proto.end(token); @@ -75,9 +75,9 @@ KernelWakesParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp index 2a89c920c119..36710dfea8f1 100644 --- a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp +++ b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp @@ -114,10 +114,10 @@ PageTypeInfoParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/ProcrankParser.cpp b/cmds/incident_helper/src/parsers/ProcrankParser.cpp index 4763b482e368..997d2e50a14b 100644 --- a/cmds/incident_helper/src/parsers/ProcrankParser.cpp +++ b/cmds/incident_helper/src/parsers/ProcrankParser.cpp @@ -60,7 +60,7 @@ ProcrankParser::Parse(const int in, const int out) const if (record[record.size() - 1] == "TOTAL") { // TOTAL record total = line; } else { - fprintf(stderr, "[%s]Line %d has missing fields\n%s\n", this->name.string(), nline, + fprintf(stderr, "[%s]Line %d has missing fields\n%s\n", this->name.c_str(), nline, line.c_str()); } continue; @@ -70,7 +70,7 @@ ProcrankParser::Parse(const int in, const int out) const for (int i=0; i<(int)record.size(); i++) { if (!table.insertField(&proto, header[i], record[i])) { fprintf(stderr, "[%s]Line %d has bad value %s of %s\n", - this->name.string(), nline, header[i].c_str(), record[i].c_str()); + this->name.c_str(), nline, header[i].c_str(), record[i].c_str()); } } proto.end(token); @@ -104,9 +104,9 @@ ProcrankParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/PsParser.cpp b/cmds/incident_helper/src/parsers/PsParser.cpp index d3cb4be59f66..55aa555794c0 100644 --- a/cmds/incident_helper/src/parsers/PsParser.cpp +++ b/cmds/incident_helper/src/parsers/PsParser.cpp @@ -61,12 +61,12 @@ status_t PsParser::Parse(const int in, const int out) const { diff = record.size() - header.size(); if (diff < 0) { // TODO: log this to incident report! - fprintf(stderr, "[%s]Line %d has %d missing fields\n%s\n", this->name.string(), nline, -diff, line.c_str()); + fprintf(stderr, "[%s]Line %d has %d missing fields\n%s\n", this->name.c_str(), nline, -diff, line.c_str()); printRecord(record); continue; } else if (diff > 0) { // TODO: log this to incident report! - fprintf(stderr, "[%s]Line %d has %d extra fields\n%s\n", this->name.string(), nline, diff, line.c_str()); + fprintf(stderr, "[%s]Line %d has %d extra fields\n%s\n", this->name.c_str(), nline, diff, line.c_str()); printRecord(record); continue; } @@ -75,7 +75,7 @@ status_t PsParser::Parse(const int in, const int out) const { for (int i=0; i<(int)record.size(); i++) { if (!table.insertField(&proto, header[i], record[i])) { fprintf(stderr, "[%s]Line %d has bad value %s of %s\n", - this->name.string(), nline, header[i].c_str(), record[i].c_str()); + this->name.c_str(), nline, header[i].c_str(), record[i].c_str()); } } proto.end(token); @@ -87,9 +87,9 @@ status_t PsParser::Parse(const int in, const int out) const { } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp b/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp index eba536bd9e9c..86c34bc25bd8 100644 --- a/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp +++ b/cmds/incident_helper/src/parsers/SystemPropertiesParser.cpp @@ -219,9 +219,9 @@ SystemPropertiesParser::Parse(const int in, const int out) const } if (!proto.flush(out)) { - fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); + fprintf(stderr, "[%s]Error writing proto back\n", this->name.c_str()); return -1; } - fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); + fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.c_str(), proto.size()); return NO_ERROR; } diff --git a/cmds/incidentd/Android.bp b/cmds/incidentd/Android.bp index b0b23f569664..bd30404848a3 100644 --- a/cmds/incidentd/Android.bp +++ b/cmds/incidentd/Android.bp @@ -82,17 +82,11 @@ cc_binary { }, }, - init_rc: ["incidentd.rc"], } -// ============== -// incidentd_test -// ============== - -cc_test { - name: "incidentd_test", - test_suites: ["device-tests"], +cc_defaults { + name: "incidentd_test_defaults", cflags: [ "-Werror", @@ -110,8 +104,6 @@ cc_test { generated_headers: ["framework-cppstream-protos"], srcs: [ - "tests/**/*.cpp", - "tests/**/*.proto", "src/FdBuffer.cpp", "src/Privacy.cpp", "src/PrivacyFilter.cpp", @@ -125,13 +117,11 @@ cc_test { "src/**/*.proto", ], - data: ["testdata/**/*"], - static_libs: [ - "libgmock", "libincidentcompanion", "libplatformprotos-test", ], + shared_libs: [ "libbase", "libbinder", @@ -144,6 +134,30 @@ cc_test { "libservices", "libutils", ], +} + +// ============== +// incidentd_test +// ============== +cc_test { + name: "incidentd_test", + + defaults: [ + "incidentd_test_defaults", + ], + + test_suites: ["device-tests"], + + srcs: [ + "tests/**/*.cpp", + "tests/**/*.proto", + ], + + data: ["testdata/**/*"], + + static_libs: [ + "libgmock", + ], target: { android: { @@ -160,3 +174,27 @@ genrule { out: ["section_list.cpp"], cmd: "$(location incident-section-gen) incidentd > $(out)", } + +cc_fuzz { + name: "incidentd_service_fuzzer", + defaults: [ + "service_fuzzer_defaults", + "fuzzer_disable_leaks", + "incidentd_test_defaults", + ], + + fuzz_config: { + cc: [ + "yaochen@google.com", + "yanmin@google.com", + ], + triage_assignee: "waghpawan@google.com", + }, + + srcs: [ + "fuzzers/IncidentServiceFuzzer.cpp", + "src/IncidentService.cpp", + "src/Broadcaster.cpp", + ":incidentd_section_list", + ], +} diff --git a/cmds/incidentd/fuzzers/IncidentServiceFuzzer.cpp b/cmds/incidentd/fuzzers/IncidentServiceFuzzer.cpp new file mode 100644 index 000000000000..14c969b30ee6 --- /dev/null +++ b/cmds/incidentd/fuzzers/IncidentServiceFuzzer.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 <fuzzbinder/libbinder_driver.h> +#include <utils/Looper.h> + +#include "IncidentService.h" + +using ::android::fuzzService; +using ::android::os::incidentd::IncidentService; +using ::android::Looper; +using ::android::sp; + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + sp<Looper> looper(Looper::prepare(0)); + sp<IncidentService> service = sp<IncidentService>::make(looper); + fuzzService(service, FuzzedDataProvider(data, size)); + return 0; +} diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp index 5af02f405ed9..82c87071bfff 100644 --- a/cmds/incidentd/src/IncidentService.cpp +++ b/cmds/incidentd/src/IncidentService.cpp @@ -407,8 +407,8 @@ Status IncidentService::systemRunning() { Status IncidentService::getIncidentReportList(const String16& pkg16, const String16& cls16, vector<String16>* result) { status_t err; - const string pkg(String8(pkg16).string()); - const string cls(String8(cls16).string()); + const string pkg(String8(pkg16).c_str()); + const string cls(String8(cls16).c_str()); // List the reports vector<sp<ReportFile>> all; @@ -441,9 +441,9 @@ Status IncidentService::getIncidentReport(const String16& pkg16, const String16& const String16& id16, IncidentManager::IncidentReport* result) { status_t err; - const string pkg(String8(pkg16).string()); - const string cls(String8(cls16).string()); - const string id(String8(id16).string()); + const string pkg(String8(pkg16).c_str()); + const string cls(String8(cls16).c_str()); + const string id(String8(id16).c_str()); IncidentReportArgs args; sp<ReportFile> file = mWorkDirectory->getReport(pkg, cls, id, &args); @@ -470,9 +470,9 @@ Status IncidentService::getIncidentReport(const String16& pkg16, const String16& Status IncidentService::deleteIncidentReports(const String16& pkg16, const String16& cls16, const String16& id16) { - const string pkg(String8(pkg16).string()); - const string cls(String8(cls16).string()); - const string id(String8(id16).string()); + const string pkg(String8(pkg16).c_str()); + const string cls(String8(cls16).c_str()); + const string id(String8(id16).c_str()); sp<ReportFile> file = mWorkDirectory->getReport(pkg, cls, id, nullptr); if (file != nullptr) { @@ -484,7 +484,7 @@ Status IncidentService::deleteIncidentReports(const String16& pkg16, const Strin } Status IncidentService::deleteAllIncidentReports(const String16& pkg16) { - const string pkg(String8(pkg16).string()); + const string pkg(String8(pkg16).c_str()); mWorkDirectory->commitAll(pkg); mBroadcaster->clearPackageBroadcasts(pkg); @@ -513,6 +513,9 @@ status_t IncidentService::onTransact(uint32_t code, const Parcel& data, Parcel* sp<IShellCallback> shellCallback = IShellCallback::asInterface(data.readStrongBinder()); sp<IResultReceiver> resultReceiver = IResultReceiver::asInterface(data.readStrongBinder()); + if (resultReceiver == nullptr) { + return BAD_VALUE; + } FILE* fin = fdopen(in, "r"); FILE* fout = fdopen(out, "w"); @@ -533,7 +536,7 @@ status_t IncidentService::onTransact(uint32_t code, const Parcel& data, Parcel* fflush(fout); fclose(fout); } - if (fout != NULL) { + if (ferr != NULL) { fflush(ferr); fclose(ferr); } @@ -560,12 +563,12 @@ status_t IncidentService::command(FILE* in, FILE* out, FILE* err, Vector<String8 fprintf(out, "Not enough arguments for section\n"); return NO_ERROR; } - int id = atoi(args[1]); + int id = atoi(args[1].c_str()); int idx = 0; while (SECTION_LIST[idx] != NULL) { const Section* section = SECTION_LIST[idx]; if (section->id == id) { - fprintf(out, "Section[%d] %s\n", id, section->name.string()); + fprintf(out, "Section[%d] %s\n", id, section->name.c_str()); break; } idx++; @@ -589,7 +592,7 @@ status_t IncidentService::cmd_help(FILE* out) { static void printPrivacy(const Privacy* p, FILE* out, String8 indent) { if (p == NULL) return; - fprintf(out, "%sid:%d, type:%d, dest:%d\n", indent.string(), p->field_id, p->type, p->policy); + fprintf(out, "%sid:%d, type:%d, dest:%d\n", indent.c_str(), p->field_id, p->type, p->policy); if (p->children == NULL) return; for (int i = 0; p->children[i] != NULL; i++) { // NULL-terminated. printPrivacy(p->children[i], out, indent + " "); @@ -602,7 +605,7 @@ status_t IncidentService::cmd_privacy(FILE* in, FILE* out, FILE* err, Vector<Str const int argCount = args.size(); if (argCount >= 3) { String8 opt = args[1]; - int sectionId = atoi(args[2].string()); + int sectionId = atoi(args[2].c_str()); const Privacy* p = get_privacy_of_section(sectionId); if (p == NULL) { diff --git a/cmds/incidentd/src/Reporter.cpp b/cmds/incidentd/src/Reporter.cpp index 86a78f095f52..c9cf7275a821 100644 --- a/cmds/incidentd/src/Reporter.cpp +++ b/cmds/incidentd/src/Reporter.cpp @@ -711,7 +711,7 @@ status_t Reporter::execute_section(const Section* section, IncidentMetadata* met return NO_ERROR; } - ALOGD("Start incident report section %d '%s'", sectionId, section->name.string()); + ALOGD("Start incident report section %d '%s'", sectionId, section->name.c_str()); IncidentMetadata::SectionStats* sectionMetadata = metadata->add_sections(); // Notify listener of starting @@ -747,7 +747,7 @@ status_t Reporter::execute_section(const Section* section, IncidentMetadata* met sectionId, IIncidentReportStatusListener::STATUS_FINISHED); }); - ALOGD("Finish incident report section %d '%s'", sectionId, section->name.string()); + ALOGD("Finish incident report section %d '%s'", sectionId, section->name.c_str()); return NO_ERROR; } diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp index 581367a75804..c2aa26948146 100644 --- a/cmds/incidentd/src/Section.cpp +++ b/cmds/incidentd/src/Section.cpp @@ -60,7 +60,7 @@ const char INCIDENT_HELPER[] = "/system/bin/incident_helper"; const char* GZIP[] = {"/system/bin/gzip", NULL}; static pid_t fork_execute_incident_helper(const int id, Fpipe* p2cPipe, Fpipe* c2pPipe) { - const char* ihArgs[]{INCIDENT_HELPER, "-s", String8::format("%d", id).string(), NULL}; + const char* ihArgs[]{INCIDENT_HELPER, "-s", String8::format("%d", id).c_str(), NULL}; return fork_execute_cmd(const_cast<char**>(ihArgs), p2cPipe, c2pPipe); } @@ -100,7 +100,7 @@ status_t FileSection::Execute(ReportWriter* writer) const { // add O_CLOEXEC to make sure it is closed when exec incident helper unique_fd fd(open(mFilename, O_RDONLY | O_CLOEXEC)); if (fd.get() == -1) { - ALOGW("[%s] failed to open file", this->name.string()); + ALOGW("[%s] failed to open file", this->name.c_str()); // There may be some devices/architectures that won't have the file. // Just return here without an error. return NO_ERROR; @@ -110,13 +110,13 @@ status_t FileSection::Execute(ReportWriter* writer) const { Fpipe c2pPipe; // initiate pipes to pass data to/from incident_helper if (!p2cPipe.init() || !c2pPipe.init()) { - ALOGW("[%s] failed to setup pipes", this->name.string()); + ALOGW("[%s] failed to setup pipes", this->name.c_str()); return -errno; } pid_t pid = fork_execute_incident_helper(this->id, &p2cPipe, &c2pPipe); if (pid == -1) { - ALOGW("[%s] failed to fork", this->name.string()); + ALOGW("[%s] failed to fork", this->name.c_str()); return -errno; } @@ -128,14 +128,14 @@ status_t FileSection::Execute(ReportWriter* writer) const { writer->setSectionStats(buffer); if (readStatus != NO_ERROR || buffer.timedOut()) { ALOGW("[%s] failed to read data from incident helper: %s, timedout: %s", - this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false"); + this->name.c_str(), strerror(-readStatus), buffer.timedOut() ? "true" : "false"); kill_child(pid); return readStatus; } status_t ihStatus = wait_child(pid); if (ihStatus != NO_ERROR) { - ALOGW("[%s] abnormal child process: %s", this->name.string(), strerror(-ihStatus)); + ALOGW("[%s] abnormal child process: %s", this->name.c_str(), strerror(-ihStatus)); return OK; // Not a fatal error. } @@ -169,7 +169,7 @@ status_t GZipSection::Execute(ReportWriter* writer) const { index++; // look at the next file. } if (fd.get() == -1) { - ALOGW("[%s] can't open all the files", this->name.string()); + ALOGW("[%s] can't open all the files", this->name.c_str()); return NO_ERROR; // e.g. LAST_KMSG will reach here in user build. } FdBuffer buffer; @@ -177,13 +177,13 @@ status_t GZipSection::Execute(ReportWriter* writer) const { Fpipe c2pPipe; // initiate pipes to pass data to/from gzip if (!p2cPipe.init() || !c2pPipe.init()) { - ALOGW("[%s] failed to setup pipes", this->name.string()); + ALOGW("[%s] failed to setup pipes", this->name.c_str()); return -errno; } pid_t pid = fork_execute_cmd((char* const*)GZIP, &p2cPipe, &c2pPipe); if (pid == -1) { - ALOGW("[%s] failed to fork", this->name.string()); + ALOGW("[%s] failed to fork", this->name.c_str()); return -errno; } // parent process @@ -202,14 +202,14 @@ status_t GZipSection::Execute(ReportWriter* writer) const { size_t editPos = internalBuffer->wp()->pos(); internalBuffer->wp()->move(8); // reserve 8 bytes for the varint of the data size. size_t dataBeginAt = internalBuffer->wp()->pos(); - VLOG("[%s] editPos=%zu, dataBeginAt=%zu", this->name.string(), editPos, dataBeginAt); + VLOG("[%s] editPos=%zu, dataBeginAt=%zu", this->name.c_str(), editPos, dataBeginAt); status_t readStatus = buffer.readProcessedDataInStream( fd.get(), std::move(p2cPipe.writeFd()), std::move(c2pPipe.readFd()), this->timeoutMs, isSysfs(mFilenames[index])); writer->setSectionStats(buffer); if (readStatus != NO_ERROR || buffer.timedOut()) { - ALOGW("[%s] failed to read data from gzip: %s, timedout: %s", this->name.string(), + ALOGW("[%s] failed to read data from gzip: %s, timedout: %s", this->name.c_str(), strerror(-readStatus), buffer.timedOut() ? "true" : "false"); kill_child(pid); return readStatus; @@ -217,7 +217,7 @@ status_t GZipSection::Execute(ReportWriter* writer) const { status_t gzipStatus = wait_child(pid); if (gzipStatus != NO_ERROR) { - ALOGW("[%s] abnormal child process: %s", this->name.string(), strerror(-gzipStatus)); + ALOGW("[%s] abnormal child process: %s", this->name.c_str(), strerror(-gzipStatus)); return gzipStatus; } // Revisit the actual size from gzip result and edit the internal buffer accordingly. @@ -290,7 +290,7 @@ status_t WorkerThreadSection::Execute(ReportWriter* writer) const { FdBuffer buffer; err = buffer.read(data->pipe.readFd().get(), this->timeoutMs); if (err != NO_ERROR) { - ALOGE("[%s] reader failed with error '%s'", this->name.string(), strerror(-err)); + ALOGE("[%s] reader failed with error '%s'", this->name.c_str(), strerror(-err)); } // If the worker side is finished, then return its error (which may overwrite @@ -300,7 +300,7 @@ status_t WorkerThreadSection::Execute(ReportWriter* writer) const { data->pipe.close(); if (data->workerError != NO_ERROR) { err = data->workerError; - ALOGE("[%s] worker failed with error '%s'", this->name.string(), strerror(-err)); + ALOGE("[%s] worker failed with error '%s'", this->name.c_str(), strerror(-err)); } workerDone = data->workerDone; } @@ -309,17 +309,17 @@ status_t WorkerThreadSection::Execute(ReportWriter* writer) const { if (err != NO_ERROR) { char errMsg[128]; snprintf(errMsg, 128, "[%s] failed with error '%s'", - this->name.string(), strerror(-err)); + this->name.c_str(), strerror(-err)); writer->error(this, err, "WorkerThreadSection failed."); return NO_ERROR; } if (buffer.truncated()) { - ALOGW("[%s] too large, truncating", this->name.string()); + ALOGW("[%s] too large, truncating", this->name.c_str()); // Do not write a truncated section. It won't pass through the PrivacyFilter. return NO_ERROR; } if (!workerDone || buffer.timedOut()) { - ALOGW("[%s] timed out", this->name.string()); + ALOGW("[%s] timed out", this->name.c_str()); return NO_ERROR; } @@ -360,18 +360,18 @@ status_t CommandSection::Execute(ReportWriter* writer) const { Fpipe ihPipe; if (!cmdPipe.init() || !ihPipe.init()) { - ALOGW("[%s] failed to setup pipes", this->name.string()); + ALOGW("[%s] failed to setup pipes", this->name.c_str()); return -errno; } pid_t cmdPid = fork_execute_cmd((char* const*)mCommand, NULL, &cmdPipe); if (cmdPid == -1) { - ALOGW("[%s] failed to fork", this->name.string()); + ALOGW("[%s] failed to fork", this->name.c_str()); return -errno; } pid_t ihPid = fork_execute_incident_helper(this->id, &cmdPipe, &ihPipe); if (ihPid == -1) { - ALOGW("[%s] failed to fork", this->name.string()); + ALOGW("[%s] failed to fork", this->name.c_str()); return -errno; } @@ -381,7 +381,7 @@ status_t CommandSection::Execute(ReportWriter* writer) const { writer->setSectionStats(buffer); if (readStatus != NO_ERROR || buffer.timedOut()) { ALOGW("[%s] failed to read data from incident helper: %s, timedout: %s", - this->name.string(), strerror(-readStatus), buffer.timedOut() ? "true" : "false"); + this->name.c_str(), strerror(-readStatus), buffer.timedOut() ? "true" : "false"); kill_child(cmdPid); kill_child(ihPid); return readStatus; @@ -393,7 +393,7 @@ status_t CommandSection::Execute(ReportWriter* writer) const { status_t ihStatus = wait_child(ihPid); if (cmdStatus != NO_ERROR || ihStatus != NO_ERROR) { ALOGW("[%s] abnormal child processes, return status: command: %s, incident helper: %s", - this->name.string(), strerror(-cmdStatus), strerror(-ihStatus)); + this->name.c_str(), strerror(-cmdStatus), strerror(-ihStatus)); // Not a fatal error. return NO_ERROR; } @@ -428,7 +428,7 @@ status_t DumpsysSection::BlockingCall(unique_fd& pipeWriteFd) const { sp<IBinder> service = defaultServiceManager()->checkService(mService); if (service == NULL) { - ALOGW("DumpsysSection: Can't lookup service: %s", String8(mService).string()); + ALOGW("DumpsysSection: Can't lookup service: %s", String8(mService).c_str()); return NAME_NOT_FOUND; } @@ -463,14 +463,14 @@ status_t TextDumpsysSection::Execute(ReportWriter* writer) const { // checkService won't wait for the service to show up like getService will. sp<IBinder> service = defaultServiceManager()->checkService(mService); if (service == NULL) { - ALOGW("TextDumpsysSection: Can't lookup service: %s", String8(mService).string()); + ALOGW("TextDumpsysSection: Can't lookup service: %s", String8(mService).c_str()); return NAME_NOT_FOUND; } // Create pipe Fpipe dumpPipe; if (!dumpPipe.init()) { - ALOGW("[%s] failed to setup pipe", this->name.string()); + ALOGW("[%s] failed to setup pipe", this->name.c_str()); return -errno; } @@ -482,7 +482,7 @@ status_t TextDumpsysSection::Execute(ReportWriter* writer) const { signal(SIGPIPE, sigpipe_handler); status_t err = service->dump(write_fd.get(), this->mArgs); if (err != OK) { - ALOGW("[%s] dump thread failed. Error: %s", this->name.string(), strerror(-err)); + ALOGW("[%s] dump thread failed. Error: %s", this->name.c_str(), strerror(-err)); } write_fd.reset(); }); @@ -490,7 +490,7 @@ status_t TextDumpsysSection::Execute(ReportWriter* writer) const { // Collect dump content FdBuffer buffer; ProtoOutputStream proto; - proto.write(TextDumpProto::COMMAND, std::string(name.string())); + proto.write(TextDumpProto::COMMAND, std::string(name.c_str())); proto.write(TextDumpProto::DUMP_DURATION_NS, int64_t(Nanotime() - start)); buffer.write(proto.data()); @@ -504,7 +504,7 @@ status_t TextDumpsysSection::Execute(ReportWriter* writer) const { dumpPipe.readFd().reset(); writer->setSectionStats(buffer); if (readStatus != OK || buffer.timedOut()) { - ALOGW("[%s] failed to read from dumpsys: %s, timedout: %s", this->name.string(), + ALOGW("[%s] failed to read from dumpsys: %s, timedout: %s", this->name.c_str(), strerror(-readStatus), buffer.timedOut() ? "true" : "false"); worker.detach(); return readStatus; @@ -579,7 +579,7 @@ status_t LogSection::BlockingCall(unique_fd& pipeWriteFd) const { // Hence forking a new process to prevent memory fragmentation. pid_t pid = fork(); if (pid < 0) { - ALOGW("[%s] failed to fork", this->name.string()); + ALOGW("[%s] failed to fork", this->name.c_str()); return errno; } if (pid > 0) { @@ -593,7 +593,7 @@ status_t LogSection::BlockingCall(unique_fd& pipeWriteFd) const { android_logger_list_free); if (android_logger_open(loggers.get(), mLogID) == NULL) { - ALOGE("[%s] Can't get logger.", this->name.string()); + ALOGE("[%s] Can't get logger.", this->name.c_str()); _exit(EXIT_FAILURE); } @@ -610,7 +610,7 @@ status_t LogSection::BlockingCall(unique_fd& pipeWriteFd) const { // status = -EAGAIN, graceful indication for ANDRODI_LOG_NONBLOCK that this is the end. if (status <= 0) { if (status != -EAGAIN) { - ALOGW("[%s] fails to read a log_msg.\n", this->name.string()); + ALOGW("[%s] fails to read a log_msg.\n", this->name.c_str()); err = -status; } break; @@ -680,7 +680,7 @@ status_t LogSection::BlockingCall(unique_fd& pipeWriteFd) const { AndroidLogEntry entry; status = android_log_processLogBuffer(&msg.entry, &entry); if (status != OK) { - ALOGW("[%s] fails to process to an entry.\n", this->name.string()); + ALOGW("[%s] fails to process to an entry.\n", this->name.c_str()); err = status; break; } @@ -702,7 +702,7 @@ status_t LogSection::BlockingCall(unique_fd& pipeWriteFd) const { } if (!proto.flush(pipeWriteFd.get())) { if (errno == EPIPE) { - ALOGW("[%s] wrote to a broken pipe\n", this->name.string()); + ALOGW("[%s] wrote to a broken pipe\n", this->name.c_str()); } err = errno; break; @@ -757,7 +757,7 @@ status_t TombstoneSection::BlockingCall(unique_fd& pipeWriteFd) const { } ssize_t exe_name_len = readlink(link_name, exe_name, EXE_NAME_LEN); if (exe_name_len < 0 || exe_name_len >= EXE_NAME_LEN) { - ALOGE("[%s] Can't read '%s': %s", name.string(), link_name, strerror(errno)); + ALOGE("[%s] Can't read '%s': %s", name.c_str(), link_name, strerror(errno)); continue; } // readlink(2) does not put a null terminator at the end @@ -788,7 +788,7 @@ status_t TombstoneSection::BlockingCall(unique_fd& pipeWriteFd) const { Fpipe dumpPipe; if (!dumpPipe.init()) { - ALOGW("[%s] failed to setup dump pipe", this->name.string()); + ALOGW("[%s] failed to setup dump pipe", this->name.c_str()); err = -errno; break; } @@ -822,12 +822,12 @@ status_t TombstoneSection::BlockingCall(unique_fd& pipeWriteFd) const { // Wait on the child to avoid it becoming a zombie process. status_t cStatus = wait_child(child); if (err != NO_ERROR) { - ALOGW("[%s] failed to read stack dump: %d", this->name.string(), err); + ALOGW("[%s] failed to read stack dump: %d", this->name.c_str(), err); dumpPipe.readFd().reset(); break; } if (cStatus != NO_ERROR) { - ALOGE("[%s] child had an issue: %s\n", this->name.string(), strerror(-cStatus)); + ALOGE("[%s] child had an issue: %s\n", this->name.c_str(), strerror(-cStatus)); } // Resize dump buffer @@ -852,7 +852,7 @@ status_t TombstoneSection::BlockingCall(unique_fd& pipeWriteFd) const { dumpPipe.readFd().reset(); if (!proto.flush(pipeWriteFd.get())) { if (errno == EPIPE) { - ALOGE("[%s] wrote to a broken pipe\n", this->name.string()); + ALOGE("[%s] wrote to a broken pipe\n", this->name.c_str()); } err = errno; break; diff --git a/cmds/incidentd/src/report_directory.cpp b/cmds/incidentd/src/report_directory.cpp index 7d20a74437ce..6b2fb8ec308a 100644 --- a/cmds/incidentd/src/report_directory.cpp +++ b/cmds/incidentd/src/report_directory.cpp @@ -62,8 +62,8 @@ void clean_directory(const char* directory, off_t maxSize, size_t maxCount) { continue; } String8 filename = dirbase + entry->d_name; - if (stat(filename.string(), &st) != 0) { - ALOGE("Unable to stat file %s", filename.string()); + if (stat(filename.c_str(), &st) != 0) { + ALOGE("Unable to stat file %s", filename.c_str()); continue; } if (!S_ISREG(st.st_mode)) { @@ -88,7 +88,7 @@ void clean_directory(const char* directory, off_t maxSize, size_t maxCount) { // Remove files until we're under our limits. for (std::vector<std::pair<String8, struct stat>>::iterator it = files.begin(); it != files.end() && totalSize >= maxSize && totalCount >= maxCount; it++) { - remove(it->first.string()); + remove(it->first.c_str()); totalSize -= it->second.st_size; totalCount--; } diff --git a/cmds/locksettings/Android.bp b/cmds/locksettings/Android.bp index 5ee582450361..ee31aed14385 100644 --- a/cmds/locksettings/Android.bp +++ b/cmds/locksettings/Android.bp @@ -21,8 +21,7 @@ package { default_applicable_licenses: ["frameworks_base_license"], } -java_binary { +sh_binary { name: "locksettings", - wrapper: "locksettings.sh", - srcs: ["**/*.java"], + src: "locksettings.sh", } diff --git a/cmds/locksettings/locksettings.sh b/cmds/locksettings/locksettings.sh index 0ef4fa9f6771..2f8d86844eb1 100755 --- a/cmds/locksettings/locksettings.sh +++ b/cmds/locksettings/locksettings.sh @@ -1,6 +1,2 @@ #!/system/bin/sh -# Script to start "locksettings" on the device -# -base=/system -export CLASSPATH=$base/framework/locksettings.jar -exec app_process $base/bin com.android.commands.locksettings.LockSettingsCmd "$@" +cmd lock_settings "$@" diff --git a/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java b/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java deleted file mode 100644 index 7d9260a77158..000000000000 --- a/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java +++ /dev/null @@ -1,47 +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.commands.locksettings; - -import android.os.ResultReceiver; -import android.os.ServiceManager; -import android.os.ShellCallback; - -import com.android.internal.os.BaseCommand; -import com.android.internal.widget.ILockSettings; - -import java.io.FileDescriptor; -import java.io.PrintStream; - -public final class LockSettingsCmd extends BaseCommand { - - public static void main(String[] args) { - (new LockSettingsCmd()).run(args); - } - - @Override - public void onShowUsage(PrintStream out) { - main(new String[] { "help" }); - } - - @Override - public void onRun() throws Exception { - ILockSettings lockSettings = ILockSettings.Stub.asInterface( - ServiceManager.getService("lock_settings")); - lockSettings.asBinder().shellCommand(FileDescriptor.in, FileDescriptor.out, - FileDescriptor.err, getRawArgs(), new ShellCallback(), new ResultReceiver(null) {}); - } -} diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index 863efffe3807..c18b7efe44db 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -196,9 +196,6 @@ int main(int argc, char** argv) return 1; } - void const* mapbase = MAP_FAILED; - ssize_t mapsize = -1; - void* base = NULL; // setThreadPoolMaxThreadCount(0) actually tells the kernel it's @@ -278,9 +275,6 @@ int main(int argc, char** argv) } } close(fd); - if (mapbase != MAP_FAILED) { - munmap((void *)mapbase, mapsize); - } return 0; } diff --git a/core/api/current.txt b/core/api/current.txt index 288ab479c0fb..5e03a81013e3 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -12736,6 +12736,7 @@ package android.content.pm { field public static final String FEATURE_TELEPHONY_RADIO_ACCESS = "android.hardware.telephony.radio.access"; field public static final String FEATURE_TELEPHONY_SUBSCRIPTION = "android.hardware.telephony.subscription"; field @Deprecated public static final String FEATURE_TELEVISION = "android.hardware.type.television"; + field public static final String FEATURE_THREAD_NETWORK = "android.hardware.thread_network"; field public static final String FEATURE_TOUCHSCREEN = "android.hardware.touchscreen"; field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH = "android.hardware.touchscreen.multitouch"; field public static final String FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT = "android.hardware.touchscreen.multitouch.distinct"; @@ -32653,6 +32654,7 @@ package android.os { field public static final int S_V2 = 32; // 0x20 field public static final int TIRAMISU = 33; // 0x21 field public static final int UPSIDE_DOWN_CAKE = 34; // 0x22 + field public static final int VANILLA_ICE_CREAM = 10000; // 0x2710 } public final class Bundle extends android.os.BaseBundle implements java.lang.Cloneable android.os.Parcelable { @@ -33543,7 +33545,7 @@ package android.os { method public boolean isInteractive(); method public boolean isLowPowerStandbyEnabled(); method public boolean isPowerSaveMode(); - method public boolean isRebootingUserspaceSupported(); + method @Deprecated public boolean isRebootingUserspaceSupported(); method @Deprecated public boolean isScreenOn(); method public boolean isSustainedPerformanceModeSupported(); method public boolean isWakeLockLevelSupported(int); @@ -33953,6 +33955,7 @@ package android.os { field public static final String DISALLOW_MICROPHONE_TOGGLE = "disallow_microphone_toggle"; field public static final String DISALLOW_MODIFY_ACCOUNTS = "no_modify_accounts"; field public static final String DISALLOW_MOUNT_PHYSICAL_MEDIA = "no_physical_media"; + field public static final String DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO = "no_near_field_communication_radio"; field public static final String DISALLOW_NETWORK_RESET = "no_network_reset"; field public static final String DISALLOW_OUTGOING_BEAM = "no_outgoing_beam"; field public static final String DISALLOW_OUTGOING_CALLS = "no_outgoing_calls"; @@ -39525,6 +39528,7 @@ package android.security.keystore { method @Nullable public java.util.Date getKeyValidityStart(); method @NonNull public String getKeystoreAlias(); method public int getMaxUsageCount(); + method @FlaggedApi("MGF1_DIGEST_SETTER") @NonNull public java.util.Set<java.lang.String> getMgf1Digests(); method public int getPurposes(); method @NonNull public String[] getSignaturePaddings(); method public int getUserAuthenticationType(); @@ -39532,6 +39536,7 @@ package android.security.keystore { method public boolean isDevicePropertiesAttestationIncluded(); method @NonNull public boolean isDigestsSpecified(); method public boolean isInvalidatedByBiometricEnrollment(); + method @FlaggedApi("MGF1_DIGEST_SETTER") @NonNull public boolean isMgf1DigestsSpecified(); method public boolean isRandomizedEncryptionRequired(); method public boolean isStrongBoxBacked(); method public boolean isUnlockedDeviceRequired(); @@ -39563,6 +39568,7 @@ package android.security.keystore { method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityForOriginationEnd(java.util.Date); method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setKeyValidityStart(java.util.Date); method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setMaxUsageCount(int); + method @FlaggedApi("MGF1_DIGEST_SETTER") @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setMgf1Digests(@Nullable java.lang.String...); method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean); method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...); method @NonNull public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean); @@ -39667,12 +39673,14 @@ package android.security.keystore { method @Nullable public java.util.Date getKeyValidityForOriginationEnd(); method @Nullable public java.util.Date getKeyValidityStart(); method public int getMaxUsageCount(); + method @FlaggedApi("MGF1_DIGEST_SETTER") @NonNull public java.util.Set<java.lang.String> getMgf1Digests(); method public int getPurposes(); method @NonNull public String[] getSignaturePaddings(); method public int getUserAuthenticationType(); method public int getUserAuthenticationValidityDurationSeconds(); method public boolean isDigestsSpecified(); method public boolean isInvalidatedByBiometricEnrollment(); + method @FlaggedApi("MGF1_DIGEST_SETTER") @NonNull public boolean isMgf1DigestsSpecified(); method public boolean isRandomizedEncryptionRequired(); method public boolean isUnlockedDeviceRequired(); method public boolean isUserAuthenticationRequired(); @@ -39694,6 +39702,7 @@ package android.security.keystore { method @NonNull public android.security.keystore.KeyProtection.Builder setKeyValidityForOriginationEnd(java.util.Date); method @NonNull public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date); method @NonNull public android.security.keystore.KeyProtection.Builder setMaxUsageCount(int); + method @FlaggedApi("MGF1_DIGEST_SETTER") @NonNull public android.security.keystore.KeyProtection.Builder setMgf1Digests(@Nullable java.lang.String...); method @NonNull public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean); method @NonNull public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...); method @NonNull public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean); diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index c1f6219025f9..7cfa1e377933 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -14,6 +14,7 @@ package android.app { @UiContext public class Activity extends android.view.ContextThemeWrapper implements android.content.ComponentCallbacks2 android.view.KeyEvent.Callback android.view.LayoutInflater.Factory2 android.view.View.OnCreateContextMenuListener android.view.Window.Callback { method public final boolean addDumpable(@NonNull android.util.Dumpable); + method public final boolean isResumed(); } public class ActivityManager { @@ -95,6 +96,7 @@ package android.content { method @NonNull public android.os.IBinder getProcessToken(); method @NonNull public android.os.UserHandle getUser(); field public static final String PAC_PROXY_SERVICE = "pac_proxy"; + field public static final String REMOTE_AUTH_SERVICE = "remote_auth"; field public static final String TEST_NETWORK_SERVICE = "test_network"; } diff --git a/core/api/system-current.txt b/core/api/system-current.txt index ace7d59c9a45..f89c188303bb 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -298,6 +298,7 @@ package android { field public static final String RECOVER_KEYSTORE = "android.permission.RECOVER_KEYSTORE"; field public static final String REGISTER_CALL_PROVIDER = "android.permission.REGISTER_CALL_PROVIDER"; field public static final String REGISTER_CONNECTION_MANAGER = "android.permission.REGISTER_CONNECTION_MANAGER"; + field public static final String REGISTER_NSD_OFFLOAD_ENGINE = "android.permission.REGISTER_NSD_OFFLOAD_ENGINE"; field public static final String REGISTER_SIM_SUBSCRIPTION = "android.permission.REGISTER_SIM_SUBSCRIPTION"; field public static final String REGISTER_STATS_PULL_ATOM = "android.permission.REGISTER_STATS_PULL_ATOM"; field public static final String REMOTE_DISPLAY_PROVIDER = "android.permission.REMOTE_DISPLAY_PROVIDER"; @@ -3480,6 +3481,7 @@ package android.content { field public static final String SYSTEM_CONFIG_SERVICE = "system_config"; field public static final String SYSTEM_UPDATE_SERVICE = "system_update"; field public static final String TETHERING_SERVICE = "tethering"; + field public static final String THREAD_NETWORK_SERVICE = "thread_network"; field public static final String TIME_MANAGER_SERVICE = "time_manager"; field public static final String TRANSLATION_MANAGER_SERVICE = "translation"; field public static final String UI_TRANSLATION_SERVICE = "ui_translation"; @@ -10239,6 +10241,73 @@ package android.nfc { } +package android.nfc.cardemulation { + + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public final class AidGroup implements android.os.Parcelable { + ctor @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public AidGroup(@NonNull java.util.List<java.lang.String>, @Nullable String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Nullable public static android.nfc.cardemulation.AidGroup createFromXml(@NonNull org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public int describeContents(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void dump(@NonNull android.util.proto.ProtoOutputStream); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public java.util.List<java.lang.String> getAids(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getCategory(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void writeAsXml(@NonNull org.xmlpull.v1.XmlSerializer) throws java.io.IOException; + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void writeToParcel(@NonNull android.os.Parcel, int); + field @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public static final android.os.Parcelable.Creator<android.nfc.cardemulation.AidGroup> CREATOR; + } + + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public final class ApduServiceInfo implements android.os.Parcelable { + ctor @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public ApduServiceInfo(@NonNull android.content.pm.PackageManager, @NonNull android.content.pm.ResolveInfo, boolean) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public int describeContents(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void dump(@NonNull android.os.ParcelFileDescriptor, @NonNull java.io.PrintWriter, @NonNull String[]); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void dumpDebug(@NonNull android.util.proto.ProtoOutputStream); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public java.util.List<android.nfc.cardemulation.AidGroup> getAidGroups(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public java.util.List<java.lang.String> getAids(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getCategoryForAid(@NonNull String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public android.content.ComponentName getComponent(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getDescription(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public android.nfc.cardemulation.AidGroup getDynamicAidGroupForCategory(@NonNull String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Nullable public String getOffHostSecureElement(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public java.util.List<java.lang.String> getPrefixAids(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getSettingsActivityName(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public java.util.List<java.lang.String> getSubsetAids(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public int getUid(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public boolean hasCategory(@NonNull String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public boolean isOnHost(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public CharSequence loadAppLabel(@NonNull android.content.pm.PackageManager); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public android.graphics.drawable.Drawable loadBanner(@NonNull android.content.pm.PackageManager); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.pm.PackageManager); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public CharSequence loadLabel(@NonNull android.content.pm.PackageManager); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public boolean removeDynamicAidGroupForCategory(@NonNull String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public boolean requiresScreenOn(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public boolean requiresUnlock(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void resetOffHostSecureElement(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void setDynamicAidGroup(@NonNull android.nfc.cardemulation.AidGroup); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void setOffHostSecureElement(@NonNull String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void writeToParcel(@NonNull android.os.Parcel, int); + field @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public static final android.os.Parcelable.Creator<android.nfc.cardemulation.ApduServiceInfo> CREATOR; + } + + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public final class NfcFServiceInfo implements android.os.Parcelable { + ctor @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public NfcFServiceInfo(@NonNull android.content.pm.PackageManager, @NonNull android.content.pm.ResolveInfo) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public int describeContents(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void dump(@NonNull android.os.ParcelFileDescriptor, @NonNull java.io.PrintWriter, @NonNull String[]); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void dumpDebug(@NonNull android.util.proto.ProtoOutputStream); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public android.content.ComponentName getComponent(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getDescription(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getNfcid2(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getSystemCode(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public String getT3tPmm(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public int getUid(); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public android.graphics.drawable.Drawable loadIcon(@NonNull android.content.pm.PackageManager); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public CharSequence loadLabel(@NonNull android.content.pm.PackageManager); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void setDynamicNfcid2(@NonNull String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void setDynamicSystemCode(@NonNull String); + method @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public void writeToParcel(@NonNull android.os.Parcel, int); + field @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @NonNull public static final android.os.Parcelable.Creator<android.nfc.cardemulation.NfcFServiceInfo> CREATOR; + } + +} + package android.os { public class BatteryManager { @@ -10746,7 +10815,7 @@ package android.os { field @RequiresPermission(android.Manifest.permission.MANAGE_LOW_POWER_STANDBY) public static final String ACTION_LOW_POWER_STANDBY_PORTS_CHANGED = "android.os.action.LOW_POWER_STANDBY_PORTS_CHANGED"; field public static final int POWER_SAVE_MODE_TRIGGER_DYNAMIC = 1; // 0x1 field public static final int POWER_SAVE_MODE_TRIGGER_PERCENTAGE = 0; // 0x0 - field public static final String REBOOT_USERSPACE = "userspace"; + field @Deprecated public static final String REBOOT_USERSPACE = "userspace"; field public static final int SOUND_TRIGGER_MODE_ALL_DISABLED = 2; // 0x2 field public static final int SOUND_TRIGGER_MODE_ALL_ENABLED = 0; // 0x0 field public static final int SOUND_TRIGGER_MODE_CRITICAL_ONLY = 1; // 0x1 diff --git a/core/api/system-lint-baseline.txt b/core/api/system-lint-baseline.txt index 025e8629fc20..71c02dc42c62 100644 --- a/core/api/system-lint-baseline.txt +++ b/core/api/system-lint-baseline.txt @@ -143,12 +143,16 @@ SamShouldBeLast: android.media.AudioFocusRequest.Builder#setOnAudioFocusChangeLi SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioFocusRequest.Builder.setOnAudioFocusChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioManager#requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int): SAM-compatible parameters (such as parameter 1, "l", in android.media.AudioManager.requestAudioFocus) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions +SamShouldBeLast: android.media.AudioRecord#addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler): + SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioRecord.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioRecord#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioRecord.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.AudioRouting#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): SAM-compatible parameters (such as parameter 1, "listener", in android.media.AudioRouting.addOnRoutingChangedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions 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.AudioTrack#addOnRoutingChangedListener(android.media.AudioTrack.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.MediaCodec#setOnFrameRenderedListener(android.media.MediaCodec.OnFrameRenderedListener, android.os.Handler): SAM-compatible parameters (such as parameter 1, "listener", in android.media.MediaCodec.setOnFrameRenderedListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.media.MediaPlayer#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler): @@ -221,3 +225,16 @@ SamShouldBeLast: android.view.accessibility.AccessibilityManager#addTouchExplora SAM-compatible parameters (such as parameter 1, "listener", in android.view.accessibility.AccessibilityManager.addTouchExplorationStateChangeListener) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions SamShouldBeLast: android.webkit.WebChromeClient#onShowFileChooser(android.webkit.WebView, android.webkit.ValueCallback<android.net.Uri[]>, android.webkit.WebChromeClient.FileChooserParams): SAM-compatible parameters (such as parameter 2, "filePathCallback", in android.webkit.WebChromeClient.onShowFileChooser) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions + +UnflaggedApi: android.nfc.cardemulation.AidGroup#CONTENTS_FILE_DESCRIPTOR: + New API must be flagged with @FlaggedApi: field android.nfc.cardemulation.AidGroup.CONTENTS_FILE_DESCRIPTOR +UnflaggedApi: android.nfc.cardemulation.AidGroup#PARCELABLE_WRITE_RETURN_VALUE: + New API must be flagged with @FlaggedApi: field android.nfc.cardemulation.AidGroup.PARCELABLE_WRITE_RETURN_VALUE +UnflaggedApi: android.nfc.cardemulation.ApduServiceInfo#CONTENTS_FILE_DESCRIPTOR: + New API must be flagged with @FlaggedApi: field android.nfc.cardemulation.ApduServiceInfo.CONTENTS_FILE_DESCRIPTOR +UnflaggedApi: android.nfc.cardemulation.ApduServiceInfo#PARCELABLE_WRITE_RETURN_VALUE: + New API must be flagged with @FlaggedApi: field android.nfc.cardemulation.ApduServiceInfo.PARCELABLE_WRITE_RETURN_VALUE +UnflaggedApi: android.nfc.cardemulation.NfcFServiceInfo#CONTENTS_FILE_DESCRIPTOR: + New API must be flagged with @FlaggedApi: field android.nfc.cardemulation.NfcFServiceInfo.CONTENTS_FILE_DESCRIPTOR +UnflaggedApi: android.nfc.cardemulation.NfcFServiceInfo#PARCELABLE_WRITE_RETURN_VALUE: + New API must be flagged with @FlaggedApi: field android.nfc.cardemulation.NfcFServiceInfo.PARCELABLE_WRITE_RETURN_VALUE diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 0c9569f730cd..70377ab6a0d9 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -2167,6 +2167,10 @@ package android.net.wifi.sharedconnectivity.service { package android.os { + public class BatteryManager { + field public static final int BATTERY_PLUGGED_ANY = 15; // 0xf + } + public final class BatteryStatsManager { method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void resetBattery(boolean); method @RequiresPermission(android.Manifest.permission.DEVICE_POWER) public void setBatteryLevel(int, boolean); @@ -3218,6 +3222,9 @@ package android.telephony.ims.feature { field @Deprecated protected int mCapabilities; } + public static class MmTelFeature.MmTelCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities { + } + } package android.text { @@ -3790,6 +3797,9 @@ package android.view.inputmethod { field public static final long CLEAR_SHOW_FORCED_FLAG_WHEN_LEAVING = 214016041L; // 0xcc1a029L } + public final class InsertModeGesture extends android.view.inputmethod.CancellableHandwritingGesture implements android.os.Parcelable { + } + } package android.view.inspector { diff --git a/core/java/Android.bp b/core/java/Android.bp index 02b14ad7a757..5091b52f7fd0 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -9,6 +9,11 @@ package { default_applicable_licenses: ["frameworks_base_license"], } +aidl_library { + name: "HardwareBuffer_aidl", + hdrs: ["android/hardware/HardwareBuffer.aidl"], +} + filegroup { name: "framework-core-sources", srcs: [ @@ -23,9 +28,14 @@ filegroup { srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"], } -filegroup { - name: "IDropBoxManagerService.aidl", - srcs: ["com/android/internal/os/IDropBoxManagerService.aidl"], +aidl_library { + name: "IDropBoxManagerService_aidl", + srcs: [ + "com/android/internal/os/IDropBoxManagerService.aidl", + ], + hdrs: [ + "android/os/DropBoxManager.aidl", + ], } filegroup { @@ -138,7 +148,7 @@ filegroup { ], } -filegroup { +aidl_library { name: "ILogcatManagerService_aidl", srcs: ["android/os/logcat/ILogcatManagerService.aidl"], } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 8021ce0dc20d..259086932465 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -966,7 +966,7 @@ public class Activity extends ContextThemeWrapper private int mDefaultKeyMode = DEFAULT_KEYS_DISABLE; private SpannableStringBuilder mDefaultKeySsb = null; - private ActivityManager.TaskDescription mTaskDescription = + private final ActivityManager.TaskDescription mTaskDescription = new ActivityManager.TaskDescription(); protected static final int[] FOCUSED_STATE_SET = {com.android.internal.R.attr.state_focused}; @@ -977,7 +977,7 @@ public class Activity extends ContextThemeWrapper private Thread mUiThread; @UnsupportedAppUsage - ActivityTransitionState mActivityTransitionState = new ActivityTransitionState(); + final ActivityTransitionState mActivityTransitionState = new ActivityTransitionState(); SharedElementCallback mEnterTransitionListener = SharedElementCallback.NULL_CALLBACK; SharedElementCallback mExitTransitionListener = SharedElementCallback.NULL_CALLBACK; @@ -1883,7 +1883,7 @@ public class Activity extends ContextThemeWrapper final int numDialogs = ids.length; mManagedDialogs = new SparseArray<ManagedDialog>(numDialogs); for (int i = 0; i < numDialogs; i++) { - final Integer dialogId = ids[i]; + final int dialogId = ids[i]; Bundle dialogState = b.getBundle(savedDialogKeyFor(dialogId)); if (dialogState != null) { // Calling onRestoreInstanceState() below will invoke dispatchOnCreate @@ -1953,7 +1953,7 @@ public class Activity extends ContextThemeWrapper * <code>persistAcrossReboots</code>. * * @param savedInstanceState The data most recently supplied in {@link #onSaveInstanceState} - * @param persistentState The data caming from the PersistableBundle first + * @param persistentState The data coming from the PersistableBundle first * saved in {@link #onSaveInstanceState(Bundle, PersistableBundle)}. * * @see #onCreate @@ -2039,7 +2039,7 @@ public class Activity extends ContextThemeWrapper * indicator that the activity became active and ready to receive input. This sometimes could * also be a transit state toward another resting state. For instance, an activity may be * relaunched to {@link #onPause} due to configuration changes and the activity was visible, - * but wasn’t the top-most activity of an activity task. {@link #onResume} is guaranteed to be + * but wasn't the top-most activity of an activity task. {@link #onResume} is guaranteed to be * called before {@link #onPause} in this case which honors the activity lifecycle policy and * the activity eventually rests in {@link #onPause}. * @@ -2258,9 +2258,9 @@ public class Activity extends ContextThemeWrapper * * <p>An activity can never receive a new intent in the resumed state. You can count on * {@link #onResume} being called after this method, though not necessarily immediately after - * the completion this callback. If the activity was resumed, it will be paused and new intent - * will be delivered, followed by {@link #onResume}. If the activity wasn't in the resumed - * state, then new intent can be delivered immediately, with {@link #onResume()} called + * the completion of this callback. If the activity was resumed, it will be paused and new + * intent will be delivered, followed by {@link #onResume}. If the activity wasn't in the + * resumed state, then new intent can be delivered immediately, with {@link #onResume()} called * sometime later when activity becomes active again. * * <p>Note that {@link #getIntent} still returns the original Intent. You @@ -5141,7 +5141,7 @@ public class Activity extends ContextThemeWrapper * This hook is called when the user signals the desire to start a search. * * <p>You can use this function as a simple way to launch the search UI, in response to a - * menu item, search button, or other widgets within your activity. Unless overidden, + * menu item, search button, or other widgets within your activity. Unless overridden, * calling this function is the same as calling * {@link #startSearch startSearch(null, false, null, false)}, which launches * search for the current activity as specified in its manifest, see {@link SearchManager}. @@ -5452,8 +5452,8 @@ public class Activity extends ContextThemeWrapper * result callbacks including {@link #onRequestPermissionsResult(int, String[], int[])}. * </p> * <p> - * The <a href="https://github.com/android/permissions-samples"> - * RuntimePermissions</a> sample apps demonstrate how to use this method to + * The <a href="https://github.com/android/platform-samples/tree/main/samples/privacy/permissions"> + * permissions samples</a> repo demonstrates how to use this method to * request permissions at run time. * </p> * @@ -8915,6 +8915,7 @@ public class Activity extends ContextThemeWrapper * @hide */ @UnsupportedAppUsage + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public final boolean isResumed() { return mResumed; } @@ -9076,7 +9077,7 @@ public class Activity extends ContextThemeWrapper * @see Activity#convertFromTranslucent() * @see Activity#convertToTranslucent(TranslucentConversionListener, ActivityOptions) */ - public void onTranslucentConversionComplete(boolean drawComplete); + void onTranslucentConversionComplete(boolean drawComplete); } private void dispatchRequestPermissionsResult(int requestCode, Intent data) { @@ -9218,7 +9219,7 @@ public class Activity extends ContextThemeWrapper /** * Registers remote animations per transition type for this activity. * - * @param definition The remote animation definition that defines which transition whould run + * @param definition The remote animation definition that defines which transition would run * which remote animation. * @hide */ diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 41c58ef67e65..ba26457b9f8a 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -269,7 +269,6 @@ public final class ActivityThread extends ClientTransactionHandler implements ActivityThreadInternal { /** @hide */ public static final String TAG = "ActivityThread"; - private static final android.graphics.Bitmap.Config THUMBNAIL_FORMAT = Bitmap.Config.RGB_565; static final boolean localLOGV = false; static final boolean DEBUG_MESSAGES = false; /** @hide */ @@ -370,7 +369,7 @@ public final class ActivityThread extends ClientTransactionHandler private final AtomicInteger mNumLaunchingActivities = new AtomicInteger(); @GuardedBy("mAppThread") private int mLastProcessState = PROCESS_STATE_UNKNOWN; - ArrayList<WeakReference<AssistStructure>> mLastAssistStructures = new ArrayList<>(); + final ArrayList<WeakReference<AssistStructure>> mLastAssistStructures = new ArrayList<>(); private int mLastSessionId; // Holds the value of the last reported device ID value from the server for the top activity. int mLastReportedDeviceId; @@ -561,7 +560,7 @@ public final class ActivityThread extends ClientTransactionHandler Configuration createdConfig; Configuration overrideConfig; // Used for consolidating configs before sending on to Activity. - private Configuration tmpConfig = new Configuration(); + private final Configuration tmpConfig = new Configuration(); // Callback used for updating activity override config and camera compat control state. ViewRootImpl.ActivityConfigCallback activityConfigCallback; @@ -769,7 +768,7 @@ public final class ActivityThread extends ClientTransactionHandler } } - final class ProviderClientRecord { + static final class ProviderClientRecord { final String[] mNames; @UnsupportedAppUsage final IContentProvider mProvider; @@ -798,7 +797,7 @@ public final class ActivityThread extends ClientTransactionHandler } @UnsupportedAppUsage - Intent intent; + final Intent intent; @UnsupportedAppUsage ActivityInfo info; @UnsupportedAppUsage @@ -3460,11 +3459,8 @@ public final class ActivityThread extends ClientTransactionHandler public void registerOnActivityPausedListener(Activity activity, OnActivityPausedListener listener) { synchronized (mOnPauseListeners) { - ArrayList<OnActivityPausedListener> list = mOnPauseListeners.get(activity); - if (list == null) { - list = new ArrayList<OnActivityPausedListener>(); - mOnPauseListeners.put(activity, list); - } + ArrayList<OnActivityPausedListener> list = + mOnPauseListeners.computeIfAbsent(activity, k -> new ArrayList<>()); list.add(listener); } } @@ -5572,7 +5568,7 @@ public final class ActivityThread extends ClientTransactionHandler /** Core implementation of activity destroy call. */ void performDestroyActivity(ActivityClientRecord r, boolean finishing, int configChanges, boolean getNonConfigInstance, String reason) { - Class<? extends Activity> activityClass = null; + Class<? extends Activity> activityClass; if (localLOGV) Slog.v(TAG, "Performing finish of " + r); activityClass = r.activity.getClass(); r.activity.mConfigChangeFlags |= configChanges; @@ -7303,7 +7299,7 @@ public final class ActivityThread extends ClientTransactionHandler // Note that we cannot hold the lock while acquiring and installing the // provider since it might take a long time to run and it could also potentially // be re-entrant in the case where the provider is in the same process. - ContentProviderHolder holder = null; + ContentProviderHolder holder; final ProviderKey key = getGetProviderKey(auth, userId); try { synchronized (key) { @@ -7357,11 +7353,7 @@ public final class ActivityThread extends ClientTransactionHandler private ProviderKey getGetProviderKey(String auth, int userId) { final ProviderKey key = new ProviderKey(auth, userId); synchronized (mGetProviderKeys) { - ProviderKey lock = mGetProviderKeys.get(key); - if (lock == null) { - lock = key; - mGetProviderKeys.put(key, lock); - } + ProviderKey lock = mGetProviderKeys.computeIfAbsent(key, k -> k); return lock; } } @@ -7998,7 +7990,7 @@ public final class ActivityThread extends ClientTransactionHandler if (!DEPRECATE_DATA_COLUMNS) return; // Install interception and make sure it sticks! - Os def = null; + Os def; do { def = Os.getDefault(); } while (!Os.compareAndSetDefault(def, new AndroidOs(def))); diff --git a/core/java/android/app/AliasActivity.java b/core/java/android/app/AliasActivity.java index 37be90160d9a..f266769a3abf 100644 --- a/core/java/android/app/AliasActivity.java +++ b/core/java/android/app/AliasActivity.java @@ -16,9 +16,6 @@ package android.app; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; - import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; @@ -29,13 +26,16 @@ import android.util.Xml; import com.android.internal.util.XmlUtils; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + import java.io.IOException; /** * Stub activity that launches another activity (and then finishes itself) * based on information in its component's manifest meta-data. This is a * simple way to implement an alias-like mechanism. - * + * * To use this activity, you should include in the manifest for the associated * component an entry named "android.app.alias". It is a reference to an XML * resource describing an intent that launches the real application. @@ -51,11 +51,11 @@ public class AliasActivity extends Activity { * {@hide} */ public final String ALIAS_META_DATA = "android.app.alias"; - + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + XmlResourceParser parser = null; try { ActivityInfo ai = getPackageManager().getActivityInfo( @@ -66,21 +66,17 @@ public class AliasActivity extends Activity { throw new RuntimeException("Alias requires a meta-data field " + ALIAS_META_DATA); } - + Intent intent = parseAlias(parser); if (intent == null) { throw new RuntimeException( "No <intent> tag found in alias description"); } - + startActivity(intent); finish(); - - } catch (PackageManager.NameNotFoundException e) { - throw new RuntimeException("Error parsing alias", e); - } catch (XmlPullParserException e) { - throw new RuntimeException("Error parsing alias", e); - } catch (IOException e) { + + } catch (PackageManager.NameNotFoundException | XmlPullParserException | IOException e) { throw new RuntimeException("Error parsing alias", e); } finally { if (parser != null) parser.close(); @@ -90,21 +86,21 @@ public class AliasActivity extends Activity { private Intent parseAlias(XmlPullParser parser) throws XmlPullParserException, IOException { AttributeSet attrs = Xml.asAttributeSet(parser); - + Intent intent = null; - + int type; while ((type=parser.next()) != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) { } - + String nodeName = parser.getName(); if (!"alias".equals(nodeName)) { throw new RuntimeException( "Alias meta-data must start with <alias> tag; found" + nodeName + " at " + parser.getPositionDescription()); } - + int outerDepth = parser.getDepth(); while ((type=parser.next()) != XmlPullParser.END_DOCUMENT && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { @@ -120,8 +116,8 @@ public class AliasActivity extends Activity { XmlUtils.skipCurrentTag(parser); } } - + return intent; } - + } diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java index 09450f59ed3d..7ed3a1d63e4f 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -49,7 +49,6 @@ import android.util.ArrayMap; import android.util.Log; import android.view.IOnKeyguardExitResult; import android.view.IWindowManager; -import android.view.WindowManager.LayoutParams; import android.view.WindowManagerGlobal; import com.android.internal.annotations.VisibleForTesting; @@ -70,9 +69,7 @@ import java.util.Objects; import java.util.concurrent.Executor; /** - * Class that can be used to lock and unlock the keyguard. The - * actual class to control the keyguard locking is - * {@link android.app.KeyguardManager.KeyguardLock}. + * Class to manage and query the state of the lock screen (also known as Keyguard). */ @SystemService(Context.KEYGUARD_SERVICE) public class KeyguardManager { @@ -238,7 +235,9 @@ public class KeyguardManager { * {@link android.app.Activity#RESULT_OK} if the user successfully completes the challenge. * * @return the intent for launching the activity or null if no password is required. - * @deprecated see BiometricPrompt.Builder#setDeviceCredentialAllowed(boolean) + * + * @deprecated see {@link + * android.hardware.biometrics.BiometricPrompt.Builder#setAllowedAuthenticators(int)} */ @Deprecated @RequiresFeature(PackageManager.FEATURE_SECURE_LOCK_SCREEN) @@ -456,13 +455,12 @@ public class KeyguardManager { /** * Handle returned by {@link KeyguardManager#newKeyguardLock} that allows - * you to disable / reenable the keyguard. + * you to temporarily disable / reenable the keyguard (lock screen). * - * @deprecated Use {@link LayoutParams#FLAG_DISMISS_KEYGUARD} - * and/or {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} - * instead; this allows you to seamlessly hide the keyguard as your application - * moves in and out of the foreground and does not require that any special - * permissions be requested. + * @deprecated Use {@link android.R.attr#showWhenLocked} or {@link + * android.app.Activity#setShowWhenLocked(boolean)} instead. This allows you to seamlessly + * occlude and unocclude the keyguard as your application moves in and out of the foreground + * and does not require that any special permissions be requested. */ @Deprecated public class KeyguardLock { @@ -477,12 +475,12 @@ public class KeyguardManager { * Disable the keyguard from showing. If the keyguard is currently * showing, hide it. The keyguard will be prevented from showing again * until {@link #reenableKeyguard()} is called. - * + * <p> + * This only works if the keyguard is not secure. + * <p> * A good place to call this is from {@link android.app.Activity#onResume()} * - * Note: This call has no effect while any {@link android.app.admin.DevicePolicyManager} - * is enabled that requires a password. - * + * @see KeyguardManager#isKeyguardSecure() * @see #reenableKeyguard() */ @RequiresPermission(Manifest.permission.DISABLE_KEYGUARD) @@ -499,9 +497,6 @@ public class KeyguardManager { * * A good place to call this is from {@link android.app.Activity#onPause()} * - * Note: This call has no effect while any {@link android.app.admin.DevicePolicyManager} - * is enabled that requires a password. - * * @see #disableKeyguard() */ @RequiresPermission(Manifest.permission.DISABLE_KEYGUARD) @@ -600,20 +595,18 @@ public class KeyguardManager { } /** - * Enables you to lock or unlock the keyguard. Get an instance of this class by - * calling {@link android.content.Context#getSystemService(java.lang.String) Context.getSystemService()}. - * This class is wrapped by {@link android.app.KeyguardManager KeyguardManager}. + * Enables you to temporarily disable / reenable the keyguard (lock screen). + * * @param tag A tag that informally identifies who you are (for debugging who * is disabling the keyguard). * * @return A {@link KeyguardLock} handle to use to disable and reenable the * keyguard. * - * @deprecated Use {@link LayoutParams#FLAG_DISMISS_KEYGUARD} - * and/or {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} - * instead; this allows you to seamlessly hide the keyguard as your application - * moves in and out of the foreground and does not require that any special - * permissions be requested. + * @deprecated Use {@link android.R.attr#showWhenLocked} or {@link + * android.app.Activity#setShowWhenLocked(boolean)} instead. This allows you to seamlessly + * occlude and unocclude the keyguard as your application moves in and out of the foreground + * and does not require that any special permissions be requested. */ @Deprecated public KeyguardLock newKeyguardLock(String tag) { @@ -621,9 +614,36 @@ public class KeyguardManager { } /** - * Return whether the keyguard is currently locked. + * Returns whether the lock screen (also known as Keyguard) is showing. + * <p> + * Specifically, this returns {@code true} in the following cases: + * <ul> + * <li>The lock screen is showing in the foreground.</li> + * <li>The lock screen is showing, but it is occluded by an activity that is showing on top of + * it. A common example is the phone app receiving a call or making an emergency call.</li> + * <li>The lock screen was showing but is temporarily disabled as a result of <a + * href="https://developer.android.com/work/dpc/dedicated-devices/lock-task-mode">lock task + * mode</a> or an app using the deprecated {@link KeyguardLock} API.</li> + * </ul> + * <p> + * "Showing" refers to a logical state of the UI, regardless of whether the screen happens to be + * on. When the power button is pressed on an unlocked device, the lock screen starts "showing" + * immediately when the screen turns off. + * <p> + * This method does not distinguish a lock screen that is requiring authentication (e.g. with + * PIN, pattern, password, or biometric) from a lock screen that is trivially dismissible (e.g. + * with swipe). It also does not distinguish a lock screen requesting a SIM card PIN from a + * normal device lock screen. Finally, it always returns the global lock screen state and does + * not consider the {@link Context}'s user specifically. + * <p> + * Note that {@code isKeyguardLocked()} is confusingly named and probably should be called + * {@code isKeyguardShowing()}. On many devices, the lock screen displays an <i>unlocked</i> + * padlock icon when it is trivially dismissible. As mentioned above, {@code isKeyguardLocked()} + * actually returns {@code true} in this case, not {@code false} as might be expected. {@link + * #isDeviceLocked()} is an alternative API that has slightly different semantics. * - * @return {@code true} if the keyguard is locked. + * @return {@code true} if the lock screen is showing + * @see #isDeviceLocked() */ public boolean isKeyguardLocked() { try { @@ -634,12 +654,23 @@ public class KeyguardManager { } /** - * Return whether the keyguard is secured by a PIN, pattern or password or a SIM card - * is currently locked. - * - * <p>See also {@link #isDeviceSecure()} which ignores SIM locked states. + * Returns whether the user has a secure lock screen or there is a locked SIM card. + * <p> + * Specifically, this returns {@code true} if at least one of the following is true: + * <ul> + * <li>The {@link Context}'s user has a secure lock screen. A full user has a secure lock + * screen if its lock screen is set to PIN, pattern, or password, as opposed to swipe or none. + * A profile that uses a unified challenge is considered to have a secure lock screen if and + * only if its parent user has a secure lock screen.</li> + * <li>At least one SIM card is currently locked and requires a PIN.</li> + * </ul> + * <p> + * This method does not consider whether the lock screen is currently showing or not. + * <p> + * See also {@link #isDeviceSecure()} which excludes locked SIM cards. * - * @return {@code true} if a PIN, pattern or password is set or a SIM card is locked. + * @return {@code true} if the user has a secure lock screen or there is a locked SIM card + * @see #isDeviceSecure() */ public boolean isKeyguardSecure() { try { @@ -650,11 +681,11 @@ public class KeyguardManager { } /** - * If keyguard screen is showing or in restricted key input mode (i.e. in - * keyguard password emergency screen). When in such mode, certain keys, - * such as the Home key and the right soft keys, don't work. + * Returns whether the lock screen is showing. + * <p> + * This is exactly the same as {@link #isKeyguardLocked()}. * - * @return {@code true} if in keyguard restricted input mode. + * @return the value of {@link #isKeyguardLocked()} * @deprecated Use {@link #isKeyguardLocked()} instead. */ public boolean inKeyguardRestrictedInputMode() { @@ -662,11 +693,26 @@ public class KeyguardManager { } /** - * Returns whether the device is currently locked and requires a PIN, pattern or - * password to unlock. + * Returns whether the device is currently locked for the user. + * <p> + * This returns the device locked state for the {@link Context}'s user. If this user is the + * current user, then the device is considered "locked" when the lock screen is showing (i.e. + * {@link #isKeyguardLocked()} returns {@code true}) and is not trivially dismissible (e.g. with + * swipe), and the user has a PIN, pattern, or password. + * <p> + * Note: the above definition implies that a user with no PIN, pattern, or password is never + * considered locked, even if the lock screen is showing and requesting a SIM card PIN. The + * device PIN and SIM PIN are separate. Also, the user is not considered locked if face + * authentication has just completed or a trust agent is keeping the device unlocked, since in + * these cases the lock screen is dismissible with swipe. + * <p> + * For a user that is not the current user but can be switched to (usually this means "another + * full user"), and that has a PIN, pattern, or password, the device is always considered + * locked. For a profile with a unified challenge, the device is considered locked if and only + * if the device is locked for the parent user. * - * @return {@code true} if unlocking the device currently requires a PIN, pattern or - * password. + * @return {@code true} if the device is currently locked for the user + * @see #isKeyguardLocked() */ public boolean isDeviceLocked() { return isDeviceLocked(mContext.getUserId()); @@ -687,12 +733,19 @@ public class KeyguardManager { } /** - * Returns whether the device is secured with a PIN, pattern or - * password. - * - * <p>See also {@link #isKeyguardSecure} which treats SIM locked states as secure. + * Returns whether the user has a secure lock screen. + * <p> + * This returns {@code true} if the {@link Context}'s user has a secure lock screen. A full user + * has a secure lock screen if its lock screen is set to PIN, pattern, or password, as opposed + * to swipe or none. A profile that uses a unified challenge is considered to have a secure lock + * screen if and only if its parent user has a secure lock screen. + * <p> + * This method does not consider whether the lock screen is currently showing or not. + * <p> + * See also {@link #isKeyguardSecure()} which includes locked SIM cards. * - * @return {@code true} if a PIN, pattern or password was set. + * @return {@code true} if the user has a secure lock screen + * @see #isKeyguardSecure() */ public boolean isDeviceSecure() { return isDeviceSecure(mContext.getUserId()); @@ -713,8 +766,7 @@ public class KeyguardManager { } /** - * If the device is currently locked (see {@link #isKeyguardLocked()}, requests the Keyguard to - * be dismissed. + * Requests that the Keyguard (lock screen) be dismissed if it is currently showing. * <p> * If the Keyguard is not secure or the device is currently in a trusted state, calling this * method will immediately dismiss the Keyguard without any user interaction. @@ -725,8 +777,9 @@ public class KeyguardManager { * If the value set for the {@link Activity} attr {@link android.R.attr#turnScreenOn} is true, * the screen will turn on when the keyguard is dismissed. * - * @param activity The activity requesting the dismissal. The activity must be either visible - * by using {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} or must be in a state in + * @param activity The activity requesting the dismissal. The activity must either be visible + * by using {@link android.R.attr#showWhenLocked} or {@link + * android.app.Activity#setShowWhenLocked(boolean)}, or must be in a state in * which it would be visible if Keyguard would not be hiding it. If that's not * the case, the request will fail immediately and * {@link KeyguardDismissCallback#onDismissError} will be invoked. @@ -741,8 +794,7 @@ public class KeyguardManager { } /** - * If the device is currently locked (see {@link #isKeyguardLocked()}, requests the Keyguard to - * be dismissed. + * Requests that the Keyguard (lock screen) be dismissed if it is currently showing. * <p> * If the Keyguard is not secure or the device is currently in a trusted state, calling this * method will immediately dismiss the Keyguard without any user interaction. @@ -753,8 +805,9 @@ public class KeyguardManager { * If the value set for the {@link Activity} attr {@link android.R.attr#turnScreenOn} is true, * the screen will turn on when the keyguard is dismissed. * - * @param activity The activity requesting the dismissal. The activity must be either visible - * by using {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} or must be in a state in + * @param activity The activity requesting the dismissal. The activity must either be visible + * by using {@link android.R.attr#showWhenLocked} or {@link + * android.app.Activity#setShowWhenLocked(boolean)}, or must be in a state in * which it would be visible if Keyguard would not be hiding it. If that's not * the case, the request will fail immediately and * {@link KeyguardDismissCallback#onDismissError} will be invoked. @@ -808,12 +861,12 @@ public class KeyguardManager { * @param callback Lets you know whether the operation was successful and * it is safe to launch anything that would normally be considered safe * once the user has gotten past the keyguard. - - * @deprecated Use {@link LayoutParams#FLAG_DISMISS_KEYGUARD} - * and/or {@link LayoutParams#FLAG_SHOW_WHEN_LOCKED} - * instead; this allows you to seamlessly hide the keyguard as your application - * moves in and out of the foreground and does not require that any special - * permissions be requested. + * + * @deprecated Use {@link android.R.attr#showWhenLocked} or {@link + * android.app.Activity#setShowWhenLocked(boolean)} to seamlessly occlude and unocclude the + * keyguard as your application moves in and out of the foreground, without requiring any + * special permissions. Use {@link #requestDismissKeyguard(android.app.Activity, + * KeyguardDismissCallback)} to request dismissal of the keyguard. */ @Deprecated @RequiresPermission(Manifest.permission.DISABLE_KEYGUARD) diff --git a/core/java/android/app/OWNERS b/core/java/android/app/OWNERS index f7d2afba428e..e1c45d98e678 100644 --- a/core/java/android/app/OWNERS +++ b/core/java/android/app/OWNERS @@ -63,10 +63,11 @@ per-file *Locale* = file:/services/core/java/com/android/server/locales/OWNERS # Multiuser per-file *User* = file:/MULTIUSER_OWNERS -# Notification, DND, Status bar +# Notification, DND, Status bar, UiModeManager per-file *Notification* = file:/packages/SystemUI/OWNERS per-file *Zen* = file:/packages/SystemUI/OWNERS per-file *StatusBar* = file:/packages/SystemUI/OWNERS +per-file *UiModeManager* = file:/packages/SystemUI/OWNERS # PackageManager per-file ApplicationPackageManager.java = file:/services/core/java/com/android/server/pm/OWNERS diff --git a/core/java/android/app/SearchableInfo.java b/core/java/android/app/SearchableInfo.java index bd5d1057f5bf..05742e658704 100644 --- a/core/java/android/app/SearchableInfo.java +++ b/core/java/android/app/SearchableInfo.java @@ -535,7 +535,7 @@ public final class SearchableInfo implements Parcelable { */ public static SearchableInfo getActivityMetaData(Context context, ActivityInfo activityInfo, int userId) { - Context userContext = null; + Context userContext; try { userContext = context.createPackageContextAsUser("system", 0, new UserHandle(userId)); diff --git a/core/java/android/app/WallpaperInfo.java b/core/java/android/app/WallpaperInfo.java index b29e73a717f4..74132a3783be 100644 --- a/core/java/android/app/WallpaperInfo.java +++ b/core/java/android/app/WallpaperInfo.java @@ -96,31 +96,30 @@ public final class WallpaperInfo implements Parcelable { throws XmlPullParserException, IOException { mService = service; ServiceInfo si = service.serviceInfo; - + final PackageManager pm = context.getPackageManager(); - XmlResourceParser parser = null; - try { - parser = si.loadXmlMetaData(pm, WallpaperService.SERVICE_META_DATA); + try (XmlResourceParser parser = si.loadXmlMetaData(pm, + WallpaperService.SERVICE_META_DATA)) { if (parser == null) { throw new XmlPullParserException("No " + WallpaperService.SERVICE_META_DATA + " meta-data"); } - + Resources res = pm.getResourcesForApplication(si.applicationInfo); - + AttributeSet attrs = Xml.asAttributeSet(parser); - + int type; - while ((type=parser.next()) != XmlPullParser.END_DOCUMENT + while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) { } - + String nodeName = parser.getName(); if (!"wallpaper".equals(nodeName)) { throw new XmlPullParserException( "Meta-data does not start with wallpaper tag"); } - + TypedArray sa = res.obtainAttributes(attrs, com.android.internal.R.styleable.Wallpaper); mSettingsActivityName = sa.getString( @@ -159,8 +158,6 @@ public final class WallpaperInfo implements Parcelable { } catch (NameNotFoundException e) { throw new XmlPullParserException( "Unable to create context for: " + si.packageName); - } finally { - if (parser != null) parser.close(); } } diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index ee888ed7d872..6131abdc1eb0 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -1969,7 +1969,6 @@ public class WallpaperManager { mContext.getUserId()); if (fd != null) { FileOutputStream fos = null; - boolean ok = false; try { fos = new ParcelFileDescriptor.AutoCloseOutputStream(fd); copyStreamToWallpaperFile(resources.openRawResource(resid), fos); diff --git a/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS b/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS index 270cb1841464..62ad8c07feba 100644 --- a/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS +++ b/core/java/android/app/admin/EnterprisePlatformSecurity_OWNERS @@ -1,4 +1,3 @@ +file:EnterprisePlatform_OWNERS rubinxu@google.com pgrafov@google.com -ayushsha@google.com -alexkershaw@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file diff --git a/core/java/android/app/admin/EnterprisePlatformTest_OWNERS b/core/java/android/app/admin/EnterprisePlatformTest_OWNERS new file mode 100644 index 000000000000..eb23a035c2d9 --- /dev/null +++ b/core/java/android/app/admin/EnterprisePlatformTest_OWNERS @@ -0,0 +1,5 @@ +# Bug template url: https://b.corp.google.com/issues/new?component=1337891&template=1814288 +# Assign bugs to aep-automated-tests@google.com + +file:EnterprisePlatform_OWNERS +scottjonathan@google.com
\ No newline at end of file diff --git a/core/java/android/app/admin/EnterprisePlatform_OWNERS b/core/java/android/app/admin/EnterprisePlatform_OWNERS index 6ce25cc42876..4d1ed59039d0 100644 --- a/core/java/android/app/admin/EnterprisePlatform_OWNERS +++ b/core/java/android/app/admin/EnterprisePlatform_OWNERS @@ -1,5 +1,2 @@ -# Assign bugs to android-enterprise-triage@google.com -file:WorkDeviceExperience_OWNERS -file:Provisioning_OWNERS -file:WorkProfile_OWNERS -file:EnterprisePlatformSecurity_OWNERS
\ No newline at end of file +sandness@google.com #{LAST_RESORT_SUGGESTION} +scottjonathan@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file diff --git a/core/java/android/app/admin/OWNERS b/core/java/android/app/admin/OWNERS index 10a5f14dca9e..308f1d622c25 100644 --- a/core/java/android/app/admin/OWNERS +++ b/core/java/android/app/admin/OWNERS @@ -1,5 +1,7 @@ # Bug component: 142675 +# Assign bugs to device-policy-manager-triage@google.com -file:EnterprisePlatform_OWNERS +file:WorkDeviceExperience_OWNERS +file:EnterprisePlatformSecurity_OWNERS yamasani@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file diff --git a/core/java/android/app/admin/Provisioning_OWNERS b/core/java/android/app/admin/Provisioning_OWNERS index 2e5c2df74280..fa0a1f09bfc8 100644 --- a/core/java/android/app/admin/Provisioning_OWNERS +++ b/core/java/android/app/admin/Provisioning_OWNERS @@ -1,5 +1,4 @@ # Assign bugs to android-enterprise-triage@google.com mdb.ae-provisioning-reviews@google.com -petuska@google.com #{LAST_RESORT_SUGGESTION} -nupursn@google.com #{LAST_RESORT_SUGGESTION} -shreyacsingh@google.com #{LAST_RESORT_SUGGESTION} +file:EnterprisePlatform_OWNERS +petuska@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file diff --git a/core/java/android/app/admin/WorkDeviceExperience_OWNERS b/core/java/android/app/admin/WorkDeviceExperience_OWNERS index 203334311da9..10ac59a53fff 100644 --- a/core/java/android/app/admin/WorkDeviceExperience_OWNERS +++ b/core/java/android/app/admin/WorkDeviceExperience_OWNERS @@ -1,7 +1,5 @@ # Assign bugs to android-enterprise-triage@google.com work-device-experience+reviews@google.com -scottjonathan@google.com #{LAST_RESORT_SUGGESTION} -eliselliott@google.com #{LAST_RESORT_SUGGESTION} +file:EnterprisePlatform_OWNERS kholoudm@google.com #{LAST_RESORT_SUGGESTION} acjohnston@google.com #{LAST_RESORT_SUGGESTION} -alexkershaw@google.com #{LAST_RESORT_SUGGESTION} diff --git a/core/java/android/app/admin/WorkProfile_OWNERS b/core/java/android/app/admin/WorkProfile_OWNERS index 260b672788d1..e9bcce21af60 100644 --- a/core/java/android/app/admin/WorkProfile_OWNERS +++ b/core/java/android/app/admin/WorkProfile_OWNERS @@ -1,5 +1,3 @@ # Assign bugs to android-enterprise-triage@google.com -liahav@google.com -olit@google.com -scottjonathan@google.com #{LAST_RESORT_SUGGESTION} -alexkershaw@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file +file:EnterprisePlatform_OWNERS +liahav@google.com
\ No newline at end of file diff --git a/core/java/android/app/assist/OWNERS b/core/java/android/app/assist/OWNERS index 80ecaa41dbf3..e4ffd7f41aa0 100644 --- a/core/java/android/app/assist/OWNERS +++ b/core/java/android/app/assist/OWNERS @@ -1,7 +1,2 @@ -augale@google.com -joannechung@google.com -markpun@google.com -lpeter@google.com -tymtsai@google.com hackz@google.com volnov@google.com
\ No newline at end of file diff --git a/core/java/android/app/search/SearchSession.java b/core/java/android/app/search/SearchSession.java index 0dbd81ee507d..99b64a05b5e2 100644 --- a/core/java/android/app/search/SearchSession.java +++ b/core/java/android/app/search/SearchSession.java @@ -104,7 +104,7 @@ public final class SearchSession implements AutoCloseable { mInterface = android.app.search.ISearchUiManager.Stub.asInterface(b); mSessionId = new SearchSessionId( context.getPackageName() + ":" + UUID.randomUUID().toString(), context.getUserId()); - // b/175527717 whitelist possible clients of this API + // b/175527717 allowlist possible clients of this API searchContext.setPackageName(context.getPackageName()); try { mInterface.createSearchSession(searchContext, mSessionId, mToken); diff --git a/core/java/android/companion/OWNERS b/core/java/android/companion/OWNERS index 0348fe2776fe..54d9c2401e11 100644 --- a/core/java/android/companion/OWNERS +++ b/core/java/android/companion/OWNERS @@ -1,3 +1,5 @@ evanxinchen@google.com guojing@google.com -raphk@google.com
\ No newline at end of file +jeremyns@google.com +raphk@google.com +yukl@google.com
\ No newline at end of file diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 06635eedeb9a..10857e51f916 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -592,7 +592,7 @@ public abstract class Context { public static final int BIND_IMPORTANT_BACKGROUND = 0x00800000; /** - * @hide Flag for {@link #bindService}: allows application hosting service to manage whitelists + * @hide Flag for {@link #bindService}: allows application hosting service to manage allowlists * such as temporary allowing a {@code PendingIntent} to bypass Power Save mode. */ public static final int BIND_ALLOW_WHITELIST_MANAGEMENT = 0x01000000; @@ -4081,6 +4081,7 @@ public abstract class Context { VIBRATOR_MANAGER_SERVICE, VIBRATOR_SERVICE, //@hide: STATUS_BAR_SERVICE, + THREAD_NETWORK_SERVICE, CONNECTIVITY_SERVICE, PAC_PROXY_SERVICE, VCN_MANAGEMENT_SERVICE, @@ -4756,6 +4757,20 @@ public abstract class Context { /** * Use with {@link #getSystemService(String)} to retrieve a + * {@link android.net.thread.ThreadNetworkManager}. + * + * <p>On devices without {@link PackageManager#FEATURE_THREAD_NETWORK} system feature + * the {@link #getSystemService(String)} will return {@code null}. + * + * @see #getSystemService(String) + * @see android.net.thread.ThreadNetworkManager + * @hide + */ + @SystemApi + public static final String THREAD_NETWORK_SERVICE = "thread_network"; + + /** + * Use with {@link #getSystemService(String)} to retrieve a * {@link android.net.IpSecManager} for encrypting Sockets or Networks with * IPSec. * @@ -6334,6 +6349,18 @@ public abstract class Context { /** * Use with {@link #getSystemService(String)} to retrieve a + * {@link android.remoteauth.RemoteAuthManager} to discover, + * register and authenticate via remote authenticator devices. + * + * @see #getSystemService(String) + * @see android.remoteauth.RemoteAuthManager + * @hide + */ + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + public static final String REMOTE_AUTH_SERVICE = "remote_auth"; + + /** + * Use with {@link #getSystemService(String)} to retrieve a * {@link android.app.ambientcontext.AmbientContextManager}. * * @see #getSystemService(String) diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index ccb53cf29fd4..406c79d2dba0 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -396,9 +396,9 @@ public class IntentSender implements Parcelable { } /** @hide */ - public IntentSender(IIntentSender target, IBinder whitelistToken) { + public IntentSender(IIntentSender target, IBinder allowlistToken) { mTarget = target; - mWhitelistToken = whitelistToken; + mWhitelistToken = allowlistToken; } /** @hide */ diff --git a/core/java/android/content/OWNERS b/core/java/android/content/OWNERS index d73f48a8f1f3..90c3d04d62d0 100644 --- a/core/java/android/content/OWNERS +++ b/core/java/android/content/OWNERS @@ -5,9 +5,7 @@ per-file *Content* = file:/services/core/java/com/android/server/am/OWNERS per-file *Sync* = file:/services/core/java/com/android/server/am/OWNERS per-file IntentFilter.java = file:/PACKAGE_MANAGER_OWNERS per-file IntentFilter.java = file:/services/core/java/com/android/server/am/OWNERS -per-file Intent.java = file:/PACKAGE_MANAGER_OWNERS -per-file Intent.java = file:/services/core/java/com/android/server/wm/OWNERS -per-file Intent.java = file:/services/core/java/com/android/server/am/OWNERS +per-file Intent.java = file:/INTENT_OWNERS per-file AutofillOptions* = file:/core/java/android/service/autofill/OWNERS per-file ContentCaptureOptions* = file:/core/java/android/service/contentcapture/OWNERS per-file LocusId* = file:/core/java/android/service/contentcapture/OWNERS diff --git a/core/java/android/content/om/IOverlayManager.aidl b/core/java/android/content/om/IOverlayManager.aidl index a0f3d7a2b8b7..122ab486948f 100644 --- a/core/java/android/content/om/IOverlayManager.aidl +++ b/core/java/android/content/om/IOverlayManager.aidl @@ -190,4 +190,15 @@ interface IOverlayManager { * @throws SecurityException if the transaction failed */ void commit(in OverlayManagerTransaction transaction); + + /** + * Returns a String of a list of partitions from low priority to high. + */ + String getPartitionOrder(); + + /** + * Returns a boolean which represent whether the partition list is sorted by default. + * If not then it should be sorted by /product/overlay/partition_order.xml. + */ + boolean isDefaultPartitionOrder(); } diff --git a/core/java/android/content/om/OWNERS b/core/java/android/content/om/OWNERS index 3669817e9844..72aed2d3fdaf 100644 --- a/core/java/android/content/om/OWNERS +++ b/core/java/android/content/om/OWNERS @@ -1,6 +1,5 @@ # Bug component: 568631 -toddke@android.com -toddke@google.com patb@google.com zyy@google.com +jakmcbane@google.com
\ No newline at end of file diff --git a/core/java/android/content/pm/AppSearchShortcutInfo.java b/core/java/android/content/pm/AppSearchShortcutInfo.java index fb41b890ce9c..225b3d3e18da 100644 --- a/core/java/android/content/pm/AppSearchShortcutInfo.java +++ b/core/java/android/content/pm/AppSearchShortcutInfo.java @@ -445,7 +445,7 @@ public class AppSearchShortcutInfo extends GenericDocument { @VisibleForTesting public static class Builder extends GenericDocument.Builder<Builder> { - private List<String> mFlags = new ArrayList<>(1); + private final List<String> mFlags = new ArrayList<>(1); public Builder(String packageName, String id) { super(/*namespace=*/ packageName, id, SCHEMA_TYPE); diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 3487e0b1f3e8..f0b99f1e6fac 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -67,7 +67,7 @@ import java.util.UUID; * <application> tag. */ public class ApplicationInfo extends PackageItemInfo implements Parcelable { - private static ForBoolean sForBoolean = Parcelling.Cache.getOrCreate(ForBoolean.class); + private static final ForBoolean sForBoolean = Parcelling.Cache.getOrCreate(ForBoolean.class); private static final Parcelling.BuiltIn.ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(Parcelling.BuiltIn.ForStringSet.class); @@ -1892,7 +1892,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private final Collator sCollator = Collator.getInstance(); @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) - private PackageManager mPM; + private final PackageManager mPM; } public ApplicationInfo() { diff --git a/core/java/android/content/pm/Attribution.java b/core/java/android/content/pm/Attribution.java index 989a5b9ad1c2..364924985314 100644 --- a/core/java/android/content/pm/Attribution.java +++ b/core/java/android/content/pm/Attribution.java @@ -33,7 +33,7 @@ public final class Attribution implements Parcelable { /** * The tag of this attribution. From the <manifest> tag's "tag" attribute */ - private @NonNull String mTag; + private final @NonNull String mTag; /** * The resource ID of the label of the attribution From the <manifest> tag's "label" @@ -43,7 +43,7 @@ public final class Attribution implements Parcelable { - // Code below generated by codegen v1.0.22. + // Code below generated by codegen v1.0.23. // // DO NOT MODIFY! // CHECKSTYLE:OFF Generated code @@ -146,10 +146,10 @@ public final class Attribution implements Parcelable { }; @DataClass.Generated( - time = 1608139558081L, - codegenVersion = "1.0.22", + time = 1683311736586L, + codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/content/pm/Attribution.java", - inputSignatures = "private @android.annotation.NonNull java.lang.String mTag\nprivate final @android.annotation.IdRes int mLabel\nclass Attribution extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstructor=true)") + inputSignatures = "private final @android.annotation.NonNull java.lang.String mTag\nprivate final @android.annotation.IdRes int mLabel\nclass Attribution extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genHiddenConstructor=true)") @Deprecated private void __metadata() {} diff --git a/core/java/android/content/pm/BaseParceledListSlice.java b/core/java/android/content/pm/BaseParceledListSlice.java index 37b17788c9cc..cc4e9c8aba43 100644 --- a/core/java/android/content/pm/BaseParceledListSlice.java +++ b/core/java/android/content/pm/BaseParceledListSlice.java @@ -42,8 +42,8 @@ import java.util.List; * @hide */ abstract class BaseParceledListSlice<T> implements Parcelable { - private static String TAG = "ParceledListSlice"; - private static boolean DEBUG = false; + private static final String TAG = "ParceledListSlice"; + private static final boolean DEBUG = false; /* * TODO get this number from somewhere else. For now set it to a quarter of diff --git a/core/java/android/content/pm/CapabilityParams.java b/core/java/android/content/pm/CapabilityParams.java index 7239bacf1221..60e8123b0029 100644 --- a/core/java/android/content/pm/CapabilityParams.java +++ b/core/java/android/content/pm/CapabilityParams.java @@ -172,7 +172,7 @@ public final class CapabilityParams implements Parcelable { @NonNull private final String mKey; @NonNull - private String mPrimaryValue; + private final String mPrimaryValue; @NonNull private Set<String> mAliases; diff --git a/core/java/android/content/pm/Checksum.java b/core/java/android/content/pm/Checksum.java index ff17496c7457..20967274d0e4 100644 --- a/core/java/android/content/pm/Checksum.java +++ b/core/java/android/content/pm/Checksum.java @@ -40,11 +40,11 @@ public final class Checksum implements Parcelable { /** * Root SHA256 hash of a 4K Merkle tree computed over all file bytes. * <a href="https://source.android.com/security/apksigning/v4">See APK Signature Scheme V4</a>. - * <a href="https://git.kernel.org/pub/scm/fs/fscrypt/fscrypt.git/tree/Documentation/filesystems/fsverity.rst">See fs-verity</a>. + * <a href="https://www.kernel.org/doc/html/latest/filesystems/fsverity.html">See fs-verity</a>. * * Recommended for all new applications. * Can be used by kernel to enforce authenticity and integrity of the APK. - * <a href="https://git.kernel.org/pub/scm/fs/fscrypt/fscrypt.git/tree/Documentation/filesystems/fsverity.rst#">See fs-verity for details</a> + * <a href="https://www.kernel.org/doc/html/latest/filesystems/fsverity.html">See fs-verity for details</a> * * @see PackageManager#requestChecksums */ diff --git a/core/java/android/content/pm/IncrementalStatesInfo.java b/core/java/android/content/pm/IncrementalStatesInfo.java index f15afdfb7da1..7098249dc4e6 100644 --- a/core/java/android/content/pm/IncrementalStatesInfo.java +++ b/core/java/android/content/pm/IncrementalStatesInfo.java @@ -24,8 +24,8 @@ import android.os.Parcelable; * @hide */ public class IncrementalStatesInfo implements Parcelable { - private boolean mIsLoading; - private float mProgress; + private final boolean mIsLoading; + private final float mProgress; private long mLoadingCompletedTime; diff --git a/core/java/android/content/pm/KeySet.java b/core/java/android/content/pm/KeySet.java index fd459e662845..3da5bfff76fc 100644 --- a/core/java/android/content/pm/KeySet.java +++ b/core/java/android/content/pm/KeySet.java @@ -29,7 +29,7 @@ import android.os.Parcelable; */ public class KeySet implements Parcelable { - private IBinder token; + private final IBinder token; /** @hide */ public KeySet(IBinder token) { diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index d6592d572726..3165e292166b 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -1737,7 +1737,8 @@ public class LauncherApps { mCallbacks.add(toAdd); } - private IOnAppsChangedListener.Stub mAppsChangedListener = new IOnAppsChangedListener.Stub() { + private final IOnAppsChangedListener.Stub mAppsChangedListener = + new IOnAppsChangedListener.Stub() { @Override public void onPackageRemoved(UserHandle user, String packageName) @@ -1872,7 +1873,7 @@ public class LauncherApps { private static final int MSG_SHORTCUT_CHANGED = 8; private static final int MSG_LOADING_PROGRESS_CHANGED = 9; - private LauncherApps.Callback mCallback; + private final LauncherApps.Callback mCallback; private static class CallbackInfo { String[] packageNames; diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 105b38a40825..ef26235a3879 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -2369,6 +2369,8 @@ public class PackageInstaller { public int requireUserAction = USER_ACTION_UNSPECIFIED; /** {@hide} */ public boolean applicationEnabledSettingPersistent = false; + /** {@hide} */ + public int developmentInstallFlags = 0; private final ArrayMap<String, Integer> mPermissionStates; @@ -2418,6 +2420,7 @@ public class PackageInstaller { requireUserAction = source.readInt(); packageSource = source.readInt(); applicationEnabledSettingPersistent = source.readBoolean(); + developmentInstallFlags = source.readInt(); } /** {@hide} */ @@ -2449,6 +2452,7 @@ public class PackageInstaller { ret.requireUserAction = requireUserAction; ret.packageSource = packageSource; ret.applicationEnabledSettingPersistent = applicationEnabledSettingPersistent; + ret.developmentInstallFlags = developmentInstallFlags; return ret; } @@ -3117,6 +3121,7 @@ public class PackageInstaller { pw.printPair("rollbackDataPolicy", rollbackDataPolicy); pw.printPair("applicationEnabledSettingPersistent", applicationEnabledSettingPersistent); + pw.printHexPair("developmentInstallFlags", developmentInstallFlags); pw.println(); } @@ -3158,6 +3163,7 @@ public class PackageInstaller { dest.writeInt(requireUserAction); dest.writeInt(packageSource); dest.writeBoolean(applicationEnabledSettingPersistent); + dest.writeInt(developmentInstallFlags); } public static final Parcelable.Creator<SessionParams> diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 2bac066ed186..bb978e05dd16 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -502,6 +502,6 @@ public class PackageItemInfo { } private final Collator sCollator = Collator.getInstance(); - private PackageManager mPM; + private final PackageManager mPM; } } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 2a0d4acbe76f..02650c65e1a4 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1454,6 +1454,16 @@ public abstract class PackageManager { public @interface InstallFlags {} /** + * Install flags that can only be used in development workflows (e.g. {@code adb install}). + * @hide + */ + @IntDef(flag = true, prefix = { "INSTALL_DEVELOPMENT_" }, value = { + INSTALL_DEVELOPMENT_FORCE_NON_STAGED_APEX_UPDATE, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface DevelopmentInstallFlags {} + + /** * Flag parameter for {@link #installPackage} to indicate that you want to * replace an already installed package, if one exists. * @@ -1663,6 +1673,14 @@ public abstract class PackageManager { */ public static final int INSTALL_FROM_MANAGED_USER_OR_PROFILE = 1 << 26; + /** + * Flag parameter for {@link #installPackage} to force a non-staged update of an APEX. This is + * a development-only feature and should not be used on end user devices. + * + * @hide + */ + public static final int INSTALL_DEVELOPMENT_FORCE_NON_STAGED_APEX_UPDATE = 1; + /** @hide */ @IntDef(flag = true, value = { DONT_KILL_APP, @@ -3616,6 +3634,14 @@ public abstract class PackageManager { "android.hardware.telephony.subscription"; /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: + * The device is capable of communicating with other devices via + * <a href="https://www.threadgroup.org">Thread</a> networking protocol. + */ + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_THREAD_NETWORK = "android.hardware.thread_network"; + + /** * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device is capable of communicating with * other devices via ultra wideband. diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 048289f56a0c..18611d8867ef 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1949,6 +1949,8 @@ public class PackageParser { int type; boolean foundApp = false; + String pkgName = (pkg != null) ? pkg.packageName : "<unknown>"; + TypedArray sa = res.obtainAttributes(parser, com.android.internal.R.styleable.AndroidManifest); @@ -2218,14 +2220,14 @@ public class PackageParser { sa.recycle(); final int minSdkVersion = PackageParser.computeMinSdkVersion(minVers, minCode, - SDK_VERSION, SDK_CODENAMES, outError); + SDK_VERSION, SDK_CODENAMES, outError, pkgName); if (minSdkVersion < 0) { mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; return null; } final int targetSdkVersion = PackageParser.computeTargetSdkVersion(targetVers, - targetCode, SDK_CODENAMES, outError); + targetCode, SDK_CODENAMES, outError, pkgName); if (targetSdkVersion < 0) { mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; return null; @@ -2610,13 +2612,15 @@ public class PackageParser { * @param platformSdkCodenames array of allowed pre-release SDK codenames * for this platform * @param outError output array to populate with error, if applicable + * @param pkgName for debug logging * @return the targetSdkVersion to use at runtime, or -1 if the package is * not compatible with this platform * @hide Exposed for unit testing only. */ public static int computeTargetSdkVersion(@IntRange(from = 0) int targetVers, @Nullable String targetCode, @NonNull String[] platformSdkCodenames, - @NonNull String[] outError) { + @NonNull String[] outError, + String pkgName) { // If it's a release SDK, return the version number unmodified. if (targetCode == null) { return targetVers; @@ -2628,6 +2632,15 @@ public class PackageParser { return Build.VERSION_CODES.CUR_DEVELOPMENT; } + // TODO(b/294161396): add a check for a "true REL" flag. + if (platformSdkCodenames.length == 0 + && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( + targetCode)) { + Slog.w(TAG, "Package " + pkgName + " requires development platform " + targetCode + + ", returning current version " + Build.VERSION.SDK_INT); + return Build.VERSION.SDK_INT; + } + // Otherwise, we're looking at an incompatible pre-release SDK. if (platformSdkCodenames.length > 0) { outError[0] = "Requires development platform " + targetCode @@ -2674,13 +2687,15 @@ public class PackageParser { * @param platformSdkCodenames array of allowed prerelease SDK codenames * for this platform * @param outError output array to populate with error, if applicable + * @param pkgName for debug logging * @return the minSdkVersion to use at runtime, or -1 if the package is not * compatible with this platform * @hide Exposed for unit testing only. */ public static int computeMinSdkVersion(@IntRange(from = 1) int minVers, @Nullable String minCode, @IntRange(from = 1) int platformSdkVersion, - @NonNull String[] platformSdkCodenames, @NonNull String[] outError) { + @NonNull String[] platformSdkCodenames, @NonNull String[] outError, + String pkgName) { // If it's a release SDK, make sure we meet the minimum SDK requirement. if (minCode == null) { if (minVers <= platformSdkVersion) { @@ -2699,6 +2714,15 @@ public class PackageParser { return Build.VERSION_CODES.CUR_DEVELOPMENT; } + // TODO(b/294161396): add a check for a "true REL" flag. + if (platformSdkCodenames.length == 0 + && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( + minCode)) { + Slog.w(TAG, "Package " + pkgName + " requires min development platform " + minCode + + ", returning current version " + Build.VERSION.SDK_INT); + return Build.VERSION.SDK_INT; + } + // Otherwise, we're looking at an incompatible pre-release SDK. if (platformSdkCodenames.length > 0) { outError[0] = "Requires development platform " + minCode diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java index 4fa80d7d7f40..dd3782c48654 100644 --- a/core/java/android/content/pm/PermissionInfo.java +++ b/core/java/android/content/pm/PermissionInfo.java @@ -489,7 +489,8 @@ public class PermissionInfo extends PackageItemInfo implements Parcelable { */ public @Nullable CharSequence nonLocalizedDescription; - private static ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(ForStringSet.class); + private static final ForStringSet sForStringSet = + Parcelling.Cache.getOrCreate(ForStringSet.class); /** * A {@link Set} of trusted signing certificate digests. If this permission has the {@link diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index f90044027b09..25707f9984f9 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -577,6 +577,6 @@ public class ResolveInfo implements Parcelable { } private final Collator mCollator = Collator.getInstance(); - private PackageManager mPM; + private final PackageManager mPM; } } diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java index 4f6bcb6f0be5..dcb1b7eb8320 100644 --- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java @@ -578,14 +578,14 @@ public class ApkLiteParseUtils { ParseResult<Integer> targetResult = FrameworkParsingPackageUtils.computeTargetSdkVersion( targetVer, targetCode, SDK_CODENAMES, input, - allowUnknownCodenames); + allowUnknownCodenames, codePath); if (targetResult.isError()) { return input.error(targetResult); } targetSdkVersion = targetResult.getResult(); ParseResult<Integer> minResult = FrameworkParsingPackageUtils.computeMinSdkVersion( - minVer, minCode, SDK_VERSION, SDK_CODENAMES, input); + minVer, minCode, SDK_VERSION, SDK_CODENAMES, input, codePath); if (minResult.isError()) { return input.error(minResult); } diff --git a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java index 3e1c5bb3d7ec..30e289f62698 100644 --- a/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/FrameworkParsingPackageUtils.java @@ -293,11 +293,14 @@ public class FrameworkParsingPackageUtils { * {@code null} otherwise * @param platformSdkVersion platform SDK version number, typically Build.VERSION.SDK_INT * @param platformSdkCodenames array of allowed prerelease SDK codenames for this platform + * @param input parsing context + * @param pkgName for debug logging * @return the minSdkVersion to use at runtime if successful */ public static ParseResult<Integer> computeMinSdkVersion(@IntRange(from = 1) int minVers, @Nullable String minCode, @IntRange(from = 1) int platformSdkVersion, - @NonNull String[] platformSdkCodenames, @NonNull ParseInput input) { + @NonNull String[] platformSdkCodenames, @NonNull ParseInput input, + String pkgName) { // If it's a release SDK, make sure we meet the minimum SDK requirement. if (minCode == null) { if (minVers <= platformSdkVersion) { @@ -316,6 +319,15 @@ public class FrameworkParsingPackageUtils { return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT); } + // TODO(b/294161396): add a check for a "true REL" flag. + if (platformSdkCodenames.length == 0 + && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( + minCode)) { + Slog.w(TAG, "Parsed package " + pkgName + " requires min development platform " + + minCode + ", returning current version " + Build.VERSION.SDK_INT); + return input.success(Build.VERSION.SDK_INT); + } + // Otherwise, we're looking at an incompatible pre-release SDK. if (platformSdkCodenames.length > 0) { return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, @@ -358,29 +370,38 @@ public class FrameworkParsingPackageUtils { * @param platformSdkCodenames array of allowed pre-release SDK codenames for this platform * @param allowUnknownCodenames allow unknown codenames, if true this method will accept unknown * (presumed to be future) codenames + * @param pkgName for debug logging * @return the targetSdkVersion to use at runtime if successful */ public static ParseResult<Integer> computeTargetSdkVersion(@IntRange(from = 0) int targetVers, @Nullable String targetCode, @NonNull String[] platformSdkCodenames, - @NonNull ParseInput input, boolean allowUnknownCodenames) { + @NonNull ParseInput input, boolean allowUnknownCodenames, + String pkgName) { // If it's a release SDK, return the version number unmodified. if (targetCode == null) { return input.success(targetVers); } + // TODO(b/294161396): add a check for a "true REL" flag. + // If it's a pre-release SDK and the codename matches this platform, it + // definitely targets this SDK. + if (matchTargetCode(platformSdkCodenames, targetCode)) { + return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT); + } + if (platformSdkCodenames.length == 0 + && Build.VERSION.KNOWN_CODENAMES.stream().max(String::compareTo).orElse("").equals( + targetCode)) { + Slog.w(TAG, "Parsed package " + pkgName + " requires development platform " + targetCode + + ", returning current version " + Build.VERSION.SDK_INT); + return input.success(Build.VERSION.SDK_INT); + } + try { if (allowUnknownCodenames && UnboundedSdkLevel.isAtMost(targetCode)) { return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT); } } catch (IllegalArgumentException e) { - // isAtMost() throws it when encountering an older SDK codename - return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, e.getMessage()); - } - - // If it's a pre-release SDK and the codename matches this platform, it - // definitely targets this SDK. - if (matchTargetCode(platformSdkCodenames, targetCode)) { - return input.success(Build.VERSION_CODES.CUR_DEVELOPMENT); + return input.error(PackageManager.INSTALL_FAILED_OLDER_SDK, "Bad package SDK"); } // Otherwise, we're looking at an incompatible pre-release SDK. diff --git a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java index c32370441e97..8343c9213e19 100644 --- a/core/java/android/content/pm/parsing/result/ParseTypeImpl.java +++ b/core/java/android/content/pm/parsing/result/ParseTypeImpl.java @@ -41,7 +41,7 @@ public class ParseTypeImpl implements ParseInput, ParseResult<Object> { public static final boolean DEBUG_THROW_ALL_ERRORS = false; @NonNull - private Callback mCallback; + private final Callback mCallback; private Object mResult; diff --git a/core/java/android/content/res/OWNERS b/core/java/android/content/res/OWNERS index a7bce122eb35..141d58d51353 100644 --- a/core/java/android/content/res/OWNERS +++ b/core/java/android/content/res/OWNERS @@ -1,8 +1,7 @@ # Bug component: 568761 -toddke@android.com -toddke@google.com patb@google.com zyy@google.com +branliu@google.com per-file FontScaleConverter*=fuego@google.com
\ No newline at end of file diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index c3d5b71e7349..ed22284ae23d 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -54,6 +54,7 @@ import android.graphics.drawable.Drawable.ConstantState; import android.graphics.drawable.DrawableInflater; import android.os.Build; import android.os.Bundle; +import android.os.SystemClock; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AttributeSet; @@ -133,6 +134,11 @@ public class Resources { private static final Object sSync = new Object(); private final Object mUpdateLock = new Object(); + /** + * Controls whether we should preload resources during zygote init. + */ + private static final boolean PRELOAD_RESOURCES = true; + // Used by BridgeResources in layoutlib @UnsupportedAppUsage static Resources mSystem = null; @@ -2705,6 +2711,98 @@ public class Resources { } } + /** + * Load in commonly used resources, so they can be shared across processes. + * + * These tend to be a few Kbytes, but are frequently in the 20-40K range, and occasionally even + * larger. + * @hide + */ + @UnsupportedAppUsage + public static void preloadResources() { + try { + final Resources sysRes = Resources.getSystem(); + sysRes.startPreloading(); + if (PRELOAD_RESOURCES) { + Log.i(TAG, "Preloading resources..."); + + long startTime = SystemClock.uptimeMillis(); + TypedArray ar = sysRes.obtainTypedArray( + com.android.internal.R.array.preloaded_drawables); + int numberOfEntries = preloadDrawables(sysRes, ar); + ar.recycle(); + Log.i(TAG, "...preloaded " + numberOfEntries + " resources in " + + (SystemClock.uptimeMillis() - startTime) + "ms."); + + startTime = SystemClock.uptimeMillis(); + ar = sysRes.obtainTypedArray( + com.android.internal.R.array.preloaded_color_state_lists); + numberOfEntries = preloadColorStateLists(sysRes, ar); + ar.recycle(); + Log.i(TAG, "...preloaded " + numberOfEntries + " resources in " + + (SystemClock.uptimeMillis() - startTime) + "ms."); + + if (sysRes.getBoolean( + com.android.internal.R.bool.config_freeformWindowManagement)) { + startTime = SystemClock.uptimeMillis(); + ar = sysRes.obtainTypedArray( + com.android.internal.R.array.preloaded_freeform_multi_window_drawables); + numberOfEntries = preloadDrawables(sysRes, ar); + ar.recycle(); + Log.i(TAG, "...preloaded " + numberOfEntries + " resource in " + + (SystemClock.uptimeMillis() - startTime) + "ms."); + } + } + sysRes.finishPreloading(); + } catch (RuntimeException e) { + Log.w(TAG, "Failure preloading resources", e); + } + } + + private static int preloadColorStateLists(Resources resources, TypedArray ar) { + final int numberOfEntries = ar.length(); + for (int i = 0; i < numberOfEntries; i++) { + int id = ar.getResourceId(i, 0); + + if (id != 0) { + if (resources.getColorStateList(id, null) == null) { + throw new IllegalArgumentException( + "Unable to find preloaded color resource #0x" + + Integer.toHexString(id) + + " (" + ar.getString(i) + ")"); + } + } + } + return numberOfEntries; + } + + private static int preloadDrawables(Resources resources, TypedArray ar) { + final int numberOfEntries = ar.length(); + for (int i = 0; i < numberOfEntries; i++) { + int id = ar.getResourceId(i, 0); + + if (id != 0) { + if (resources.getDrawable(id, null) == null) { + throw new IllegalArgumentException( + "Unable to find preloaded drawable resource #0x" + + Integer.toHexString(id) + + " (" + ar.getString(i) + ")"); + } + } + } + return numberOfEntries; + } + + /** + * Clear the cache when the framework resources packages is changed. + * @hide + */ + @VisibleForTesting + public static void resetPreloadDrawableStateCache() { + ResourcesImpl.resetDrawableStateCache(); + preloadResources(); + } + /** @hide */ public void dump(PrintWriter pw, String prefix) { pw.println(prefix + "class=" + getClass()); diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index 1fdfcd067867..3ccfc6f05e72 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -54,6 +54,7 @@ import android.util.TypedValue; import android.util.Xml; import android.view.DisplayAdjustments; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.GrowingArrayUtils; import libcore.util.NativeAllocationRegistry; @@ -163,6 +164,23 @@ public class ResourcesImpl { } /** + * Clear the cache when the framework resources packages is changed. + * + * It's only used in the test initial function instead of regular app behaviors. It doesn't + * guarantee the thread-safety so mark this with @VisibleForTesting. + */ + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) + static void resetDrawableStateCache() { + synchronized (sSync) { + sPreloadedDrawables[0].clear(); + sPreloadedDrawables[1].clear(); + sPreloadedColorDrawables.clear(); + sPreloadedComplexColors.clear(); + sPreloaded = false; + } + } + + /** * Creates a new ResourcesImpl object with CompatibilityInfo. * * @param assets Previously created AssetManager. diff --git a/core/java/android/credentials/ui/BaseDialogResult.java b/core/java/android/credentials/ui/BaseDialogResult.java index f0442de74e9e..e8cf5abd5239 100644 --- a/core/java/android/credentials/ui/BaseDialogResult.java +++ b/core/java/android/credentials/ui/BaseDialogResult.java @@ -85,15 +85,15 @@ public class BaseDialogResult implements Parcelable { */ public static final int RESULT_CODE_DATA_PARSING_FAILURE = 3; - @NonNull + @Nullable private final IBinder mRequestToken; - public BaseDialogResult(@NonNull IBinder requestToken) { + public BaseDialogResult(@Nullable IBinder requestToken) { mRequestToken = requestToken; } /** Returns the unique identifier for the request that launched the operation. */ - @NonNull + @Nullable public IBinder getRequestToken() { return mRequestToken; } @@ -101,7 +101,6 @@ public class BaseDialogResult implements Parcelable { protected BaseDialogResult(@NonNull Parcel in) { IBinder requestToken = in.readStrongBinder(); mRequestToken = requestToken; - AnnotationValidations.validate(NonNull.class, null, mRequestToken); } @Override diff --git a/core/java/android/credentials/ui/UserSelectionDialogResult.java b/core/java/android/credentials/ui/UserSelectionDialogResult.java index 44b3b36844c2..3089bf674b95 100644 --- a/core/java/android/credentials/ui/UserSelectionDialogResult.java +++ b/core/java/android/credentials/ui/UserSelectionDialogResult.java @@ -60,7 +60,7 @@ public final class UserSelectionDialogResult extends BaseDialogResult implements @Nullable private ProviderPendingIntentResponse mProviderPendingIntentResponse; public UserSelectionDialogResult( - @NonNull IBinder requestToken, @NonNull String providerId, + @Nullable IBinder requestToken, @NonNull String providerId, @NonNull String entryKey, @NonNull String entrySubkey) { super(requestToken); mProviderId = providerId; @@ -69,7 +69,7 @@ public final class UserSelectionDialogResult extends BaseDialogResult implements } public UserSelectionDialogResult( - @NonNull IBinder requestToken, @NonNull String providerId, + @Nullable IBinder requestToken, @NonNull String providerId, @NonNull String entryKey, @NonNull String entrySubkey, @Nullable ProviderPendingIntentResponse providerPendingIntentResponse) { super(requestToken); diff --git a/core/java/android/database/OWNERS b/core/java/android/database/OWNERS index 7e19942ba332..53f5bb0ab492 100644 --- a/core/java/android/database/OWNERS +++ b/core/java/android/database/OWNERS @@ -1,3 +1,6 @@ +include /SQLITE_OWNERS + omakoto@google.com jsharkey@android.com yamasani@google.com + diff --git a/core/java/android/database/sqlite/OWNERS b/core/java/android/database/sqlite/OWNERS new file mode 100644 index 000000000000..3bebc7c56f61 --- /dev/null +++ b/core/java/android/database/sqlite/OWNERS @@ -0,0 +1 @@ +include /SQLITE_OWNERS diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index c08294f42c45..e14d8dcb8ecd 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -890,7 +890,7 @@ public final class SQLiteDatabase extends SQLiteClosable { * Open the database according to the flags {@link #OPEN_READWRITE} * {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}. * - * <p>Sets the locale of the database to the the system's current locale. + * <p>Sets the locale of the database to the system's current locale. * Call {@link #setLocale} if you would like something else.</p> * * @param path to database file to open and/or create @@ -936,7 +936,7 @@ public final class SQLiteDatabase extends SQLiteClosable { * Open the database according to the flags {@link #OPEN_READWRITE} * {@link #OPEN_READONLY} {@link #CREATE_IF_NECESSARY} and/or {@link #NO_LOCALIZED_COLLATORS}. * - * <p>Sets the locale of the database to the the system's current locale. + * <p>Sets the locale of the database to the system's current locale. * Call {@link #setLocale} if you would like something else.</p> * * <p>Accepts input param: a concrete instance of {@link DatabaseErrorHandler} to be @@ -1097,7 +1097,7 @@ public final class SQLiteDatabase extends SQLiteClosable { * Create a memory backed SQLite database. Its contents will be destroyed * when the database is closed. * - * <p>Sets the locale of the database to the the system's current locale. + * <p>Sets the locale of the database to the system's current locale. * Call {@link #setLocale} if you would like something else.</p> * * @param factory an optional factory class that is called to instantiate a @@ -1116,7 +1116,7 @@ public final class SQLiteDatabase extends SQLiteClosable { * Create a memory backed SQLite database. Its contents will be destroyed * when the database is closed. * - * <p>Sets the locale of the database to the the system's current locale. + * <p>Sets the locale of the database to the system's current locale. * Call {@link #setLocale} if you would like something else.</p> * @param openParams configuration parameters that are used for opening SQLiteDatabase * @return a SQLiteDatabase instance diff --git a/core/java/android/database/sqlite/package.html b/core/java/android/database/sqlite/package.html index 6ececa2e1416..71b8f3f8e17a 100644 --- a/core/java/android/database/sqlite/package.html +++ b/core/java/android/database/sqlite/package.html @@ -20,6 +20,9 @@ with adb shell, for example, <code>adb -e shell sqlite3</code>. <p>The version of SQLite depends on the version of Android. See the following table: <table style="width:auto;"> <tr><th>Android API</th><th>SQLite Version</th></tr> + <tr><td>API 34</td><td>3.39</td></tr> + <tr><td>API 33</td><td>3.32</td></tr> + <tr><td>API 32</td><td>3.32</td></tr> <tr><td>API 31</td><td>3.32</td></tr> <tr><td>API 30</td><td>3.28</td></tr> <tr><td>API 28</td><td>3.22</td></tr> diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index ccc39b6080d7..039644387715 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -41,11 +41,6 @@ import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; -import android.renderscript.Allocation; -import android.renderscript.Element; -import android.renderscript.RSIllegalArgumentException; -import android.renderscript.RenderScript; -import android.renderscript.Type; import android.text.TextUtils; import android.util.Log; import android.view.Surface; @@ -1007,132 +1002,6 @@ public class Camera { private native final void _addCallbackBuffer( byte[] callbackBuffer, int msgType); - /** - * <p>Create a {@link android.renderscript RenderScript} - * {@link android.renderscript.Allocation Allocation} to use as a - * destination of preview callback frames. Use - * {@link #setPreviewCallbackAllocation setPreviewCallbackAllocation} to use - * the created Allocation as a destination for camera preview frames.</p> - * - * <p>The Allocation will be created with a YUV type, and its contents must - * be accessed within Renderscript with the {@code rsGetElementAtYuv_*} - * accessor methods. Its size will be based on the current - * {@link Parameters#getPreviewSize preview size} configured for this - * camera.</p> - * - * @param rs the RenderScript context for this Allocation. - * @param usage additional usage flags to set for the Allocation. The usage - * flag {@link android.renderscript.Allocation#USAGE_IO_INPUT} will always - * be set on the created Allocation, but additional flags may be provided - * here. - * @return a new YUV-type Allocation with dimensions equal to the current - * preview size. - * @throws RSIllegalArgumentException if the usage flags are not compatible - * with an YUV Allocation. - * @see #setPreviewCallbackAllocation - * @hide - */ - public final Allocation createPreviewAllocation(RenderScript rs, int usage) - throws RSIllegalArgumentException { - Parameters p = getParameters(); - Size previewSize = p.getPreviewSize(); - Type.Builder yuvBuilder = new Type.Builder(rs, - Element.createPixel(rs, - Element.DataType.UNSIGNED_8, - Element.DataKind.PIXEL_YUV)); - // Use YV12 for wide compatibility. Changing this requires also - // adjusting camera service's format selection. - yuvBuilder.setYuvFormat(ImageFormat.YV12); - yuvBuilder.setX(previewSize.width); - yuvBuilder.setY(previewSize.height); - - Allocation a = Allocation.createTyped(rs, yuvBuilder.create(), - usage | Allocation.USAGE_IO_INPUT); - - return a; - } - - /** - * <p>Set an {@link android.renderscript.Allocation Allocation} as the - * target of preview callback data. Use this method for efficient processing - * of camera preview data with RenderScript. The Allocation must be created - * with the {@link #createPreviewAllocation createPreviewAllocation } - * method.</p> - * - * <p>Setting a preview allocation will disable any active preview callbacks - * set by {@link #setPreviewCallback setPreviewCallback} or - * {@link #setPreviewCallbackWithBuffer setPreviewCallbackWithBuffer}, and - * vice versa. Using a preview allocation still requires an active standard - * preview target to be set, either with - * {@link #setPreviewTexture setPreviewTexture} or - * {@link #setPreviewDisplay setPreviewDisplay}.</p> - * - * <p>To be notified when new frames are available to the Allocation, use - * {@link android.renderscript.Allocation#setIoInputNotificationHandler Allocation.setIoInputNotificationHandler}. To - * update the frame currently accessible from the Allocation to the latest - * preview frame, call - * {@link android.renderscript.Allocation#ioReceive Allocation.ioReceive}.</p> - * - * <p>To disable preview into the Allocation, call this method with a - * {@code null} parameter.</p> - * - * <p>Once a preview allocation is set, the preview size set by - * {@link Parameters#setPreviewSize setPreviewSize} cannot be changed. If - * you wish to change the preview size, first remove the preview allocation - * by calling {@code setPreviewCallbackAllocation(null)}, then change the - * preview size, create a new preview Allocation with - * {@link #createPreviewAllocation createPreviewAllocation}, and set it as - * the new preview callback allocation target.</p> - * - * <p>If you are using the preview data to create video or still images, - * strongly consider using {@link android.media.MediaActionSound} to - * properly indicate image capture or recording start/stop to the user.</p> - * - * @param previewAllocation the allocation to use as destination for preview - * @throws IOException if configuring the camera to use the Allocation for - * preview fails. - * @throws IllegalArgumentException if the Allocation's dimensions or other - * parameters don't meet the requirements. - * @see #createPreviewAllocation - * @see #setPreviewCallback - * @see #setPreviewCallbackWithBuffer - * @hide - */ - public final void setPreviewCallbackAllocation(Allocation previewAllocation) - throws IOException { - Surface previewSurface = null; - if (previewAllocation != null) { - Parameters p = getParameters(); - Size previewSize = p.getPreviewSize(); - if (previewSize.width != previewAllocation.getType().getX() || - previewSize.height != previewAllocation.getType().getY()) { - throw new IllegalArgumentException( - "Allocation dimensions don't match preview dimensions: " + - "Allocation is " + - previewAllocation.getType().getX() + - ", " + - previewAllocation.getType().getY() + - ". Preview is " + previewSize.width + ", " + - previewSize.height); - } - if ((previewAllocation.getUsage() & - Allocation.USAGE_IO_INPUT) == 0) { - throw new IllegalArgumentException( - "Allocation usage does not include USAGE_IO_INPUT"); - } - if (previewAllocation.getType().getElement().getDataKind() != - Element.DataKind.PIXEL_YUV) { - throw new IllegalArgumentException( - "Allocation is not of a YUV type"); - } - previewSurface = previewAllocation.getSurface(); - mUsingPreviewAllocation = true; - } else { - mUsingPreviewAllocation = false; - } - setPreviewCallbackSurface(previewSurface); - } - private native final void setPreviewCallbackSurface(Surface s); private class EventHandler extends Handler diff --git a/core/java/android/hardware/SensorAdditionalInfo.java b/core/java/android/hardware/SensorAdditionalInfo.java index 12edc5eb7e33..d1e101d563c4 100644 --- a/core/java/android/hardware/SensorAdditionalInfo.java +++ b/core/java/android/hardware/SensorAdditionalInfo.java @@ -63,7 +63,7 @@ public class SensorAdditionalInfo { public final int[] intValues; /** - * Typical values of additional infomation type. The set of values is subject to extension in + * Typical values of additional information type. The set of values is subject to extension in * newer versions and vendors have the freedom of define their own custom values. * * @hide @@ -257,7 +257,7 @@ public class SensorAdditionalInfo { public static SensorAdditionalInfo createLocalGeomagneticField( float strength, float declination, float inclination) { if (strength < 10 || strength > 100 // much beyond extreme values on earth - || declination < 0 || declination > Math.PI + || declination < -Math.PI / 2 || declination > Math.PI / 2 || inclination < -Math.PI / 2 || inclination > Math.PI / 2) { throw new IllegalArgumentException("Geomagnetic field info out of range"); } diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index c2aebd7cfaca..f033f9740b3d 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -893,9 +893,9 @@ public abstract class SensorManager { /** * Flushes the FIFO of all the sensors registered for this listener. If there are events - * in the FIFO of the sensor, they are returned as if the maxReportLantecy of the FIFO has + * in the FIFO of the sensor, they are returned as if the maxReportLatency of the FIFO has * expired. Events are returned in the usual way through the SensorEventListener. - * This call doesn't affect the maxReportLantecy for this sensor. This call is asynchronous and + * This call doesn't affect the maxReportLatency for this sensor. This call is asynchronous and * returns immediately. * {@link android.hardware.SensorEventListener2#onFlushCompleted onFlushCompleted} is called * after all the events in the batch at the time of calling this method have been delivered @@ -923,7 +923,7 @@ public abstract class SensorManager { * Create a sensor direct channel backed by shared memory wrapped in MemoryFile object. * * The resulting channel can be used for delivering sensor events to native code, other - * processes, GPU/DSP or other co-processors without CPU intervention. This is the recommanded + * processes, GPU/DSP or other co-processors without CPU intervention. This is the recommended * for high performance sensor applications that use high sensor rates (e.g. greater than 200Hz) * and cares about sensor event latency. * @@ -945,7 +945,7 @@ public abstract class SensorManager { * Create a sensor direct channel backed by shared memory wrapped in HardwareBuffer object. * * The resulting channel can be used for delivering sensor events to native code, other - * processes, GPU/DSP or other co-processors without CPU intervention. This is the recommanded + * processes, GPU/DSP or other co-processors without CPU intervention. This is the recommended * for high performance sensor applications that use high sensor rates (e.g. greater than 200Hz) * and cares about sensor event latency. * @@ -1355,11 +1355,11 @@ public abstract class SensorManager { * returned by {@link #getRotationMatrix}. * * @param X - * defines the axis of the new cooridinate system that coincide with the X axis of the + * defines the axis of the new coordinate system that coincide with the X axis of the * original coordinate system. * * @param Y - * defines the axis of the new cooridinate system that coincide with the Y axis of the + * defines the axis of the new coordinate system that coincide with the Y axis of the * original coordinate system. * * @param outR @@ -1847,7 +1847,7 @@ public abstract class SensorManager { * This method is used to inject raw sensor data into the HAL. Call {@link * initDataInjection(boolean)} before this method to set the HAL in data injection mode. This * method should be called only if a previous call to initDataInjection has been successful and - * the HAL and SensorService are already opreating in data injection mode. + * the HAL and SensorService are already operating in data injection mode. * * @param sensor The sensor to inject. * @param values Sensor values to inject. The length of this diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java index d8ab6f7da82d..0f6f6019c0f7 100644 --- a/core/java/android/hardware/SystemSensorManager.java +++ b/core/java/android/hardware/SystemSensorManager.java @@ -565,7 +565,7 @@ public class SystemSensorManager extends SensorManager { public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_DYNAMIC_SENSOR_CHANGED)) { if (DEBUG_DYNAMIC_SENSOR) { - Log.i(TAG, "DYNS received DYNAMIC_SENSOR_CHANED broadcast"); + Log.i(TAG, "DYNS received DYNAMIC_SENSOR_CHANGED broadcast"); } // Dynamic sensors probably changed mDynamicSensorListDirty = true; @@ -610,7 +610,7 @@ public class SystemSensorManager extends SensorManager { protected void unregisterDynamicSensorCallbackImpl( DynamicSensorCallback callback) { if (DEBUG_DYNAMIC_SENSOR) { - Log.i(TAG, "Removing dynamic sensor listerner"); + Log.i(TAG, "Removing dynamic sensor listener"); } mDynamicSensorCallbacks.remove(callback); } @@ -740,7 +740,7 @@ public class SystemSensorManager extends SensorManager { } if (hardwareBuffer.getWidth() < MIN_DIRECT_CHANNEL_BUFFER_SIZE) { throw new IllegalArgumentException( - "Width if HaradwareBuffer must be greater than " + "Width if HardwareBuffer must be greater than " + MIN_DIRECT_CHANNEL_BUFFER_SIZE); } if ((hardwareBuffer.getUsage() & HardwareBuffer.USAGE_SENSOR_DIRECT_DATA) == 0) { @@ -771,7 +771,7 @@ public class SystemSensorManager extends SensorManager { /* * BaseEventQueue is the communication channel with the sensor service, - * SensorEventQueue, TriggerEventQueue are subclases and there is one-to-one mapping between + * SensorEventQueue, TriggerEventQueue are subclasses and there is one-to-one mapping between * the queues and the listeners. InjectEventQueue is also a sub-class which is a special case * where data is being injected into the sensor HAL through the sensor service. It is not * associated with any listener and there is one InjectEventQueue associated with a diff --git a/core/java/android/hardware/biometrics/flags.aconfig b/core/java/android/hardware/biometrics/flags.aconfig new file mode 100644 index 000000000000..0924e0d12bd3 --- /dev/null +++ b/core/java/android/hardware/biometrics/flags.aconfig @@ -0,0 +1,8 @@ +package: "android.hardware.biometrics" + +flag { + name: "add_key_agreement_crypto_object" + namespace: "biometrics" + description: "Feature flag for adding KeyAgreement api to CryptoObject." + bug: "282058146" +} diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index d352be16ae0c..a4dd0655917e 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -212,7 +212,14 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri @GuardedBy("mLock") private boolean mFoldedDeviceState; - private CameraManager.DeviceStateListener mFoldStateListener; + private final CameraManager.DeviceStateListener mFoldStateListener = + new CameraManager.DeviceStateListener() { + @Override + public final void onDeviceStateChanged(boolean folded) { + synchronized (mLock) { + mFoldedDeviceState = folded; + } + }}; private static final String TAG = "CameraCharacteristics"; @@ -238,18 +245,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * Return the device state listener for this Camera characteristics instance */ - CameraManager.DeviceStateListener getDeviceStateListener() { - if (mFoldStateListener == null) { - mFoldStateListener = new CameraManager.DeviceStateListener() { - @Override - public final void onDeviceStateChanged(boolean folded) { - synchronized (mLock) { - mFoldedDeviceState = folded; - } - }}; - } - return mFoldStateListener; - } + CameraManager.DeviceStateListener getDeviceStateListener() { return mFoldStateListener; } /** * Overrides the property value diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index 99b297abe92a..65fc1c62a471 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -540,14 +540,6 @@ public abstract class CameraDevice implements AutoCloseable { * or configuring it to use one of the supported * {@link android.media.CamcorderProfile CamcorderProfiles}.</li> * - * <li>For efficient YUV processing with {@link android.renderscript}: - * Create a RenderScript - * {@link android.renderscript.Allocation Allocation} with a supported YUV - * type, the IO_INPUT flag, and one of the sizes returned by - * {@link StreamConfigurationMap#getOutputSizes(Class) getOutputSizes(Allocation.class)}, - * Then obtain the Surface with - * {@link android.renderscript.Allocation#getSurface}.</li> - * * <li>For access to RAW, uncompressed YUV, or compressed JPEG data in the application: Create an * {@link android.media.ImageReader} object with one of the supported output formats given by * {@link StreamConfigurationMap#getOutputFormats()}, setting its size to one of the diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 85f8ca66715b..51501b558fba 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -1836,7 +1836,6 @@ public final class CameraManager { ctx.getSystemService(DeviceStateManager.class).registerCallback( new HandlerExecutor(mDeviceStateHandler), mFoldStateListener); } catch (IllegalStateException e) { - mFoldStateListener = null; Log.v(TAG, "Failed to register device state listener!"); Log.v(TAG, "Device state dependent characteristics updates will not be" + "functional!"); diff --git a/core/java/android/hardware/camera2/camera_platform.aconfig b/core/java/android/hardware/camera2/camera_platform.aconfig new file mode 100644 index 000000000000..67f63001ab58 --- /dev/null +++ b/core/java/android/hardware/camera2/camera_platform.aconfig @@ -0,0 +1,8 @@ +package: "com.android.hardware.camera2" + +flag { + namespace: "camera_platform" + name: "initial_test_flag" + description: "Flag infrastructure test flag" + bug: "292631208" +} diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java index 65d4b433f132..f078f66818d1 100644 --- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java @@ -265,7 +265,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes List<CameraOutputConfig> outputConfigs = sessionConfig.outputConfigs; ArrayList<OutputConfiguration> outputList = new ArrayList<>(); for (CameraOutputConfig output : outputConfigs) { - Surface outputSurface = initializeSurfrace(output); + Surface outputSurface = initializeSurface(output); if (outputSurface == null) { continue; } @@ -278,7 +278,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes if ((output.sharedSurfaceConfigs != null) && !output.sharedSurfaceConfigs.isEmpty()) { cameraOutput.enableSurfaceSharing(); for (CameraOutputConfig sharedOutputConfig : output.sharedSurfaceConfigs) { - Surface sharedSurface = initializeSurfrace(sharedOutputConfig); + Surface sharedSurface = initializeSurface(sharedOutputConfig); if (sharedSurface == null) { continue; } @@ -1156,7 +1156,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes return ret; } - private Surface initializeSurfrace(CameraOutputConfig output) { + private Surface initializeSurface(CameraOutputConfig output) { switch(output.type) { case CameraOutputConfig.TYPE_SURFACE: if (output.surface == null) { diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java index 9ebef0b59ece..6f025bd91593 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java @@ -2095,10 +2095,10 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { HashMap<Integer, Pair<Image, TotalCaptureResult>> captureMap, Integer jpegOrientation, Byte jpegQuality) { ArrayList<CaptureBundle> ret = new ArrayList<>(); - for (Integer stagetId : captureMap.keySet()) { - Pair<Image, TotalCaptureResult> entry = captureMap.get(stagetId); + for (Integer stageId : captureMap.keySet()) { + Pair<Image, TotalCaptureResult> entry = captureMap.get(stageId); CaptureBundle bundle = new CaptureBundle(); - bundle.stage = stagetId; + bundle.stage = stageId; bundle.captureImage = initializeParcelImage(entry.first); bundle.sequenceId = entry.second.getSequenceId(); bundle.captureResult = entry.second.getNativeMetadata(); diff --git a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java index aabe149d16f5..fac64da764d8 100644 --- a/core/java/android/hardware/camera2/params/StreamConfigurationMap.java +++ b/core/java/android/hardware/camera2/params/StreamConfigurationMap.java @@ -509,8 +509,6 @@ public final class StreamConfigurationMap { * Recommended for recording video (simple to use) * <li>{@link android.media.MediaCodec} - * Recommended for recording video (more complicated to use, with more flexibility) - * <li>{@link android.renderscript.Allocation} - - * Recommended for image processing with {@link android.renderscript RenderScript} * <li>{@link android.view.SurfaceHolder} - * Recommended for low-power camera preview with {@link android.view.SurfaceView} * <li>{@link android.graphics.SurfaceTexture} - diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig new file mode 100644 index 000000000000..ebfe66f51bbc --- /dev/null +++ b/core/java/android/hardware/input/input_framework.aconfig @@ -0,0 +1,19 @@ +package: "com.android.hardware.input" + +# Project link: https://gantry.corp.google.com/projects/android_platform_input_native/changes + +flag { + namespace: "input_native" + name: "keyboard_layout_preview_flag" + description: "Controls whether a preview will be shown in Settings when selecting a physical keyboard layout" + bug: "293579375" +} + + +flag { + namespace: "input_native" + name: "keyboard_a11y_sticky_keys_flag" + description: "Controls if the sticky keys accessibility feature for physical keyboard is available to the user" + bug: "294546335" +} + diff --git a/core/java/android/hardware/usb/OWNERS b/core/java/android/hardware/usb/OWNERS index 8f5c2a025672..a753f9634d0d 100644 --- a/core/java/android/hardware/usb/OWNERS +++ b/core/java/android/hardware/usb/OWNERS @@ -1,3 +1,7 @@ # Bug component: 175220 +aprasath@google.com +kumarashishg@google.com +sarup@google.com +anothermark@google.com badhri@google.com diff --git a/core/java/android/inputmethodservice/OWNERS b/core/java/android/inputmethodservice/OWNERS index d7db7c741364..9805ce82dcfc 100644 --- a/core/java/android/inputmethodservice/OWNERS +++ b/core/java/android/inputmethodservice/OWNERS @@ -3,4 +3,5 @@ set noparent include /services/core/java/com/android/server/inputmethod/OWNERS -per-file *InlineSuggestion* = file:/core/java/android/service/autofill/OWNERS +# Bug component: 1195602 = per-file *InlineSuggestion* +per-file *InlineSuggestion* = file:/core/java/android/widget/inline/OWNERS diff --git a/core/java/android/net/ITetheringStatsProvider.aidl b/core/java/android/net/ITetheringStatsProvider.aidl deleted file mode 100644 index da0bf4c47b94..000000000000 --- a/core/java/android/net/ITetheringStatsProvider.aidl +++ /dev/null @@ -1,45 +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; - -import android.net.NetworkStats; - -/** - * Interface for NetworkManagementService to query tethering statistics and set data limits. - * - * TODO: this does not really need to be an interface since Tethering runs in the same process - * as NetworkManagementService. Consider refactoring Tethering to use direct access to - * NetworkManagementService instead of using INetworkManagementService, and then deleting this - * interface. - * - * @hide - */ -interface ITetheringStatsProvider { - // Returns cumulative statistics for all tethering sessions since boot, on all upstreams. - // @code {how} is one of the NetworkStats.STATS_PER_* constants. If {@code how} is - // {@code STATS_PER_IFACE}, the provider should not include any traffic that is already - // counted by kernel interface counters. - NetworkStats getTetherStats(int how); - - // Sets the interface quota for the specified upstream interface. This is defined as the number - // of bytes, starting from zero and counting from now, after which data should stop being - // forwarded to/from the specified upstream. A value of QUOTA_UNLIMITED means there is no limit. - void setInterfaceQuota(String iface, long quotaBytes); - - // Indicates that no data usage limit is set. - const int QUOTA_UNLIMITED = -1; -} diff --git a/core/java/android/net/OWNERS b/core/java/android/net/OWNERS index b989488f9015..feeef55a957b 100644 --- a/core/java/android/net/OWNERS +++ b/core/java/android/net/OWNERS @@ -5,3 +5,4 @@ include platform/frameworks/base:/services/core/java/com/android/server/net/OWNE per-file **IpSec* = file:/services/core/java/com/android/server/vcn/OWNERS per-file SSL*,Uri*,Url* = prb@google.com,oth@google.com,narayan@google.com,ngeoffray@google.com per-file SntpClient* = file:/services/core/java/com/android/server/timedetector/OWNERS +per-file Uri.java,Uri.aidl = varunshah@google.com diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 1ae1b050d32f..37bd67a4b883 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -537,8 +537,15 @@ public class VpnService extends Service { } /** - * Sets an HTTP proxy for the VPN network. This proxy is only a recommendation - * and it is possible that some apps will ignore it. PAC proxies are not supported. + * Sets an HTTP proxy for the VPN network. + * <p class="note">This proxy is only a recommendation and it is possible that some apps + * will ignore it. + * <p class="note">PAC proxies are not supported over VPNs. + * <p class="note">Apps that do use the proxy cannot distinguish between routes handled + * and not handled by the VPN and will try to access HTTP resources over the proxy + * regardless of the destination. In practice this means using a proxy with a split + * tunnel generally won't work as expected, because HTTP accesses on routes not handled by + * the VPN will not reach as the proxy won't be available outside of the VPN network. */ @NonNull public Builder setHttpProxy(@NonNull ProxyInfo proxyInfo) { diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index 9e97216ac632..a9eb672c4e4d 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -26,8 +26,6 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SystemApi; import android.annotation.UserIdInt; import android.app.Activity; -import android.app.ActivityThread; -import android.app.OnActivityPausedListener; import android.app.PendingIntent; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; @@ -602,6 +600,17 @@ public final class NfcAdapter { return offHostSE; } + private static void retrieveServiceRegisterer() { + if (sServiceRegisterer == null) { + NfcServiceManager manager = NfcFrameworkInitializer.getNfcServiceManager(); + if (manager == null) { + Log.e(TAG, "NfcServiceManager is null"); + throw new UnsupportedOperationException(); + } + sServiceRegisterer = manager.getNfcManagerServiceRegisterer(); + } + } + /** * Returns the NfcAdapter for application context, * or throws if NFC is not available. @@ -629,12 +638,7 @@ public final class NfcAdapter { Log.v(TAG, "this device does not have NFC support"); throw new UnsupportedOperationException(); } - NfcServiceManager manager = NfcFrameworkInitializer.getNfcServiceManager(); - if (manager == null) { - Log.e(TAG, "NfcServiceManager is null"); - throw new UnsupportedOperationException(); - } - sServiceRegisterer = manager.getNfcManagerServiceRegisterer(); + retrieveServiceRegisterer(); sService = getServiceInterface(); if (sService == null) { Log.e(TAG, "could not retrieve NFC service"); @@ -644,6 +648,7 @@ public final class NfcAdapter { try { sTagService = sService.getNfcTagInterface(); } catch (RemoteException e) { + sTagService = null; Log.e(TAG, "could not retrieve NFC Tag service"); throw new UnsupportedOperationException(); } @@ -652,12 +657,14 @@ public final class NfcAdapter { try { sNfcFCardEmulationService = sService.getNfcFCardEmulationInterface(); } catch (RemoteException e) { + sNfcFCardEmulationService = null; Log.e(TAG, "could not retrieve NFC-F card emulation service"); throw new UnsupportedOperationException(); } try { sCardEmulationService = sService.getNfcCardEmulationInterface(); } catch (RemoteException e) { + sCardEmulationService = null; Log.e(TAG, "could not retrieve card emulation service"); throw new UnsupportedOperationException(); } @@ -705,11 +712,13 @@ public final class NfcAdapter { throw new IllegalArgumentException( "context not associated with any application (using a mock context?)"); } - - if (sIsInitialized && sServiceRegisterer.tryGet() == null) { - synchronized (NfcAdapter.class) { - /* Stale sService pointer */ - if (sIsInitialized) sIsInitialized = false; + retrieveServiceRegisterer(); + if (sServiceRegisterer.tryGet() == null) { + if (sIsInitialized) { + synchronized (NfcAdapter.class) { + /* Stale sService pointer */ + if (sIsInitialized) sIsInitialized = false; + } } return null; } @@ -841,30 +850,54 @@ public final class NfcAdapter { // assigning to sService is not thread-safe, but this is best-effort code // and on a well-behaved system should never happen sService = service; - try { - sTagService = service.getNfcTagInterface(); - } catch (RemoteException ee) { - Log.e(TAG, "could not retrieve NFC tag service during service recovery"); - // nothing more can be done now, sService is still stale, we'll hit - // this recovery path again later - return; + if (sHasNfcFeature) { + try { + sTagService = service.getNfcTagInterface(); + } catch (RemoteException ee) { + sTagService = null; + Log.e(TAG, "could not retrieve NFC tag service during service recovery"); + // nothing more can be done now, sService is still stale, we'll hit + // this recovery path again later + return; + } } - try { - sCardEmulationService = service.getNfcCardEmulationInterface(); - } catch (RemoteException ee) { - Log.e(TAG, "could not retrieve NFC card emulation service during service recovery"); - } + if (sHasCeFeature) { + try { + sCardEmulationService = service.getNfcCardEmulationInterface(); + } catch (RemoteException ee) { + sCardEmulationService = null; + Log.e(TAG, + "could not retrieve NFC card emulation service during service recovery"); + } - try { - sNfcFCardEmulationService = service.getNfcFCardEmulationInterface(); - } catch (RemoteException ee) { - Log.e(TAG, "could not retrieve NFC-F card emulation service during service recovery"); + try { + sNfcFCardEmulationService = service.getNfcFCardEmulationInterface(); + } catch (RemoteException ee) { + sNfcFCardEmulationService = null; + Log.e(TAG, + "could not retrieve NFC-F card emulation service during service recovery"); + } } return; } + private boolean isCardEmulationEnabled() { + if (sHasCeFeature) { + return (sCardEmulationService != null || sNfcFCardEmulationService != null); + } + return false; + } + + private boolean isTagReadingEnabled() { + if (sHasNfcFeature) { + return sTagService != null; + } + return false; + } + + /** * Return true if this NFC Adapter has any features enabled. * @@ -878,8 +911,9 @@ public final class NfcAdapter { * @return true if this NFC Adapter has any features enabled */ public boolean isEnabled() { + boolean serviceState = false; try { - return sService.getState() == STATE_ON; + serviceState = sService.getState() == STATE_ON; } catch (RemoteException e) { attemptDeadServiceRecovery(e); // Try one more time @@ -888,12 +922,12 @@ public final class NfcAdapter { return false; } try { - return sService.getState() == STATE_ON; + serviceState = sService.getState() == STATE_ON; } catch (RemoteException ee) { Log.e(TAG, "Failed to recover NFC Service."); } - return false; } + return serviceState && (isTagReadingEnabled() || isCardEmulationEnabled()); } /** @@ -1473,17 +1507,11 @@ public final class NfcAdapter { if (activity == null || intent == null) { throw new NullPointerException(); } - if (!activity.isResumed()) { - throw new IllegalStateException("Foreground dispatch can only be enabled " + - "when your activity is resumed"); - } try { TechListParcel parcel = null; if (techLists != null && techLists.length > 0) { parcel = new TechListParcel(techLists); } - ActivityThread.currentActivityThread().registerOnActivityPausedListener(activity, - mForegroundDispatchListener); sService.setForegroundDispatch(intent, filters, parcel); } catch (RemoteException e) { attemptDeadServiceRecovery(e); @@ -1511,25 +1539,8 @@ public final class NfcAdapter { throw new UnsupportedOperationException(); } } - ActivityThread.currentActivityThread().unregisterOnActivityPausedListener(activity, - mForegroundDispatchListener); - disableForegroundDispatchInternal(activity, false); - } - - OnActivityPausedListener mForegroundDispatchListener = new OnActivityPausedListener() { - @Override - public void onPaused(Activity activity) { - disableForegroundDispatchInternal(activity, true); - } - }; - - void disableForegroundDispatchInternal(Activity activity, boolean force) { try { sService.setForegroundDispatch(null, null, null); - if (!force && !activity.isResumed()) { - throw new IllegalStateException("You must disable foreground dispatching " + - "while your activity is still resumed"); - } } catch (RemoteException e) { attemptDeadServiceRecovery(e); } diff --git a/core/java/android/nfc/cardemulation/AidGroup.java b/core/java/android/nfc/cardemulation/AidGroup.java index 2436e57b74bc..958669ee5852 100644 --- a/core/java/android/nfc/cardemulation/AidGroup.java +++ b/core/java/android/nfc/cardemulation/AidGroup.java @@ -16,7 +16,11 @@ package android.nfc.cardemulation; -import android.compat.annotation.UnsupportedAppUsage; +import android.annotation.FlaggedApi; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.nfc.Flags; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; @@ -29,6 +33,11 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Locale; + +/********************************************************************** + * This file is not a part of the NFC mainline module * + * *******************************************************************/ /** * The AidGroup class represents a group of Application Identifiers (AIDs). @@ -39,28 +48,30 @@ import java.util.List; * * @hide */ +@SystemApi +@FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public final class AidGroup implements Parcelable { /** * The maximum number of AIDs that can be present in any one group. */ - public static final int MAX_NUM_AIDS = 256; + private static final int MAX_NUM_AIDS = 256; + + private static final String TAG = "AidGroup"; - static final String TAG = "AidGroup"; - @UnsupportedAppUsage - final List<String> aids; - @UnsupportedAppUsage - final String category; - @UnsupportedAppUsage - final String description; + private final List<String> mAids; + private final String mCategory; + @SuppressWarnings("unused") // Unused as of now, but part of the XML input. + private final String mDescription; /** * Creates a new AidGroup object. * - * @param aids The list of AIDs present in the group - * @param category The category of this group, e.g. {@link CardEmulation#CATEGORY_PAYMENT} + * @param aids list of AIDs present in the group + * @param category category of this group, e.g. {@link CardEmulation#CATEGORY_PAYMENT} */ - public AidGroup(List<String> aids, String category) { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public AidGroup(@NonNull List<String> aids, @Nullable String category) { if (aids == null || aids.size() == 0) { throw new IllegalArgumentException("No AIDS in AID group."); } @@ -73,45 +84,55 @@ public final class AidGroup implements Parcelable { } } if (isValidCategory(category)) { - this.category = category; + this.mCategory = category; } else { - this.category = CardEmulation.CATEGORY_OTHER; + this.mCategory = CardEmulation.CATEGORY_OTHER; } - this.aids = new ArrayList<String>(aids.size()); + this.mAids = new ArrayList<String>(aids.size()); for (String aid : aids) { - this.aids.add(aid.toUpperCase()); + this.mAids.add(aid.toUpperCase(Locale.US)); } - this.description = null; + this.mDescription = null; } - @UnsupportedAppUsage - AidGroup(String category, String description) { - this.aids = new ArrayList<String>(); - this.category = category; - this.description = description; + /** + * Creates a new AidGroup object. + * + * @param category category of this group, e.g. {@link CardEmulation#CATEGORY_PAYMENT} + * @param description description of this group + */ + AidGroup(@NonNull String category, @NonNull String description) { + this.mAids = new ArrayList<String>(); + this.mCategory = category; + this.mDescription = description; } /** + * Returns the category of this group. * @return the category of this AID group */ - @UnsupportedAppUsage + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public String getCategory() { - return category; + return mCategory; } /** + * Returns the list of AIDs in this group. + * * @return the list of AIDs in this group */ - @UnsupportedAppUsage + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public List<String> getAids() { - return aids; + return mAids; } @Override public String toString() { - StringBuilder out = new StringBuilder("Category: " + category + - ", AIDs:"); - for (String aid : aids) { + StringBuilder out = new StringBuilder("Category: " + mCategory + + ", AIDs:"); + for (String aid : mAids) { out.append(aid); out.append(", "); } @@ -119,41 +140,44 @@ public final class AidGroup implements Parcelable { } /** - * Dump debugging info as AidGroupProto + * Dump debugging info as AidGroupProto. * * If the output belongs to a sub message, the caller is responsible for wrapping this function * between {@link ProtoOutputStream#start(long)} and {@link ProtoOutputStream#end(long)}. * * @param proto the ProtoOutputStream to write to */ - public void dump(ProtoOutputStream proto) { - proto.write(AidGroupProto.CATEGORY, category); - for (String aid : aids) { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void dump(@NonNull ProtoOutputStream proto) { + proto.write(AidGroupProto.CATEGORY, mCategory); + for (String aid : mAids) { proto.write(AidGroupProto.AIDS, aid); } } + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Override public int describeContents() { return 0; } + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(category); - dest.writeInt(aids.size()); - if (aids.size() > 0) { - dest.writeStringList(aids); + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeString8(mCategory); + dest.writeInt(mAids.size()); + if (mAids.size() > 0) { + dest.writeStringList(mAids); } } - @UnsupportedAppUsage - public static final @android.annotation.NonNull Parcelable.Creator<AidGroup> CREATOR = + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public static final @NonNull Parcelable.Creator<AidGroup> CREATOR = new Parcelable.Creator<AidGroup>() { @Override public AidGroup createFromParcel(Parcel source) { - String category = source.readString(); + String category = source.readString8(); int listSize = source.readInt(); ArrayList<String> aidList = new ArrayList<String>(); if (listSize > 0) { @@ -168,8 +192,17 @@ public final class AidGroup implements Parcelable { } }; - @UnsupportedAppUsage - static public AidGroup createFromXml(XmlPullParser parser) throws XmlPullParserException, IOException { + /** + * Create an instance of AID group from XML file. + * + * @param parser input xml parser stream + * @throws XmlPullParserException If an error occurs parsing the element. + * @throws IOException If an error occurs reading the element. + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @Nullable + public static AidGroup createFromXml(@NonNull XmlPullParser parser) + throws XmlPullParserException, IOException { String category = null; ArrayList<String> aids = new ArrayList<String>(); AidGroup group = null; @@ -210,11 +243,16 @@ public final class AidGroup implements Parcelable { return group; } - @UnsupportedAppUsage - public void writeAsXml(XmlSerializer out) throws IOException { + /** + * Serialize instance of AID group to XML file. + * @param out XML serializer stream + * @throws IOException If an error occurs reading the element. + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void writeAsXml(@NonNull XmlSerializer out) throws IOException { out.startTag(null, "aid-group"); - out.attribute(null, "category", category); - for (String aid : aids) { + out.attribute(null, "category", mCategory); + for (String aid : mAids) { out.startTag(null, "aid"); out.attribute(null, "value", aid); out.endTag(null, "aid"); @@ -222,7 +260,7 @@ public final class AidGroup implements Parcelable { out.endTag(null, "aid-group"); } - static boolean isValidCategory(String category) { + private static boolean isValidCategory(String category) { return CardEmulation.CATEGORY_PAYMENT.equals(category) || CardEmulation.CATEGORY_OTHER.equals(category); } diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java index 793a70e93f56..18ec914860fb 100644 --- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -14,10 +14,16 @@ * limitations under the License. */ +/********************************************************************** + * This file is not a part of the NFC mainline module * + * *******************************************************************/ + package android.nfc.cardemulation; +import android.annotation.FlaggedApi; +import android.annotation.NonNull; import android.annotation.Nullable; -import android.compat.annotation.UnsupportedAppUsage; +import android.annotation.SystemApi; import android.content.ComponentName; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -28,7 +34,9 @@ import android.content.res.Resources.NotFoundException; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; +import android.nfc.Flags; import android.os.Parcel; +import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; @@ -38,7 +46,6 @@ import android.util.proto.ProtoOutputStream; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; @@ -47,82 +54,82 @@ import java.util.List; import java.util.Map; /** + * Class holding APDU service info. + * * @hide */ +@SystemApi +@FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public final class ApduServiceInfo implements Parcelable { - static final String TAG = "ApduServiceInfo"; + private static final String TAG = "ApduServiceInfo"; /** * The service that implements this */ - @UnsupportedAppUsage - final ResolveInfo mService; + private final ResolveInfo mService; /** * Description of the service */ - final String mDescription; + private final String mDescription; /** * Whether this service represents AIDs running on the host CPU */ - final boolean mOnHost; + private final boolean mOnHost; /** * Offhost reader name. * eg: SIM, eSE etc */ - String mOffHostName; + private String mOffHostName; /** * Offhost reader name from manifest file. - * Used for unsetOffHostSecureElement() + * Used for resetOffHostSecureElement() */ - final String mStaticOffHostName; + private final String mStaticOffHostName; /** * Mapping from category to static AID group */ - @UnsupportedAppUsage - final HashMap<String, AidGroup> mStaticAidGroups; + private final HashMap<String, AidGroup> mStaticAidGroups; /** * Mapping from category to dynamic AID group */ - @UnsupportedAppUsage - final HashMap<String, AidGroup> mDynamicAidGroups; + private final HashMap<String, AidGroup> mDynamicAidGroups; /** * Whether this service should only be started when the device is unlocked. */ - final boolean mRequiresDeviceUnlock; + private final boolean mRequiresDeviceUnlock; /** * Whether this service should only be started when the device is screen on. */ - final boolean mRequiresDeviceScreenOn; + private final boolean mRequiresDeviceScreenOn; /** * The id of the service banner specified in XML. */ - final int mBannerResourceId; + private final int mBannerResourceId; /** * The uid of the package the service belongs to */ - final int mUid; + private final int mUid; /** * Settings Activity for this service */ - final String mSettingsActivityName; + private final String mSettingsActivityName; /** * @hide */ - @UnsupportedAppUsage public ApduServiceInfo(ResolveInfo info, boolean onHost, String description, - ArrayList<AidGroup> staticAidGroups, ArrayList<AidGroup> dynamicAidGroups, + List<AidGroup> staticAidGroups, List<AidGroup> dynamicAidGroups, boolean requiresUnlock, int bannerResource, int uid, String settingsActivityName, String offHost, String staticOffHost) { this(info, onHost, description, staticAidGroups, dynamicAidGroups, @@ -134,7 +141,7 @@ public final class ApduServiceInfo implements Parcelable { * @hide */ public ApduServiceInfo(ResolveInfo info, boolean onHost, String description, - ArrayList<AidGroup> staticAidGroups, ArrayList<AidGroup> dynamicAidGroups, + List<AidGroup> staticAidGroups, List<AidGroup> dynamicAidGroups, boolean requiresUnlock, boolean requiresScreenOn, int bannerResource, int uid, String settingsActivityName, String offHost, String staticOffHost) { this.mService = info; @@ -147,19 +154,28 @@ public final class ApduServiceInfo implements Parcelable { this.mRequiresDeviceUnlock = requiresUnlock; this.mRequiresDeviceScreenOn = requiresScreenOn; for (AidGroup aidGroup : staticAidGroups) { - this.mStaticAidGroups.put(aidGroup.category, aidGroup); + this.mStaticAidGroups.put(aidGroup.getCategory(), aidGroup); } for (AidGroup aidGroup : dynamicAidGroups) { - this.mDynamicAidGroups.put(aidGroup.category, aidGroup); + this.mDynamicAidGroups.put(aidGroup.getCategory(), aidGroup); } this.mBannerResourceId = bannerResource; this.mUid = uid; this.mSettingsActivityName = settingsActivityName; } - @UnsupportedAppUsage - public ApduServiceInfo(PackageManager pm, ResolveInfo info, boolean onHost) throws - XmlPullParserException, IOException { + /** + * Creates a new ApduServiceInfo object. + * + * @param pm packageManager instance + * @param info app component info + * @param onHost whether service is on host or not (secure element) + * @throws XmlPullParserException If an error occurs parsing the element. + * @throws IOException If an error occurs reading the element. + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public ApduServiceInfo(@NonNull PackageManager pm, @NonNull ResolveInfo info, boolean onHost) + throws XmlPullParserException, IOException { ServiceInfo si = info.serviceInfo; XmlResourceParser parser = null; try { @@ -277,9 +293,9 @@ public final class ApduServiceInfo implements Parcelable { groupAttrs.recycle(); } else if (eventType == XmlPullParser.END_TAG && "aid-group".equals(tagName) && currentGroup != null) { - if (currentGroup.aids.size() > 0) { - if (!mStaticAidGroups.containsKey(currentGroup.category)) { - mStaticAidGroups.put(currentGroup.category, currentGroup); + if (currentGroup.getAids().size() > 0) { + if (!mStaticAidGroups.containsKey(currentGroup.getCategory())) { + mStaticAidGroups.put(currentGroup.getCategory(), currentGroup); } } else { Log.e(TAG, "Not adding <aid-group> with empty or invalid AIDs"); @@ -291,8 +307,8 @@ public final class ApduServiceInfo implements Parcelable { com.android.internal.R.styleable.AidFilter); String aid = a.getString(com.android.internal.R.styleable.AidFilter_name). toUpperCase(); - if (CardEmulation.isValidAid(aid) && !currentGroup.aids.contains(aid)) { - currentGroup.aids.add(aid); + if (CardEmulation.isValidAid(aid) && !currentGroup.getAids().contains(aid)) { + currentGroup.getAids().add(aid); } else { Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid); } @@ -305,8 +321,8 @@ public final class ApduServiceInfo implements Parcelable { toUpperCase(); // Add wildcard char to indicate prefix aid = aid.concat("*"); - if (CardEmulation.isValidAid(aid) && !currentGroup.aids.contains(aid)) { - currentGroup.aids.add(aid); + if (CardEmulation.isValidAid(aid) && !currentGroup.getAids().contains(aid)) { + currentGroup.getAids().add(aid); } else { Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid); } @@ -319,8 +335,8 @@ public final class ApduServiceInfo implements Parcelable { toUpperCase(); // Add wildcard char to indicate suffix aid = aid.concat("#"); - if (CardEmulation.isValidAid(aid) && !currentGroup.aids.contains(aid)) { - currentGroup.aids.add(aid); + if (CardEmulation.isValidAid(aid) && !currentGroup.getAids().contains(aid)) { + currentGroup.getAids().add(aid); } else { Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid); } @@ -336,11 +352,25 @@ public final class ApduServiceInfo implements Parcelable { mUid = si.applicationInfo.uid; } + /** + * Returns the app component corresponding to this APDU service. + * + * @return app component for this service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public ComponentName getComponent() { return new ComponentName(mService.serviceInfo.packageName, mService.serviceInfo.name); } + /** + * Returns the offhost secure element name (if the service is offhost). + * + * @return offhost secure element name for offhost services + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @Nullable public String getOffHostSecureElement() { return mOffHostName; } @@ -353,18 +383,30 @@ public final class ApduServiceInfo implements Parcelable { * for that category. * @return List of AIDs registered by the service */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public List<String> getAids() { final ArrayList<String> aids = new ArrayList<String>(); for (AidGroup group : getAidGroups()) { - aids.addAll(group.aids); + aids.addAll(group.getAids()); } return aids; } + /** + * Returns a consolidated list of AIDs with prefixes from the AID groups + * registered by this service. Note that if a service has both + * a static (manifest-based) AID group for a category and a dynamic + * AID group, only the dynamically registered AIDs will be returned + * for that category. + * @return List of prefix AIDs registered by the service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public List<String> getPrefixAids() { final ArrayList<String> prefixAids = new ArrayList<String>(); for (AidGroup group : getAidGroups()) { - for (String aid : group.aids) { + for (String aid : group.getAids()) { if (aid.endsWith("*")) { prefixAids.add(aid); } @@ -373,10 +415,20 @@ public final class ApduServiceInfo implements Parcelable { return prefixAids; } + /** + * Returns a consolidated list of AIDs with subsets from the AID groups + * registered by this service. Note that if a service has both + * a static (manifest-based) AID group for a category and a dynamic + * AID group, only the dynamically registered AIDs will be returned + * for that category. + * @return List of prefix AIDs registered by the service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public List<String> getSubsetAids() { final ArrayList<String> subsetAids = new ArrayList<String>(); for (AidGroup group : getAidGroups()) { - for (String aid : group.aids) { + for (String aid : group.getAids()) { if (aid.endsWith("#")) { subsetAids.add(aid); } @@ -384,14 +436,28 @@ public final class ApduServiceInfo implements Parcelable { } return subsetAids; } + /** * Returns the registered AID group for this category. + * + * @param category category name + * @return {@link AidGroup} instance for the provided category */ - public AidGroup getDynamicAidGroupForCategory(String category) { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public AidGroup getDynamicAidGroupForCategory(@NonNull String category) { return mDynamicAidGroups.get(category); } - public boolean removeDynamicAidGroupForCategory(String category) { + /** + * Removes the registered AID group for this category. + * + * @param category category name + * @return {@code true} if an AID group existed + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public boolean removeDynamicAidGroupForCategory(@NonNull String category) { return (mDynamicAidGroups.remove(category) != null); } @@ -403,7 +469,9 @@ public final class ApduServiceInfo implements Parcelable { * for that category. * @return List of AIDs registered by the service */ - public ArrayList<AidGroup> getAidGroups() { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public List<AidGroup> getAidGroups() { final ArrayList<AidGroup> groups = new ArrayList<AidGroup>(); for (Map.Entry<String, AidGroup> entry : mDynamicAidGroups.entrySet()) { groups.add(entry.getValue()); @@ -421,49 +489,83 @@ public final class ApduServiceInfo implements Parcelable { /** * Returns the category to which this service has attributed the AID that is passed in, * or null if we don't know this AID. + * @param aid AID to lookup for + * @return category name corresponding to this AID */ - public String getCategoryForAid(String aid) { - ArrayList<AidGroup> groups = getAidGroups(); + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public String getCategoryForAid(@NonNull String aid) { + List<AidGroup> groups = getAidGroups(); for (AidGroup group : groups) { - if (group.aids.contains(aid.toUpperCase())) { - return group.category; + if (group.getAids().contains(aid.toUpperCase())) { + return group.getCategory(); } } return null; } - public boolean hasCategory(String category) { + /** + * Returns whether there is any AID group for this category. + * @param category category name + * @return {@code true} if an AID group exists + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public boolean hasCategory(@NonNull String category) { return (mStaticAidGroups.containsKey(category) || mDynamicAidGroups.containsKey(category)); } - @UnsupportedAppUsage + /** + * Returns whether the service is on host or not. + * @return true if the service is on host (not secure element) + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public boolean isOnHost() { return mOnHost; } - @UnsupportedAppUsage + /** + * Returns whether the service requires device unlock. + * @return whether the service requires device unlock + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public boolean requiresUnlock() { return mRequiresDeviceUnlock; } /** * Returns whether this service should only be started when the device is screen on. + * @return whether the service requires screen on */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public boolean requiresScreenOn() { return mRequiresDeviceScreenOn; } - @UnsupportedAppUsage + /** + * Returns description of service. + * @return user readable description of service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public String getDescription() { return mDescription; } - @UnsupportedAppUsage + /** + * Returns uid of service. + * @return uid of the service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public int getUid() { return mUid; } - public void setOrReplaceDynamicAidGroup(AidGroup aidGroup) { + /** + * Add or replace an AID group to this service. + * @param aidGroup instance of aid group to set or replace + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void setDynamicAidGroup(@NonNull AidGroup aidGroup) { mDynamicAidGroups.put(aidGroup.getCategory(), aidGroup); } @@ -476,7 +578,8 @@ public final class ApduServiceInfo implements Parcelable { * TS26_NFC_REQ_070: For embedded SE, Secure Element Name SHALL be eSE[number] * (e.g. eSE/eSE1, eSE2, etc.). */ - public void setOffHostSecureElement(String offHost) { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void setOffHostSecureElement(@NonNull String offHost) { mOffHostName = offHost; } @@ -484,15 +587,30 @@ public final class ApduServiceInfo implements Parcelable { * Resets the off host Secure Element to statically defined * by the service in the manifest file. */ - public void unsetOffHostSecureElement() { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void resetOffHostSecureElement() { mOffHostName = mStaticOffHostName; } - public CharSequence loadLabel(PackageManager pm) { + /** + * Load label for this service. + * @param pm packagemanager instance + * @return label name corresponding to service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public CharSequence loadLabel(@NonNull PackageManager pm) { return mService.loadLabel(pm); } - public CharSequence loadAppLabel(PackageManager pm) { + /** + * Load application label for this service. + * @param pm packagemanager instance + * @return app label name corresponding to service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public CharSequence loadAppLabel(@NonNull PackageManager pm) { try { return pm.getApplicationLabel(pm.getApplicationInfo( mService.resolvePackageName, PackageManager.GET_META_DATA)); @@ -501,12 +619,25 @@ public final class ApduServiceInfo implements Parcelable { } } - public Drawable loadIcon(PackageManager pm) { + /** + * Load application icon for this service. + * @param pm packagemanager instance + * @return app icon corresponding to service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public Drawable loadIcon(@NonNull PackageManager pm) { return mService.loadIcon(pm); } - @UnsupportedAppUsage - public Drawable loadBanner(PackageManager pm) { + /** + * Load application banner for this service. + * @param pm packagemanager instance + * @return app banner corresponding to service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public Drawable loadBanner(@NonNull PackageManager pm) { Resources res; try { res = pm.getResourcesForApplication(mService.serviceInfo.packageName); @@ -521,7 +652,12 @@ public final class ApduServiceInfo implements Parcelable { } } - @UnsupportedAppUsage + /** + * Load activity name for this service. + * @return activity name for this service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public String getSettingsActivityName() { return mSettingsActivityName; } @Override @@ -556,14 +692,15 @@ public final class ApduServiceInfo implements Parcelable { return getComponent().hashCode(); } - + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Override public int describeContents() { return 0; } + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Override - public void writeToParcel(Parcel dest, int flags) { + public void writeToParcel(@NonNull Parcel dest, int flags) { mService.writeToParcel(dest, flags); dest.writeString(mDescription); dest.writeInt(mOnHost ? 1 : 0); @@ -584,8 +721,8 @@ public final class ApduServiceInfo implements Parcelable { dest.writeString(mSettingsActivityName); }; - @UnsupportedAppUsage - public static final @android.annotation.NonNull Parcelable.Creator<ApduServiceInfo> CREATOR = + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public static final @NonNull Parcelable.Creator<ApduServiceInfo> CREATOR = new Parcelable.Creator<ApduServiceInfo>() { @Override public ApduServiceInfo createFromParcel(Parcel source) { @@ -620,7 +757,15 @@ public final class ApduServiceInfo implements Parcelable { } }; - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + /** + * Dump contents for debugging. + * @param fd parcelfiledescriptor instance + * @param pw printwriter instance + * @param args args for dumping + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void dump(@NonNull ParcelFileDescriptor fd, @NonNull PrintWriter pw, + @NonNull String[] args) { pw.println(" " + getComponent() + " (Description: " + getDescription() + ")" + " (UID: " + getUid() + ")"); @@ -633,15 +778,15 @@ public final class ApduServiceInfo implements Parcelable { } pw.println(" Static AID groups:"); for (AidGroup group : mStaticAidGroups.values()) { - pw.println(" Category: " + group.category); - for (String aid : group.aids) { + pw.println(" Category: " + group.getCategory()); + for (String aid : group.getAids()) { pw.println(" AID: " + aid); } } pw.println(" Dynamic AID groups:"); for (AidGroup group : mDynamicAidGroups.values()) { - pw.println(" Category: " + group.category); - for (String aid : group.aids) { + pw.println(" Category: " + group.getCategory()); + for (String aid : group.getAids()) { pw.println(" AID: " + aid); } } @@ -651,7 +796,7 @@ public final class ApduServiceInfo implements Parcelable { } /** - * Dump debugging info as ApduServiceInfoProto + * Dump debugging info as ApduServiceInfoProto. * * If the output belongs to a sub message, the caller is responsible for wrapping this function * between {@link ProtoOutputStream#start(long)} and {@link ProtoOutputStream#end(long)}. @@ -659,7 +804,8 @@ public final class ApduServiceInfo implements Parcelable { * * @param proto the ProtoOutputStream to write to */ - public void dumpDebug(ProtoOutputStream proto) { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void dumpDebug(@NonNull ProtoOutputStream proto) { Utils.dumpDebugComponentName(getComponent(), proto, ApduServiceInfoProto.COMPONENT_NAME); proto.write(ApduServiceInfoProto.DESCRIPTION, getDescription()); proto.write(ApduServiceInfoProto.ON_HOST, mOnHost); diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java index ac3344e91c06..4909b0830eeb 100644 --- a/core/java/android/nfc/cardemulation/CardEmulation.java +++ b/core/java/android/nfc/cardemulation/CardEmulation.java @@ -594,9 +594,6 @@ public final class CardEmulation { if (activity == null || service == null) { throw new NullPointerException("activity or service or category is null"); } - if (!activity.isResumed()) { - throw new IllegalArgumentException("Activity must be resumed."); - } try { return sService.setPreferredService(service); } catch (RemoteException e) { @@ -629,9 +626,6 @@ public final class CardEmulation { if (activity == null) { throw new NullPointerException("activity is null"); } - if (!activity.isResumed()) { - throw new IllegalArgumentException("Activity must be resumed."); - } try { return sService.unsetPreferredService(); } catch (RemoteException e) { diff --git a/core/java/android/nfc/cardemulation/NfcFServiceInfo.java b/core/java/android/nfc/cardemulation/NfcFServiceInfo.java index 7a36b269240c..ec919e4d66bc 100644 --- a/core/java/android/nfc/cardemulation/NfcFServiceInfo.java +++ b/core/java/android/nfc/cardemulation/NfcFServiceInfo.java @@ -14,9 +14,16 @@ * limitations under the License. */ +/********************************************************************** + * This file is not a part of the NFC mainline module * + * *******************************************************************/ + package android.nfc.cardemulation; +import android.annotation.FlaggedApi; +import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SystemApi; import android.content.ComponentName; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; @@ -26,7 +33,9 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; +import android.nfc.Flags; import android.os.Parcel; +import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.util.AttributeSet; import android.util.Log; @@ -36,13 +45,16 @@ import android.util.proto.ProtoOutputStream; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; /** + * Class to hold NfcF service info. + * * @hide */ +@SystemApi +@FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public final class NfcFServiceInfo implements Parcelable { static final String TAG = "NfcFServiceInfo"; @@ -51,42 +63,42 @@ public final class NfcFServiceInfo implements Parcelable { /** * The service that implements this */ - final ResolveInfo mService; + private final ResolveInfo mService; /** * Description of the service */ - final String mDescription; + private final String mDescription; /** * System Code of the service */ - final String mSystemCode; + private final String mSystemCode; /** * System Code of the service registered by API */ - String mDynamicSystemCode; + private String mDynamicSystemCode; /** * NFCID2 of the service */ - final String mNfcid2; + private final String mNfcid2; /** * NFCID2 of the service registered by API */ - String mDynamicNfcid2; + private String mDynamicNfcid2; /** * The uid of the package the service belongs to */ - final int mUid; + private final int mUid; /** * LF_T3T_PMM of the service */ - final String mT3tPmm; + private final String mT3tPmm; /** * @hide @@ -104,7 +116,16 @@ public final class NfcFServiceInfo implements Parcelable { this.mT3tPmm = t3tPmm; } - public NfcFServiceInfo(PackageManager pm, ResolveInfo info) + /** + * Creates a new NfcFServiceInfo object. + * + * @param pm packageManager instance + * @param info app component info + * @throws XmlPullParserException If an error occurs parsing the element. + * @throws IOException If an error occurs reading the element. + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public NfcFServiceInfo(@NonNull PackageManager pm, @NonNull ResolveInfo info) throws XmlPullParserException, IOException { ServiceInfo si = info.serviceInfo; XmlResourceParser parser = null; @@ -192,44 +213,107 @@ public final class NfcFServiceInfo implements Parcelable { mUid = si.applicationInfo.uid; } + /** + * Returns the app component corresponding to this NFCF service. + * + * @return app component for this service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public ComponentName getComponent() { return new ComponentName(mService.serviceInfo.packageName, mService.serviceInfo.name); } + /** + * Returns the system code corresponding to this service. + * + * @return system code for this service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public String getSystemCode() { return (mDynamicSystemCode == null ? mSystemCode : mDynamicSystemCode); } - public void setOrReplaceDynamicSystemCode(String systemCode) { + /** + * Add or replace a system code to this service. + * @param systemCode system code to set or replace + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void setDynamicSystemCode(@NonNull String systemCode) { mDynamicSystemCode = systemCode; } + /** + * Returns NFC ID2. + * + * @return nfc id2 to return + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public String getNfcid2() { return (mDynamicNfcid2 == null ? mNfcid2 : mDynamicNfcid2); } - public void setOrReplaceDynamicNfcid2(String nfcid2) { + /** + * Set or replace NFC ID2 + * + * @param nfcid2 NFC ID2 string + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void setDynamicNfcid2(@NonNull String nfcid2) { mDynamicNfcid2 = nfcid2; } + /** + * Returns description of service. + * @return user readable description of service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public String getDescription() { return mDescription; } + /** + * Returns uid of service. + * @return uid of the service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) public int getUid() { return mUid; } + /** + * Returns LF_T3T_PMM of the service + * @return returns LF_T3T_PMM of the service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull public String getT3tPmm() { return mT3tPmm; } - public CharSequence loadLabel(PackageManager pm) { + /** + * Load application label for this service. + * @param pm packagemanager instance + * @return label name corresponding to service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public CharSequence loadLabel(@NonNull PackageManager pm) { return mService.loadLabel(pm); } - public Drawable loadIcon(PackageManager pm) { + /** + * Load application icon for this service. + * @param pm packagemanager instance + * @return app icon corresponding to service + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + @NonNull + public Drawable loadIcon(@NonNull PackageManager pm) { return mService.loadIcon(pm); } @@ -270,13 +354,15 @@ public final class NfcFServiceInfo implements Parcelable { return getComponent().hashCode(); } + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Override public int describeContents() { return 0; } + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) @Override - public void writeToParcel(Parcel dest, int flags) { + public void writeToParcel(@NonNull Parcel dest, int flags) { mService.writeToParcel(dest, flags); dest.writeString(mDescription); dest.writeString(mSystemCode); @@ -293,7 +379,8 @@ public final class NfcFServiceInfo implements Parcelable { dest.writeString(mT3tPmm); }; - public static final @android.annotation.NonNull Parcelable.Creator<NfcFServiceInfo> CREATOR = + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public static final @NonNull Parcelable.Creator<NfcFServiceInfo> CREATOR = new Parcelable.Creator<NfcFServiceInfo>() { @Override public NfcFServiceInfo createFromParcel(Parcel source) { @@ -322,7 +409,15 @@ public final class NfcFServiceInfo implements Parcelable { } }; - public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + /** + * Dump contents of the service for debugging. + * @param fd parcelfiledescriptor instance + * @param pw printwriter instance + * @param args args for dumping + */ + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void dump(@NonNull ParcelFileDescriptor fd, @NonNull PrintWriter pw, + @NonNull String[] args) { pw.println(" " + getComponent() + " (Description: " + getDescription() + ")" + " (UID: " + getUid() + ")"); @@ -332,14 +427,15 @@ public final class NfcFServiceInfo implements Parcelable { } /** - * Dump debugging info as NfcFServiceInfoProto + * Dump debugging info as NfcFServiceInfoProto. * * If the output belongs to a sub message, the caller is responsible for wrapping this function * between {@link ProtoOutputStream#start(long)} and {@link ProtoOutputStream#end(long)}. * * @param proto the ProtoOutputStream to write to */ - public void dumpDebug(ProtoOutputStream proto) { + @FlaggedApi(Flags.FLAG_ENABLE_NFC_MAINLINE) + public void dumpDebug(@NonNull ProtoOutputStream proto) { Utils.dumpDebugComponentName(getComponent(), proto, NfcFServiceInfoProto.COMPONENT_NAME); proto.write(NfcFServiceInfoProto.DESCRIPTION, getDescription()); proto.write(NfcFServiceInfoProto.SYSTEM_CODE, getSystemCode()); @@ -347,4 +443,3 @@ public final class NfcFServiceInfo implements Parcelable { proto.write(NfcFServiceInfoProto.T3T_PMM, getT3tPmm()); } } - diff --git a/core/java/android/nfc/flags.aconfig b/core/java/android/nfc/flags.aconfig new file mode 100644 index 000000000000..e3faf3978856 --- /dev/null +++ b/core/java/android/nfc/flags.aconfig @@ -0,0 +1,8 @@ +package: "android.nfc" + +flag { + name: "enable_nfc_mainline" + namespace: "nfc" + description: "Flag for NFC mainline changes" + bug: "292140387" +} diff --git a/core/java/android/os/BatteryManager.java b/core/java/android/os/BatteryManager.java index 6bc0f6ea947c..092923e927a3 100644 --- a/core/java/android/os/BatteryManager.java +++ b/core/java/android/os/BatteryManager.java @@ -20,6 +20,7 @@ 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; @@ -232,6 +233,7 @@ public class BatteryManager { OsProtoEnums.CHARGING_POLICY_ADAPTIVE_LONGLIFE; // = 4 /** @hide */ + @TestApi public static final int BATTERY_PLUGGED_ANY = BATTERY_PLUGGED_AC | BATTERY_PLUGGED_USB | BATTERY_PLUGGED_WIRELESS | BATTERY_PLUGGED_DOCK; diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 00676f3cb746..218d4bb8514f 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -186,6 +186,8 @@ public class Binder implements IBinder { /** * Get the binder transaction observer for this process. * + * TODO(b/299356196): only applies to Java code, not C++/Rust + * * @hide */ public static void setObserver(@Nullable BinderInternal.Observer observer) { @@ -202,6 +204,8 @@ public class Binder implements IBinder { * that require a result must be sent as {@link IBinder#FLAG_ONEWAY} calls * which deliver results through a callback interface. * + * TODO(b/299355525): only applies to Java code, not C++/Rust + * * @hide */ public static void setWarnOnBlocking(boolean warnOnBlocking) { @@ -218,6 +222,8 @@ public class Binder implements IBinder { * interfaces hosted by package that could be upgraded or replaced, * otherwise you risk system instability if that remote interface wedges. * + * TODO(b/299355525): only applies to Java code, not C++/Rust + * * @hide */ public static IBinder allowBlocking(IBinder binder) { @@ -325,7 +331,24 @@ public class Binder implements IBinder { * @hide */ @CriticalNative - public static final native boolean isDirectlyHandlingTransaction(); + public static final native boolean isDirectlyHandlingTransactionNative(); + + private static boolean sIsHandlingBinderTransaction = false; + + /** + * @hide + */ + public static final boolean isDirectlyHandlingTransaction() { + return sIsHandlingBinderTransaction || isDirectlyHandlingTransactionNative(); + } + + /** + * This is Test API which will be used to override output of isDirectlyHandlingTransactionNative + * @hide + */ + public static void setIsDirectlyHandlingTransactionOverride(boolean isInTransaction) { + sIsHandlingBinderTransaction = isInTransaction; + } /** * Returns {@code true} if the current thread has had its identity @@ -926,16 +949,19 @@ public class Binder implements IBinder { * @hide */ @VisibleForTesting - public final @NonNull String getTransactionTraceName(int transactionCode) { + public final @Nullable String getTransactionTraceName(int transactionCode) { + final boolean isInterfaceUserDefined = getMaxTransactionId() == 0; if (mTransactionTraceNames == null) { - final int highestId = Math.min(getMaxTransactionId(), TRANSACTION_TRACE_NAME_ID_LIMIT); + final int highestId = isInterfaceUserDefined ? TRANSACTION_TRACE_NAME_ID_LIMIT + : Math.min(getMaxTransactionId(), TRANSACTION_TRACE_NAME_ID_LIMIT); mSimpleDescriptor = getSimpleDescriptor(); mTransactionTraceNames = new AtomicReferenceArray(highestId + 1); } - final int index = transactionCode - FIRST_CALL_TRANSACTION; - if (index < 0 || index >= mTransactionTraceNames.length()) { - return mSimpleDescriptor + "#" + transactionCode; + final int index = isInterfaceUserDefined + ? transactionCode : transactionCode - FIRST_CALL_TRANSACTION; + if (index >= mTransactionTraceNames.length() || index < 0) { + return null; } String transactionTraceName = mTransactionTraceNames.getAcquire(index); @@ -1287,6 +1313,8 @@ public class Binder implements IBinder { int callingUid) { // Make sure the observer won't change while processing a transaction. final BinderInternal.Observer observer = sObserver; + + // TODO(b/299356196): observer should also observe transactions in native code final CallSession callSession = observer != null ? observer.callStarted(this, code, UNSET_WORKSOURCE) : null; // Theoretically, we should call transact, which will call onTransact, @@ -1300,26 +1328,16 @@ public class Binder implements IBinder { final boolean hasFullyQualifiedName = getMaxTransactionId() > 0; final String transactionTraceName; - if (tagEnabled && hasFullyQualifiedName) { + if (tagEnabled) { // If tracing enabled and we have a fully qualified name, fetch the name transactionTraceName = getTransactionTraceName(code); - } else if (tagEnabled && isStackTrackingEnabled()) { - // If tracing is enabled and we *don't* have a fully qualified name, fetch the - // 'best effort' name only for stack tracking. This works around noticeable perf impact - // on low latency binder calls (<100us). The tracing call itself is between (1-10us) and - // the perf impact can be quite noticeable while benchmarking such binder calls. - // The primary culprits are ContentProviders and Cursors which convenienty don't - // autogenerate their AIDL and hence will not have a fully qualified name. - // - // TODO(b/253426478): Relax this constraint after a more robust fix - transactionTraceName = getTransactionTraceName(code); } else { transactionTraceName = null; } final boolean tracingEnabled = tagEnabled && transactionTraceName != null; try { - // TODO - this logic should not be in Java - it should be in native + // TODO(b/299356201) - this logic should not be in Java - it should be in native // code in libbinder so that it works for all binder users. final BinderCallHeavyHitterWatcher heavyHitterWatcher = sHeavyHitterWatcher; if (heavyHitterWatcher != null && callingUid != -1) { @@ -1330,9 +1348,9 @@ public class Binder implements IBinder { Trace.traceBegin(Trace.TRACE_TAG_AIDL, transactionTraceName); } - // TODO - this logic should not be in Java - it should be in native - // code in libbinder so that it works for all binder users. Further, - // this should not re-use flags. + // TODO(b/299353919) - this logic should not be in Java - it should be + // in native code in libbinder so that it works for all binder users. + // Further, this should not re-use flags. if ((flags & FLAG_COLLECT_NOTED_APP_OPS) != 0 && callingUid != -1) { AppOpsManager.startNotedAppOpsCollection(callingUid); try { diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java index 1929a4d562d4..5196b1702cc0 100644 --- a/core/java/android/os/BinderProxy.java +++ b/core/java/android/os/BinderProxy.java @@ -32,7 +32,9 @@ import java.io.FileDescriptor; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -613,15 +615,35 @@ public final class BinderProxy implements IBinder { */ public native boolean transactNative(int code, Parcel data, Parcel reply, int flags) throws RemoteException; + + /* This list is to hold strong reference to the death recipients that are waiting for the death + * of binder that this proxy references. Previously, the death recipients were strongy + * referenced from JNI, but that can cause memory leak (b/298374304) when the application has a + * strong reference from the death recipient to the proxy object. The JNI reference is now weak. + * And this strong reference is to keep death recipients at least until the proxy is GC'ed. */ + private List<DeathRecipient> mDeathRecipients = Collections.synchronizedList(new ArrayList<>()); + /** * See {@link IBinder#linkToDeath(DeathRecipient, int)} */ - public native void linkToDeath(DeathRecipient recipient, int flags) - throws RemoteException; + public void linkToDeath(DeathRecipient recipient, int flags) + throws RemoteException { + linkToDeathNative(recipient, flags); + mDeathRecipients.add(recipient); + } + /** * See {@link IBinder#unlinkToDeath} */ - public native boolean unlinkToDeath(DeathRecipient recipient, int flags); + public boolean unlinkToDeath(DeathRecipient recipient, int flags) { + mDeathRecipients.remove(recipient); + return unlinkToDeathNative(recipient, flags); + } + + private native void linkToDeathNative(DeathRecipient recipient, int flags) + throws RemoteException; + + private native boolean unlinkToDeathNative(DeathRecipient recipient, int flags); /** * Perform a dump on the remote object diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 9f9c2222f9d9..509c3b88441e 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -1223,6 +1223,11 @@ public class Build { * Upside Down Cake. */ public static final int UPSIDE_DOWN_CAKE = 34; + + /** + * Vanilla Ice Cream. + */ + public static final int VANILLA_ICE_CREAM = CUR_DEVELOPMENT; } /** The type of build, like "user" or "eng". */ @@ -1555,7 +1560,7 @@ public class Build { String attestProp = getString( TextUtils.formatSimple("ro.product.%s_for_attestation", property)); return attestProp.equals(UNKNOWN) - ? getString(TextUtils.formatSimple("ro.product.vendor.%s", property)) : UNKNOWN; + ? getString(TextUtils.formatSimple("ro.product.vendor.%s", property)) : attestProp; } private static String[] getStringList(String property, String separator) { diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java index 403f55ceb94a..cf3546057549 100644 --- a/core/java/android/os/DropBoxManager.java +++ b/core/java/android/os/DropBoxManager.java @@ -364,7 +364,7 @@ public class DropBoxManager { } /** - * Checks any blacklists (set in system settings) to see whether a certain + * Checks any denylists (set in system settings) to see whether a certain * tag is allowed. Entries with disabled tags will be dropped immediately, * so you can save the work of actually constructing and sending the data. * diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java index ceaf337b2122..22d6fcdc7983 100644 --- a/core/java/android/os/Handler.java +++ b/core/java/android/os/Handler.java @@ -119,7 +119,7 @@ public class Handler { * crashes (if a handler is sometimes created on a thread without a Looper active), or race * conditions, where the thread a handler is associated with is not what the author * anticipated. Instead, use an {@link java.util.concurrent.Executor} or specify the Looper - * explicitly, using {@link Looper#getMainLooper}, {link android.view.View#getHandler}, or + * explicitly, using {@link Looper#getMainLooper}, {@link android.view.View#getHandler}, or * similar. If the implicit thread local behavior is required for compatibility, use * {@code new Handler(Looper.myLooper())} to make it clear to readers. * @@ -144,7 +144,7 @@ public class Handler { * crashes (if a handler is sometimes created on a thread without a Looper active), or race * conditions, where the thread a handler is associated with is not what the author * anticipated. Instead, use an {@link java.util.concurrent.Executor} or specify the Looper - * explicitly, using {@link Looper#getMainLooper}, {link android.view.View#getHandler}, or + * explicitly, using {@link Looper#getMainLooper}, {@link android.view.View#getHandler}, or * similar. If the implicit thread local behavior is required for compatibility, use * {@code new Handler(Looper.myLooper(), callback)} to make it clear to readers. */ @@ -182,7 +182,7 @@ public class Handler { * * Asynchronous messages represent interrupts or events that do not require global ordering * with respect to synchronous messages. Asynchronous messages are not subject to - * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}. + * the synchronization barriers introduced by {@link MessageQueue#postSyncBarrier()}. * * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for * each {@link Message} that is sent to it or {@link Runnable} that is posted to it. @@ -203,7 +203,7 @@ public class Handler { * * Asynchronous messages represent interrupts or events that do not require global ordering * with respect to synchronous messages. Asynchronous messages are not subject to - * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}. + * the synchronization barriers introduced by {@link MessageQueue#postSyncBarrier()}. * * @param callback The callback interface in which to handle messages, or null. * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for @@ -751,7 +751,7 @@ public class Handler { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException( - this + " sendMessageAtTime() called with no mQueue"); + this + " sendMessageAtFrontOfQueue() called with no mQueue"); Log.w("Looper", e.getMessage(), e); return false; } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 40f7533a2800..1a3dcee427d8 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -19,7 +19,6 @@ package android.os; import android.net.InterfaceConfiguration; import android.net.INetworkManagementEventObserver; -import android.net.ITetheringStatsProvider; import android.net.Network; import android.net.NetworkStats; import android.net.RouteInfo; @@ -127,128 +126,90 @@ interface INetworkManagementService /** * Returns true if IP forwarding is enabled */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "Use {@code android.net.INetd#ipfwdEnabled}") boolean getIpForwardingEnabled(); /** * Enables/Disables IP Forwarding */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "Avoid using this directly. Instead, enable tethering with " + + "{@code android.net.TetheringManager#startTethering}. See also " + + "{@code INetd#ipfwdEnableForwarding(String)}.") void setIpForwardingEnabled(boolean enabled); /** * Start tethering services with the specified dhcp server range * arg is a set of start end pairs defining the ranges. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "{@code android.net.TetheringManager#startTethering}") void startTethering(in String[] dhcpRanges); /** - * Start tethering services with the specified dhcp server range and - * DNS proxy config. - * {@code boolean} is used to control legacy DNS proxy server. - * {@code String[]} is a set of start end pairs defining the ranges. - */ - void startTetheringWithConfiguration(boolean usingLegacyDnsProxy, in String[] dhcpRanges); - - /** * Stop currently running tethering services */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "{@code android.net.TetheringManager#stopTethering(int)}") void stopTethering(); /** * Returns true if tethering services are started */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "Generally track your own tethering requests. " + + "See also {@code android.net.INetd#tetherIsEnabled()}") boolean isTetheringStarted(); /** * Tethers the specified interface */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "Avoid using this directly. Instead, enable tethering with " + + "{@code android.net.TetheringManager#startTethering}. See also " + + "{@code com.android.net.module.util.NetdUtils#tetherInterface}.") void tetherInterface(String iface); /** * Untethers the specified interface */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "Avoid using this directly. Instead, disable " + + "tethering with {@code android.net.TetheringManager#stopTethering(int)}. " + + "See also {@code NetdUtils#untetherInterface}.") void untetherInterface(String iface); /** * Returns a list of currently tethered interfaces */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "{@code android.net.TetheringManager#getTetheredIfaces()}") String[] listTetheredInterfaces(); /** - * Returns the list of DNS forwarders (in order of priority) - */ - String[] getDnsForwarders(); - - /** - * Enables unidirectional packet forwarding from {@code fromIface} to - * {@code toIface}. - */ - void startInterfaceForwarding(String fromIface, String toIface); - - /** - * Disables unidirectional packet forwarding from {@code fromIface} to - * {@code toIface}. - */ - void stopInterfaceForwarding(String fromIface, String toIface); - - /** * Enables Network Address Translation between two interfaces. * The address and netmask of the external interface is used for * the NAT'ed network. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "Avoid using this directly. Instead, enable tethering with " + + "{@code android.net.TetheringManager#startTethering}.") void enableNat(String internalInterface, String externalInterface); /** * Disables Network Address Translation between two interfaces. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = 34, trackingBug = 170729553, + publicAlternatives = "Avoid using this directly. Instead, disable tethering with " + + "{@code android.net.TetheringManager#stopTethering(int)}.") void disableNat(String internalInterface, String externalInterface); /** - * Registers a {@code ITetheringStatsProvider} to provide tethering statistics. - * All registered providers will be called in order, and their results will be added together. - * Netd is always registered as a tethering stats provider. - */ - void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name); - - /** - * Unregisters a previously-registered {@code ITetheringStatsProvider}. - */ - void unregisterTetheringStatsProvider(ITetheringStatsProvider provider); - - /** - * Reports that a tethering provider has reached a data limit. - * - * Currently triggers a global alert, which causes NetworkStatsService to poll counters and - * re-evaluate data usage. - * - * This does not take an interface name because: - * 1. The tethering offload stats provider cannot reliably determine the interface on which the - * limit was reached, because the HAL does not provide it. - * 2. Firing an interface-specific alert instead of a global alert isn't really useful since in - * all cases of interest, the system responds to both in the same way - it polls stats, and - * then notifies NetworkPolicyManagerService of the fact. - */ - void tetherLimitReached(ITetheringStatsProvider provider); - - /** ** DATA USAGE RELATED **/ /** - * Return summary of network statistics all tethering interfaces. - */ - NetworkStats getNetworkStatsTethering(int how); - - /** * Set quota for an interface. */ void setInterfaceQuota(String iface, long quotaBytes); @@ -269,11 +230,6 @@ interface INetworkManagementService void removeInterfaceAlert(String iface); /** - * Set alert across all interfaces. - */ - void setGlobalAlert(long alertBytes); - - /** * Control network activity of a UID over interfaces with a quota limit. */ void setUidOnMeteredNetworkDenylist(int uid, boolean enable); @@ -291,7 +247,6 @@ interface INetworkManagementService void setFirewallEnabled(boolean enabled); boolean isFirewallEnabled(); - void setFirewallInterfaceRule(String iface, boolean allow); void setFirewallUidRule(int chain, int uid, int rule); void setFirewallUidRules(int chain, in int[] uids, in int[] rules); void setFirewallChainEnabled(int chain, boolean enable); @@ -306,10 +261,6 @@ interface INetworkManagementService */ void denyProtect(int uid); - void addInterfaceToLocalNetwork(String iface, in List<RouteInfo> routes); - void removeInterfaceFromLocalNetwork(String iface); - int removeRoutesFromLocalNetwork(in List<RouteInfo> routes); - @EnforcePermission("OBSERVE_NETWORK_POLICY") boolean isNetworkRestricted(int uid); } diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS index e9a32544e58e..d9a9266cfddc 100644 --- a/core/java/android/os/OWNERS +++ b/core/java/android/os/OWNERS @@ -10,6 +10,7 @@ per-file PowerManagerInternal.java = michaelwr@google.com, santoscordon@google.c # BatteryStats per-file *BatteryConsumer* = file:/BATTERY_STATS_OWNERS per-file BatteryManager* = file:/BATTERY_STATS_OWNERS +per-file PowerMonitor* = file:/BATTERY_STATS_OWNERS per-file PowerComponents.java = file:/BATTERY_STATS_OWNERS per-file *Stats* = file:/BATTERY_STATS_OWNERS @@ -79,3 +80,6 @@ per-file PermissionEnforcer.java = tweek@google.com, brufino@google.com # ART per-file ArtModuleServiceManager.java = file:platform/art:/OWNERS + +# PerformanceHintManager +per-file PerformanceHintManager.java = file:/ADPF_OWNERS diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index e784c2669575..352c9d2ba81f 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -63,6 +63,7 @@ import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -362,6 +363,22 @@ public final class Parcel { // see libbinder's binder/Status.h private static final int EX_TRANSACTION_FAILED = -129; + // Allow limit of 1 MB for allocating arrays + private static final int ARRAY_ALLOCATION_LIMIT = 1000000; + + // Following type size are used to determine allocation size while creating arrays + private static final int SIZE_BYTE = 1; + private static final int SIZE_CHAR = 2; + private static final int SIZE_SHORT = 2; + private static final int SIZE_BOOLEAN = 4; + private static final int SIZE_INT = 4; + private static final int SIZE_FLOAT = 4; + private static final int SIZE_DOUBLE = 8; + private static final int SIZE_LONG = 8; + + // Assume the least possible size for complex objects + private static final int SIZE_COMPLEX_TYPE = 1; + @CriticalNative private static native void nativeMarkSensitive(long nativePtr); @FastNative @@ -1502,9 +1519,71 @@ public final class Parcel { } } + private static <T> int getItemTypeSize(@NonNull Class<T> arrayClass) { + final Class<?> componentType = arrayClass.getComponentType(); + // typeSize has been referred from respective create*Array functions + if (componentType == boolean.class) { + return SIZE_BOOLEAN; + } else if (componentType == byte.class) { + return SIZE_BYTE; + } else if (componentType == char.class) { + return SIZE_CHAR; + } else if (componentType == int.class) { + return SIZE_INT; + } else if (componentType == long.class) { + return SIZE_LONG; + } else if (componentType == float.class) { + return SIZE_FLOAT; + } else if (componentType == double.class) { + return SIZE_DOUBLE; + } + + return SIZE_COMPLEX_TYPE; + } + + private void ensureWithinMemoryLimit(int typeSize, @NonNull int... dimensions) { + // For Multidimensional arrays, Calculate total object + // which will be allocated. + int totalObjects = 1; + try { + for (int dimension : dimensions) { + totalObjects = Math.multiplyExact(totalObjects, dimension); + } + } catch (ArithmeticException e) { + Log.e(TAG, "ArithmeticException occurred while multiplying dimensions " + e); + BadParcelableException badParcelableException = new BadParcelableException("Estimated " + + "array length is too large. Array Dimensions:" + Arrays.toString(dimensions)); + SneakyThrow.sneakyThrow(badParcelableException); + } + ensureWithinMemoryLimit(typeSize, totalObjects); + } + + private void ensureWithinMemoryLimit(int typeSize, @NonNull int length) { + int estimatedAllocationSize = 0; + try { + estimatedAllocationSize = Math.multiplyExact(typeSize, length); + } catch (ArithmeticException e) { + Log.e(TAG, "ArithmeticException occurred while multiplying values " + typeSize + + " and " + length + " Exception: " + e); + BadParcelableException badParcelableException = new BadParcelableException("Estimated " + + "allocation size is too large. typeSize: " + typeSize + " length: " + length); + SneakyThrow.sneakyThrow(badParcelableException); + } + + boolean isInBinderTransaction = Binder.isDirectlyHandlingTransaction(); + if (isInBinderTransaction && (estimatedAllocationSize > ARRAY_ALLOCATION_LIMIT)) { + Log.e(TAG, "Trying to Allocate " + estimatedAllocationSize + + " memory, In Binder Transaction : " + isInBinderTransaction); + BadParcelableException e = new BadParcelableException("Allocation of size " + + estimatedAllocationSize + " is above allowed limit of 1MB"); + SneakyThrow.sneakyThrow(e); + } + } + @Nullable public final boolean[] createBooleanArray() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_BOOLEAN, N); // >>2 as a fast divide-by-4 works in the create*Array() functions // because dataAvail() will never return a negative number. 4 is // the size of a stored boolean in the stream. @@ -1547,6 +1626,7 @@ public final class Parcel { @Nullable public short[] createShortArray() { int n = readInt(); + ensureWithinMemoryLimit(SIZE_SHORT, n); if (n >= 0 && n <= (dataAvail() >> 2)) { short[] val = new short[n]; for (int i = 0; i < n; i++) { @@ -1585,6 +1665,7 @@ public final class Parcel { @Nullable public final char[] createCharArray() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_CHAR, N); if (N >= 0 && N <= (dataAvail() >> 2)) { char[] val = new char[N]; for (int i=0; i<N; i++) { @@ -1622,6 +1703,7 @@ public final class Parcel { @Nullable public final int[] createIntArray() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_INT, N); if (N >= 0 && N <= (dataAvail() >> 2)) { int[] val = new int[N]; for (int i=0; i<N; i++) { @@ -1659,6 +1741,7 @@ public final class Parcel { @Nullable public final long[] createLongArray() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_LONG, N); // >>3 because stored longs are 64 bits if (N >= 0 && N <= (dataAvail() >> 3)) { long[] val = new long[N]; @@ -1697,6 +1780,7 @@ public final class Parcel { @Nullable public final float[] createFloatArray() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_FLOAT, N); // >>2 because stored floats are 4 bytes if (N >= 0 && N <= (dataAvail() >> 2)) { float[] val = new float[N]; @@ -1735,6 +1819,7 @@ public final class Parcel { @Nullable public final double[] createDoubleArray() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_DOUBLE, N); // >>3 because stored doubles are 8 bytes if (N >= 0 && N <= (dataAvail() >> 3)) { double[] val = new double[N]; @@ -1788,6 +1873,7 @@ public final class Parcel { @Nullable public final String[] createString8Array() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); if (N >= 0) { String[] val = new String[N]; for (int i=0; i<N; i++) { @@ -1828,6 +1914,7 @@ public final class Parcel { @Nullable public final String[] createString16Array() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); if (N >= 0) { String[] val = new String[N]; for (int i=0; i<N; i++) { @@ -1920,6 +2007,7 @@ public final class Parcel { @Nullable public final IBinder[] createBinderArray() { int N = readInt(); + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); if (N >= 0) { IBinder[] val = new IBinder[N]; for (int i=0; i<N; i++) { @@ -1954,6 +2042,7 @@ public final class Parcel { public final <T extends IInterface> T[] createInterfaceArray( @NonNull IntFunction<T[]> newArray, @NonNull Function<IBinder, T> asInterface) { int N = readInt(); + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); if (N >= 0) { T[] val = newArray.apply(N); for (int i=0; i<N; i++) { @@ -3200,6 +3289,7 @@ public final class Parcel { if (N < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); FileDescriptor[] f = new FileDescriptor[N]; for (int i = 0; i < N; i++) { f[i] = readRawFileDescriptor(); @@ -3666,6 +3756,7 @@ public final class Parcel { if (N < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); ArrayList<T> l = new ArrayList<T>(N); while (N > 0) { l.add(readTypedObject(c)); @@ -3717,6 +3808,7 @@ public final class Parcel { if (count < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, count); final SparseArray<T> array = new SparseArray<>(count); for (int i = 0; i < count; i++) { final int index = readInt(); @@ -3745,6 +3837,7 @@ public final class Parcel { if (count < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, count); final ArrayMap<String, T> map = new ArrayMap<>(count); for (int i = 0; i < count; i++) { final String key = readString(); @@ -3771,6 +3864,7 @@ public final class Parcel { if (N < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); ArrayList<String> l = new ArrayList<String>(N); while (N > 0) { l.add(readString()); @@ -3796,6 +3890,7 @@ public final class Parcel { if (N < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); ArrayList<IBinder> l = new ArrayList<IBinder>(N); while (N > 0) { l.add(readStrongBinder()); @@ -3822,6 +3917,7 @@ public final class Parcel { if (N < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); ArrayList<T> l = new ArrayList<T>(N); while (N > 0) { l.add(asInterface.apply(readStrongBinder())); @@ -3981,6 +4077,7 @@ public final class Parcel { if (N < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, N); T[] l = c.newArray(N); for (int i=0; i<N; i++) { l[i] = readTypedObject(c); @@ -4209,6 +4306,10 @@ public final class Parcel { while (innermost.isArray()) { innermost = innermost.getComponentType(); } + + int typeSize = getItemTypeSize(innermost); + ensureWithinMemoryLimit(typeSize, dimensions); + val = (T) Array.newInstance(innermost, dimensions); for (int i = 0; i < length; i++) { readFixedArray(Array.get(val, i)); @@ -4265,6 +4366,10 @@ public final class Parcel { while (innermost.isArray()) { innermost = innermost.getComponentType(); } + + int typeSize = getItemTypeSize(innermost); + ensureWithinMemoryLimit(typeSize, dimensions); + val = (T) Array.newInstance(innermost, dimensions); for (int i = 0; i < length; i++) { readFixedArray(Array.get(val, i), asInterface); @@ -4320,6 +4425,10 @@ public final class Parcel { while (innermost.isArray()) { innermost = innermost.getComponentType(); } + + int typeSize = getItemTypeSize(innermost); + ensureWithinMemoryLimit(typeSize, dimensions); + val = (T) Array.newInstance(innermost, dimensions); for (int i = 0; i < length; i++) { readFixedArray(Array.get(val, i), c); @@ -5076,6 +5185,7 @@ public final class Parcel { if (n < 0) { return null; } + ensureWithinMemoryLimit(SIZE_COMPLEX_TYPE, n); T[] p = (T[]) ((clazz == null) ? new Parcelable[n] : Array.newInstance(clazz, n)); for (int i = 0; i < n; i++) { p[i] = readParcelableInternal(loader, clazz); diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index d1c10fa46aaa..6e19c2ad24e3 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -33,7 +33,6 @@ import android.app.PropertyInvalidatedCache; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.service.dreams.Sandman; -import android.sysprop.InitProperties; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; @@ -868,6 +867,8 @@ public final class PowerManager { /** * The 'reason' value used for rebooting userspace. + * + * @deprecated userspace reboot is not supported * @hide */ @SystemApi @@ -1824,16 +1825,18 @@ public final class PowerManager { * <p>This method exists solely for the sake of re-using same logic between {@code PowerManager} * and {@code PowerManagerService}. * + * @deprecated TODO(b/292469129): remove this method. * @hide */ public static boolean isRebootingUserspaceSupportedImpl() { - return InitProperties.is_userspace_reboot_supported().orElse(false); + return false; } /** * Returns {@code true} if this device supports rebooting userspace. + * + * @deprecated userspace reboot is deprecated, this method always returns {@code false}. */ - // TODO(b/138605180): add link to documentation once it's ready. public boolean isRebootingUserspaceSupported() { return isRebootingUserspaceSupportedImpl(); } diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java index b210c4644d7d..e96c24d677f1 100644 --- a/core/java/android/os/ServiceManager.java +++ b/core/java/android/os/ServiceManager.java @@ -245,7 +245,7 @@ public final class ServiceManager { public static boolean isDeclared(@NonNull String name) { try { return getIServiceManager().isDeclared(name); - } catch (RemoteException e) { + } catch (RemoteException | SecurityException e) { Log.e(TAG, "error in isDeclared", e); return false; } diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java index ef3901082833..0527ed692da4 100644 --- a/core/java/android/os/UserHandle.java +++ b/core/java/android/os/UserHandle.java @@ -606,12 +606,9 @@ public final class UserHandle implements Parcelable { @Override public boolean equals(@Nullable Object obj) { - try { - if (obj != null) { - UserHandle other = (UserHandle)obj; - return mHandle == other.mHandle; - } - } catch (ClassCastException ignore) { + if (obj instanceof UserHandle) { + UserHandle other = (UserHandle) obj; + return mHandle == other.mHandle; } return false; } diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 84f1880213b8..159394b2b776 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -1810,6 +1810,31 @@ public class UserManager { public static final String DISALLOW_ULTRA_WIDEBAND_RADIO = "no_ultra_wideband_radio"; /** + * This user restriction specifies if Near-fied communication is disallowed on the device. If + * Near-field communication is disallowed it cannot be turned on via Settings. + * + * <p>This restriction can only be set by a device owner or a profile owner of an + * organization-owned managed profile on the parent profile. + * In both cases, the restriction applies globally on the device and will turn off the + * Near-field communication radio if it's currently on and prevent the radio from being turned + * on in the future. + * + * <p> + * Near-field communication (NFC) is a radio technology that allows two devices (like your phone + * and a payments terminal) to communicate with each other when they're close together. + * + * <p>Default is <code>false</code>. + * + * <p>Key for user restrictions. + * <p>Type: Boolean + * @see DevicePolicyManager#addUserRestriction(ComponentName, String) + * @see DevicePolicyManager#clearUserRestriction(ComponentName, String) + * @see #getUserRestrictions() + */ + public static final String DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO = + "no_near_field_communication_radio"; + + /** * List of key values that can be passed into the various user restriction related methods * in {@link UserManager} & {@link DevicePolicyManager}. * Note: This is slightly different from the real set of user restrictions listed in {@link @@ -1893,6 +1918,7 @@ public class UserManager { DISALLOW_CELLULAR_2G, DISALLOW_ULTRA_WIDEBAND_RADIO, DISALLOW_GRANT_ADMIN, + DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO, }) @Retention(RetentionPolicy.SOURCE) public @interface UserRestrictionKey {} diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig new file mode 100644 index 000000000000..851aa6dce560 --- /dev/null +++ b/core/java/android/os/flags.aconfig @@ -0,0 +1,8 @@ +package: "android.os" + +flag { + name: "disallow_cellular_null_ciphers_restriction" + namespace: "cellular_security" + description: "Guards a new UserManager user restriction that admins can use to require cellular encryption on their managed devices." + bug: "276752881" +} diff --git a/core/java/android/os/image/DynamicSystemClient.java b/core/java/android/os/image/DynamicSystemClient.java index 218ecc8c5571..88096ab91261 100644 --- a/core/java/android/os/image/DynamicSystemClient.java +++ b/core/java/android/os/image/DynamicSystemClient.java @@ -209,6 +209,13 @@ public class DynamicSystemClient { public static final String ACTION_HIDE_NOTIFICATION = "android.os.image.action.HIDE_NOTIFICATION"; + /** + * Intent action: notify the service to post a status update when keyguard is dismissed. + * @hide + */ + public static final String ACTION_NOTIFY_KEYGUARD_DISMISSED = + "android.os.image.action.NOTIFY_KEYGUARD_DISMISSED"; + /* * Intent Keys */ diff --git a/core/java/android/os/image/DynamicSystemManager.java b/core/java/android/os/image/DynamicSystemManager.java index 9610b16a312c..536795bafb1c 100644 --- a/core/java/android/os/image/DynamicSystemManager.java +++ b/core/java/android/os/image/DynamicSystemManager.java @@ -285,4 +285,16 @@ public class DynamicSystemManager { throw new RuntimeException(e.toString()); } } + + /** + * Returns the active DSU slot + */ + @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM) + public String getActiveDsuSlot() { + try { + return mService.getActiveDsuSlot(); + } catch (RemoteException e) { + throw new RuntimeException(e.toString()); + } + } } diff --git a/core/java/android/os/image/IDynamicSystemService.aidl b/core/java/android/os/image/IDynamicSystemService.aidl index 755368a85c40..0280ebbd87ab 100644 --- a/core/java/android/os/image/IDynamicSystemService.aidl +++ b/core/java/android/os/image/IDynamicSystemService.aidl @@ -145,4 +145,10 @@ interface IDynamicSystemService */ @EnforcePermission("MANAGE_DYNAMIC_SYSTEM") long suggestScratchSize(); + + /** + * Get the active DSU slot + */ + @EnforcePermission("MANAGE_DYNAMIC_SYSTEM") + String getActiveDsuSlot(); } diff --git a/core/java/android/os/storage/StorageManagerInternal.java b/core/java/android/os/storage/StorageManagerInternal.java index 059bd846327c..22e8251b3f52 100644 --- a/core/java/android/os/storage/StorageManagerInternal.java +++ b/core/java/android/os/storage/StorageManagerInternal.java @@ -19,6 +19,7 @@ package android.os.storage; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; +import android.content.pm.UserInfo; import android.os.IVold; import java.util.List; @@ -169,4 +170,19 @@ public abstract class StorageManagerInternal { */ public abstract void registerCloudProviderChangeListener( @NonNull CloudProviderChangeListener listener); + + /** + * Prepares user data directories before moving storage or apps. This is required as adoptable + * storage unlock is tied to the prepare user data and storage needs to be unlocked before + * performing any operations on it. This will also create user data directories before + * initiating the move operations, which essential for ensuring the directories to have correct + * SELinux labels and permissions. + * + * @param fromVolumeUuid the source volume UUID from which content needs to be transferred + * @param toVolumeUuid the destination volume UUID to which contents are to be transferred + * @param users a list of users for whom to prepare storage + */ + public abstract void prepareUserStorageForMove(String fromVolumeUuid, String toVolumeUuid, + List<UserInfo> users); + } diff --git a/core/java/android/permission/DEFAULT_PERMISSION_GRANT_POLICY_OWNERS b/core/java/android/permission/DEFAULT_PERMISSION_GRANT_POLICY_OWNERS index 4564c30b5d61..6c208a8e3d68 100644 --- a/core/java/android/permission/DEFAULT_PERMISSION_GRANT_POLICY_OWNERS +++ b/core/java/android/permission/DEFAULT_PERMISSION_GRANT_POLICY_OWNERS @@ -1,7 +1,6 @@ -ashfall@google.com hackbod@google.com +joecastro@google.com jsharkey@google.com -narayan@google.com patb@google.com yamasani@google.com -zhanghai@google.com +zhanghai@google.com
\ No newline at end of file diff --git a/core/java/android/permission/OWNERS b/core/java/android/permission/OWNERS index 4603e43fd164..d2f4b50eaa1b 100644 --- a/core/java/android/permission/OWNERS +++ b/core/java/android/permission/OWNERS @@ -1,6 +1,5 @@ # Bug component: 137825 -ashfall@google.com augale@google.com evanseverson@google.com fayey@google.com @@ -8,12 +7,8 @@ jaysullivan@google.com joecastro@google.com kvakil@google.com mrulhania@google.com -narayan@google.com ntmyren@google.com -olekarg@google.com -pyuli@google.com rmacgregor@google.com -sergeynv@google.com theianchen@google.com yutingfang@google.com zhanghai@google.com diff --git a/core/java/android/permission/PermissionControllerManager.java b/core/java/android/permission/PermissionControllerManager.java index b494c7f4026a..46276c037574 100644 --- a/core/java/android/permission/PermissionControllerManager.java +++ b/core/java/android/permission/PermissionControllerManager.java @@ -40,6 +40,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Process; @@ -81,8 +82,8 @@ import java.util.function.IntConsumer; public final class PermissionControllerManager { private static final String TAG = PermissionControllerManager.class.getSimpleName(); - private static final long REQUEST_TIMEOUT_MILLIS = 60000; - private static final long UNBIND_TIMEOUT_MILLIS = 10000; + private static final long REQUEST_TIMEOUT_MILLIS = 60000L * Build.HW_TIMEOUT_MULTIPLIER; + private static final long UNBIND_TIMEOUT_MILLIS = 10000L * Build.HW_TIMEOUT_MULTIPLIER; private static final int CHUNK_SIZE = 4 * 1024; private static final Object sLock = new Object(); diff --git a/core/java/android/print/OWNERS b/core/java/android/print/OWNERS index 28a242037f6a..0809de25b45c 100644 --- a/core/java/android/print/OWNERS +++ b/core/java/android/print/OWNERS @@ -1,4 +1,4 @@ # Bug component: 47273 -svetoslavganov@android.com -svetoslavganov@google.com +anothermark@google.com +kumarashishg@google.com diff --git a/core/java/android/print/pdf/OWNERS b/core/java/android/print/pdf/OWNERS deleted file mode 100644 index 28a242037f6a..000000000000 --- a/core/java/android/print/pdf/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -# Bug component: 47273 - -svetoslavganov@android.com -svetoslavganov@google.com diff --git a/core/java/android/printservice/OWNERS b/core/java/android/printservice/OWNERS index 28a242037f6a..0809de25b45c 100644 --- a/core/java/android/printservice/OWNERS +++ b/core/java/android/printservice/OWNERS @@ -1,4 +1,4 @@ # Bug component: 47273 -svetoslavganov@android.com -svetoslavganov@google.com +anothermark@google.com +kumarashishg@google.com diff --git a/core/java/android/printservice/recommendation/OWNERS b/core/java/android/printservice/recommendation/OWNERS deleted file mode 100644 index 28a242037f6a..000000000000 --- a/core/java/android/printservice/recommendation/OWNERS +++ /dev/null @@ -1,4 +0,0 @@ -# Bug component: 47273 - -svetoslavganov@android.com -svetoslavganov@google.com diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index d695c0cb3760..baeb1aa71207 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1437,7 +1437,7 @@ public final class Settings { /** * Activity Action: Ask the user to allow an app to ignore battery optimizations (that is, - * put them on the whitelist of apps shown by + * put them on the allowlist of apps shown by * {@link #ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}). For an app to use this, it also * must hold the {@link android.Manifest.permission#REQUEST_IGNORE_BATTERY_OPTIMIZATIONS} * permission. @@ -12126,7 +12126,7 @@ public final class Settings { public static final String BUGREPORT_IN_POWER_MENU = "bugreport_in_power_menu"; /** - * The package name for the custom bugreport handler app. This app must be whitelisted. + * The package name for the custom bugreport handler app. This app must be allowlisted. * This is currently used only by Power Menu short press. * @deprecated Use {@link android.provider.Settings.Secure#CUSTOM_BUGREPORT_HANDLER_APP} * instead @@ -12542,7 +12542,7 @@ public final class Settings { "location_background_throttle_proximity_alert_interval_ms"; /** - * Packages that are whitelisted for background throttling (throttling will not be applied). + * Packages that are allowlisted for background throttling (throttling will not be applied). * @hide */ @Readable @@ -12550,7 +12550,7 @@ public final class Settings { "location_background_throttle_package_whitelist"; /** - * Packages that are whitelisted for ignoring location settings (may retrieve location even + * Packages that are allowlisted for ignoring location settings (may retrieve location even * when user location settings are off), for emergency purposes. * @deprecated No longer used from Android 12+ * @hide @@ -13114,7 +13114,7 @@ public final class Settings { /** * List of certificate (hex string representation of the application's certificate - SHA-1 - * or SHA-256) and carrier app package pairs which are whitelisted to prompt the user for + * or SHA-256) and carrier app package pairs which are allowlisted to prompt the user for * install when a sim card with matching UICC carrier privilege rules is inserted. The * certificate is used as a key, so the certificate encoding here must be the same as the * certificate encoding used on the SIM. @@ -16515,7 +16515,7 @@ public final class Settings { "enable_adb_incremental_install_default"; /** - * The packages whitelisted to be run in autofill compatibility mode. The list + * The packages allowlisted to be run in autofill compatibility mode. The list * of packages is {@code ":"} colon delimited, and each entry has the name of the * package and an optional list of url bar resource ids (the list is delimited by * brackets&mdash{@code [} and {@code ]}&mdash and is also comma delimited). @@ -16575,7 +16575,7 @@ public final class Settings { public static final String STYLUS_EVER_USED = "stylus_ever_used"; /** - * Exemptions to the hidden API blacklist. + * Exemptions to the hidden API denylist. * * @hide */ diff --git a/core/java/android/security/OWNERS b/core/java/android/security/OWNERS index 7140ff12be64..96c0be7f803e 100644 --- a/core/java/android/security/OWNERS +++ b/core/java/android/security/OWNERS @@ -1,11 +1,10 @@ # Bug component: 36824 -cbrubaker@google.com -vishwath@google.com +brambonne@google.com +brufino@google.com +jeffv@google.com -per-file NetworkSecurityPolicy.java = cbrubaker@google.com -per-file NetworkSecurityPolicy.java = klyubin@google.com -per-file FrameworkNetworkSecurityPolicy.java = cbrubaker@google.com -per-file FrameworkNetworkSecurityPolicy.java = klyubin@google.com -per-file Confirmation*.java = jdanis@google.com -per-file Confirmation*.java = swillden@google.com +per-file *NetworkSecurityPolicy.java = file:net/OWNERS +per-file Confirmation*.java = file:/keystore/OWNERS +per-file FileIntegrityManager.java = file:platform/system/security:/fsverity/OWNERS +per-file IFileIntegrityService.aidl = file:platform/system/security:/fsverity/OWNERS diff --git a/core/java/android/security/flags.aconfig b/core/java/android/security/flags.aconfig new file mode 100644 index 000000000000..b6c2b83f0daa --- /dev/null +++ b/core/java/android/security/flags.aconfig @@ -0,0 +1,15 @@ +package: "android.security" + +flag { + name: "fsverity_api" + namespace: "hardware_backed_security" + description: "Feature flag for fs-verity API" + bug: "285185747" +} + +flag { + name: "fix_unlocked_device_required_keys" + namespace: "hardware_backed_security" + description: "Fix bugs in behavior of UnlockedDeviceRequired keystore keys" + bug: "296464083" +} diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index 4d6422c670c2..9088a7790db4 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -337,8 +337,22 @@ public final class KeymasterDefs { ErrorCode.ROLLBACK_RESISTANCE_UNAVAILABLE; // -67; public static final int KM_ERROR_HARDWARE_TYPE_UNAVAILABLE = ErrorCode.HARDWARE_TYPE_UNAVAILABLE; // -68; + public static final int KM_ERROR_PROOF_OF_PRESENCE_REQUIRED = + ErrorCode.PROOF_OF_PRESENCE_REQUIRED; // -69; + public static final int KM_ERROR_CONCURRENT_PROOF_OF_PRESENCE_REQUESTED = + ErrorCode.CONCURRENT_PROOF_OF_PRESENCE_REQUESTED; // -70; + public static final int KM_ERROR_NO_USER_CONFIRMATION = + ErrorCode.NO_USER_CONFIRMATION; // -71; public static final int KM_ERROR_DEVICE_LOCKED = ErrorCode.DEVICE_LOCKED; // -72; + public static final int KM_ERROR_EARLY_BOOT_ENDED = + ErrorCode.EARLY_BOOT_ENDED; // -73; + public static final int KM_ERROR_ATTESTATION_KEYS_NOT_PROVISIONED = + ErrorCode.ATTESTATION_KEYS_NOT_PROVISIONED; // -74; + public static final int KM_ERROR_ATTESTATION_IDS_NOT_PROVISIONED = + ErrorCode.ATTESTATION_IDS_NOT_PROVISIONED; // -75; + public static final int KM_ERROR_INVALID_OPERATION = + ErrorCode.INVALID_OPERATION; // -76; public static final int KM_ERROR_STORAGE_KEY_UNSUPPORTED = ErrorCode.STORAGE_KEY_UNSUPPORTED; // -77, public static final int KM_ERROR_INCOMPATIBLE_MGF_DIGEST = @@ -348,7 +362,13 @@ public final class KeymasterDefs { public static final int KM_ERROR_MISSING_NOT_BEFORE = ErrorCode.MISSING_NOT_BEFORE; // -80; public static final int KM_ERROR_MISSING_NOT_AFTER = - ErrorCode.MISSING_NOT_AFTER; // -80; + ErrorCode.MISSING_NOT_AFTER; // -81; + public static final int KM_ERROR_MISSING_ISSUER_SUBJECT = + ErrorCode.MISSING_ISSUER_SUBJECT; // -82; + public static final int KM_ERROR_INVALID_ISSUER_SUBJECT = + ErrorCode.INVALID_ISSUER_SUBJECT; // -83; + public static final int KM_ERROR_BOOT_LEVEL_EXCEEDED = + ErrorCode.BOOT_LEVEL_EXCEEDED; // -84; public static final int KM_ERROR_HARDWARE_NOT_YET_AVAILABLE = ErrorCode.HARDWARE_NOT_YET_AVAILABLE; // -85 public static final int KM_ERROR_UNIMPLEMENTED = diff --git a/core/java/android/security/keystore/OWNERS b/core/java/android/security/keystore/OWNERS index 65129a46d113..d9e01161ce6d 100644 --- a/core/java/android/security/keystore/OWNERS +++ b/core/java/android/security/keystore/OWNERS @@ -1,5 +1 @@ -# Bug component: 189335 - -swillden@google.com -jdanis@google.com -jbires@google.com +include /keystore/OWNERS diff --git a/core/java/android/security/keystore/recovery/OWNERS b/core/java/android/security/keystore/recovery/OWNERS deleted file mode 100644 index 65129a46d113..000000000000 --- a/core/java/android/security/keystore/recovery/OWNERS +++ /dev/null @@ -1,5 +0,0 @@ -# Bug component: 189335 - -swillden@google.com -jdanis@google.com -jbires@google.com diff --git a/core/java/android/security/net/OWNERS b/core/java/android/security/net/OWNERS index d8281645738b..1d52eed0cb56 100644 --- a/core/java/android/security/net/OWNERS +++ b/core/java/android/security/net/OWNERS @@ -1,4 +1,4 @@ # Bug component: 36824 -cbrubaker@google.com brambonne@google.com +jeffv@google.com diff --git a/core/java/android/service/autofill/augmented/OWNERS b/core/java/android/service/autofill/augmented/OWNERS index a08863276da7..4187b10f1ed2 100644 --- a/core/java/android/service/autofill/augmented/OWNERS +++ b/core/java/android/service/autofill/augmented/OWNERS @@ -1,9 +1,3 @@ # Bug component: 351486 -joannechung@google.com -adamhe@google.com -tymtsai@google.com -lpeter@google.com -augale@google.com -svetoslavganov@android.com -svetoslavganov@google.com +wangqi@google.com diff --git a/core/java/android/service/dreams/OWNERS b/core/java/android/service/dreams/OWNERS index 489a5f62b49d..77bcee832250 100644 --- a/core/java/android/service/dreams/OWNERS +++ b/core/java/android/service/dreams/OWNERS @@ -4,5 +4,7 @@ brycelee@google.com dsandler@google.com galinap@google.com jjaggi@google.com +lusilva@google.com michaelwr@google.com santoscordon@google.com +wxyz@google.com diff --git a/core/java/android/service/gatekeeper/OWNERS b/core/java/android/service/gatekeeper/OWNERS index 2ca52cdc0495..7c4f285fcff8 100644 --- a/core/java/android/service/gatekeeper/OWNERS +++ b/core/java/android/service/gatekeeper/OWNERS @@ -1,3 +1,2 @@ -swillden@google.com -jdanis@google.com -jbires@google.com +include platform/system/gatekeeper:/OWNERS +include /services/core/java/com/android/server/locksettings/OWNERS diff --git a/core/java/android/service/rotationresolver/OWNERS b/core/java/android/service/rotationresolver/OWNERS index e381d17b57eb..5b57fc7fa528 100644 --- a/core/java/android/service/rotationresolver/OWNERS +++ b/core/java/android/service/rotationresolver/OWNERS @@ -2,7 +2,6 @@ asalo@google.com augale@google.com -bquezada@google.com eejiang@google.com payamp@google.com siddikap@google.com diff --git a/core/java/android/service/trust/OWNERS b/core/java/android/service/trust/OWNERS index 198925b37fb4..d3525250ebb6 100644 --- a/core/java/android/service/trust/OWNERS +++ b/core/java/android/service/trust/OWNERS @@ -1,5 +1,4 @@ # Bug component: 36824 -cbrubaker@google.com -vishwath@google.com -jacobhobbie@google.com
\ No newline at end of file +jacobhobbie@google.com +dlm@google.com diff --git a/core/java/android/speech/OWNERS b/core/java/android/speech/OWNERS index 162e02904075..0f2f8ad3d99e 100644 --- a/core/java/android/speech/OWNERS +++ b/core/java/android/speech/OWNERS @@ -1,5 +1,4 @@ volnov@google.com eugeniom@google.com schfan@google.com -andreaambu@google.com -hackz@google.com
\ No newline at end of file +hackz@google.com diff --git a/core/java/android/text/OWNERS b/core/java/android/text/OWNERS index a6be687ab4c9..0935ffd9dd81 100644 --- a/core/java/android/text/OWNERS +++ b/core/java/android/text/OWNERS @@ -1,5 +1,6 @@ set noparent +grantapher@google.com halilibo@google.com haoyuchang@google.com justinghan@google.com diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java index ff66e5f28275..f256210365ba 100644 --- a/core/java/android/text/TextUtils.java +++ b/core/java/android/text/TextUtils.java @@ -872,126 +872,128 @@ public class TextUtils { if (kind == 0) break; + final Object span; switch (kind) { case ALIGNMENT_SPAN: - readSpan(p, sp, new AlignmentSpan.Standard(p)); + span = new AlignmentSpan.Standard(p); break; case FOREGROUND_COLOR_SPAN: - readSpan(p, sp, new ForegroundColorSpan(p)); + span = new ForegroundColorSpan(p); break; case RELATIVE_SIZE_SPAN: - readSpan(p, sp, new RelativeSizeSpan(p)); + span = new RelativeSizeSpan(p); break; case SCALE_X_SPAN: - readSpan(p, sp, new ScaleXSpan(p)); + span = new ScaleXSpan(p); break; case STRIKETHROUGH_SPAN: - readSpan(p, sp, new StrikethroughSpan(p)); + span = new StrikethroughSpan(p); break; case UNDERLINE_SPAN: - readSpan(p, sp, new UnderlineSpan(p)); + span = new UnderlineSpan(p); break; case STYLE_SPAN: - readSpan(p, sp, new StyleSpan(p)); + span = new StyleSpan(p); break; case BULLET_SPAN: - readSpan(p, sp, new BulletSpan(p)); + span = new BulletSpan(p); break; case QUOTE_SPAN: - readSpan(p, sp, new QuoteSpan(p)); + span = new QuoteSpan(p); break; case LEADING_MARGIN_SPAN: - readSpan(p, sp, new LeadingMarginSpan.Standard(p)); + span = new LeadingMarginSpan.Standard(p); break; case URL_SPAN: - readSpan(p, sp, new URLSpan(p)); + span = new URLSpan(p); break; case BACKGROUND_COLOR_SPAN: - readSpan(p, sp, new BackgroundColorSpan(p)); + span = new BackgroundColorSpan(p); break; case TYPEFACE_SPAN: - readSpan(p, sp, new TypefaceSpan(p)); + span = new TypefaceSpan(p); break; case SUPERSCRIPT_SPAN: - readSpan(p, sp, new SuperscriptSpan(p)); + span = new SuperscriptSpan(p); break; case SUBSCRIPT_SPAN: - readSpan(p, sp, new SubscriptSpan(p)); + span = new SubscriptSpan(p); break; case ABSOLUTE_SIZE_SPAN: - readSpan(p, sp, new AbsoluteSizeSpan(p)); + span = new AbsoluteSizeSpan(p); break; case TEXT_APPEARANCE_SPAN: - readSpan(p, sp, new TextAppearanceSpan(p)); + span = new TextAppearanceSpan(p); break; case ANNOTATION: - readSpan(p, sp, new Annotation(p)); + span = new Annotation(p); break; case SUGGESTION_SPAN: - readSpan(p, sp, new SuggestionSpan(p)); + span = new SuggestionSpan(p); break; case SPELL_CHECK_SPAN: - readSpan(p, sp, new SpellCheckSpan(p)); + span = new SpellCheckSpan(p); break; case SUGGESTION_RANGE_SPAN: - readSpan(p, sp, new SuggestionRangeSpan(p)); + span = new SuggestionRangeSpan(p); break; case EASY_EDIT_SPAN: - readSpan(p, sp, new EasyEditSpan(p)); + span = new EasyEditSpan(p); break; case LOCALE_SPAN: - readSpan(p, sp, new LocaleSpan(p)); + span = new LocaleSpan(p); break; case TTS_SPAN: - readSpan(p, sp, new TtsSpan(p)); + span = new TtsSpan(p); break; case ACCESSIBILITY_CLICKABLE_SPAN: - readSpan(p, sp, new AccessibilityClickableSpan(p)); + span = new AccessibilityClickableSpan(p); break; case ACCESSIBILITY_URL_SPAN: - readSpan(p, sp, new AccessibilityURLSpan(p)); + span = new AccessibilityURLSpan(p); break; case LINE_BACKGROUND_SPAN: - readSpan(p, sp, new LineBackgroundSpan.Standard(p)); + span = new LineBackgroundSpan.Standard(p); break; case LINE_HEIGHT_SPAN: - readSpan(p, sp, new LineHeightSpan.Standard(p)); + span = new LineHeightSpan.Standard(p); break; case ACCESSIBILITY_REPLACEMENT_SPAN: - readSpan(p, sp, new AccessibilityReplacementSpan(p)); + span = new AccessibilityReplacementSpan(p); break; default: throw new RuntimeException("bogus span encoding " + kind); } + readSpan(p, sp, span); } return sp; diff --git a/core/java/android/text/flags/use_bounds_for_width.aconfig b/core/java/android/text/flags/use_bounds_for_width.aconfig new file mode 100644 index 000000000000..d89d5f4c7216 --- /dev/null +++ b/core/java/android/text/flags/use_bounds_for_width.aconfig @@ -0,0 +1,8 @@ +package: "com.android.text.flags" + +flag { + name: "use_bounds_for_width" + namespace: "text" + description: "Feature flag for preventing horizontal clipping." + bug: "63938206" +} diff --git a/core/java/android/text/format/DateUtils.java b/core/java/android/text/format/DateUtils.java index 511c9746c84c..518a5498d6ed 100644 --- a/core/java/android/text/format/DateUtils.java +++ b/core/java/android/text/format/DateUtils.java @@ -743,7 +743,7 @@ public class DateUtils * @param startMillis the start time in UTC milliseconds * @param endMillis the end time in UTC milliseconds * @param flags a bit mask of options - * @param timeZone the time zone to compute the string in. Use null for local + * @param timeZone the id of the time zone to compute the string in. Use null for local * or if the FORMAT_UTC flag is being used. * * @return the formatter with the formatted date/time range appended to the string buffer. diff --git a/core/java/android/text/style/URLSpan.java b/core/java/android/text/style/URLSpan.java index e8113905894c..9969d29a857d 100644 --- a/core/java/android/text/style/URLSpan.java +++ b/core/java/android/text/style/URLSpan.java @@ -106,7 +106,7 @@ public class URLSpan extends ClickableSpan implements ParcelableSpan { try { context.startActivity(intent); } catch (ActivityNotFoundException e) { - Log.w("URLSpan", "Actvity was not found for intent, " + intent.toString()); + Log.w("URLSpan", "Activity was not found for intent, " + intent.toString()); } } diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java index 946fc30eecb3..fb6de56b0952 100644 --- a/core/java/android/text/util/Linkify.java +++ b/core/java/android/text/util/Linkify.java @@ -31,6 +31,7 @@ import android.text.Spanned; import android.text.method.LinkMovementMethod; import android.text.method.MovementMethod; import android.text.style.URLSpan; +import android.text.TextUtils; import android.util.Log; import android.util.Patterns; import android.webkit.WebView; @@ -672,8 +673,15 @@ public class Linkify { @Nullable Context context) { PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); final Context ctx = (context != null) ? context : ActivityThread.currentApplication(); - final String regionCode = (ctx != null) ? ctx.getSystemService(TelephonyManager.class). - getSimCountryIso().toUpperCase(Locale.US) : Locale.getDefault().getCountry(); + String regionCode = Locale.getDefault().getCountry(); + if (ctx != null) { + String simCountryIso = ctx.getSystemService(TelephonyManager.class).getSimCountryIso(); + if (!TextUtils.isEmpty(simCountryIso)) { + // Assign simCountryIso if it is available + regionCode = simCountryIso.toUpperCase(Locale.US); + } + } + Iterable<PhoneNumberMatch> matches = phoneUtil.findNumbers(s.toString(), regionCode, Leniency.POSSIBLE, Long.MAX_VALUE); for (PhoneNumberMatch match : matches) { diff --git a/core/java/android/util/Patterns.java b/core/java/android/util/Patterns.java index ece069fa0873..c4660c474e57 100644 --- a/core/java/android/util/Patterns.java +++ b/core/java/android/util/Patterns.java @@ -111,7 +111,7 @@ public class Patterns { /** * Regular expression to match all IANA top-level domains. * - * List accurate as of 2015/11/24. List taken from: + * List accurate as of 2023/09/11. List taken from: * http://data.iana.org/TLD/tlds-alpha-by-domain.txt * This pattern is auto-generated by frameworks/ex/common/tools/make-iana-tld-pattern.py * @@ -119,121 +119,167 @@ public class Patterns { */ static final String IANA_TOP_LEVEL_DOMAINS = "(?:" - + "(?:aaa|aarp|abb|abbott|abogado|academy|accenture|accountant|accountants|aco|active" - + "|actor|ads|adult|aeg|aero|afl|agency|aig|airforce|airtel|allfinanz|alsace|amica|amsterdam" - + "|android|apartments|app|apple|aquarelle|aramco|archi|army|arpa|arte|asia|associates" - + "|attorney|auction|audio|auto|autos|axa|azure|a[cdefgilmoqrstuwxz])" - + "|(?:band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bbc|bbva" - + "|bcn|beats|beer|bentley|berlin|best|bet|bharti|bible|bid|bike|bing|bingo|bio|biz|black" - + "|blackfriday|bloomberg|blue|bms|bmw|bnl|bnpparibas|boats|bom|bond|boo|boots|boutique" - + "|bradesco|bridgestone|broadway|broker|brother|brussels|budapest|build|builders|business" - + "|buzz|bzh|b[abdefghijmnorstvwyz])" - + "|(?:cab|cafe|cal|camera|camp|cancerresearch|canon|capetown|capital|car|caravan|cards" - + "|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|ceb|center|ceo" - + "|cern|cfa|cfd|chanel|channel|chat|cheap|chloe|christmas|chrome|church|cipriani|cisco" - + "|citic|city|cityeats|claims|cleaning|click|clinic|clothing|cloud|club|clubmed|coach" - + "|codes|coffee|college|cologne|com|commbank|community|company|computer|comsec|condos" - + "|construction|consulting|contractors|cooking|cool|coop|corsica|country|coupons|courses" - + "|credit|creditcard|creditunion|cricket|crown|crs|cruises|csc|cuisinella|cymru|cyou|c[acdfghiklmnoruvwxyz])" - + "|(?:dabur|dad|dance|date|dating|datsun|day|dclk|deals|degree|delivery|dell|delta" - + "|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount" - + "|dnp|docs|dog|doha|domains|doosan|download|drive|durban|dvag|d[ejkmoz])" - + "|(?:earth|eat|edu|education|email|emerck|energy|engineer|engineering|enterprises" - + "|epson|equipment|erni|esq|estate|eurovision|eus|events|everbank|exchange|expert|exposed" - + "|express|e[cegrstu])" - + "|(?:fage|fail|fairwinds|faith|family|fan|fans|farm|fashion|feedback|ferrero|film" - + "|final|finance|financial|firmdale|fish|fishing|fit|fitness|flights|florist|flowers|flsmidth" - + "|fly|foo|football|forex|forsale|forum|foundation|frl|frogans|fund|furniture|futbol|fyi" - + "|f[ijkmor])" - + "|(?:gal|gallery|game|garden|gbiz|gdn|gea|gent|genting|ggee|gift|gifts|gives|giving" - + "|glass|gle|global|globo|gmail|gmo|gmx|gold|goldpoint|golf|goo|goog|google|gop|gov|grainger" - + "|graphics|gratis|green|gripe|group|gucci|guge|guide|guitars|guru|g[abdefghilmnpqrstuwy])" - + "|(?:hamburg|hangout|haus|healthcare|help|here|hermes|hiphop|hitachi|hiv|hockey|holdings" - + "|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hsbc|hyundai" - + "|h[kmnrtu])" - + "|(?:ibm|icbc|ice|icu|ifm|iinet|immo|immobilien|industries|infiniti|info|ing|ink|institute" - + "|insure|int|international|investments|ipiranga|irish|ist|istanbul|itau|iwc|i[delmnoqrst])" - + "|(?:jaguar|java|jcb|jetzt|jewelry|jlc|jll|jobs|joburg|jprs|juegos|j[emop])" - + "|(?:kaufen|kddi|kia|kim|kinder|kitchen|kiwi|koeln|komatsu|krd|kred|kyoto|k[eghimnprwyz])" - + "|(?:lacaixa|lancaster|land|landrover|lasalle|lat|latrobe|law|lawyer|lds|lease|leclerc" - + "|legal|lexus|lgbt|liaison|lidl|life|lifestyle|lighting|limited|limo|linde|link|live" - + "|lixil|loan|loans|lol|london|lotte|lotto|love|ltd|ltda|lupin|luxe|luxury|l[abcikrstuvy])" - + "|(?:madrid|maif|maison|man|management|mango|market|marketing|markets|marriott|mba" - + "|media|meet|melbourne|meme|memorial|men|menu|meo|miami|microsoft|mil|mini|mma|mobi|moda" - + "|moe|moi|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar" - + "|mtn|mtpc|mtr|museum|mutuelle|m[acdeghklmnopqrstuvwxyz])" - + "|(?:nadex|nagoya|name|navy|nec|net|netbank|network|neustar|new|news|nexus|ngo|nhk" - + "|nico|ninja|nissan|nokia|nra|nrw|ntt|nyc|n[acefgilopruz])" - + "|(?:obi|office|okinawa|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|osaka" - + "|otsuka|ovh|om)" - + "|(?:page|panerai|paris|partners|parts|party|pet|pharmacy|philips|photo|photography" - + "|photos|physio|piaget|pics|pictet|pictures|ping|pink|pizza|place|play|playstation|plumbing" - + "|plus|pohl|poker|porn|post|praxi|press|pro|prod|productions|prof|properties|property" - + "|protection|pub|p[aefghklmnrstwy])" - + "|(?:qpon|quebec|qa)" - + "|(?:racing|realtor|realty|recipes|red|redstone|rehab|reise|reisen|reit|ren|rent|rentals" - + "|repair|report|republican|rest|restaurant|review|reviews|rich|ricoh|rio|rip|rocher|rocks" - + "|rodeo|rsvp|ruhr|run|rwe|ryukyu|r[eosuw])" - + "|(?:saarland|sakura|sale|samsung|sandvik|sandvikcoromant|sanofi|sap|sapo|sarl|saxo" - + "|sbs|sca|scb|schmidt|scholarships|school|schule|schwarz|science|scor|scot|seat|security" - + "|seek|sener|services|seven|sew|sex|sexy|shiksha|shoes|show|shriram|singles|site|ski" - + "|sky|skype|sncf|soccer|social|software|sohu|solar|solutions|sony|soy|space|spiegel|spreadbetting" - + "|srl|stada|starhub|statoil|stc|stcgroup|stockholm|studio|study|style|sucks|supplies" - + "|supply|support|surf|surgery|suzuki|swatch|swiss|sydney|systems|s[abcdeghijklmnortuvxyz])" - + "|(?:tab|taipei|tatamotors|tatar|tattoo|tax|taxi|team|tech|technology|tel|telefonica" - + "|temasek|tennis|thd|theater|theatre|tickets|tienda|tips|tires|tirol|today|tokyo|tools" - + "|top|toray|toshiba|tours|town|toyota|toys|trade|trading|training|travel|trust|tui|t[cdfghjklmnortvwz])" - + "|(?:ubs|university|uno|uol|u[agksyz])" - + "|(?:vacations|vana|vegas|ventures|versicherung|vet|viajes|video|villas|vin|virgin" - + "|vision|vista|vistaprint|viva|vlaanderen|vodka|vote|voting|voto|voyage|v[aceginu])" - + "|(?:wales|walter|wang|watch|webcam|website|wed|wedding|weir|whoswho|wien|wiki|williamhill" - + "|win|windows|wine|wme|work|works|world|wtc|wtf|w[fs])" - + "|(?:\u03b5\u03bb|\u0431\u0435\u043b|\u0434\u0435\u0442\u0438|\u043a\u043e\u043c|\u043c\u043a\u0434" + + "(?:aaa|aarp|abb|abbott|abbvie|abc|able|abogado|abudhabi|academy|accenture|accountant" + + "|accountants|aco|actor|ads|adult|aeg|aero|aetna|afl|africa|agakhan|agency|aig|airbus" + + "|airforce|airtel|akdn|alibaba|alipay|allfinanz|allstate|ally|alsace|alstom|amazon|americanexpress" + + "|americanfamily|amex|amfam|amica|amsterdam|analytics|android|anquan|anz|aol|apartments" + + "|app|apple|aquarelle|arab|aramco|archi|army|arpa|art|arte|asda|asia|associates|athleta" + + "|attorney|auction|audi|audible|audio|auspost|author|auto|autos|avianca|aws|axa|azure" + + "|a[cdefgilmoqrstuwxz])" + + "|(?:baby|baidu|banamex|bananarepublic|band|bank|bar|barcelona|barclaycard|barclays" + + "|barefoot|bargains|baseball|basketball|bauhaus|bayern|bbc|bbt|bbva|bcg|bcn|beats|beauty" + + "|beer|bentley|berlin|best|bestbuy|bet|bharti|bible|bid|bike|bing|bingo|bio|biz|black" + + "|blackfriday|blockbuster|blog|bloomberg|blue|bms|bmw|bnpparibas|boats|boehringer|bofa" + + "|bom|bond|boo|book|booking|bosch|bostik|boston|bot|boutique|box|bradesco|bridgestone" + + "|broadway|broker|brother|brussels|build|builders|business|buy|buzz|bzh|b[abdefghijmnorstvwyz])" + + "|(?:cab|cafe|cal|call|calvinklein|cam|camera|camp|canon|capetown|capital|capitalone" + + "|car|caravan|cards|care|career|careers|cars|casa|case|cash|casino|cat|catering|catholic" + + "|cba|cbn|cbre|cbs|center|ceo|cern|cfa|cfd|chanel|channel|charity|chase|chat|cheap|chintai" + + "|christmas|chrome|church|cipriani|circle|cisco|citadel|citi|citic|city|cityeats|claims" + + "|cleaning|click|clinic|clinique|clothing|cloud|club|clubmed|coach|codes|coffee|college" + + "|cologne|com|comcast|commbank|community|company|compare|computer|comsec|condos|construction" + + "|consulting|contact|contractors|cooking|cool|coop|corsica|country|coupon|coupons|courses" + + "|cpa|credit|creditcard|creditunion|cricket|crown|crs|cruise|cruises|cuisinella|cymru" + + "|cyou|c[acdfghiklmnoruvwxyz])" + + "|(?:dabur|dad|dance|data|date|dating|datsun|day|dclk|dds|deal|dealer|deals|degree" + + "|delivery|dell|deloitte|delta|democrat|dental|dentist|desi|design|dev|dhl|diamonds|diet" + + "|digital|direct|directory|discount|discover|dish|diy|dnp|docs|doctor|dog|domains|dot" + + "|download|drive|dtv|dubai|dunlop|dupont|durban|dvag|dvr|d[ejkmoz])" + + "|(?:earth|eat|eco|edeka|edu|education|email|emerck|energy|engineer|engineering|enterprises" + + "|epson|equipment|ericsson|erni|esq|estate|etisalat|eurovision|eus|events|exchange|expert" + + "|exposed|express|extraspace|e[cegrstu])" + + "|(?:fage|fail|fairwinds|faith|family|fan|fans|farm|farmers|fashion|fast|fedex|feedback" + + "|ferrari|ferrero|fidelity|fido|film|final|finance|financial|fire|firestone|firmdale" + + "|fish|fishing|fit|fitness|flickr|flights|flir|florist|flowers|fly|foo|food|football" + + "|ford|forex|forsale|forum|foundation|fox|free|fresenius|frl|frogans|frontdoor|frontier" + + "|ftr|fujitsu|fun|fund|furniture|futbol|fyi|f[ijkmor])" + + "|(?:gal|gallery|gallo|gallup|game|games|gap|garden|gay|gbiz|gdn|gea|gent|genting" + + "|george|ggee|gift|gifts|gives|giving|glass|gle|global|globo|gmail|gmbh|gmo|gmx|godaddy" + + "|gold|goldpoint|golf|goo|goodyear|goog|google|gop|got|gov|grainger|graphics|gratis|green" + + "|gripe|grocery|group|guardian|gucci|guge|guide|guitars|guru|g[abdefghilmnpqrstuwy])" + + "|(?:hair|hamburg|hangout|haus|hbo|hdfc|hdfcbank|health|healthcare|help|helsinki|here" + + "|hermes|hiphop|hisamitsu|hitachi|hiv|hkt|hockey|holdings|holiday|homedepot|homegoods" + + "|homes|homesense|honda|horse|hospital|host|hosting|hot|hotels|hotmail|house|how|hsbc" + + "|hughes|hyatt|hyundai|h[kmnrtu])" + + "|(?:ibm|icbc|ice|icu|ieee|ifm|ikano|imamat|imdb|immo|immobilien|inc|industries|infiniti" + + "|info|ing|ink|institute|insurance|insure|int|international|intuit|investments|ipiranga" + + "|irish|ismaili|ist|istanbul|itau|itv|i[delmnoqrst])" + + "|(?:jaguar|java|jcb|jeep|jetzt|jewelry|jio|jll|jmp|jnj|jobs|joburg|jot|joy|jpmorgan" + + "|jprs|juegos|juniper|j[emop])" + + "|(?:kaufen|kddi|kerryhotels|kerrylogistics|kerryproperties|kfh|kia|kids|kim|kinder" + + "|kindle|kitchen|kiwi|koeln|komatsu|kosher|kpmg|kpn|krd|kred|kuokgroup|kyoto|k[eghimnprwyz])" + + "|(?:lacaixa|lamborghini|lamer|lancaster|land|landrover|lanxess|lasalle|lat|latino" + + "|latrobe|law|lawyer|lds|lease|leclerc|lefrak|legal|lego|lexus|lgbt|lidl|life|lifeinsurance" + + "|lifestyle|lighting|like|lilly|limited|limo|lincoln|link|lipsy|live|living|llc|llp|loan" + + "|loans|locker|locus|lol|london|lotte|lotto|love|lpl|lplfinancial|ltd|ltda|lundbeck|luxe" + + "|luxury|l[abcikrstuvy])" + + "|(?:madrid|maif|maison|makeup|man|management|mango|map|market|marketing|markets|marriott" + + "|marshalls|mattel|mba|mckinsey|med|media|meet|melbourne|meme|memorial|men|menu|merckmsd" + + "|miami|microsoft|mil|mini|mint|mit|mitsubishi|mlb|mls|mma|mobi|mobile|moda|moe|moi|mom" + + "|monash|money|monster|mormon|mortgage|moscow|moto|motorcycles|mov|movie|msd|mtn|mtr" + + "|museum|music|m[acdeghklmnopqrstuvwxyz])" + + "|(?:nab|nagoya|name|natura|navy|nba|nec|net|netbank|netflix|network|neustar|new|news" + + "|next|nextdirect|nexus|nfl|ngo|nhk|nico|nike|nikon|ninja|nissan|nissay|nokia|norton" + + "|now|nowruz|nowtv|nra|nrw|ntt|nyc|n[acefgilopruz])" + + "|(?:obi|observer|office|okinawa|olayan|olayangroup|oldnavy|ollo|omega|one|ong|onl" + + "|online|ooo|open|oracle|orange|org|organic|origins|osaka|otsuka|ott|ovh|om)" + + "|(?:page|panasonic|paris|pars|partners|parts|party|pay|pccw|pet|pfizer|pharmacy|phd" + + "|philips|phone|photo|photography|photos|physio|pics|pictet|pictures|pid|pin|ping|pink" + + "|pioneer|pizza|place|play|playstation|plumbing|plus|pnc|pohl|poker|politie|porn|post" + + "|pramerica|praxi|press|prime|pro|prod|productions|prof|progressive|promo|properties" + + "|property|protection|pru|prudential|pub|pwc|p[aefghklmnrstwy])" + + "|(?:qpon|quebec|quest|qa)" + + "|(?:racing|radio|read|realestate|realtor|realty|recipes|red|redstone|redumbrella" + + "|rehab|reise|reisen|reit|reliance|ren|rent|rentals|repair|report|republican|rest|restaurant" + + "|review|reviews|rexroth|rich|richardli|ricoh|ril|rio|rip|rocher|rocks|rodeo|rogers|room" + + "|rsvp|rugby|ruhr|run|rwe|ryukyu|r[eosuw])" + + "|(?:saarland|safe|safety|sakura|sale|salon|samsclub|samsung|sandvik|sandvikcoromant" + + "|sanofi|sap|sarl|sas|save|saxo|sbi|sbs|sca|scb|schaeffler|schmidt|scholarships|school" + + "|schule|schwarz|science|scot|search|seat|secure|security|seek|select|sener|services" + + "|seven|sew|sex|sexy|sfr|shangrila|sharp|shaw|shell|shia|shiksha|shoes|shop|shopping" + + "|shouji|show|showtime|silk|sina|singles|site|ski|skin|sky|skype|sling|smart|smile|sncf" + + "|soccer|social|softbank|software|sohu|solar|solutions|song|sony|soy|spa|space|sport" + + "|spot|srl|stada|staples|star|statebank|statefarm|stc|stcgroup|stockholm|storage|store" + + "|stream|studio|study|style|sucks|supplies|supply|support|surf|surgery|suzuki|swatch" + + "|swiss|sydney|systems|s[abcdeghijklmnorstuvxyz])" + + "|(?:tab|taipei|talk|taobao|target|tatamotors|tatar|tattoo|tax|taxi|tci|tdk|team|tech" + + "|technology|tel|temasek|tennis|teva|thd|theater|theatre|tiaa|tickets|tienda|tips|tires" + + "|tirol|tjmaxx|tjx|tkmaxx|tmall|today|tokyo|tools|top|toray|toshiba|total|tours|town" + + "|toyota|toys|trade|trading|training|travel|travelers|travelersinsurance|trust|trv|tube" + + "|tui|tunes|tushu|tvs|t[cdfghjklmnortvwz])" + + "|(?:ubank|ubs|unicom|university|uno|uol|ups|u[agksyz])" + + "|(?:vacations|vana|vanguard|vegas|ventures|verisign|versicherung|vet|viajes|video" + + "|vig|viking|villas|vin|vip|virgin|visa|vision|viva|vivo|vlaanderen|vodka|volkswagen" + + "|volvo|vote|voting|voto|voyage|v[aceginu])" + + "|(?:wales|walmart|walter|wang|wanggou|watch|watches|weather|weatherchannel|webcam" + + "|weber|website|wed|wedding|weibo|weir|whoswho|wien|wiki|williamhill|win|windows|wine" + + "|winners|wme|wolterskluwer|woodside|work|works|world|wow|wtc|wtf|w[fs])" + + "|(?:\u03b5\u03bb|\u03b5\u03c5|\u0431\u0433|\u0431\u0435\u043b|\u0434\u0435\u0442\u0438" + + "|\u0435\u044e|\u043a\u0430\u0442\u043e\u043b\u0438\u043a|\u043a\u043e\u043c|\u043c\u043a\u0434" + "|\u043c\u043e\u043d|\u043c\u043e\u0441\u043a\u0432\u0430|\u043e\u043d\u043b\u0430\u0439\u043d" + "|\u043e\u0440\u0433|\u0440\u0443\u0441|\u0440\u0444|\u0441\u0430\u0439\u0442|\u0441\u0440\u0431" - + "|\u0443\u043a\u0440|\u049b\u0430\u0437|\u0570\u0561\u0575|\u05e7\u05d5\u05dd|\u0627\u0631\u0627\u0645\u0643\u0648" - + "|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629" - + "|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a|\u0627\u06cc\u0631\u0627\u0646" - + "|\u0628\u0627\u0632\u0627\u0631|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633" - + "|\u0633\u0648\u062f\u0627\u0646|\u0633\u0648\u0631\u064a\u0629|\u0634\u0628\u0643\u0629" - + "|\u0639\u0631\u0627\u0642|\u0639\u0645\u0627\u0646|\u0641\u0644\u0633\u0637\u064a\u0646" - + "|\u0642\u0637\u0631|\u0643\u0648\u0645|\u0645\u0635\u0631|\u0645\u0644\u064a\u0633\u064a\u0627" - + "|\u0645\u0648\u0642\u0639|\u0915\u0949\u092e|\u0928\u0947\u091f|\u092d\u093e\u0930\u0924" - + "|\u0938\u0902\u0917\u0920\u0928|\u09ad\u09be\u09b0\u09a4|\u0a2d\u0a3e\u0a30\u0a24|\u0aad\u0abe\u0ab0\u0aa4" - + "|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd" - + "|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0dbd\u0d82\u0d9a\u0dcf|\u0e04\u0e2d\u0e21|\u0e44\u0e17\u0e22" - + "|\u10d2\u10d4|\u307f\u3093\u306a|\u30b0\u30fc\u30b0\u30eb|\u30b3\u30e0|\u4e16\u754c" - + "|\u4e2d\u4fe1|\u4e2d\u56fd|\u4e2d\u570b|\u4e2d\u6587\u7f51|\u4f01\u4e1a|\u4f5b\u5c71" - + "|\u4fe1\u606f|\u5065\u5eb7|\u516b\u5366|\u516c\u53f8|\u516c\u76ca|\u53f0\u6e7e|\u53f0\u7063" - + "|\u5546\u57ce|\u5546\u5e97|\u5546\u6807|\u5728\u7ebf|\u5927\u62ff|\u5a31\u4e50|\u5de5\u884c" - + "|\u5e7f\u4e1c|\u6148\u5584|\u6211\u7231\u4f60|\u624b\u673a|\u653f\u52a1|\u653f\u5e9c" - + "|\u65b0\u52a0\u5761|\u65b0\u95fb|\u65f6\u5c1a|\u673a\u6784|\u6de1\u9a6c\u9521|\u6e38\u620f" - + "|\u70b9\u770b|\u79fb\u52a8|\u7ec4\u7ec7\u673a\u6784|\u7f51\u5740|\u7f51\u5e97|\u7f51\u7edc" - + "|\u8c37\u6b4c|\u96c6\u56e2|\u98de\u5229\u6d66|\u9910\u5385|\u9999\u6e2f|\ub2f7\ub137" - + "|\ub2f7\ucef4|\uc0bc\uc131|\ud55c\uad6d|xbox" - + "|xerox|xin|xn\\-\\-11b4c3d|xn\\-\\-1qqw23a|xn\\-\\-30rr7y|xn\\-\\-3bst00m|xn\\-\\-3ds443g" - + "|xn\\-\\-3e0b707e|xn\\-\\-3pxu8k|xn\\-\\-42c2d9a|xn\\-\\-45brj9c|xn\\-\\-45q11c|xn\\-\\-4gbrim" - + "|xn\\-\\-55qw42g|xn\\-\\-55qx5d|xn\\-\\-6frz82g|xn\\-\\-6qq986b3xl|xn\\-\\-80adxhks" - + "|xn\\-\\-80ao21a|xn\\-\\-80asehdb|xn\\-\\-80aswg|xn\\-\\-90a3ac|xn\\-\\-90ais|xn\\-\\-9dbq2a" - + "|xn\\-\\-9et52u|xn\\-\\-b4w605ferd|xn\\-\\-c1avg|xn\\-\\-c2br7g|xn\\-\\-cg4bki|xn\\-\\-clchc0ea0b2g2a9gcd" - + "|xn\\-\\-czr694b|xn\\-\\-czrs0t|xn\\-\\-czru2d|xn\\-\\-d1acj3b|xn\\-\\-d1alf|xn\\-\\-efvy88h" - + "|xn\\-\\-estv75g|xn\\-\\-fhbei|xn\\-\\-fiq228c5hs|xn\\-\\-fiq64b|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s" - + "|xn\\-\\-fjq720a|xn\\-\\-flw351e|xn\\-\\-fpcrj9c3d|xn\\-\\-fzc2c9e2c|xn\\-\\-gecrj9c" - + "|xn\\-\\-h2brj9c|xn\\-\\-hxt814e|xn\\-\\-i1b6b1a6a2e|xn\\-\\-imr513n|xn\\-\\-io0a7i" - + "|xn\\-\\-j1aef|xn\\-\\-j1amh|xn\\-\\-j6w193g|xn\\-\\-kcrx77d1x4a|xn\\-\\-kprw13d|xn\\-\\-kpry57d" + + "|\u0443\u043a\u0440|\u049b\u0430\u0437|\u0570\u0561\u0575|\u05d9\u05e9\u05e8\u05d0\u05dc" + + "|\u05e7\u05d5\u05dd|\u0627\u0628\u0648\u0638\u0628\u064a|\u0627\u062a\u0635\u0627\u0644\u0627\u062a" + + "|\u0627\u0631\u0627\u0645\u0643\u0648|\u0627\u0644\u0627\u0631\u062f\u0646|\u0627\u0644\u0628\u062d\u0631\u064a\u0646" + + "|\u0627\u0644\u062c\u0632\u0627\u0626\u0631|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629" + + "|\u0627\u0644\u0639\u0644\u064a\u0627\u0646|\u0627\u0644\u0645\u063a\u0631\u0628|\u0627\u0645\u0627\u0631\u0627\u062a" + + "|\u0627\u06cc\u0631\u0627\u0646|\u0628\u0627\u0631\u062a|\u0628\u0627\u0632\u0627\u0631" + + "|\u0628\u064a\u062a\u0643|\u0628\u06be\u0627\u0631\u062a|\u062a\u0648\u0646\u0633|\u0633\u0648\u062f\u0627\u0646" + + "|\u0633\u0648\u0631\u064a\u0629|\u0634\u0628\u0643\u0629|\u0639\u0631\u0627\u0642|\u0639\u0631\u0628" + + "|\u0639\u0645\u0627\u0646|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0643\u0627\u062b\u0648\u0644\u064a\u0643" + + "|\u0643\u0648\u0645|\u0645\u0635\u0631|\u0645\u0644\u064a\u0633\u064a\u0627|\u0645\u0648\u0631\u064a\u062a\u0627\u0646\u064a\u0627" + + "|\u0645\u0648\u0642\u0639|\u0647\u0645\u0631\u0627\u0647|\u067e\u0627\u06a9\u0633\u062a\u0627\u0646" + + "|\u0680\u0627\u0631\u062a|\u0915\u0949\u092e|\u0928\u0947\u091f|\u092d\u093e\u0930\u0924" + + "|\u092d\u093e\u0930\u0924\u092e\u094d|\u092d\u093e\u0930\u094b\u0924|\u0938\u0902\u0917\u0920\u0928" + + "|\u09ac\u09be\u0982\u09b2\u09be|\u09ad\u09be\u09b0\u09a4|\u09ad\u09be\u09f0\u09a4|\u0a2d\u0a3e\u0a30\u0a24" + + "|\u0aad\u0abe\u0ab0\u0aa4|\u0b2d\u0b3e\u0b30\u0b24|\u0b87\u0ba8\u0bcd\u0ba4\u0bbf\u0baf\u0bbe" + + "|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u0b9a\u0bbf\u0b99\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0bc2\u0bb0\u0bcd" + + "|\u0c2d\u0c3e\u0c30\u0c24\u0c4d|\u0cad\u0cbe\u0cb0\u0ca4|\u0d2d\u0d3e\u0d30\u0d24\u0d02" + + "|\u0dbd\u0d82\u0d9a\u0dcf|\u0e04\u0e2d\u0e21|\u0e44\u0e17\u0e22|\u0ea5\u0eb2\u0ea7|\u10d2\u10d4" + + "|\u307f\u3093\u306a|\u30a2\u30de\u30be\u30f3|\u30af\u30e9\u30a6\u30c9|\u30b0\u30fc\u30b0\u30eb" + + "|\u30b3\u30e0|\u30b9\u30c8\u30a2|\u30bb\u30fc\u30eb|\u30d5\u30a1\u30c3\u30b7\u30e7\u30f3" + + "|\u30dd\u30a4\u30f3\u30c8|\u4e16\u754c|\u4e2d\u4fe1|\u4e2d\u56fd|\u4e2d\u570b|\u4e2d\u6587\u7f51" + + "|\u4e9a\u9a6c\u900a|\u4f01\u4e1a|\u4f5b\u5c71|\u4fe1\u606f|\u5065\u5eb7|\u516b\u5366" + + "|\u516c\u53f8|\u516c\u76ca|\u53f0\u6e7e|\u53f0\u7063|\u5546\u57ce|\u5546\u5e97|\u5546\u6807" + + "|\u5609\u91cc|\u5609\u91cc\u5927\u9152\u5e97|\u5728\u7ebf|\u5927\u62ff|\u5929\u4e3b\u6559" + + "|\u5a31\u4e50|\u5bb6\u96fb|\u5e7f\u4e1c|\u5fae\u535a|\u6148\u5584|\u6211\u7231\u4f60" + + "|\u624b\u673a|\u62db\u8058|\u653f\u52a1|\u653f\u5e9c|\u65b0\u52a0\u5761|\u65b0\u95fb" + + "|\u65f6\u5c1a|\u66f8\u7c4d|\u673a\u6784|\u6de1\u9a6c\u9521|\u6e38\u620f|\u6fb3\u9580" + + "|\u70b9\u770b|\u79fb\u52a8|\u7ec4\u7ec7\u673a\u6784|\u7f51\u5740|\u7f51\u5e97|\u7f51\u7ad9" + + "|\u7f51\u7edc|\u8054\u901a|\u8c37\u6b4c|\u8d2d\u7269|\u901a\u8ca9|\u96c6\u56e2|\u96fb\u8a0a\u76c8\u79d1" + + "|\u98de\u5229\u6d66|\u98df\u54c1|\u9910\u5385|\u9999\u683c\u91cc\u62c9|\u9999\u6e2f" + + "|\ub2f7\ub137|\ub2f7\ucef4|\uc0bc\uc131|\ud55c\uad6d" + + "|xbox|xerox|xfinity|xihuan|xin|xn\\-\\-11b4c3d|xn\\-\\-1ck2e1b|xn\\-\\-1qqw23a|xn\\-\\-2scrj9c" + + "|xn\\-\\-30rr7y|xn\\-\\-3bst00m|xn\\-\\-3ds443g|xn\\-\\-3e0b707e|xn\\-\\-3hcrj9c|xn\\-\\-3pxu8k" + + "|xn\\-\\-42c2d9a|xn\\-\\-45br5cyl|xn\\-\\-45brj9c|xn\\-\\-45q11c|xn\\-\\-4dbrk0ce|xn\\-\\-4gbrim" + + "|xn\\-\\-54b7fta0cc|xn\\-\\-55qw42g|xn\\-\\-55qx5d|xn\\-\\-5su34j936bgsg|xn\\-\\-5tzm5g" + + "|xn\\-\\-6frz82g|xn\\-\\-6qq986b3xl|xn\\-\\-80adxhks|xn\\-\\-80ao21a|xn\\-\\-80aqecdr1a" + + "|xn\\-\\-80asehdb|xn\\-\\-80aswg|xn\\-\\-8y0a063a|xn\\-\\-90a3ac|xn\\-\\-90ae|xn\\-\\-90ais" + + "|xn\\-\\-9dbq2a|xn\\-\\-9et52u|xn\\-\\-9krt00a|xn\\-\\-b4w605ferd|xn\\-\\-bck1b9a5dre4c" + + "|xn\\-\\-c1avg|xn\\-\\-c2br7g|xn\\-\\-cck2b3b|xn\\-\\-cckwcxetd|xn\\-\\-cg4bki|xn\\-\\-clchc0ea0b2g2a9gcd" + + "|xn\\-\\-czr694b|xn\\-\\-czrs0t|xn\\-\\-czru2d|xn\\-\\-d1acj3b|xn\\-\\-d1alf|xn\\-\\-e1a4c" + + "|xn\\-\\-eckvdtc9d|xn\\-\\-efvy88h|xn\\-\\-fct429k|xn\\-\\-fhbei|xn\\-\\-fiq228c5hs" + + "|xn\\-\\-fiq64b|xn\\-\\-fiqs8s|xn\\-\\-fiqz9s|xn\\-\\-fjq720a|xn\\-\\-flw351e|xn\\-\\-fpcrj9c3d" + + "|xn\\-\\-fzc2c9e2c|xn\\-\\-fzys8d69uvgm|xn\\-\\-g2xx48c|xn\\-\\-gckr3f0f|xn\\-\\-gecrj9c" + + "|xn\\-\\-gk3at1e|xn\\-\\-h2breg3eve|xn\\-\\-h2brj9c|xn\\-\\-h2brj9c8c|xn\\-\\-hxt814e" + + "|xn\\-\\-i1b6b1a6a2e|xn\\-\\-imr513n|xn\\-\\-io0a7i|xn\\-\\-j1aef|xn\\-\\-j1amh|xn\\-\\-j6w193g" + + "|xn\\-\\-jlq480n2rg|xn\\-\\-jvr189m|xn\\-\\-kcrx77d1x4a|xn\\-\\-kprw13d|xn\\-\\-kpry57d" + "|xn\\-\\-kput3i|xn\\-\\-l1acc|xn\\-\\-lgbbat1ad8j|xn\\-\\-mgb9awbf|xn\\-\\-mgba3a3ejt" - + "|xn\\-\\-mgba3a4f16a|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbab2bd|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a71e" - + "|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgberp4a5d4ar|xn\\-\\-mgbpl2fh|xn\\-\\-mgbtx2b|xn\\-\\-mgbx4cd0ab" - + "|xn\\-\\-mk1bu44c|xn\\-\\-mxtq1m|xn\\-\\-ngbc5azd|xn\\-\\-node|xn\\-\\-nqv7f|xn\\-\\-nqv7fs00ema" - + "|xn\\-\\-nyqy26a|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl|xn\\-\\-p1acf|xn\\-\\-p1ai|xn\\-\\-pgbs0dh" - + "|xn\\-\\-pssy2u|xn\\-\\-q9jyb4c|xn\\-\\-qcka1pmc|xn\\-\\-qxam|xn\\-\\-rhqv96g|xn\\-\\-s9brj9c" - + "|xn\\-\\-ses554g|xn\\-\\-t60b56a|xn\\-\\-tckwe|xn\\-\\-unup4y|xn\\-\\-vermgensberater\\-ctb" - + "|xn\\-\\-vermgensberatung\\-pwb|xn\\-\\-vhquv|xn\\-\\-vuq861b|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a" + + "|xn\\-\\-mgba3a4f16a|xn\\-\\-mgba7c0bbn0a|xn\\-\\-mgbaakc7dvf|xn\\-\\-mgbaam7a8h|xn\\-\\-mgbab2bd" + + "|xn\\-\\-mgbah1a3hjkrd|xn\\-\\-mgbai9azgqp6j|xn\\-\\-mgbayh7gpa|xn\\-\\-mgbbh1a|xn\\-\\-mgbbh1a71e" + + "|xn\\-\\-mgbc0a9azcg|xn\\-\\-mgbca7dzdo|xn\\-\\-mgbcpq6gpa1a|xn\\-\\-mgberp4a5d4ar|xn\\-\\-mgbgu82a" + + "|xn\\-\\-mgbi4ecexp|xn\\-\\-mgbpl2fh|xn\\-\\-mgbt3dhd|xn\\-\\-mgbtx2b|xn\\-\\-mgbx4cd0ab" + + "|xn\\-\\-mix891f|xn\\-\\-mk1bu44c|xn\\-\\-mxtq1m|xn\\-\\-ngbc5azd|xn\\-\\-ngbe9e0a|xn\\-\\-ngbrx" + + "|xn\\-\\-node|xn\\-\\-nqv7f|xn\\-\\-nqv7fs00ema|xn\\-\\-nyqy26a|xn\\-\\-o3cw4h|xn\\-\\-ogbpf8fl" + + "|xn\\-\\-otu796d|xn\\-\\-p1acf|xn\\-\\-p1ai|xn\\-\\-pgbs0dh|xn\\-\\-pssy2u|xn\\-\\-q7ce6a" + + "|xn\\-\\-q9jyb4c|xn\\-\\-qcka1pmc|xn\\-\\-qxa6a|xn\\-\\-qxam|xn\\-\\-rhqv96g|xn\\-\\-rovu88b" + + "|xn\\-\\-rvc1e0am3e|xn\\-\\-s9brj9c|xn\\-\\-ses554g|xn\\-\\-t60b56a|xn\\-\\-tckwe|xn\\-\\-tiq49xqyj" + + "|xn\\-\\-unup4y|xn\\-\\-vermgensberater\\-ctb|xn\\-\\-vermgensberatung\\-pwb|xn\\-\\-vhquv" + + "|xn\\-\\-vuq861b|xn\\-\\-w4r85el8fhu5dnra|xn\\-\\-w4rs40l|xn\\-\\-wgbh1c|xn\\-\\-wgbl6a" + "|xn\\-\\-xhq521b|xn\\-\\-xkc2al3hye2a|xn\\-\\-xkc2dl3a5ee0h|xn\\-\\-y9a3aq|xn\\-\\-yfro4i67o" - + "|xn\\-\\-ygbi2ammx|xn\\-\\-zfr164b|xperia|xxx|xyz)" - + "|(?:yachts|yamaxun|yandex|yodobashi|yoga|yokohama|youtube|y[et])" - + "|(?:zara|zip|zone|zuerich|z[amw]))"; - + + "|xn\\-\\-ygbi2ammx|xn\\-\\-zfr164b|xxx|xyz)" + + "|(?:yachts|yahoo|yamaxun|yandex|yodobashi|yoga|yokohama|you|youtube|yun|y[et])" + + "|(?:zappos|zara|zero|zip|zone|zuerich|z[amw]))"; /** * Kept for backward compatibility reasons. * diff --git a/core/java/android/util/apk/SourceStampVerifier.java b/core/java/android/util/apk/SourceStampVerifier.java index f9e312146ccf..11d7a005a647 100644 --- a/core/java/android/util/apk/SourceStampVerifier.java +++ b/core/java/android/util/apk/SourceStampVerifier.java @@ -142,16 +142,21 @@ public abstract class SourceStampVerifier { private static SourceStampVerificationResult verify( RandomAccessFile apk, byte[] sourceStampCertificateDigest, byte[] manifestBytes) { + SignatureInfo signatureInfo; try { - SignatureInfo signatureInfo = + signatureInfo = ApkSigningBlockUtils.findSignature(apk, SOURCE_STAMP_BLOCK_ID); + } catch (IOException | SignatureNotFoundException | RuntimeException e) { + return SourceStampVerificationResult.notPresent(); + } + try { Map<Integer, Map<Integer, byte[]>> signatureSchemeApkContentDigests = getSignatureSchemeApkContentDigests(apk, manifestBytes); return verify( signatureInfo, getSignatureSchemeDigests(signatureSchemeApkContentDigests), sourceStampCertificateDigest); - } catch (IOException | SignatureNotFoundException | RuntimeException e) { + } catch (IOException | RuntimeException e) { return SourceStampVerificationResult.notVerified(); } } diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index fc47c193ec60..9ff29a81a5c6 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -841,8 +841,10 @@ public class GestureDetector { mHandler.removeMessages(SHOW_PRESS); mHandler.removeMessages(LONG_PRESS); mHandler.removeMessages(TAP); - mVelocityTracker.recycle(); - mVelocityTracker = null; + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } mIsDoubleTapping = false; mStillDown = false; mAlwaysInTapRegion = false; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f1cde3b4bb7e..03a6a00e6af4 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5318,11 +5318,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @Retention(RetentionPolicy.SOURCE) public @interface LayerType {} - @ViewDebug.ExportedProperty(category = "drawing", mapping = { - @ViewDebug.IntToString(from = LAYER_TYPE_NONE, to = "NONE"), - @ViewDebug.IntToString(from = LAYER_TYPE_SOFTWARE, to = "SOFTWARE"), - @ViewDebug.IntToString(from = LAYER_TYPE_HARDWARE, to = "HARDWARE") - }) int mLayerType = LAYER_TYPE_NONE; Paint mLayerPaint; @@ -9323,8 +9318,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final AccessibilityNodeInfo info = createAccessibilityNodeInfo(); structure.setChildCount(1); final ViewStructure root = structure.newChild(0); - populateVirtualStructure(root, provider, info, forAutofill); - info.recycle(); + if (info != null) { + populateVirtualStructure(root, provider, info, forAutofill); + info.recycle(); + } else { + Log.w(AUTOFILL_LOG_TAG, "AccessibilityNodeInfo is null."); + } } } @@ -21821,6 +21820,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, mCurrentAnimation = null; if ((mViewFlags & TOOLTIP) == TOOLTIP) { + removeCallbacks(mTooltipInfo.mShowTooltipRunnable); + removeCallbacks(mTooltipInfo.mHideTooltipRunnable); hideTooltip(); } @@ -22501,6 +22502,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, @EnumEntry(value = LAYER_TYPE_SOFTWARE, name = "software"), @EnumEntry(value = LAYER_TYPE_HARDWARE, name = "hardware") }) + @ViewDebug.ExportedProperty(category = "drawing", mapping = { + @ViewDebug.IntToString(from = LAYER_TYPE_NONE, to = "NONE"), + @ViewDebug.IntToString(from = LAYER_TYPE_SOFTWARE, to = "SOFTWARE"), + @ViewDebug.IntToString(from = LAYER_TYPE_HARDWARE, to = "HARDWARE") + }) @LayerType public int getLayerType() { return mLayerType; diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index d4578475e9c3..0d0bfe3b8ab9 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -4427,7 +4427,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @param drawingPosition the drawing order position. * @return the container position of a child for this drawing order position. * - * @see #getChildDrawingOrder(int, int)} + * @see #getChildDrawingOrder(int, int) */ public final int getChildDrawingOrder(int drawingPosition) { return getChildDrawingOrder(getChildCount(), drawingPosition); diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java index 0acc0228ade4..33eba03f6426 100644 --- a/core/java/android/view/accessibility/AccessibilityEvent.java +++ b/core/java/android/view/accessibility/AccessibilityEvent.java @@ -457,12 +457,16 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par /** * Represents the event of clicking on a {@link android.view.View} like * {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc. + * <p>See {@link AccessibilityNodeInfo.AccessibilityAction#ACTION_CLICK} for more + * details. */ public static final int TYPE_VIEW_CLICKED = 0x00000001; /** * Represents the event of long clicking on a {@link android.view.View} like * {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc. + * <p>See {@link AccessibilityNodeInfo.AccessibilityAction#ACTION_LONG_CLICK} for more + * details. */ public static final int TYPE_VIEW_LONG_CLICKED = 0x00000002; @@ -583,6 +587,8 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par /** * Represents the event of a context click on a {@link android.view.View}. + * <p>See {@link AccessibilityNodeInfo.AccessibilityAction#ACTION_CONTEXT_CLICK} for more + * details. */ public static final int TYPE_VIEW_CONTEXT_CLICKED = 0x00800000; diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index ddd7734fd1dd..ba4f4aa8960c 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -259,6 +259,7 @@ public class AccessibilityNodeInfo implements Parcelable { /** * Action that selects the node. + * @see AccessibilityAction#ACTION_SELECT */ public static final int ACTION_SELECT = 0x00000004; @@ -270,7 +271,7 @@ public class AccessibilityNodeInfo implements Parcelable { /** * Action that clicks on the node info. * - * See {@link AccessibilityAction#ACTION_CLICK} + * @see AccessibilityAction#ACTION_CLICK */ public static final int ACTION_CLICK = 0x00000010; @@ -278,6 +279,7 @@ public class AccessibilityNodeInfo implements Parcelable { * Action that long clicks on the node. * * <p>It does not support coordinate information for anchoring.</p> + * @see AccessibilityAction#ACTION_LONG_CLICK */ public static final int ACTION_LONG_CLICK = 0x00000020; @@ -414,19 +416,8 @@ public class AccessibilityNodeInfo implements Parcelable { /** * Action to set the selection. Performing this action with no arguments * clears the selection. - * <p> - * <strong>Arguments:</strong> - * {@link #ACTION_ARGUMENT_SELECTION_START_INT}, - * {@link #ACTION_ARGUMENT_SELECTION_END_INT}<br> - * <strong>Example:</strong> - * <code><pre><p> - * Bundle arguments = new Bundle(); - * arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 1); - * arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, 2); - * info.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments); - * </code></pre></p> - * </p> * + * @see AccessibilityAction#ACTION_SET_SELECTION * @see #ACTION_ARGUMENT_SELECTION_START_INT * @see #ACTION_ARGUMENT_SELECTION_END_INT */ @@ -451,16 +442,7 @@ public class AccessibilityNodeInfo implements Parcelable { * Action that sets the text of the node. Performing the action without argument, using <code> * null</code> or empty {@link CharSequence} will clear the text. This action will also put the * cursor at the end of text. - * <p> - * <strong>Arguments:</strong> - * {@link #ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE}<br> - * <strong>Example:</strong> - * <code><pre><p> - * Bundle arguments = new Bundle(); - * arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, - * "android"); - * info.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); - * </code></pre></p> + * @see AccessibilityAction#ACTION_SET_TEXT */ public static final int ACTION_SET_TEXT = 0x00200000; @@ -5012,7 +4994,7 @@ public class AccessibilityNodeInfo implements Parcelable { * and handled by custom widgets. i.e. ones that are not part of the UI toolkit. For * example, an application may define a custom action for clearing the user history. * </li> - * <li><strong>Overriden standard actions</strong> - These are actions that override + * <li><strong>Overridden standard actions</strong> - These are actions that override * standard actions to customize them. For example, an app may add a label to the * standard {@link #ACTION_CLICK} action to indicate to the user that this action clears * browsing history. @@ -5050,24 +5032,45 @@ public class AccessibilityNodeInfo implements Parcelable { /** * Action that selects the node. + * The view the implements this should send a + * {@link AccessibilityEvent#TYPE_VIEW_SELECTED} event. + * @see AccessibilityAction#ACTION_CLEAR_SELECTION */ public static final AccessibilityAction ACTION_SELECT = new AccessibilityAction(AccessibilityNodeInfo.ACTION_SELECT); /** * Action that deselects the node. + * @see AccessibilityAction#ACTION_SELECT */ public static final AccessibilityAction ACTION_CLEAR_SELECTION = new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION); /** * Action that clicks on the node info. + * + * <p>The UI element that implements this should send a + * {@link AccessibilityEvent#TYPE_VIEW_CLICKED} event. In the View system, + * the default handling of this action when performed by a service is to call + * {@link View#performClick()}, and setting a + * {@link View#setOnClickListener(View.OnClickListener)} automatically adds this action. + * + * <p>{@link #isClickable()} should return true if this action is available. */ public static final AccessibilityAction ACTION_CLICK = new AccessibilityAction(AccessibilityNodeInfo.ACTION_CLICK); /** * Action that long clicks on the node. + * + * <p>The UI element that implements this should send a + * {@link AccessibilityEvent#TYPE_VIEW_LONG_CLICKED} event. In the View system, + * the default handling of this action when performed by a service is to call + * {@link View#performLongClick()}, and setting a + * {@link View#setOnLongClickListener(View.OnLongClickListener)} automatically adds this + * action. + * + * <p>{@link #isLongClickable()} should return true if this action is available. */ public static final AccessibilityAction ACTION_LONG_CLICK = new AccessibilityAction(AccessibilityNodeInfo.ACTION_LONG_CLICK); @@ -5263,7 +5266,10 @@ public class AccessibilityNodeInfo implements Parcelable { * info.performAction(AccessibilityAction.ACTION_SET_SELECTION.getId(), arguments); * </code></pre></p> * </p> - * + * <p> If this is a text selection, the UI element that implements this should send a + * {@link AccessibilityEvent#TYPE_VIEW_TEXT_SELECTION_CHANGED} event if its selection is + * updated. This element should also return {@code true} for + * {@link AccessibilityNodeInfo#isTextSelectable()}. * @see AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_START_INT * AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT * @see AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_END_INT @@ -5305,6 +5311,10 @@ public class AccessibilityNodeInfo implements Parcelable { * "android"); * info.performAction(AccessibilityAction.ACTION_SET_TEXT.getId(), arguments); * </code></pre></p> + * <p> The UI element that implements this should send a + * {@link AccessibilityEvent#TYPE_VIEW_TEXT_CHANGED} event if its text is updated. + * This element should also return {@code true} for + * {@link AccessibilityNodeInfo#isEditable()}. */ public static final AccessibilityAction ACTION_SET_TEXT = new AccessibilityAction(AccessibilityNodeInfo.ACTION_SET_TEXT); @@ -5409,6 +5419,18 @@ public class AccessibilityNodeInfo implements Parcelable { /** * Action that context clicks the node. + * + * <p>The UI element that implements this should send a + * {@link AccessibilityEvent#TYPE_VIEW_CONTEXT_CLICKED} event. In the View system, + * the default handling of this action when performed by a service is to call + * {@link View#performContextClick()}, and setting a + * {@link View#setOnContextClickListener(View.OnContextClickListener)} automatically adds + * this action. + * + * <p>A context click usually occurs from a mouse pointer right-click or a stylus button + * press. + * + * <p>{@link #isContextClickable()} should return true if this action is available. */ public static final AccessibilityAction ACTION_CONTEXT_CLICK = new AccessibilityAction(R.id.accessibilityActionContextClick); diff --git a/core/java/android/view/autofill/OWNERS b/core/java/android/view/autofill/OWNERS index 622b0e208812..37c6f5bf3425 100644 --- a/core/java/android/view/autofill/OWNERS +++ b/core/java/android/view/autofill/OWNERS @@ -4,3 +4,6 @@ simranjit@google.com haoranzhang@google.com skxu@google.com yunicorn@google.com + +# Bug component: 543785 = per-file *Augmented* +per-file *Augmented* = wangqi@google.com diff --git a/core/java/android/view/contentcapture/OWNERS b/core/java/android/view/contentcapture/OWNERS index a958bbec8f90..e4b09524ede7 100644 --- a/core/java/android/view/contentcapture/OWNERS +++ b/core/java/android/view/contentcapture/OWNERS @@ -1,10 +1,5 @@ # Bug component: 544200 -augale@google.com -joannechung@google.com -markpun@google.com -lpeter@google.com -tymtsai@google.com hackz@google.com shivanker@google.com volnov@google.com diff --git a/core/java/android/view/textclassifier/OWNERS b/core/java/android/view/textclassifier/OWNERS index a205be2f39d0..224ed71f3401 100644 --- a/core/java/android/view/textclassifier/OWNERS +++ b/core/java/android/view/textclassifier/OWNERS @@ -1,8 +1,3 @@ # Bug component: 709498 -mns@google.com -toki@google.com -augale@google.com -joannechung@google.com -tonymak@google.com -licha@google.com +wangqi@google.com diff --git a/core/java/android/view/translation/OWNERS b/core/java/android/view/translation/OWNERS index b772ad3f7cab..977bda16c2d0 100644 --- a/core/java/android/view/translation/OWNERS +++ b/core/java/android/view/translation/OWNERS @@ -1,7 +1,3 @@ # Bug component: 994311 -augale@google.com -joannechung@google.com -markpun@google.com -lpeter@google.com -tymtsai@google.com +wangqi@google.com diff --git a/core/java/android/webkit/CookieManager.java b/core/java/android/webkit/CookieManager.java index 20230e770bf5..0427d1051919 100644 --- a/core/java/android/webkit/CookieManager.java +++ b/core/java/android/webkit/CookieManager.java @@ -103,15 +103,22 @@ public abstract class CookieManager { * will be ignored if it is expired. To set multiple cookies, your application should invoke * this method multiple times. * - * <p>The {@code value} parameter must follow the format of the {@code Set-Cookie} HTTP - * response header defined by - * <a href="https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03">RFC6265bis</a>. - * This is a key-value pair of the form {@code "key=value"}, optionally followed by a list of - * cookie attributes delimited with semicolons (ex. {@code "key=value; Max-Age=123"}). Please - * consult the RFC specification for a list of valid attributes. + * <p>The {@code value} parameter must follow the format of the {@code Set-Cookie} HTTP response + * header. This is a key-value pair of the form {@code "key=value"}, optionally followed by a + * list of cookie attributes delimited with semicolons (ex. {@code "key=value; Max-Age=123"}). + * For the header format and attributes supported by WebView, see the <a href= + * "https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie">{@code Set-Cookie} + * documentation on MDN</a>. * - * <p class="note"><b>Note:</b> if specifying a {@code value} containing the {@code "Secure"} - * attribute, {@code url} must use the {@code "https://"} scheme. + * <p class="note"> + * <b>Notes:</b> + * <ul> + * <li>If specifying a {@code value} containing the {@code "Secure"} attribute, + * {@code url} must use the {@code "https://"} scheme.</li> + * <li>if specifying a {@code value} containing the {@code "Partitioned"} + * attribute, the cookie will be set for the top-level partition of the + * {@code url}.</li> + * </ul> * * @param url the URL for which the cookie is to be set * @param value the cookie as a string, using the format of the 'Set-Cookie' @@ -125,12 +132,12 @@ public abstract class CookieManager { * will be ignored if it is expired. To set multiple cookies, your application should invoke * this method multiple times. * - * <p>The {@code value} parameter must follow the format of the {@code Set-Cookie} HTTP - * response header defined by - * <a href="https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03">RFC6265bis</a>. - * This is a key-value pair of the form {@code "key=value"}, optionally followed by a list of - * cookie attributes delimited with semicolons (ex. {@code "key=value; Max-Age=123"}). Please - * consult the RFC specification for a list of valid attributes. + * <p>The {@code value} parameter must follow the format of the {@code Set-Cookie} HTTP response + * header. This is a key-value pair of the form {@code "key=value"}, optionally followed by a + * list of cookie attributes delimited with semicolons (ex. {@code "key=value; Max-Age=123"}). + * For the header format and attributes supported by WebView, see the <a href= + * "https://developer.mozilla.org/docs/Web/HTTP/Headers/Set-Cookie">{@code Set-Cookie} + * documentation on MDN</a>. * * <p>This method is asynchronous. If a {@link ValueCallback} is provided, * {@link ValueCallback#onReceiveValue} will be called on the current @@ -140,8 +147,15 @@ public abstract class CookieManager { * completes or whether it succeeded, and in this case it is safe to call the method from a * thread without a Looper. * - * <p class="note"><b>Note:</b> if specifying a {@code value} containing the {@code "Secure"} - * attribute, {@code url} must use the {@code "https://"} scheme. + * <p class="note"> + * <b>Notes:</b> + * <ul> + * <li>If specifying a {@code value} containing the {@code "Secure"} attribute, + * {@code url} must use the {@code "https://"} scheme.</li> + * <li>if specifying a {@code value} containing the {@code "Partitioned"} + * attribute, the cookie will be set for the top-level partition of the + * {@code url}.</li> + * </ul> * * @param url the URL for which the cookie is to be set * @param value the cookie as a string, using the format of the 'Set-Cookie' @@ -157,6 +171,10 @@ public abstract class CookieManager { * "; "} characters (semicolon followed by a space). Each key-value pair will be of the form * {@code "key=value"}. * + * <p class="note"> + * <b>Note:</b> Any cookies set with the {@code "Partitioned"} attribute will only be returned + * for the top-level partition of {@code url}. + * * @param url the URL for which the cookies are requested * @return value the cookies as a string, using the format of the 'Cookie' * HTTP request header diff --git a/core/java/android/webkit/OWNERS b/core/java/android/webkit/OWNERS index b33da57c42e3..e7fd7a5d1096 100644 --- a/core/java/android/webkit/OWNERS +++ b/core/java/android/webkit/OWNERS @@ -1,4 +1,3 @@ -changwan@google.com +# Bug component: 76427 ntfschr@google.com -tobiasjs@google.com torne@google.com diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index db7d48471d9d..b5f05e49d6c3 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -14996,6 +14996,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final ClipDescription description = getClipboardManagerForUser().getPrimaryClipDescription(); + if (description == null) { + return false; + } final boolean isPlainType = description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN); return (isPlainType && description.isStyledText()) || description.hasMimeType(ClipDescription.MIMETYPE_TEXT_HTML); diff --git a/core/java/android/widget/Toast.java b/core/java/android/widget/Toast.java index ee6ac1297b63..65984f55ded2 100644 --- a/core/java/android/widget/Toast.java +++ b/core/java/android/widget/Toast.java @@ -155,8 +155,7 @@ public class Toast { * Construct an empty Toast object. You must call {@link #setView} before you * can call {@link #show}. * - * @param context The context to use. Usually your {@link android.app.Application} - * or {@link android.app.Activity} object. + * @param context The context to use. Usually your {@link android.app.Activity} object. */ public Toast(Context context) { this(context, null); @@ -482,8 +481,7 @@ public class Toast { /** * Make a standard toast that just contains text. * - * @param context The context to use. Usually your {@link android.app.Application} - * or {@link android.app.Activity} object. + * @param context The context to use. Usually your {@link android.app.Activity} object. * @param text The text to show. Can be formatted text. * @param duration How long to display the message. Either {@link #LENGTH_SHORT} or * {@link #LENGTH_LONG} @@ -539,8 +537,7 @@ public class Toast { /** * Make a standard toast that just contains text from a resource. * - * @param context The context to use. Usually your {@link android.app.Application} - * or {@link android.app.Activity} object. + * @param context The context to use. Usually your {@link android.app.Activity} object. * @param resId The resource id of the string resource to use. Can be formatted text. * @param duration How long to display the message. Either {@link #LENGTH_SHORT} or * {@link #LENGTH_LONG} diff --git a/core/java/android/widget/inline/OWNERS b/core/java/android/widget/inline/OWNERS index 9a30e826a24f..73651daa562c 100644 --- a/core/java/android/widget/inline/OWNERS +++ b/core/java/android/widget/inline/OWNERS @@ -1,3 +1,3 @@ -# Bug component: 351486 +# Bug component: 1195602 -include /core/java/android/view/autofill/OWNERS +wangqi@google.com diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig new file mode 100644 index 000000000000..7a4c5bc669fc --- /dev/null +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -0,0 +1,8 @@ +package: "com.android.window.flags" + +flag { + name: "nav_bar_transparent_by_default" + namespace: "windowing_frontend" + description: "Make nav bar color transparent by default when targeting SDK 35 or greater" + bug: "232195501" +} diff --git a/core/java/android/window/flags/windowing_sdk.aconfig b/core/java/android/window/flags/windowing_sdk.aconfig new file mode 100644 index 000000000000..560e41b1aa33 --- /dev/null +++ b/core/java/android/window/flags/windowing_sdk.aconfig @@ -0,0 +1,10 @@ +package: "com.android.window.flags" + +# Project link: https://gantry.corp.google.com/projects/android_platform_windowing_sdk/changes + +flag { + namespace: "windowing_sdk" + name: "sync_window_config_update_flag" + description: "Whether the feature to sync different window-related config updates is enabled" + bug: "260873529" +} diff --git a/core/java/com/android/internal/content/OWNERS b/core/java/com/android/internal/content/OWNERS index c42bee69410d..c8e4005e4bc7 100644 --- a/core/java/com/android/internal/content/OWNERS +++ b/core/java/com/android/internal/content/OWNERS @@ -1,5 +1,7 @@ # Bug component: 36137 include /core/java/android/content/pm/OWNERS +per-file FileSystemProvider.java = file:/core/java/android/os/storage/OWNERS + per-file ReferrerIntent.aidl = file:/services/core/java/com/android/server/am/OWNERS per-file ReferrerIntent.java = file:/services/core/java/com/android/server/am/OWNERS diff --git a/core/java/com/android/internal/content/om/OverlayConfig.java b/core/java/com/android/internal/content/om/OverlayConfig.java index 2d04bdbda846..07e178c0ba27 100644 --- a/core/java/com/android/internal/content/om/OverlayConfig.java +++ b/core/java/com/android/internal/content/om/OverlayConfig.java @@ -34,8 +34,15 @@ import com.android.internal.content.om.OverlayScanner.ParsedOverlayInfo; import com.android.internal.util.Preconditions; import com.android.internal.util.function.TriConsumer; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; @@ -46,6 +53,10 @@ import java.util.List; import java.util.Map; import java.util.function.Supplier; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + /** * Responsible for reading overlay configuration files and handling queries of overlay mutability, * default-enabled state, and priority. @@ -61,6 +72,8 @@ public class OverlayConfig { @VisibleForTesting public static final int DEFAULT_PRIORITY = Integer.MAX_VALUE; + public static final String PARTITION_ORDER_FILE_PATH = "/product/overlay/partition_order.xml"; + @VisibleForTesting public static final class Configuration { @Nullable @@ -119,6 +132,10 @@ public class OverlayConfig { // Singleton instance only assigned in system server private static OverlayConfig sInstance; + private final String mPartitionOrder; + + private final boolean mIsDefaultPartitionOrder; + @VisibleForTesting public OverlayConfig(@Nullable File rootDirectory, @Nullable Supplier<OverlayScanner> scannerFactory, @@ -137,6 +154,8 @@ public class OverlayConfig { new File(rootDirectory, p.getNonConicalFolder().getPath()), p))); } + mIsDefaultPartitionOrder = !sortPartitions(PARTITION_ORDER_FILE_PATH, partitions); + mPartitionOrder = generatePartitionOrderString(partitions); ArrayMap<Integer, List<String>> activeApexesPerPartition = getActiveApexes(partitions); @@ -198,6 +217,96 @@ public class OverlayConfig { } } + private static String generatePartitionOrderString(List<OverlayPartition> partitions) { + if (partitions == null || partitions.size() == 0) { + return ""; + } + StringBuilder partitionOrder = new StringBuilder(); + partitionOrder.append(partitions.get(0).getName()); + for (int i = 1; i < partitions.size(); i++) { + partitionOrder.append(", ").append(partitions.get(i).getName()); + } + return partitionOrder.toString(); + } + + private static boolean parseAndValidatePartitionsOrderXml(String partitionOrderFilePath, + Map<String, Integer> orderMap, List<OverlayPartition> partitions) { + try { + File file = new File(partitionOrderFilePath); + if (!file.exists()) { + Log.w(TAG, "partition_order.xml does not exist."); + return false; + } + var dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(file); + doc.getDocumentElement().normalize(); + + Element root = doc.getDocumentElement(); + if (!root.getNodeName().equals("partition-order")) { + Log.w(TAG, "Invalid partition_order.xml, " + + "xml root element is not partition-order"); + return false; + } + + NodeList partitionList = doc.getElementsByTagName("partition"); + for (int order = 0; order < partitionList.getLength(); order++) { + Node partitionNode = partitionList.item(order); + if (partitionNode.getNodeType() == Node.ELEMENT_NODE) { + Element partitionElement = (Element) partitionNode; + String partitionName = partitionElement.getAttribute("name"); + if (orderMap.containsKey(partitionName)) { + Log.w(TAG, "Invalid partition_order.xml, " + + "it has duplicate partition: " + partitionName); + return false; + } + orderMap.put(partitionName, order); + } + } + + if (orderMap.keySet().size() != partitions.size()) { + Log.w(TAG, "Invalid partition_order.xml, partition_order.xml has " + + orderMap.keySet().size() + " partitions, " + + "which is different from SYSTEM_PARTITIONS"); + return false; + } + for (int i = 0; i < partitions.size(); i++) { + if (!orderMap.keySet().contains(partitions.get(i).getName())) { + Log.w(TAG, "Invalid Parsing partition_order.xml, " + + "partition_order.xml does not have partition: " + + partitions.get(i).getName()); + return false; + } + } + } catch (ParserConfigurationException | SAXException | IOException e) { + Log.w(TAG, "Parsing or validating partition_order.xml failed, " + + "exception thrown: " + e.getMessage()); + return false; + } + Log.i(TAG, "Sorting partitions in the specified order from partitions_order.xml"); + return true; + } + + /** + * Sort partitions by order in partition_order.xml if the file exists. + * + * @hide + */ + @VisibleForTesting + public static boolean sortPartitions(String partitionOrderFilePath, + List<OverlayPartition> partitions) { + Map<String, Integer> orderMap = new HashMap<>(); + if (!parseAndValidatePartitionsOrderXml(partitionOrderFilePath, orderMap, partitions)) { + return false; + } + + Comparator<OverlayPartition> partitionComparator = Comparator.comparingInt( + o -> orderMap.get(o.getName())); + Collections.sort(partitions, partitionComparator); + + return true; + } + /** * Creates an instance of OverlayConfig for use in the zygote process. * This instance will not include information of static overlays existing outside of a partition @@ -476,4 +585,19 @@ public class OverlayConfig { */ private static native String[] createIdmap(@NonNull String targetPath, @NonNull String[] overlayPath, @NonNull String[] policies, boolean enforceOverlayable); + + /** + * @hide + */ + public boolean isDefaultPartitionOrder() { + return mIsDefaultPartitionOrder; + } + + /** + * @hide + */ + public String getPartitionOrder() { + return mPartitionOrder; + } + } diff --git a/core/java/com/android/internal/content/om/OverlayConfigParser.java b/core/java/com/android/internal/content/om/OverlayConfigParser.java index 5ab77d8d3236..faaf7d5cef18 100644 --- a/core/java/com/android/internal/content/om/OverlayConfigParser.java +++ b/core/java/com/android/internal/content/om/OverlayConfigParser.java @@ -28,6 +28,7 @@ import android.util.ArraySet; import android.util.Log; import android.util.Xml; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.content.om.OverlayScanner.ParsedOverlayInfo; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; @@ -54,8 +55,11 @@ import java.util.Map; * * @see #parseOverlay(File, XmlPullParser, OverlayScanner, ParsingContext) * @see #parseMerge(File, XmlPullParser, OverlayScanner, ParsingContext) + * + * @hide **/ -final class OverlayConfigParser { +@VisibleForTesting +public final class OverlayConfigParser { /** Represents a part of a parsed overlay configuration XML file. */ public static class ParsedConfigFile { @@ -160,7 +164,11 @@ final class OverlayConfigParser { } } - static class OverlayPartition extends SystemPartition { + /** + * @hide + **/ + @VisibleForTesting + public static class OverlayPartition extends SystemPartition { // Policies passed to idmap2 during idmap creation. // Keep partition policy constants in sync with f/b/cmds/idmap2/include/idmap2/Policies.h. static final String POLICY_ODM = "odm"; @@ -173,7 +181,11 @@ final class OverlayConfigParser { @NonNull public final String policy; - OverlayPartition(@NonNull SystemPartition partition) { + /** + * @hide + **/ + @VisibleForTesting + public OverlayPartition(@NonNull SystemPartition partition) { super(partition); this.policy = policyForPartition(partition); } diff --git a/core/java/com/android/internal/dynamicanimation/animation/DynamicAnimation.java b/core/java/com/android/internal/dynamicanimation/animation/DynamicAnimation.java index d4fe7c8d7f36..03f10b65629a 100644 --- a/core/java/com/android/internal/dynamicanimation/animation/DynamicAnimation.java +++ b/core/java/com/android/internal/dynamicanimation/animation/DynamicAnimation.java @@ -651,7 +651,7 @@ public abstract class DynamicAnimation<T extends DynamicAnimation<T>> if (!mStartValueIsSet) { mValue = getPropertyValue(); } - // Sanity check: + // Initial check: if (mValue > mMaxValue || mValue < mMinValue) { throw new IllegalArgumentException("Starting value need to be in between min" + " value and max value"); diff --git a/core/java/com/android/internal/dynamicanimation/animation/SpringForce.java b/core/java/com/android/internal/dynamicanimation/animation/SpringForce.java index 36242ae2cf3d..dea4907cd689 100644 --- a/core/java/com/android/internal/dynamicanimation/animation/SpringForce.java +++ b/core/java/com/android/internal/dynamicanimation/animation/SpringForce.java @@ -228,7 +228,7 @@ public final class SpringForce implements Force { } /** - * Initialize the string by doing the necessary pre-calculation as well as some sanity check + * Initialize the string by doing the necessary pre-calculation as well as some initial check * on the setup. * * @throws IllegalStateException if the final position is not yet set by the time the spring diff --git a/core/java/com/android/internal/infra/ServiceConnector.java b/core/java/com/android/internal/infra/ServiceConnector.java index cb162674eb16..6489c8ed30ae 100644 --- a/core/java/com/android/internal/infra/ServiceConnector.java +++ b/core/java/com/android/internal/infra/ServiceConnector.java @@ -745,6 +745,10 @@ public interface ServiceConnector<I extends IInterface> { boolean mAsync = false; private String mDebugName; { + // The timeout handler must be set before any calls to set timeouts on the + // AndroidFuture, to ensure they are posted on the proper thread. + setTimeoutHandler(getJobHandler()); + long requestTimeout = getRequestTimeoutMs(); if (requestTimeout > 0) { orTimeout(requestTimeout, TimeUnit.MILLISECONDS); diff --git a/core/java/com/android/internal/jank/OWNERS b/core/java/com/android/internal/jank/OWNERS index 352c132fda4f..2f3bbeef0d77 100644 --- a/core/java/com/android/internal/jank/OWNERS +++ b/core/java/com/android/internal/jank/OWNERS @@ -3,4 +3,5 @@ include /services/core/java/com/android/server/wm/OWNERS # Jank people ahanwu@google.com vadimt@google.com -marcinoc@google.com
\ No newline at end of file +marcinoc@google.com +pmuetschard@google.com
\ No newline at end of file diff --git a/core/java/com/android/internal/net/OWNERS b/core/java/com/android/internal/net/OWNERS index 71f997bb57c5..71576837c2e1 100644 --- a/core/java/com/android/internal/net/OWNERS +++ b/core/java/com/android/internal/net/OWNERS @@ -1,4 +1,4 @@ set noparent -file:platform/packages/modules/Connectivity:master:/OWNERS_core_networking +file:platform/packages/modules/Connectivity:main:/OWNERS_core_networking jsharkey@android.com diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 20635425362b..965277c4635e 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -195,6 +195,12 @@ public final class Zygote { */ public static final int PROFILEABLE = 1 << 24; + /** + * Enable ptrace. This is enabled on eng, if the app is debuggable, or if + * the persist.debug.ptrace.enabled property is set. + */ + public static final int DEBUG_ENABLE_PTRACE = 1 << 25; + /** No external storage should be mounted. */ public static final int MOUNT_EXTERNAL_NONE = IVold.REMOUNT_MODE_NONE; /** Default external storage should be mounted. */ @@ -1015,18 +1021,36 @@ public final class Zygote { "persist.debug.dalvik.vm.jdwp.enabled").equals("1"); /** + * This will enable ptrace by default for all apps. It is OK to cache this property + * because we expect to reboot the system whenever this property changes + */ + private static final boolean ENABLE_PTRACE = SystemProperties.get( + "persist.debug.ptrace.enabled").equals("1"); + + /** * Applies debugger system properties to the zygote arguments. * - * For eng builds all apps are debuggable. On userdebug and user builds - * if persist.debug.dalvik.vm.jdwp.enabled is 1 all apps are - * debuggable. Otherwise, the debugger state is specified via the - * "--enable-jdwp" flag in the spawn request. + * For eng builds all apps are debuggable with JDWP and ptrace. + * + * On userdebug builds if persist.debug.dalvik.vm.jdwp.enabled + * is 1 all apps are debuggable with JDWP and ptrace. Otherwise, the + * debugger state is specified via the "--enable-jdwp" flag in the + * spawn request. + * + * On userdebug builds if persist.debug.ptrace.enabled is 1 all + * apps are debuggable with ptrace. * * @param args non-null; zygote spawner args */ static void applyDebuggerSystemProperty(ZygoteArguments args) { - if (Build.IS_ENG || ENABLE_JDWP) { + if (Build.IS_ENG || (Build.IS_USERDEBUG && ENABLE_JDWP)) { args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_JDWP; + // Also enable ptrace when JDWP is enabled for consistency with + // before persist.debug.ptrace.enabled existed. + args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_PTRACE; + } + if (Build.IS_ENG || (Build.IS_USERDEBUG && ENABLE_PTRACE)) { + args.mRuntimeFlags |= Zygote.DEBUG_ENABLE_PTRACE; } } @@ -1049,7 +1073,8 @@ public final class Zygote { int peerUid = peer.getUid(); if (args.mInvokeWith != null && peerUid != 0 - && (args.mRuntimeFlags & Zygote.DEBUG_ENABLE_JDWP) == 0) { + && (args.mRuntimeFlags + & (Zygote.DEBUG_ENABLE_JDWP | Zygote.DEBUG_ENABLE_PTRACE)) == 0) { throw new ZygoteSecurityException("Peer is permitted to specify an " + "explicit invoke-with wrapper command only for debuggable " + "applications."); diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index a95ce64ecec8..11d5ab353232 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -26,7 +26,6 @@ import android.app.ApplicationLoaders; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.SharedLibraryInfo; import android.content.res.Resources; -import android.content.res.TypedArray; import android.os.Build; import android.os.Environment; import android.os.IInstalld; @@ -105,21 +104,10 @@ public class ZygoteInit { private static final String SOCKET_NAME_ARG = "--socket-name="; /** - * Used to pre-load resources. - */ - @UnsupportedAppUsage - private static Resources mResources; - - /** * The path of a file that contains classes to preload. */ private static final String PRELOADED_CLASSES = "/system/etc/preloaded-classes"; - /** - * Controls whether we should preload resources during zygote init. - */ - private static final boolean PRELOAD_RESOURCES = true; - private static final int UNPRIVILEGED_UID = 9999; private static final int UNPRIVILEGED_GID = 9999; @@ -146,7 +134,7 @@ public class ZygoteInit { cacheNonBootClasspathClassLoaders(); bootTimingsTraceLog.traceEnd(); // CacheNonBootClasspathClassLoaders bootTimingsTraceLog.traceBegin("PreloadResources"); - preloadResources(); + Resources.preloadResources(); bootTimingsTraceLog.traceEnd(); // PreloadResources Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadAppProcessHALs"); nativePreloadAppProcessHALs(); @@ -433,87 +421,6 @@ public class ZygoteInit { } /** - * Load in commonly used resources, so they can be shared across processes. - * - * These tend to be a few Kbytes, but are frequently in the 20-40K range, and occasionally even - * larger. - */ - private static void preloadResources() { - try { - mResources = Resources.getSystem(); - mResources.startPreloading(); - if (PRELOAD_RESOURCES) { - Log.i(TAG, "Preloading resources..."); - - long startTime = SystemClock.uptimeMillis(); - TypedArray ar = mResources.obtainTypedArray( - com.android.internal.R.array.preloaded_drawables); - int N = preloadDrawables(ar); - ar.recycle(); - Log.i(TAG, "...preloaded " + N + " resources in " - + (SystemClock.uptimeMillis() - startTime) + "ms."); - - startTime = SystemClock.uptimeMillis(); - ar = mResources.obtainTypedArray( - com.android.internal.R.array.preloaded_color_state_lists); - N = preloadColorStateLists(ar); - ar.recycle(); - Log.i(TAG, "...preloaded " + N + " resources in " - + (SystemClock.uptimeMillis() - startTime) + "ms."); - - if (mResources.getBoolean( - com.android.internal.R.bool.config_freeformWindowManagement)) { - startTime = SystemClock.uptimeMillis(); - ar = mResources.obtainTypedArray( - com.android.internal.R.array.preloaded_freeform_multi_window_drawables); - N = preloadDrawables(ar); - ar.recycle(); - Log.i(TAG, "...preloaded " + N + " resource in " - + (SystemClock.uptimeMillis() - startTime) + "ms."); - } - } - mResources.finishPreloading(); - } catch (RuntimeException e) { - Log.w(TAG, "Failure preloading resources", e); - } - } - - private static int preloadColorStateLists(TypedArray ar) { - int N = ar.length(); - for (int i = 0; i < N; i++) { - int id = ar.getResourceId(i, 0); - - if (id != 0) { - if (mResources.getColorStateList(id, null) == null) { - throw new IllegalArgumentException( - "Unable to find preloaded color resource #0x" - + Integer.toHexString(id) - + " (" + ar.getString(i) + ")"); - } - } - } - return N; - } - - - private static int preloadDrawables(TypedArray ar) { - int N = ar.length(); - for (int i = 0; i < N; i++) { - int id = ar.getResourceId(i, 0); - - if (id != 0) { - if (mResources.getDrawable(id, null) == null) { - throw new IllegalArgumentException( - "Unable to find preloaded drawable resource #0x" - + Integer.toHexString(id) - + " (" + ar.getString(i) + ")"); - } - } - } - return N; - } - - /** * Runs several special GCs to try to clean up a few generations of softly- and final-reachable * objects, along with any other garbage. This is only useful just before a fork(). */ diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index af1fdd79169a..2579ca116efc 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -2622,8 +2622,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind @Override public String toString() { - return "DecorView@" + Integer.toHexString(this.hashCode()) + "[" - + getTitleSuffix(mWindow.getAttributes()) + "]"; + return super.toString() + "[" + getTitleSuffix(mWindow.getAttributes()) + "]"; } private static class ColorViewState { diff --git a/core/java/com/android/internal/util/FileRotator.java b/core/java/com/android/internal/util/FileRotator.java index 5bc48c5172f0..c9d9926ba75a 100644 --- a/core/java/com/android/internal/util/FileRotator.java +++ b/core/java/com/android/internal/util/FileRotator.java @@ -19,6 +19,9 @@ package com.android.internal.util; import android.annotation.NonNull; import android.os.FileUtils; import android.util.Log; +import android.util.Pair; + +import libcore.io.IoUtils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; @@ -28,12 +31,12 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.Comparator; import java.util.Objects; +import java.util.TreeSet; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import libcore.io.IoUtils; - /** * Utility that rotates files over time, similar to {@code logrotate}. There is * a single "active" file, which is periodically rotated into historical files, @@ -302,17 +305,24 @@ public class FileRotator { public void readMatching(Reader reader, long matchStartMillis, long matchEndMillis) throws IOException { final FileInfo info = new FileInfo(mPrefix); + final TreeSet<Pair<Long, String>> readSet = new TreeSet<>( + Comparator.comparingLong(o -> o.first)); for (String name : mBasePath.list()) { if (!info.parse(name)) continue; - // read file when it overlaps + // Add file to set when it overlaps. if (info.startMillis <= matchEndMillis && matchStartMillis <= info.endMillis) { - if (LOGD) Log.d(TAG, "reading matching " + name); - - final File file = new File(mBasePath, name); - readFile(file, reader); + readSet.add(new Pair(info.startMillis, name)); } } + + // Read files in ascending order of start timestamp. + for (Pair<Long, String> pair : readSet) { + final String name = pair.second; + if (LOGD) Log.d(TAG, "reading matching " + name); + final File file = new File(mBasePath, name); + readFile(file, reader); + } } /** diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index e60a5c36d761..490ec35d1482 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -1055,7 +1055,7 @@ public class LockPatternUtils { */ @UnsupportedAppUsage public boolean isVisiblePatternEnabled(int userId) { - return getBoolean(Settings.Secure.LOCK_PATTERN_VISIBLE, false, userId); + return getBoolean(Settings.Secure.LOCK_PATTERN_VISIBLE, true, userId); } /** @@ -1091,13 +1091,6 @@ public class LockPatternUtils { } /** - * Set whether the visible password is enabled for cryptkeeper screen. - */ - public void setVisiblePasswordEnabled(boolean enabled, int userId) { - // No longer does anything. - } - - /** * Set and store the lockout deadline, meaning the user can't attempt their unlock * pattern until the deadline has passed. * @return the chosen deadline. diff --git a/core/java/com/android/internal/widget/OWNERS b/core/java/com/android/internal/widget/OWNERS index d068a3a0f62e..e2672f5b03ba 100644 --- a/core/java/com/android/internal/widget/OWNERS +++ b/core/java/com/android/internal/widget/OWNERS @@ -21,3 +21,6 @@ per-file ImageFloatingTextView.java = file:/services/core/java/com/android/serve per-file ObservableTextView.java = file:/services/core/java/com/android/server/notification/OWNERS per-file RemeasuringLinearLayout.java = file:/services/core/java/com/android/server/notification/OWNERS per-file ViewClippingUtil.java = file:/services/core/java/com/android/server/notification/OWNERS + +# Appwidget related +per-file *RemoteViews* = file:/services/appwidget/java/com/android/server/appwidget/OWNERS diff --git a/core/java/com/android/server/net/OWNERS b/core/java/com/android/server/net/OWNERS index 62c5737a2e8e..c24680e9b06a 100644 --- a/core/java/com/android/server/net/OWNERS +++ b/core/java/com/android/server/net/OWNERS @@ -1,2 +1,2 @@ set noparent -file:platform/packages/modules/Connectivity:master:/OWNERS_core_networking +file:platform/packages/modules/Connectivity:main:/OWNERS_core_networking diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 42d68960cafd..cc2d2e2aa55c 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -15,7 +15,19 @@ license { ], } -cc_library_shared { +soong_config_module_type { + name: "cc_library_shared_for_libandroid_runtime", + module_type: "cc_library_shared", + config_namespace: "ANDROID", + bool_variables: [ + "release_binder_death_recipient_weak_from_jni", + ], + properties: [ + "cflags", + ], +} + +cc_library_shared_for_libandroid_runtime { name: "libandroid_runtime", host_supported: true, cflags: [ @@ -46,6 +58,12 @@ cc_library_shared { }, }, + soong_config_variables: { + release_binder_death_recipient_weak_from_jni: { + cflags: ["-DBINDER_DEATH_RECIPIENT_WEAK_FROM_JNI"], + }, + }, + cpp_std: "gnu++20", srcs: [ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index e5d567607199..d90d5f8c5eac 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -352,7 +352,7 @@ status_t AndroidRuntime::callMain(const String8& className, jclass clazz, JNIEnv* env; jmethodID methodId; - ALOGD("Calling main entry %s", className.string()); + ALOGD("Calling main entry %s", className.c_str()); env = getJNIEnv(); if (clazz == NULL || env == NULL) { @@ -361,7 +361,7 @@ status_t AndroidRuntime::callMain(const String8& className, jclass clazz, methodId = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V"); if (methodId == NULL) { - ALOGE("ERROR: could not find method %s.main(String[])\n", className.string()); + ALOGE("ERROR: could not find method %s.main(String[])\n", className.c_str()); return UNKNOWN_ERROR; } @@ -377,7 +377,7 @@ status_t AndroidRuntime::callMain(const String8& className, jclass clazz, strArray = env->NewObjectArray(numArgs, stringClass, NULL); for (size_t i = 0; i < numArgs; i++) { - jstring argStr = env->NewStringUTF(args[i].string()); + jstring argStr = env->NewStringUTF(args[i].c_str()); env->SetObjectArrayElement(strArray, i, argStr); } @@ -1268,7 +1268,7 @@ void AndroidRuntime::start(const char* className, const Vector<String8>& options env->SetObjectArrayElement(strArray, 0, classNameStr); for (size_t i = 0; i < options.size(); ++i) { - jstring optionsStr = env->NewStringUTF(options.itemAt(i).string()); + jstring optionsStr = env->NewStringUTF(options.itemAt(i).c_str()); assert(optionsStr != NULL); env->SetObjectArrayElement(strArray, i + 1, optionsStr); } diff --git a/core/jni/OWNERS b/core/jni/OWNERS index 4e4abec88040..3aca751edb0d 100644 --- a/core/jni/OWNERS +++ b/core/jni/OWNERS @@ -104,3 +104,9 @@ per-file com_android_internal_os_*MultiStateCounter* = file:/BATTERY_STATS_OWNER # PM per-file com_android_internal_content_* = file:/PACKAGE_MANAGER_OWNERS + +# SQLite +per-file android_database_SQLite* = file:/SQLITE_OWNERS + +# PerformanceHintManager +per-file android_os_PerformanceHintManager.cpp = file:/ADPF_OWNERS diff --git a/core/jni/android_app_NativeActivity.cpp b/core/jni/android_app_NativeActivity.cpp index 21369f9cf5f8..d6c559322ef1 100644 --- a/core/jni/android_app_NativeActivity.cpp +++ b/core/jni/android_app_NativeActivity.cpp @@ -352,7 +352,7 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName const char* dirStr = env->GetStringUTFChars(internalDataDir, NULL); code->internalDataPathObj = dirStr; - code->internalDataPath = code->internalDataPathObj.string(); + code->internalDataPath = code->internalDataPathObj.c_str(); env->ReleaseStringUTFChars(internalDataDir, dirStr); if (externalDataDir != NULL) { @@ -360,7 +360,7 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName code->externalDataPathObj = dirStr; env->ReleaseStringUTFChars(externalDataDir, dirStr); } - code->externalDataPath = code->externalDataPathObj.string(); + code->externalDataPath = code->externalDataPathObj.c_str(); code->sdkVersion = sdkVersion; @@ -372,7 +372,7 @@ loadNativeCode_native(JNIEnv* env, jobject clazz, jstring path, jstring funcName code->obbPathObj = dirStr; env->ReleaseStringUTFChars(obbDir, dirStr); } - code->obbPath = code->obbPathObj.string(); + code->obbPath = code->obbPathObj.c_str(); jbyte* rawSavedState = NULL; jsize rawSavedSize = 0; diff --git a/core/jni/android_app_backup_FullBackup.cpp b/core/jni/android_app_backup_FullBackup.cpp index 339a7d30e407..5e096d7623ad 100644 --- a/core/jni/android_app_backup_FullBackup.cpp +++ b/core/jni/android_app_backup_FullBackup.cpp @@ -106,15 +106,14 @@ static jint backupToTar(JNIEnv* env, jobject clazz, jstring packageNameObj, : NULL; if (path.length() < rootpath.length()) { - ALOGE("file path [%s] shorter than root path [%s]", - path.string(), rootpath.string()); + ALOGE("file path [%s] shorter than root path [%s]", path.c_str(), rootpath.c_str()); return (jint) -1; } off64_t tarSize = 0; jint err = write_tarfile(packageName, domain, rootpath, path, &tarSize, writer); if (!err) { - ALOGI("measured [%s] at %lld", path.string(), (long long)tarSize); + ALOGI("measured [%s] at %lld", path.c_str(), (long long)tarSize); env->CallVoidMethod(dataOutputObj, sFullBackupDataOutput.addSize, (jlong) tarSize); } diff --git a/core/jni/android_backup_BackupDataInput.cpp b/core/jni/android_backup_BackupDataInput.cpp index 79fa2a28666c..fc081a782b4a 100644 --- a/core/jni/android_backup_BackupDataInput.cpp +++ b/core/jni/android_backup_BackupDataInput.cpp @@ -76,7 +76,7 @@ readNextHeader_native(JNIEnv* env, jobject clazz, jlong r, jobject entity) return err < 0 ? err : -1; } // TODO: Set the fields in the entity object - jstring keyStr = env->NewStringUTF(key.string()); + jstring keyStr = env->NewStringUTF(key.c_str()); env->SetObjectField(entity, s_keyField, keyStr); env->SetIntField(entity, s_dataSizeField, dataSize); return 0; diff --git a/core/jni/android_backup_BackupHelperDispatcher.cpp b/core/jni/android_backup_BackupHelperDispatcher.cpp index efe7d0b6ad0a..efce8e164817 100644 --- a/core/jni/android_backup_BackupHelperDispatcher.cpp +++ b/core/jni/android_backup_BackupHelperDispatcher.cpp @@ -118,7 +118,7 @@ readHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj) } env->SetIntField(headerObj, s_chunkSizeField, flattenedHeader.dataSize); - env->SetObjectField(headerObj, s_keyPrefixField, env->NewStringUTF(keyPrefix.string())); + env->SetObjectField(headerObj, s_keyPrefixField, env->NewStringUTF(keyPrefix.c_str())); return (jint) 0; } diff --git a/core/jni/android_content_res_ObbScanner.cpp b/core/jni/android_content_res_ObbScanner.cpp index de429a07d0f6..760037f63195 100644 --- a/core/jni/android_content_res_ObbScanner.cpp +++ b/core/jni/android_content_res_ObbScanner.cpp @@ -52,7 +52,7 @@ static void android_content_res_ObbScanner_getObbInfo(JNIEnv* env, jobject clazz env->ReleaseStringUTFChars(file, filePath); - const char* packageNameStr = obb->getPackageName().string(); + const char* packageNameStr = obb->getPackageName().c_str(); jstring packageName = env->NewStringUTF(packageNameStr); if (packageName == NULL) { diff --git a/core/jni/android_database_CursorWindow.cpp b/core/jni/android_database_CursorWindow.cpp index 243540693785..c0e9215267e6 100644 --- a/core/jni/android_database_CursorWindow.cpp +++ b/core/jni/android_database_CursorWindow.cpp @@ -58,13 +58,13 @@ static void throwExceptionWithRowCol(JNIEnv* env, jint row, jint column) { msg.appendFormat("Couldn't read row %d, col %d from CursorWindow. " "Make sure the Cursor is initialized correctly before accessing data from it.", row, column); - jniThrowException(env, "java/lang/IllegalStateException", msg.string()); + jniThrowException(env, "java/lang/IllegalStateException", msg.c_str()); } static void throwUnknownTypeException(JNIEnv * env, jint type) { String8 msg; msg.appendFormat("UNKNOWN type %d", type); - jniThrowException(env, "java/lang/IllegalStateException", msg.string()); + jniThrowException(env, "java/lang/IllegalStateException", msg.c_str()); } static int getFdCount() { @@ -89,7 +89,7 @@ static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring nameObj, jint curso CursorWindow* window; const char* nameStr = env->GetStringUTFChars(nameObj, NULL); - name.setTo(nameStr); + name = nameStr; env->ReleaseStringUTFChars(nameObj, nameStr); if (cursorWindowSize < 0) { @@ -107,7 +107,7 @@ static jlong nativeCreate(JNIEnv* env, jclass clazz, jstring nameObj, jint curso fail: jniThrowExceptionFmt(env, "android/database/CursorWindowAllocationException", "Could not allocate CursorWindow '%s' of size %d due to error %d.", - name.string(), cursorWindowSize, status); + name.c_str(), cursorWindowSize, status); return 0; } @@ -139,7 +139,7 @@ static void nativeDispose(JNIEnv* env, jclass clazz, jlong windowPtr) { static jstring nativeGetName(JNIEnv* env, jclass clazz, jlong windowPtr) { CursorWindow* window = reinterpret_cast<CursorWindow*>(windowPtr); - return env->NewStringUTF(window->name().string()); + return env->NewStringUTF(window->name().c_str()); } static void nativeWriteToParcel(JNIEnv * env, jclass clazz, jlong windowPtr, @@ -151,7 +151,7 @@ static void nativeWriteToParcel(JNIEnv * env, jclass clazz, jlong windowPtr, if (status) { String8 msg; msg.appendFormat("Could not write CursorWindow to Parcel due to error %d.", status); - jniThrowRuntimeException(env, msg.string()); + jniThrowRuntimeException(env, msg.c_str()); } } @@ -267,7 +267,7 @@ static jstring nativeGetString(JNIEnv* env, jclass clazz, jlong windowPtr, // doesn't like UTF-8 strings with high codepoints. It actually expects // Modified UTF-8 with encoded surrogate pairs. String16 utf16(value, sizeIncludingNull - 1); - return env->NewString(reinterpret_cast<const jchar*>(utf16.string()), utf16.size()); + return env->NewString(reinterpret_cast<const jchar*>(utf16.c_str()), utf16.size()); } else if (type == CursorWindow::FIELD_TYPE_INTEGER) { int64_t value = window->getFieldSlotValueLong(fieldSlot); char buf[32]; diff --git a/core/jni/android_database_SQLiteCommon.cpp b/core/jni/android_database_SQLiteCommon.cpp index daa20876ba65..c6a75112d185 100644 --- a/core/jni/android_database_SQLiteCommon.cpp +++ b/core/jni/android_database_SQLiteCommon.cpp @@ -229,7 +229,7 @@ void throw_sqlite3_exception(JNIEnv* env, int errcode, fullMessage.append(": "); fullMessage.append(message); } - jniThrowException(env, exceptionClass, fullMessage.string()); + jniThrowException(env, exceptionClass, fullMessage.c_str()); } else { jniThrowException(env, exceptionClass, message); } diff --git a/core/jni/android_database_SQLiteConnection.cpp b/core/jni/android_database_SQLiteConnection.cpp index 32697aeaa47f..03d3bc6857e4 100644 --- a/core/jni/android_database_SQLiteConnection.cpp +++ b/core/jni/android_database_SQLiteConnection.cpp @@ -91,15 +91,14 @@ struct SQLiteConnection { // Called each time a statement begins execution, when tracing is enabled. static void sqliteTraceCallback(void *data, const char *sql) { SQLiteConnection* connection = static_cast<SQLiteConnection*>(data); - ALOG(LOG_VERBOSE, SQLITE_TRACE_TAG, "%s: \"%s\"\n", - connection->label.string(), sql); + ALOG(LOG_VERBOSE, SQLITE_TRACE_TAG, "%s: \"%s\"\n", connection->label.c_str(), sql); } // Called each time a statement finishes execution, when profiling is enabled. static void sqliteProfileCallback(void *data, const char *sql, sqlite3_uint64 tm) { SQLiteConnection* connection = static_cast<SQLiteConnection*>(data); - ALOG(LOG_VERBOSE, SQLITE_PROFILE_TAG, "%s: \"%s\" took %0.3f ms\n", - connection->label.string(), sql, tm * 0.000001f); + ALOG(LOG_VERBOSE, SQLITE_PROFILE_TAG, "%s: \"%s\" took %0.3f ms\n", connection->label.c_str(), + sql, tm * 0.000001f); } // Called after each SQLite VM instruction when cancelation is enabled. @@ -130,7 +129,7 @@ static jlong nativeOpen(JNIEnv* env, jclass clazz, jstring pathStr, jint openFla env->ReleaseStringUTFChars(labelStr, labelChars); sqlite3* db; - int err = sqlite3_open_v2(path.string(), &db, sqliteFlags, NULL); + int err = sqlite3_open_v2(path.c_str(), &db, sqliteFlags, NULL); if (err != SQLITE_OK) { throw_sqlite3_exception_errcode(env, err, "Could not open database"); return 0; @@ -180,7 +179,7 @@ static jlong nativeOpen(JNIEnv* env, jclass clazz, jstring pathStr, jint openFla sqlite3_profile(db, &sqliteProfileCallback, connection); } - ALOGV("Opened connection %p with label '%s'", db, label.string()); + ALOGV("Opened connection %p with label '%s'", db, label.c_str()); return reinterpret_cast<jlong>(connection); } @@ -760,7 +759,7 @@ static jlong nativeExecuteForCursorWindow(JNIEnv* env, jclass clazz, if (status) { String8 msg; msg.appendFormat("Failed to clear the cursor window, status=%d", status); - throw_sqlite3_exception(env, connection->db, msg.string()); + throw_sqlite3_exception(env, connection->db, msg.c_str()); return 0; } @@ -770,7 +769,7 @@ static jlong nativeExecuteForCursorWindow(JNIEnv* env, jclass clazz, String8 msg; msg.appendFormat("Failed to set the cursor window column count to %d, status=%d", numColumns, status); - throw_sqlite3_exception(env, connection->db, msg.string()); + throw_sqlite3_exception(env, connection->db, msg.c_str()); return 0; } @@ -845,7 +844,7 @@ static jlong nativeExecuteForCursorWindow(JNIEnv* env, jclass clazz, String8 msg; msg.appendFormat("Row too big to fit into CursorWindow requiredPos=%d, totalRows=%d", requiredPos, totalRows); - throw_sqlite3_exception(env, SQLITE_TOOBIG, NULL, msg.string()); + throw_sqlite3_exception(env, SQLITE_TOOBIG, NULL, msg.c_str()); return 0; } diff --git a/core/jni/android_ddm_DdmHandleNativeHeap.cpp b/core/jni/android_ddm_DdmHandleNativeHeap.cpp index 2ca4500991fa..d36d29ca301d 100644 --- a/core/jni/android_ddm_DdmHandleNativeHeap.cpp +++ b/core/jni/android_ddm_DdmHandleNativeHeap.cpp @@ -100,8 +100,8 @@ static jbyteArray DdmHandleNativeHeap_getLeakInfo(JNIEnv* env, jobject) { if (array != NULL) { env->SetByteArrayRegion(array, 0, sizeof(header), reinterpret_cast<jbyte*>(&header)); - env->SetByteArrayRegion(array, sizeof(header), - maps.size(), reinterpret_cast<const jbyte*>(maps.string())); + env->SetByteArrayRegion(array, sizeof(header), maps.size(), + reinterpret_cast<const jbyte*>(maps.c_str())); env->SetByteArrayRegion(array, sizeof(header) + maps.size(), header.allocSize, reinterpret_cast<jbyte*>(leak_info.buffer)); } diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 2a670e865ced..5f3a1b5be154 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -17,22 +17,21 @@ //#define LOG_NDEBUG 0 #define LOG_TAG "Camera-JNI" -#include <utils/Log.h> - -#include "jni.h" -#include <nativehelper/JNIHelp.h> -#include "core_jni_helpers.h" #include <android_runtime/android_graphics_SurfaceTexture.h> #include <android_runtime/android_view_Surface.h> - +#include <binder/IMemory.h> +#include <camera/Camera.h> +#include <camera/StringUtils.h> #include <cutils/properties.h> -#include <utils/Vector.h> -#include <utils/Errors.h> - #include <gui/GLConsumer.h> #include <gui/Surface.h> -#include <camera/Camera.h> -#include <binder/IMemory.h> +#include <nativehelper/JNIHelp.h> +#include <utils/Errors.h> +#include <utils/Log.h> +#include <utils/Vector.h> + +#include "core_jni_helpers.h" +#include "jni.h" using namespace android; @@ -562,7 +561,7 @@ static jint android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, jobj const char16_t *rawClientName = reinterpret_cast<const char16_t*>( env->GetStringChars(clientPackageName, NULL)); jsize rawClientNameLen = env->GetStringLength(clientPackageName); - String16 clientName(rawClientName, rawClientNameLen); + std::string clientName = toStdString(rawClientName, rawClientNameLen); env->ReleaseStringChars(clientPackageName, reinterpret_cast<const jchar*>(rawClientName)); @@ -875,11 +874,11 @@ static jstring android_hardware_Camera_getParameters(JNIEnv *env, jobject thiz) if (camera == 0) return 0; String8 params8 = camera->getParameters(); - if (params8.isEmpty()) { + if (params8.empty()) { jniThrowRuntimeException(env, "getParameters failed (empty parameters)"); return 0; } - return env->NewStringUTF(params8.string()); + return env->NewStringUTF(params8.c_str()); } static void android_hardware_Camera_reconnect(JNIEnv *env, jobject thiz) diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp index 9c6a534c3bbb..deb138fda867 100644 --- a/core/jni/android_hardware_SensorManager.cpp +++ b/core/jni/android_hardware_SensorManager.cpp @@ -150,7 +150,7 @@ static jstring getJavaInternedString(JNIEnv *env, const String8 &string) { return gStringOffsets.emptyString; } - ScopedLocalRef<jstring> javaString(env, env->NewStringUTF(string.string())); + ScopedLocalRef<jstring> javaString(env, env->NewStringUTF(string.c_str())); jstring internedString = (jstring) env->CallObjectMethod(javaString.get(), gStringOffsets.intern); return internedString; diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index 5293c583cfd0..041fed74c573 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -514,7 +514,7 @@ static void CameraMetadata_dump(JNIEnv *env, jclass thiz, jlong ptr) { ssize_t res; while ((res = TEMP_FAILURE_RETRY(read(readFd, &out[0], /*count*/1))) > 0) { if (out[0] == '\n') { - ALOGD("%s", logLine.string()); + ALOGD("%s", logLine.c_str()); logLine.clear(); } else { logLine.append(out); @@ -526,8 +526,8 @@ static void CameraMetadata_dump(JNIEnv *env, jclass thiz, jlong ptr) { "Failed to read from fd (errno = %#x, message = '%s')", errno, strerror(errno)); //return; - } else if (!logLine.isEmpty()) { - ALOGD("%s", logLine.string()); + } else if (!logLine.empty()) { + ALOGD("%s", logLine.c_str()); } close(readFd); @@ -956,8 +956,8 @@ static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass th return OK; } else if (!res.isOk()) { VendorTagDescriptor::clearGlobalVendorTagDescriptor(); - ALOGE("%s: Failed to setup vendor tag descriptors: %s", - __FUNCTION__, res.toString8().string()); + ALOGE("%s: Failed to setup vendor tag descriptors: %s", __FUNCTION__, + res.toString8().c_str()); return res.serviceSpecificErrorCode(); } if (0 < desc->getTagCount()) { @@ -971,8 +971,8 @@ static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jclass th return OK; } else if (!res.isOk()) { VendorTagDescriptorCache::clearGlobalVendorTagCache(); - ALOGE("%s: Failed to setup vendor tag cache: %s", - __FUNCTION__, res.toString8().string()); + ALOGE("%s: Failed to setup vendor tag cache: %s", __FUNCTION__, + res.toString8().c_str()); return res.serviceSpecificErrorCode(); } diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp index c947fba2dbd9..30e546cc290d 100644 --- a/core/jni/android_hardware_camera2_DngCreator.cpp +++ b/core/jni/android_hardware_camera2_DngCreator.cpp @@ -1543,7 +1543,8 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image String8 captureTime = nativeContext->getCaptureTime(); if (writer->addEntry(TAG_DATETIME, NativeContext::DATETIME_COUNT, - reinterpret_cast<const uint8_t*>(captureTime.string()), TIFF_IFD_0) != OK) { + reinterpret_cast<const uint8_t*>(captureTime.c_str()), + TIFF_IFD_0) != OK) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid metadata for tag %x", TAG_DATETIME); return nullptr; @@ -1551,7 +1552,8 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image // datetime original if (writer->addEntry(TAG_DATETIMEORIGINAL, NativeContext::DATETIME_COUNT, - reinterpret_cast<const uint8_t*>(captureTime.string()), TIFF_IFD_0) != OK) { + reinterpret_cast<const uint8_t*>(captureTime.c_str()), + TIFF_IFD_0) != OK) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid metadata for tag %x", TAG_DATETIMEORIGINAL); return nullptr; @@ -1879,8 +1881,10 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image cameraModel += brand.c_str(); BAIL_IF_INVALID_RET_NULL_SP(writer->addEntry(TAG_UNIQUECAMERAMODEL, cameraModel.size() + 1, - reinterpret_cast<const uint8_t*>(cameraModel.string()), TIFF_IFD_0), env, - TAG_UNIQUECAMERAMODEL, writer); + reinterpret_cast<const uint8_t*>( + cameraModel.c_str()), + TIFF_IFD_0), + env, TAG_UNIQUECAMERAMODEL, writer); } { @@ -2165,7 +2169,8 @@ static sp<TiffWriter> DngCreator_setup(JNIEnv* env, jobject thiz, uint32_t image String8 description = nativeContext->getDescription(); size_t len = description.bytes() + 1; if (writer->addEntry(TAG_IMAGEDESCRIPTION, len, - reinterpret_cast<const uint8_t*>(description.string()), TIFF_IFD_0) != OK) { + reinterpret_cast<const uint8_t*>(description.c_str()), + TIFF_IFD_0) != OK) { jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "Invalid metadata for tag %x", TAG_IMAGEDESCRIPTION); } diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index e1be0cd80bb6..7dfd282f3660 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -30,6 +30,8 @@ #include <media/AudioSystem.h> #include <nativehelper/JNIHelp.h> #include <nativehelper/ScopedLocalRef.h> +#include <nativehelper/ScopedPrimitiveArray.h> +#include <nativehelper/jni_macros.h> #include <system/audio.h> #include <system/audio_policy.h> #include <utils/Log.h> @@ -285,7 +287,7 @@ JNIAudioPortCallback::JNIAudioPortCallback(JNIEnv* env, jobject thiz, jobject we ALOGE("Can't find class %s", kEventHandlerClassPathName); return; } - mClass = (jclass)env->NewGlobalRef(clazz); + mClass = static_cast<jclass>(env->NewGlobalRef(clazz)); // We use a weak reference so the AudioPortEventHandler object can be garbage collected. // The reference is only used as a proxy for callbacks. @@ -337,15 +339,16 @@ static sp<JNIAudioPortCallback> setJniCallback(JNIEnv* env, const sp<JNIAudioPortCallback>& callback) { Mutex::Autolock l(gLock); - sp<JNIAudioPortCallback> old = - (JNIAudioPortCallback*)env->GetLongField(thiz, gEventHandlerFields.mJniCallback); + sp<JNIAudioPortCallback> old = reinterpret_cast<JNIAudioPortCallback *>( + env->GetLongField(thiz, gEventHandlerFields.mJniCallback)); if (callback.get()) { - callback->incStrong((void*)setJniCallback); + callback->incStrong(reinterpret_cast<void *>(setJniCallback)); } if (old != 0) { - old->decStrong((void*)setJniCallback); + old->decStrong(reinterpret_cast<void *>(setJniCallback)); } - env->SetLongField(thiz, gEventHandlerFields.mJniCallback, (jlong)callback.get()); + env->SetLongField(thiz, gEventHandlerFields.mJniCallback, + reinterpret_cast<jlong>(callback.get())); return old; } @@ -374,43 +377,44 @@ static jint getVectorOfAudioDeviceTypeAddr(JNIEnv *env, jintArray deviceTypes, jobjectArray deviceAddresses, AudioDeviceTypeAddrVector &audioDeviceTypeAddrVector) { if (deviceTypes == nullptr || deviceAddresses == nullptr) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } jsize deviceCount = env->GetArrayLength(deviceTypes); if (deviceCount == 0 || deviceCount != env->GetArrayLength(deviceAddresses)) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } // retrieve all device types std::vector<audio_devices_t> deviceTypesVector; jint *typesPtr = nullptr; typesPtr = env->GetIntArrayElements(deviceTypes, 0); if (typesPtr == nullptr) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } for (jint i = 0; i < deviceCount; i++) { - deviceTypesVector.push_back((audio_devices_t)typesPtr[i]); + deviceTypesVector.push_back(static_cast<audio_devices_t>(typesPtr[i])); } // check each address is a string and add device type/address to list jclass stringClass = FindClassOrDie(env, "java/lang/String"); for (jint i = 0; i < deviceCount; i++) { jobject addrJobj = env->GetObjectArrayElement(deviceAddresses, i); if (!env->IsInstanceOf(addrJobj, stringClass)) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } - const char *address = env->GetStringUTFChars((jstring)addrJobj, NULL); - AudioDeviceTypeAddr dev = AudioDeviceTypeAddr((audio_devices_t)typesPtr[i], address); + const char *address = env->GetStringUTFChars(static_cast<jstring>(addrJobj), NULL); + AudioDeviceTypeAddr dev = + AudioDeviceTypeAddr(static_cast<audio_devices_t>(typesPtr[i]), address); audioDeviceTypeAddrVector.push_back(dev); - env->ReleaseStringUTFChars((jstring)addrJobj, address); + env->ReleaseStringUTFChars(static_cast<jstring>(addrJobj), address); } env->ReleaseIntArrayElements(deviceTypes, typesPtr, 0); - return (jint)NO_ERROR; + return NO_ERROR; } static jint android_media_AudioSystem_muteMicrophone(JNIEnv *env, jobject thiz, jboolean on) { - return (jint) check_AudioSystem_Command(AudioSystem::muteMicrophone(on)); + return check_AudioSystem_Command(AudioSystem::muteMicrophone(on)); } static jboolean @@ -425,7 +429,7 @@ static jboolean android_media_AudioSystem_isStreamActive(JNIEnv *env, jobject thiz, jint stream, jint inPastMs) { bool state = false; - AudioSystem::isStreamActive((audio_stream_type_t) stream, &state, inPastMs); + AudioSystem::isStreamActive(static_cast<audio_stream_type_t>(stream), &state, inPastMs); return state; } @@ -434,7 +438,7 @@ android_media_AudioSystem_isStreamActiveRemotely(JNIEnv *env, jobject thiz, jint jint inPastMs) { bool state = false; - AudioSystem::isStreamActiveRemotely((audio_stream_type_t) stream, &state, inPastMs); + AudioSystem::isStreamActiveRemotely(static_cast<audio_stream_type_t>(stream), &state, inPastMs); return state; } @@ -442,7 +446,7 @@ static jboolean android_media_AudioSystem_isSourceActive(JNIEnv *env, jobject thiz, jint source) { bool state = false; - AudioSystem::isSourceActive((audio_source_t) source, &state); + AudioSystem::isSourceActive(static_cast<audio_source_t>(source), &state); return state; } @@ -477,8 +481,7 @@ android_media_AudioSystem_setParameters(JNIEnv *env, jobject thiz, jstring keyVa env->GetStringLength(keyValuePairs)); env->ReleaseStringCritical(keyValuePairs, c_keyValuePairs); } - int status = check_AudioSystem_Command(AudioSystem::setParameters(c_keyValuePairs8)); - return (jint) status; + return check_AudioSystem_Command(AudioSystem::setParameters(c_keyValuePairs8)); } static jstring @@ -491,7 +494,7 @@ android_media_AudioSystem_getParameters(JNIEnv *env, jobject thiz, jstring keys) env->GetStringLength(keys)); env->ReleaseStringCritical(keys, c_keys); } - return env->NewStringUTF(AudioSystem::getParameters(c_keys8).string()); + return env->NewStringUTF(AudioSystem::getParameters(c_keys8).c_str()); } static void @@ -520,7 +523,7 @@ android_media_AudioSystem_dyn_policy_callback(int event, String8 regId, int val) } jclass clazz = env->FindClass(kClassPathName); - const char* zechars = regId.string(); + const char *zechars = regId.c_str(); jstring zestring = env->NewStringUTF(zechars); env->CallStaticVoidMethod(clazz, gAudioPolicyEventHandlerMethods.postDynPolicyEventFromNative, @@ -558,15 +561,15 @@ android_media_AudioSystem_recording_callback(int event, return; } jint recParamData[REC_PARAM_SIZE]; - recParamData[0] = (jint) audioFormatFromNative(clientConfig->format); + recParamData[0] = audioFormatFromNative(clientConfig->format); // FIXME this doesn't support index-based masks - recParamData[1] = (jint) inChannelMaskFromNative(clientConfig->channel_mask); - recParamData[2] = (jint) clientConfig->sample_rate; - recParamData[3] = (jint) audioFormatFromNative(deviceConfig->format); + recParamData[1] = inChannelMaskFromNative(clientConfig->channel_mask); + recParamData[2] = clientConfig->sample_rate; + recParamData[3] = audioFormatFromNative(deviceConfig->format); // FIXME this doesn't support index-based masks - recParamData[4] = (jint) inChannelMaskFromNative(deviceConfig->channel_mask); - recParamData[5] = (jint) deviceConfig->sample_rate; - recParamData[6] = (jint) patchHandle; + recParamData[4] = inChannelMaskFromNative(deviceConfig->channel_mask); + recParamData[5] = deviceConfig->sample_rate; + recParamData[6] = patchHandle; env->SetIntArrayRegion(recParamArray, 0, REC_PARAM_SIZE, recParamData); jobjectArray jClientEffects; @@ -580,10 +583,9 @@ android_media_AudioSystem_recording_callback(int event, env->CallStaticVoidMethod(clazz, gAudioPolicyEventHandlerMethods.postRecordConfigEventFromNative, - event, (jint) clientInfo->riid, (jint) clientInfo->uid, - clientInfo->session, clientInfo->source, clientInfo->port_id, - clientInfo->silenced, recParamArray, jClientEffects, jEffects, - source); + event, clientInfo->riid, clientInfo->uid, clientInfo->session, + clientInfo->source, clientInfo->port_id, clientInfo->silenced, + recParamArray, jClientEffects, jEffects, source); env->DeleteLocalRef(clazz); env->DeleteLocalRef(recParamArray); env->DeleteLocalRef(jClientEffects); @@ -626,11 +628,9 @@ static jint android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobj if (Parcel *parcel = parcelForJavaObject(env, jParcel); parcel != nullptr) { android::media::audio::common::AudioPort port{}; if (status_t statusOfParcel = port.readFromParcel(parcel); statusOfParcel == OK) { - status = check_AudioSystem_Command( - AudioSystem::setDeviceConnectionState(static_cast<audio_policy_dev_state_t>( - state), - port, - static_cast<audio_format_t>(codec))); + status = check_AudioSystem_Command( + AudioSystem::setDeviceConnectionState(static_cast<audio_policy_dev_state_t>(state), + port, static_cast<audio_format_t>(codec))); } else { ALOGE("Failed to read from parcel: %s", statusToString(statusOfParcel).c_str()); status = kAudioStatusError; @@ -639,17 +639,17 @@ static jint android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobj ALOGE("Failed to retrieve the native parcel from Java parcel"); status = kAudioStatusError; } - return (jint) status; + return status; } static jint android_media_AudioSystem_getDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jstring device_address) { const char *c_address = env->GetStringUTFChars(device_address, NULL); - int state = static_cast <int>(AudioSystem::getDeviceConnectionState(static_cast <audio_devices_t>(device), - c_address)); + int state = static_cast<int>( + AudioSystem::getDeviceConnectionState(static_cast<audio_devices_t>(device), c_address)); env->ReleaseStringUTFChars(device_address, c_address); - return (jint) state; + return state; } static jint @@ -658,38 +658,41 @@ android_media_AudioSystem_handleDeviceConfigChange(JNIEnv *env, jobject thiz, ji { const char *c_address = env->GetStringUTFChars(device_address, NULL); const char *c_name = env->GetStringUTFChars(device_name, NULL); - int status = check_AudioSystem_Command(AudioSystem::handleDeviceConfigChange(static_cast <audio_devices_t>(device), - c_address, c_name, static_cast <audio_format_t>(codec))); + int status = check_AudioSystem_Command( + AudioSystem::handleDeviceConfigChange(static_cast<audio_devices_t>(device), c_address, + c_name, static_cast<audio_format_t>(codec))); env->ReleaseStringUTFChars(device_address, c_address); env->ReleaseStringUTFChars(device_name, c_name); - return (jint) status; + return status; } static jint android_media_AudioSystem_setPhoneState(JNIEnv *env, jobject thiz, jint state, jint uid) { - return (jint)check_AudioSystem_Command( - AudioSystem::setPhoneState((audio_mode_t)state, (uid_t)uid)); + return check_AudioSystem_Command( + AudioSystem::setPhoneState(static_cast<audio_mode_t>(state), static_cast<uid_t>(uid))); } static jint android_media_AudioSystem_setForceUse(JNIEnv *env, jobject thiz, jint usage, jint config) { - return (jint) check_AudioSystem_Command(AudioSystem::setForceUse(static_cast <audio_policy_force_use_t>(usage), - static_cast <audio_policy_forced_cfg_t>(config))); + return check_AudioSystem_Command( + AudioSystem::setForceUse(static_cast<audio_policy_force_use_t>(usage), + static_cast<audio_policy_forced_cfg_t>(config))); } static jint android_media_AudioSystem_getForceUse(JNIEnv *env, jobject thiz, jint usage) { - return static_cast <jint>(AudioSystem::getForceUse(static_cast <audio_policy_force_use_t>(usage))); + return static_cast<jint>( + AudioSystem::getForceUse(static_cast<audio_policy_force_use_t>(usage))); } static jint android_media_AudioSystem_initStreamVolume(JNIEnv *env, jobject thiz, jint stream, jint indexMin, jint indexMax) { - return (jint) check_AudioSystem_Command(AudioSystem::initStreamVolume(static_cast <audio_stream_type_t>(stream), - indexMin, - indexMax)); + return check_AudioSystem_Command( + AudioSystem::initStreamVolume(static_cast<audio_stream_type_t>(stream), indexMin, + indexMax)); } static jint @@ -699,10 +702,9 @@ android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jint index, jint device) { - return (jint) check_AudioSystem_Command( - AudioSystem::setStreamVolumeIndex(static_cast <audio_stream_type_t>(stream), - index, - (audio_devices_t)device)); + return check_AudioSystem_Command( + AudioSystem::setStreamVolumeIndex(static_cast<audio_stream_type_t>(stream), index, + static_cast<audio_devices_t>(device))); } static jint @@ -712,13 +714,11 @@ android_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env, jint device) { int index; - if (AudioSystem::getStreamVolumeIndex(static_cast <audio_stream_type_t>(stream), - &index, - (audio_devices_t)device) - != NO_ERROR) { + if (AudioSystem::getStreamVolumeIndex(static_cast<audio_stream_type_t>(stream), &index, + static_cast<audio_devices_t>(device)) != NO_ERROR) { index = -1; } - return (jint) index; + return index; } static jint @@ -731,11 +731,12 @@ android_media_AudioSystem_setVolumeIndexForAttributes(JNIEnv *env, // read the AudioAttributes values JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return jStatus; } - return (jint) check_AudioSystem_Command( - AudioSystem::setVolumeIndexForAttributes(*(paa.get()), index, (audio_devices_t)device)); + return check_AudioSystem_Command( + AudioSystem::setVolumeIndexForAttributes(*(paa.get()), index, + static_cast<audio_devices_t>(device))); } static jint @@ -747,15 +748,16 @@ android_media_AudioSystem_getVolumeIndexForAttributes(JNIEnv *env, // read the AudioAttributes values JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return jStatus; } int index; - if (AudioSystem::getVolumeIndexForAttributes(*(paa.get()), index, (audio_devices_t)device) - != NO_ERROR) { + if (AudioSystem::getVolumeIndexForAttributes(*(paa.get()), index, + static_cast<audio_devices_t>(device)) != + NO_ERROR) { index = -1; } - return (jint) index; + return index; } static jint @@ -766,7 +768,7 @@ android_media_AudioSystem_getMinVolumeIndexForAttributes(JNIEnv *env, // read the AudioAttributes values JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return jStatus; } int index; @@ -774,7 +776,7 @@ android_media_AudioSystem_getMinVolumeIndexForAttributes(JNIEnv *env, != NO_ERROR) { index = -1; } - return (jint) index; + return index; } static jint @@ -785,7 +787,7 @@ android_media_AudioSystem_getMaxVolumeIndexForAttributes(JNIEnv *env, // read the AudioAttributes values JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return jStatus; } int index; @@ -793,13 +795,13 @@ android_media_AudioSystem_getMaxVolumeIndexForAttributes(JNIEnv *env, != NO_ERROR) { index = -1; } - return (jint) index; + return index; } static jint android_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jfloat value) { - return (jint) check_AudioSystem_Command(AudioSystem::setMasterVolume(value)); + return check_AudioSystem_Command(AudioSystem::setMasterVolume(value)); } static jfloat @@ -815,7 +817,7 @@ android_media_AudioSystem_getMasterVolume(JNIEnv *env, jobject thiz) static jint android_media_AudioSystem_setMasterMute(JNIEnv *env, jobject thiz, jboolean mute) { - return (jint) check_AudioSystem_Command(AudioSystem::setMasterMute(mute)); + return check_AudioSystem_Command(AudioSystem::setMasterMute(mute)); } static jboolean @@ -831,7 +833,7 @@ android_media_AudioSystem_getMasterMute(JNIEnv *env, jobject thiz) static jint android_media_AudioSystem_setMasterMono(JNIEnv *env, jobject thiz, jboolean mono) { - return (jint) check_AudioSystem_Command(AudioSystem::setMasterMono(mono)); + return check_AudioSystem_Command(AudioSystem::setMasterMono(mono)); } static jboolean @@ -847,7 +849,7 @@ android_media_AudioSystem_getMasterMono(JNIEnv *env, jobject thiz) static jint android_media_AudioSystem_setMasterBalance(JNIEnv *env, jobject thiz, jfloat balance) { - return (jint) check_AudioSystem_Command(AudioSystem::setMasterBalance(balance)); + return check_AudioSystem_Command(AudioSystem::setMasterBalance(balance)); } static jfloat @@ -865,37 +867,37 @@ android_media_AudioSystem_getMasterBalance(JNIEnv *env, jobject thiz) static jint android_media_AudioSystem_getPrimaryOutputSamplingRate(JNIEnv *env, jobject clazz) { - return (jint) AudioSystem::getPrimaryOutputSamplingRate(); + return AudioSystem::getPrimaryOutputSamplingRate(); } static jint android_media_AudioSystem_getPrimaryOutputFrameCount(JNIEnv *env, jobject clazz) { - return (jint) AudioSystem::getPrimaryOutputFrameCount(); + return AudioSystem::getPrimaryOutputFrameCount(); } static jint android_media_AudioSystem_getOutputLatency(JNIEnv *env, jobject clazz, jint stream) { uint32_t afLatency; - if (AudioSystem::getOutputLatency(&afLatency, static_cast <audio_stream_type_t>(stream)) - != NO_ERROR) { + if (AudioSystem::getOutputLatency(&afLatency, static_cast<audio_stream_type_t>(stream)) != + NO_ERROR) { afLatency = -1; } - return (jint) afLatency; + return afLatency; } static jint android_media_AudioSystem_setLowRamDevice( JNIEnv *env, jobject clazz, jboolean isLowRamDevice, jlong totalMemory) { - return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice, (int64_t) totalMemory); + return AudioSystem::setLowRamDevice(isLowRamDevice, totalMemory); } static jint android_media_AudioSystem_checkAudioFlinger(JNIEnv *env, jobject clazz) { - return (jint) check_AudioSystem_Command(AudioSystem::checkAudioFlinger()); + return check_AudioSystem_Command(AudioSystem::checkAudioFlinger()); } static void android_media_AudioSystem_setAudioFlingerBinder(JNIEnv *env, jobject clazz, @@ -909,8 +911,8 @@ static void convertAudioGainConfigToNative(JNIEnv *env, bool useInMask) { nAudioGainConfig->index = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mIndex); - nAudioGainConfig->mode = - (audio_gain_mode_t)env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mMode); + nAudioGainConfig->mode = static_cast<audio_gain_mode_t>( + env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mMode)); ALOGV("convertAudioGainConfigToNative got gain index %d", nAudioGainConfig->index); jint jMask = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mChannelMask); audio_channel_mask_t nMask; @@ -924,8 +926,8 @@ static void convertAudioGainConfigToNative(JNIEnv *env, nAudioGainConfig->channel_mask = nMask; nAudioGainConfig->ramp_duration_ms = env->GetIntField(jAudioGainConfig, gAudioGainConfigFields.mRampDurationMs); - jintArray jValues = (jintArray)env->GetObjectField(jAudioGainConfig, - gAudioGainConfigFields.mValues); + jintArray jValues = static_cast<jintArray>( + env->GetObjectField(jAudioGainConfig, gAudioGainConfigFields.mValues)); int *nValues = env->GetIntArrayElements(jValues, NULL); size_t size = env->GetArrayLength(jValues); memcpy(nAudioGainConfig->values, nValues, size * sizeof(int)); @@ -940,8 +942,8 @@ static jint convertAudioPortConfigToNative(JNIEnv *env, jobject jAudioPort = env->GetObjectField(jAudioPortConfig, gAudioPortConfigFields.mPort); jobject jHandle = env->GetObjectField(jAudioPort, gAudioPortFields.mHandle); nAudioPortConfig->id = env->GetIntField(jHandle, gAudioHandleFields.mId); - nAudioPortConfig->role = (audio_port_role_t)env->GetIntField(jAudioPort, - gAudioPortFields.mRole); + nAudioPortConfig->role = + static_cast<audio_port_role_t>(env->GetIntField(jAudioPort, gAudioPortFields.mRole)); if (env->IsInstanceOf(jAudioPort, gAudioDevicePortClass)) { nAudioPortConfig->type = AUDIO_PORT_TYPE_DEVICE; } else if (env->IsInstanceOf(jAudioPort, gAudioMixPortClass)) { @@ -949,7 +951,7 @@ static jint convertAudioPortConfigToNative(JNIEnv *env, } else { env->DeleteLocalRef(jAudioPort); env->DeleteLocalRef(jHandle); - return (jint)AUDIO_JAVA_ERROR; + return AUDIO_JAVA_ERROR; } ALOGV("convertAudioPortConfigToNative handle %d role %d type %d", nAudioPortConfig->id, nAudioPortConfig->role, nAudioPortConfig->type); @@ -1004,7 +1006,7 @@ static jint convertAudioPortConfigToNative(JNIEnv *env, } env->DeleteLocalRef(jAudioPort); env->DeleteLocalRef(jHandle); - return (jint)AUDIO_JAVA_SUCCESS; + return AUDIO_JAVA_SUCCESS; } /** @@ -1025,15 +1027,15 @@ static jint convertAudioPortConfigToNativeWithDevicePort(JNIEnv *env, } // Supports AUDIO_PORT_TYPE_DEVICE only if (nAudioPortConfig->type != AUDIO_PORT_TYPE_DEVICE) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } jobject jAudioDevicePort = env->GetObjectField(jAudioPortConfig, gAudioPortConfigFields.mPort); - nAudioPortConfig->ext.device.type = - (audio_devices_t)env->GetIntField(jAudioDevicePort, gAudioPortFields.mType); - jstring jDeviceAddress = (jstring)env->GetObjectField(jAudioDevicePort, - gAudioPortFields.mAddress); + nAudioPortConfig->ext.device.type = static_cast<audio_devices_t>( + env->GetIntField(jAudioDevicePort, gAudioPortFields.mType)); + jstring jDeviceAddress = + static_cast<jstring>(env->GetObjectField(jAudioDevicePort, gAudioPortFields.mAddress)); const char *nDeviceAddress = env->GetStringUTFChars(jDeviceAddress, NULL); strncpy(nAudioPortConfig->ext.device.address, nDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN - 1); @@ -1043,45 +1045,41 @@ static jint convertAudioPortConfigToNativeWithDevicePort(JNIEnv *env, return jStatus; } -static jint convertAudioPortConfigFromNative(JNIEnv *env, - jobject jAudioPort, - jobject *jAudioPortConfig, - const struct audio_port_config *nAudioPortConfig) -{ - jint jStatus = AUDIO_JAVA_SUCCESS; - jobject jAudioGainConfig = NULL; - jobject jAudioGain = NULL; +static jint convertAudioPortConfigFromNative(JNIEnv *env, ScopedLocalRef<jobject> *jAudioPort, + ScopedLocalRef<jobject> *jAudioPortConfig, + const struct audio_port_config *nAudioPortConfig) { jintArray jGainValues; bool audioportCreated = false; ALOGV("convertAudioPortConfigFromNative jAudioPort %p", jAudioPort); - if (jAudioPort == NULL) { - jobject jHandle = env->NewObject(gAudioHandleClass, gAudioHandleCstor, - nAudioPortConfig->id); + if (*jAudioPort == nullptr) { + ScopedLocalRef<jobject> jHandle(env, + env->NewObject(gAudioHandleClass, gAudioHandleCstor, + nAudioPortConfig->id)); ALOGV("convertAudioPortConfigFromNative handle %d is a %s", nAudioPortConfig->id, nAudioPortConfig->type == AUDIO_PORT_TYPE_DEVICE ? "device" : "mix"); if (jHandle == NULL) { - return (jint)AUDIO_JAVA_ERROR; + return AUDIO_JAVA_ERROR; } // create placeholder port and port config objects with just the correct handle // and configuration data. The actual AudioPortConfig objects will be // constructed by java code with correct class type (device, mix etc...) // and reference to AudioPort instance in this client - jAudioPort = env->NewObject(gAudioPortClass, gAudioPortCstor, - jHandle, // handle - 0, // role - NULL, // name - NULL, // samplingRates - NULL, // channelMasks - NULL, // channelIndexMasks - NULL, // formats - NULL); // gains - env->DeleteLocalRef(jHandle); - if (jAudioPort == NULL) { - return (jint)AUDIO_JAVA_ERROR; + jAudioPort->reset(env->NewObject(gAudioPortClass, gAudioPortCstor, + jHandle.get(), // handle + 0, // role + nullptr, // name + nullptr, // samplingRates + nullptr, // channelMasks + nullptr, // channelIndexMasks + nullptr, // formats + nullptr)); // gains + + if (*jAudioPort == nullptr) { + return AUDIO_JAVA_ERROR; } ALOGV("convertAudioPortConfigFromNative jAudioPort created for handle %d", nAudioPortConfig->id); @@ -1089,6 +1087,9 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, audioportCreated = true; } + ScopedLocalRef<jobject> jAudioGainConfig(env, nullptr); + ScopedLocalRef<jobject> jAudioGain(env, nullptr); + bool useInMask = audio_port_config_has_input_direction(nAudioPortConfig); audio_channel_mask_t nMask; @@ -1102,36 +1103,28 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, gainIndex, nAudioPortConfig->gain.mode); if (audioportCreated) { ALOGV("convertAudioPortConfigFromNative creating gain"); - jAudioGain = env->NewObject(gAudioGainClass, gAudioGainCstor, - gainIndex, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0); + jAudioGain.reset(env->NewObject(gAudioGainClass, gAudioGainCstor, gainIndex, 0 /*mode*/, + 0 /*channelMask*/, 0 /*minValue*/, 0 /*maxValue*/, + 0 /*defaultValue*/, 0 /*stepValue*/, + 0 /*rampDurationMinMs*/, 0 /*rampDurationMaxMs*/)); if (jAudioGain == NULL) { ALOGV("convertAudioPortConfigFromNative creating gain FAILED"); - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } } else { ALOGV("convertAudioPortConfigFromNative reading gain from port"); - jobjectArray jGains = (jobjectArray)env->GetObjectField(jAudioPort, - gAudioPortFields.mGains); + ScopedLocalRef<jobjectArray> + jGains(env, + static_cast<jobjectArray>(env->GetObjectField(jAudioPort->get(), + gAudioPortFields.mGains))); if (jGains == NULL) { ALOGV("convertAudioPortConfigFromNative could not get gains from port"); - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } - jAudioGain = env->GetObjectArrayElement(jGains, gainIndex); - env->DeleteLocalRef(jGains); + jAudioGain.reset(env->GetObjectArrayElement(jGains.get(), gainIndex)); if (jAudioGain == NULL) { ALOGV("convertAudioPortConfigFromNative could not get gain at index %d", gainIndex); - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } } int numValues; @@ -1143,8 +1136,7 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, jGainValues = env->NewIntArray(numValues); if (jGainValues == NULL) { ALOGV("convertAudioPortConfigFromNative could not create gain values %d", numValues); - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } env->SetIntArrayRegion(jGainValues, 0, numValues, nAudioPortConfig->gain.values); @@ -1158,19 +1150,14 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, ALOGV("convertAudioPortConfigFromNative OUT mask java %x native %x", jMask, nMask); } - jAudioGainConfig = env->NewObject(gAudioGainConfigClass, - gAudioGainConfigCstor, - gainIndex, - jAudioGain, - nAudioPortConfig->gain.mode, - jMask, - jGainValues, - nAudioPortConfig->gain.ramp_duration_ms); + jAudioGainConfig.reset(env->NewObject(gAudioGainConfigClass, gAudioGainConfigCstor, + gainIndex, jAudioGain.get(), + nAudioPortConfig->gain.mode, jMask, jGainValues, + nAudioPortConfig->gain.ramp_duration_ms)); env->DeleteLocalRef(jGainValues); if (jAudioGainConfig == NULL) { ALOGV("convertAudioPortConfigFromNative could not create gain config"); - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } } jclass clazz; @@ -1180,17 +1167,16 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, methodID = gAudioPortConfigCstor; ALOGV("convertAudioPortConfigFromNative building a generic port config"); } else { - if (env->IsInstanceOf(jAudioPort, gAudioDevicePortClass)) { + if (env->IsInstanceOf(jAudioPort->get(), gAudioDevicePortClass)) { clazz = gAudioDevicePortConfigClass; methodID = gAudioDevicePortConfigCstor; ALOGV("convertAudioPortConfigFromNative building a device config"); - } else if (env->IsInstanceOf(jAudioPort, gAudioMixPortClass)) { + } else if (env->IsInstanceOf(jAudioPort->get(), gAudioMixPortClass)) { clazz = gAudioMixPortConfigClass; methodID = gAudioMixPortConfigCstor; ALOGV("convertAudioPortConfigFromNative building a mix config"); } else { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } } nMask = (nAudioPortConfig->config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) @@ -1204,8 +1190,8 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, ALOGV("convertAudioPortConfigFromNative OUT mask java %x native %x", jMask, nMask); } - *jAudioPortConfig = - env->NewObject(clazz, methodID, jAudioPort, + jAudioPortConfig->reset( + env->NewObject(clazz, methodID, jAudioPort->get(), (nAudioPortConfig->config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) ? nAudioPortConfig->sample_rate : AUDIO_CONFIG_BASE_INITIALIZER.sample_rate, @@ -1214,31 +1200,14 @@ static jint convertAudioPortConfigFromNative(JNIEnv *env, (nAudioPortConfig->config_mask & AUDIO_PORT_CONFIG_FORMAT) ? nAudioPortConfig->format : AUDIO_CONFIG_BASE_INITIALIZER.format), - jAudioGainConfig); + jAudioGainConfig.get())); if (*jAudioPortConfig == NULL) { ALOGV("convertAudioPortConfigFromNative could not create new port config"); - jStatus = (jint)AUDIO_JAVA_ERROR; + return AUDIO_JAVA_ERROR; } else { ALOGV("convertAudioPortConfigFromNative OK"); } - -exit: - if (audioportCreated) { - env->DeleteLocalRef(jAudioPort); - if (jAudioGain != NULL) { - env->DeleteLocalRef(jAudioGain); - } - } - if (jAudioGainConfig != NULL) { - env->DeleteLocalRef(jAudioGainConfig); - } - return jStatus; -} - -// TODO: pull out to separate file -template <typename T, size_t N> -static constexpr size_t array_size(const T (&)[N]) { - return N; + return AUDIO_JAVA_SUCCESS; } static jintArray convertEncapsulationInfoFromNative(JNIEnv *env, uint32_t encapsulationInfo) { @@ -1252,7 +1221,8 @@ static jintArray convertEncapsulationInfoFromNative(JNIEnv *env, uint32_t encaps } } jintArray result = env->NewIntArray(encapsulation.size()); - env->SetIntArrayRegion(result, 0, encapsulation.size(), (jint *)encapsulation.data()); + env->SetIntArrayRegion(result, 0, encapsulation.size(), + reinterpret_cast<jint *>(encapsulation.data())); return result; } @@ -1260,8 +1230,8 @@ static bool isAudioPortArrayCountOutOfBounds(const struct audio_port_v7 *nAudioP std::stringstream &ss) { ss << " num_audio_profiles " << nAudioPort->num_audio_profiles << " num_gains " << nAudioPort->num_gains; - if (nAudioPort->num_audio_profiles > array_size(nAudioPort->audio_profiles) || - nAudioPort->num_gains > array_size(nAudioPort->gains)) { + if (nAudioPort->num_audio_profiles > std::size(nAudioPort->audio_profiles) || + nAudioPort->num_gains > std::size(nAudioPort->gains)) { return true; } for (size_t i = 0; i < nAudioPort->num_audio_profiles; ++i) { @@ -1269,16 +1239,16 @@ static bool isAudioPortArrayCountOutOfBounds(const struct audio_port_v7 *nAudioP << " num_sample_rates " << nAudioPort->audio_profiles[i].num_sample_rates << " num_channel_masks " << nAudioPort->audio_profiles[i].num_channel_masks; if (nAudioPort->audio_profiles[i].num_sample_rates > - array_size(nAudioPort->audio_profiles[i].sample_rates) || + std::size(nAudioPort->audio_profiles[i].sample_rates) || nAudioPort->audio_profiles[i].num_channel_masks > - array_size(nAudioPort->audio_profiles[i].channel_masks)) { + std::size(nAudioPort->audio_profiles[i].channel_masks)) { return true; } } return false; } -static jint convertAudioProfileFromNative(JNIEnv *env, jobject *jAudioProfile, +static jint convertAudioProfileFromNative(JNIEnv *env, ScopedLocalRef<jobject> *jAudioProfile, const audio_profile *nAudioProfile, bool useInMask) { size_t numPositionMasks = 0; size_t numIndexMasks = 0; @@ -1309,7 +1279,8 @@ static jint convertAudioProfileFromNative(JNIEnv *env, jobject *jAudioProfile, if (nAudioProfile->num_sample_rates) { env->SetIntArrayRegion(jSamplingRates.get(), 0 /*start*/, nAudioProfile->num_sample_rates, - (jint *)nAudioProfile->sample_rates); + const_cast<jint *>(reinterpret_cast<const jint *>( + nAudioProfile->sample_rates))); } // put the masks in the output arrays @@ -1331,10 +1302,9 @@ static jint convertAudioProfileFromNative(JNIEnv *env, jobject *jAudioProfile, ALOGW("Unknown encapsulation type for JAVA API: %u", nAudioProfile->encapsulation_type); } - *jAudioProfile = env->NewObject(gAudioProfileClass, gAudioProfileCstor, audioFormat, - jSamplingRates.get(), jChannelMasks.get(), - jChannelIndexMasks.get(), encapsulationType); - + jAudioProfile->reset(env->NewObject(gAudioProfileClass, gAudioProfileCstor, audioFormat, + jSamplingRates.get(), jChannelMasks.get(), + jChannelIndexMasks.get(), encapsulationType)); if (*jAudioProfile == nullptr) { return AUDIO_JAVA_ERROR; } @@ -1342,18 +1312,8 @@ static jint convertAudioProfileFromNative(JNIEnv *env, jobject *jAudioProfile, return AUDIO_JAVA_SUCCESS; } -static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, +static jint convertAudioPortFromNative(JNIEnv *env, ScopedLocalRef<jobject> *jAudioPort, const struct audio_port_v7 *nAudioPort) { - jint jStatus = (jint)AUDIO_JAVA_SUCCESS; - jintArray jEncapsulationModes = NULL; - jintArray jEncapsulationMetadataTypes = NULL; - jobjectArray jGains = NULL; - jobject jHandle = NULL; - jobject jAudioPortConfig = NULL; - jstring jDeviceName = NULL; - jobject jAudioProfiles = NULL; - jobject jAudioDescriptors = nullptr; - ScopedLocalRef<jobject> jPcmFloatProfileFromExtendedInteger(env, nullptr); bool hasFloat = false; bool useInMask; @@ -1377,30 +1337,30 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, } else { ALOGE("%s", s.c_str()); } - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } useInMask = audio_has_input_direction(nAudioPort->type, nAudioPort->role); - jAudioProfiles = env->NewObject(gArrayListClass, gArrayListMethods.cstor); + ScopedLocalRef<jobject> jAudioProfiles(env, + env->NewObject(gArrayListClass, + gArrayListMethods.cstor)); if (jAudioProfiles == nullptr) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } + ScopedLocalRef<jobject> jPcmFloatProfileFromExtendedInteger(env, nullptr); for (size_t i = 0; i < nAudioPort->num_audio_profiles; ++i) { - jobject jAudioProfile = nullptr; - jStatus = convertAudioProfileFromNative(env, &jAudioProfile, &nAudioPort->audio_profiles[i], - useInMask); + ScopedLocalRef<jobject> jAudioProfile(env); + jint jStatus = convertAudioProfileFromNative(env, &jAudioProfile, + &nAudioPort->audio_profiles[i], useInMask); if (jStatus == AUDIO_JAVA_BAD_VALUE) { // skipping Java layer unsupported audio formats continue; } if (jStatus != NO_ERROR) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } - env->CallBooleanMethod(jAudioProfiles, gArrayListMethods.add, jAudioProfile); + env->CallBooleanMethod(jAudioProfiles.get(), gArrayListMethods.add, jAudioProfile.get()); if (nAudioPort->audio_profiles[i].format == AUDIO_FORMAT_PCM_FLOAT) { hasFloat = true; @@ -1409,21 +1369,23 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, audio_bytes_per_sample(nAudioPort->audio_profiles[i].format) > 2) { ScopedLocalRef<jintArray> jSamplingRates(env, - (jintArray) - env->GetObjectField(jAudioProfile, - gAudioProfileFields.mSamplingRates)); + static_cast<jintArray>( + env->GetObjectField(jAudioProfile.get(), + gAudioProfileFields + .mSamplingRates))); ScopedLocalRef<jintArray> jChannelMasks(env, - (jintArray) - env->GetObjectField(jAudioProfile, - gAudioProfileFields.mChannelMasks)); + static_cast<jintArray>( + env->GetObjectField(jAudioProfile.get(), + gAudioProfileFields.mChannelMasks))); ScopedLocalRef<jintArray> jChannelIndexMasks(env, - (jintArray)env->GetObjectField(jAudioProfile, - gAudioProfileFields - .mChannelIndexMasks)); + static_cast<jintArray>( + env->GetObjectField(jAudioProfile.get(), + gAudioProfileFields + .mChannelIndexMasks))); int encapsulationType = - env->GetIntField(jAudioProfile, gAudioProfileFields.mEncapsulationType); + env->GetIntField(jAudioProfile.get(), gAudioProfileFields.mEncapsulationType); jPcmFloatProfileFromExtendedInteger.reset( env->NewObject(gAudioProfileClass, gAudioProfileCstor, @@ -1431,24 +1393,21 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, jSamplingRates.get(), jChannelMasks.get(), jChannelIndexMasks.get(), encapsulationType)); } - - if (jAudioProfile != nullptr) { - env->DeleteLocalRef(jAudioProfile); - } } if (!hasFloat && jPcmFloatProfileFromExtendedInteger.get() != nullptr) { // R and earlier compatibility - add ENCODING_PCM_FLOAT to the end // (replacing the zero pad). This ensures pre-S apps that look // for ENCODING_PCM_FLOAT continue to see that encoding if the device supports // extended precision integers. - env->CallBooleanMethod(jAudioProfiles, gArrayListMethods.add, + env->CallBooleanMethod(jAudioProfiles.get(), gArrayListMethods.add, jPcmFloatProfileFromExtendedInteger.get()); } - jAudioDescriptors = env->NewObject(gArrayListClass, gArrayListMethods.cstor); + ScopedLocalRef<jobject> jAudioDescriptors(env, + env->NewObject(gArrayListClass, + gArrayListMethods.cstor)); if (jAudioDescriptors == nullptr) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } for (size_t i = 0; i < nAudioPort->num_extra_audio_descriptors; ++i) { const auto &extraAudioDescriptor = nAudioPort->extra_audio_descriptors[i]; @@ -1478,15 +1437,16 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, env->NewObject(gAudioDescriptorClass, gAudioDescriptorCstor, standard, encapsulationType, jDescriptor.get())); - env->CallBooleanMethod(jAudioDescriptors, gArrayListMethods.add, jAudioDescriptor.get()); + env->CallBooleanMethod(jAudioDescriptors.get(), gArrayListMethods.add, + jAudioDescriptor.get()); } // gains - jGains = env->NewObjectArray(nAudioPort->num_gains, - gAudioGainClass, NULL); - if (jGains == NULL) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + ScopedLocalRef<jobjectArray> jGains(env, + env->NewObjectArray(nAudioPort->num_gains, gAudioGainClass, + nullptr)); + if (jGains == nullptr) { + return AUDIO_JAVA_ERROR; } for (size_t j = 0; j < nAudioPort->num_gains; j++) { @@ -1511,88 +1471,71 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, nAudioPort->gains[j].min_ramp_ms, nAudioPort->gains[j].max_ramp_ms); if (jGain == NULL) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } - env->SetObjectArrayElement(jGains, j, jGain); + env->SetObjectArrayElement(jGains.get(), j, jGain); env->DeleteLocalRef(jGain); } - jHandle = env->NewObject(gAudioHandleClass, gAudioHandleCstor, - nAudioPort->id); - if (jHandle == NULL) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + ScopedLocalRef<jobject> jHandle(env, + env->NewObject(gAudioHandleClass, gAudioHandleCstor, + nAudioPort->id)); + if (jHandle == nullptr) { + return AUDIO_JAVA_ERROR; } - jDeviceName = env->NewStringUTF(nAudioPort->name); - + ScopedLocalRef<jstring> jDeviceName(env, env->NewStringUTF(nAudioPort->name)); if (nAudioPort->type == AUDIO_PORT_TYPE_DEVICE) { - ALOGV("convertAudioPortFromNative is a device %08x", nAudioPort->ext.device.type); - jstring jAddress = env->NewStringUTF(nAudioPort->ext.device.address); - jEncapsulationModes = - convertEncapsulationInfoFromNative(env, nAudioPort->ext.device.encapsulation_modes); - jEncapsulationMetadataTypes = + ScopedLocalRef<jintArray> jEncapsulationModes( + env, + convertEncapsulationInfoFromNative(env, + nAudioPort->ext.device.encapsulation_modes)); + ScopedLocalRef<jintArray> jEncapsulationMetadataTypes( + env, convertEncapsulationInfoFromNative(env, nAudioPort->ext.device - .encapsulation_metadata_types); - *jAudioPort = - env->NewObject(gAudioDevicePortClass, gAudioDevicePortCstor, jHandle, jDeviceName, - jAudioProfiles, jGains, nAudioPort->ext.device.type, jAddress, - jEncapsulationModes, jEncapsulationMetadataTypes, jAudioDescriptors); - env->DeleteLocalRef(jAddress); + .encapsulation_metadata_types)); + ALOGV("convertAudioPortFromNative is a device %08x", nAudioPort->ext.device.type); + ScopedLocalRef<jstring> jAddress(env, env->NewStringUTF(nAudioPort->ext.device.address)); + jAudioPort->reset(env->NewObject(gAudioDevicePortClass, gAudioDevicePortCstor, + jHandle.get(), jDeviceName.get(), jAudioProfiles.get(), + jGains.get(), nAudioPort->ext.device.type, jAddress.get(), + jEncapsulationModes.get(), + jEncapsulationMetadataTypes.get(), + jAudioDescriptors.get())); } else if (nAudioPort->type == AUDIO_PORT_TYPE_MIX) { ALOGV("convertAudioPortFromNative is a mix"); - *jAudioPort = env->NewObject(gAudioMixPortClass, gAudioMixPortCstor, jHandle, - nAudioPort->ext.mix.handle, nAudioPort->role, jDeviceName, - jAudioProfiles, jGains); + jAudioPort->reset(env->NewObject(gAudioMixPortClass, gAudioMixPortCstor, jHandle.get(), + nAudioPort->ext.mix.handle, nAudioPort->role, + jDeviceName.get(), jAudioProfiles.get(), jGains.get())); } else { ALOGE("convertAudioPortFromNative unknown nAudioPort type %d", nAudioPort->type); - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } if (*jAudioPort == NULL) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + return AUDIO_JAVA_ERROR; } - jStatus = convertAudioPortConfigFromNative(env, - *jAudioPort, - &jAudioPortConfig, + ScopedLocalRef<jobject> jAudioPortConfig(env, nullptr); + + if (int jStatus = convertAudioPortConfigFromNative(env, jAudioPort, &jAudioPortConfig, &nAudioPort->active_config); - if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + jStatus != AUDIO_JAVA_SUCCESS) { + return jStatus; } - env->SetObjectField(*jAudioPort, gAudioPortFields.mActiveConfig, jAudioPortConfig); + env->SetObjectField(jAudioPort->get(), gAudioPortFields.mActiveConfig, jAudioPortConfig.get()); + return AUDIO_JAVA_SUCCESS; +} -exit: - if (jDeviceName != NULL) { - env->DeleteLocalRef(jDeviceName); - } - if (jEncapsulationModes != NULL) { - env->DeleteLocalRef(jEncapsulationModes); - } - if (jEncapsulationMetadataTypes != NULL) { - env->DeleteLocalRef(jEncapsulationMetadataTypes); - } - if (jAudioProfiles != NULL) { - env->DeleteLocalRef(jAudioProfiles); - } - if (jGains != NULL) { - env->DeleteLocalRef(jGains); - } - if (jHandle != NULL) { - env->DeleteLocalRef(jHandle); - } - if (jAudioPortConfig != NULL) { - env->DeleteLocalRef(jAudioPortConfig); - } - if (jAudioDescriptors != nullptr) { - env->DeleteLocalRef(jAudioDescriptors); +static bool setGeneration(JNIEnv *env, jintArray jGeneration, unsigned int generation1) { + ScopedIntArrayRW nGeneration(env, jGeneration); + if (nGeneration.get() == nullptr) { + return false; + } else { + nGeneration[0] = generation1; + return true; } - - return jStatus; } static jint @@ -1603,23 +1546,22 @@ android_media_AudioSystem_listAudioPorts(JNIEnv *env, jobject clazz, if (jPorts == NULL) { ALOGE("listAudioPorts NULL AudioPort ArrayList"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (!env->IsInstanceOf(jPorts, gArrayListClass)) { ALOGE("listAudioPorts not an arraylist"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (jGeneration == NULL || env->GetArrayLength(jGeneration) != 1) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } status_t status; - unsigned int generation1; + unsigned int generation1 = 0; unsigned int generation; unsigned int numPorts; - jint *nGeneration; - struct audio_port_v7 *nPorts = nullptr; + std::vector<audio_port_v7> nPorts; int attempts = MAX_PORT_GENERATION_SYNC_ATTEMPTS; jint jStatus; @@ -1638,43 +1580,29 @@ android_media_AudioSystem_listAudioPorts(JNIEnv *env, jobject clazz, break; } if (numPorts == 0) { - jStatus = (jint)AUDIO_JAVA_SUCCESS; - goto exit; + return setGeneration(env, jGeneration, generation1) ? AUDIO_JAVA_SUCCESS + : AUDIO_JAVA_ERROR; } - nPorts = (struct audio_port_v7 *)realloc(nPorts, numPorts * sizeof(struct audio_port_v7)); + nPorts.resize(numPorts); status = AudioSystem::listAudioPorts(AUDIO_PORT_ROLE_NONE, AUDIO_PORT_TYPE_NONE, &numPorts, - nPorts, &generation); + &nPorts[0], &generation); ALOGV("listAudioPorts AudioSystem::listAudioPorts numPorts %d generation %d generation1 %d", numPorts, generation, generation1); } while (generation1 != generation && status == NO_ERROR); jStatus = nativeToJavaStatus(status); - if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; - } - - for (size_t i = 0; i < numPorts; i++) { - jobject jAudioPort = NULL; - jStatus = convertAudioPortFromNative(env, &jAudioPort, &nPorts[i]); - if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; - } - env->CallBooleanMethod(jPorts, gArrayListMethods.add, jAudioPort); - if (jAudioPort != NULL) { - env->DeleteLocalRef(jAudioPort); + if (jStatus == AUDIO_JAVA_SUCCESS) { + for (size_t i = 0; i < numPorts; i++) { + ScopedLocalRef<jobject> jAudioPort(env, nullptr); + jStatus = convertAudioPortFromNative(env, &jAudioPort, &nPorts[i]); + if (jStatus != AUDIO_JAVA_SUCCESS) break; + env->CallBooleanMethod(jPorts, gArrayListMethods.add, jAudioPort.get()); } } - -exit: - nGeneration = env->GetIntArrayElements(jGeneration, NULL); - if (nGeneration == NULL) { - jStatus = (jint)AUDIO_JAVA_ERROR; - } else { - nGeneration[0] = generation1; - env->ReleaseIntArrayElements(jGeneration, nGeneration, 0); + if (!setGeneration(env, jGeneration, generation1)) { + jStatus = AUDIO_JAVA_ERROR; } - free(nPorts); return jStatus; } @@ -1687,64 +1615,56 @@ android_media_AudioSystem_createAudioPatch(JNIEnv *env, jobject clazz, ALOGV("createAudioPatch"); if (jPatches == NULL || jSources == NULL || jSinks == NULL) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (env->GetArrayLength(jPatches) != 1) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } jint numSources = env->GetArrayLength(jSources); if (numSources == 0 || numSources > AUDIO_PATCH_PORTS_MAX) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } jint numSinks = env->GetArrayLength(jSinks); if (numSinks == 0 || numSinks > AUDIO_PATCH_PORTS_MAX) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } - audio_patch_handle_t handle = (audio_patch_handle_t)0; - jobject jPatch = env->GetObjectArrayElement(jPatches, 0); - jobject jPatchHandle = NULL; - if (jPatch != NULL) { - if (!env->IsInstanceOf(jPatch, gAudioPatchClass)) { - return (jint)AUDIO_JAVA_BAD_VALUE; + audio_patch_handle_t handle = static_cast<audio_patch_handle_t>(AUDIO_PATCH_HANDLE_NONE); + ScopedLocalRef<jobject> jPatch(env, env->GetObjectArrayElement(jPatches, 0)); + ScopedLocalRef<jobject> jPatchHandle(env, nullptr); + if (jPatch != nullptr) { + if (!env->IsInstanceOf(jPatch.get(), gAudioPatchClass)) { + return AUDIO_JAVA_BAD_VALUE; } - jPatchHandle = env->GetObjectField(jPatch, gAudioPatchFields.mHandle); - handle = (audio_patch_handle_t)env->GetIntField(jPatchHandle, gAudioHandleFields.mId); + jPatchHandle.reset(env->GetObjectField(jPatch.get(), gAudioPatchFields.mHandle)); + handle = static_cast<audio_patch_handle_t>( + env->GetIntField(jPatchHandle.get(), gAudioHandleFields.mId)); } struct audio_patch nPatch = { .id = handle }; - jobject jSource = NULL; - jobject jSink = NULL; - for (jint i = 0; i < numSources; i++) { - jSource = env->GetObjectArrayElement(jSources, i); - if (!env->IsInstanceOf(jSource, gAudioPortConfigClass)) { - jStatus = (jint)AUDIO_JAVA_BAD_VALUE; - goto exit; + ScopedLocalRef<jobject> jSource(env, env->GetObjectArrayElement(jSources, i)); + if (!env->IsInstanceOf(jSource.get(), gAudioPortConfigClass)) { + return AUDIO_JAVA_BAD_VALUE; } - jStatus = convertAudioPortConfigToNative(env, &nPatch.sources[i], jSource, false); - env->DeleteLocalRef(jSource); - jSource = NULL; + jStatus = convertAudioPortConfigToNative(env, &nPatch.sources[i], jSource.get(), false); if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + return jStatus; } nPatch.num_sources++; } for (jint i = 0; i < numSinks; i++) { - jSink = env->GetObjectArrayElement(jSinks, i); - if (!env->IsInstanceOf(jSink, gAudioPortConfigClass)) { - jStatus = (jint)AUDIO_JAVA_BAD_VALUE; - goto exit; + ScopedLocalRef<jobject> jSink(env, env->GetObjectArrayElement(jSinks, i)); + if (!env->IsInstanceOf(jSink.get(), gAudioPortConfigClass)) { + return AUDIO_JAVA_BAD_VALUE; } - jStatus = convertAudioPortConfigToNative(env, &nPatch.sinks[i], jSink, false); - env->DeleteLocalRef(jSink); - jSink = NULL; + jStatus = convertAudioPortConfigToNative(env, &nPatch.sinks[i], jSink.get(), false); if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + return jStatus; } nPatch.num_sinks++; } @@ -1755,38 +1675,22 @@ android_media_AudioSystem_createAudioPatch(JNIEnv *env, jobject clazz, jStatus = nativeToJavaStatus(status); if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + return jStatus; } - if (jPatchHandle == NULL) { - jPatchHandle = env->NewObject(gAudioHandleClass, gAudioHandleCstor, - handle); - if (jPatchHandle == NULL) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + if (jPatchHandle == nullptr) { + jPatchHandle.reset(env->NewObject(gAudioHandleClass, gAudioHandleCstor, handle)); + if (jPatchHandle == nullptr) { + return AUDIO_JAVA_ERROR; } - jPatch = env->NewObject(gAudioPatchClass, gAudioPatchCstor, jPatchHandle, jSources, jSinks); - if (jPatch == NULL) { - jStatus = (jint)AUDIO_JAVA_ERROR; - goto exit; + jPatch.reset(env->NewObject(gAudioPatchClass, gAudioPatchCstor, jPatchHandle.get(), + jSources, jSinks)); + if (jPatch == nullptr) { + return AUDIO_JAVA_ERROR; } - env->SetObjectArrayElement(jPatches, 0, jPatch); + env->SetObjectArrayElement(jPatches, 0, jPatch.get()); } else { - env->SetIntField(jPatchHandle, gAudioHandleFields.mId, handle); - } - -exit: - if (jPatchHandle != NULL) { - env->DeleteLocalRef(jPatchHandle); - } - if (jPatch != NULL) { - env->DeleteLocalRef(jPatch); - } - if (jSource != NULL) { - env->DeleteLocalRef(jSource); - } - if (jSink != NULL) { - env->DeleteLocalRef(jSink); + env->SetIntField(jPatchHandle.get(), gAudioHandleFields.mId, handle); } return jStatus; } @@ -1797,16 +1701,17 @@ android_media_AudioSystem_releaseAudioPatch(JNIEnv *env, jobject clazz, { ALOGV("releaseAudioPatch"); if (jPatch == NULL) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } - audio_patch_handle_t handle = (audio_patch_handle_t)0; + audio_patch_handle_t handle = static_cast<audio_patch_handle_t>(AUDIO_PATCH_HANDLE_NONE); jobject jPatchHandle = NULL; if (!env->IsInstanceOf(jPatch, gAudioPatchClass)) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } jPatchHandle = env->GetObjectField(jPatch, gAudioPatchFields.mHandle); - handle = (audio_patch_handle_t)env->GetIntField(jPatchHandle, gAudioHandleFields.mId); + handle = static_cast<audio_patch_handle_t>( + env->GetIntField(jPatchHandle, gAudioHandleFields.mId)); env->DeleteLocalRef(jPatchHandle); ALOGV("AudioSystem::releaseAudioPatch"); @@ -1823,28 +1728,22 @@ android_media_AudioSystem_listAudioPatches(JNIEnv *env, jobject clazz, ALOGV("listAudioPatches"); if (jPatches == NULL) { ALOGE("listAudioPatches NULL AudioPatch ArrayList"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (!env->IsInstanceOf(jPatches, gArrayListClass)) { ALOGE("listAudioPatches not an arraylist"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (jGeneration == NULL || env->GetArrayLength(jGeneration) != 1) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } status_t status; unsigned int generation1; unsigned int generation; unsigned int numPatches; - jint *nGeneration; - struct audio_patch *nPatches = NULL; - jobjectArray jSources = NULL; - jobject jSource = NULL; - jobjectArray jSinks = NULL; - jobject jSink = NULL; - jobject jPatch = NULL; + std::vector<audio_patch> nPatches; int attempts = MAX_PORT_GENERATION_SYNC_ATTEMPTS; jint jStatus; @@ -1865,15 +1764,13 @@ android_media_AudioSystem_listAudioPatches(JNIEnv *env, jobject clazz, break; } if (numPatches == 0) { - jStatus = (jint)AUDIO_JAVA_SUCCESS; - goto exit; + return setGeneration(env, jGeneration, generation1) ? AUDIO_JAVA_SUCCESS + : AUDIO_JAVA_ERROR; } - nPatches = (struct audio_patch *)realloc(nPatches, numPatches * sizeof(struct audio_patch)); + nPatches.resize(numPatches); - status = AudioSystem::listAudioPatches(&numPatches, - nPatches, - &generation); + status = AudioSystem::listAudioPatches(&numPatches, nPatches.data(), &generation); ALOGV("listAudioPatches AudioSystem::listAudioPatches numPatches %d generation %d generation1 %d", numPatches, generation, generation1); @@ -1881,15 +1778,21 @@ android_media_AudioSystem_listAudioPatches(JNIEnv *env, jobject clazz, jStatus = nativeToJavaStatus(status); if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + if (!setGeneration(env, jGeneration, generation1)) { + jStatus = AUDIO_JAVA_ERROR; + } + return jStatus; } for (size_t i = 0; i < numPatches; i++) { + ScopedLocalRef<jobject> jPatch(env, nullptr); + ScopedLocalRef<jobjectArray> jSources(env, nullptr); + ScopedLocalRef<jobjectArray> jSinks(env, nullptr); jobject patchHandle = env->NewObject(gAudioHandleClass, gAudioHandleCstor, nPatches[i].id); if (patchHandle == NULL) { - jStatus = AUDIO_JAVA_ERROR; - goto exit; + setGeneration(env, jGeneration, generation1); + return AUDIO_JAVA_ERROR; } ALOGV("listAudioPatches patch %zu num_sources %d num_sinks %d", i, nPatches[i].num_sources, nPatches[i].num_sinks); @@ -1897,96 +1800,66 @@ android_media_AudioSystem_listAudioPatches(JNIEnv *env, jobject clazz, env->SetIntField(patchHandle, gAudioHandleFields.mId, nPatches[i].id); // load sources - jSources = env->NewObjectArray(nPatches[i].num_sources, - gAudioPortConfigClass, NULL); - if (jSources == NULL) { - jStatus = AUDIO_JAVA_ERROR; - goto exit; + jSources.reset(env->NewObjectArray(nPatches[i].num_sources, gAudioPortConfigClass, NULL)); + if (jSources == nullptr) { + setGeneration(env, jGeneration, generation1); + return AUDIO_JAVA_ERROR; } for (size_t j = 0; j < nPatches[i].num_sources; j++) { - jStatus = convertAudioPortConfigFromNative(env, - NULL, - &jSource, - &nPatches[i].sources[j]); + ScopedLocalRef<jobject> jSource(env, nullptr); + ScopedLocalRef<jobject> jAudioPort(env, nullptr); + jStatus = convertAudioPortConfigFromNative(env, &jAudioPort, &jSource, + &nPatches[i].sources[j]); if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + if (!setGeneration(env, jGeneration, generation1)) { + jStatus = AUDIO_JAVA_ERROR; + } + return jStatus; } - env->SetObjectArrayElement(jSources, j, jSource); - env->DeleteLocalRef(jSource); - jSource = NULL; + env->SetObjectArrayElement(jSources.get(), j, jSource.get()); ALOGV("listAudioPatches patch %zu source %zu is a %s handle %d", i, j, nPatches[i].sources[j].type == AUDIO_PORT_TYPE_DEVICE ? "device" : "mix", nPatches[i].sources[j].id); } // load sinks - jSinks = env->NewObjectArray(nPatches[i].num_sinks, - gAudioPortConfigClass, NULL); - if (jSinks == NULL) { - jStatus = AUDIO_JAVA_ERROR; - goto exit; + jSinks.reset(env->NewObjectArray(nPatches[i].num_sinks, gAudioPortConfigClass, NULL)); + if (jSinks == nullptr) { + setGeneration(env, jGeneration, generation1); + return AUDIO_JAVA_ERROR; } for (size_t j = 0; j < nPatches[i].num_sinks; j++) { - jStatus = convertAudioPortConfigFromNative(env, - NULL, - &jSink, - &nPatches[i].sinks[j]); + ScopedLocalRef<jobject> jSink(env, nullptr); + ScopedLocalRef<jobject> jAudioPort(env, nullptr); + jStatus = convertAudioPortConfigFromNative(env, &jAudioPort, &jSink, + &nPatches[i].sinks[j]); if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + if (!setGeneration(env, jGeneration, generation1)) { + jStatus = AUDIO_JAVA_ERROR; + } + return jStatus; } - env->SetObjectArrayElement(jSinks, j, jSink); - env->DeleteLocalRef(jSink); - jSink = NULL; + env->SetObjectArrayElement(jSinks.get(), j, jSink.get()); ALOGV("listAudioPatches patch %zu sink %zu is a %s handle %d", i, j, nPatches[i].sinks[j].type == AUDIO_PORT_TYPE_DEVICE ? "device" : "mix", nPatches[i].sinks[j].id); } - jPatch = env->NewObject(gAudioPatchClass, gAudioPatchCstor, - patchHandle, jSources, jSinks); - env->DeleteLocalRef(jSources); - jSources = NULL; - env->DeleteLocalRef(jSinks); - jSinks = NULL; - if (jPatch == NULL) { - jStatus = AUDIO_JAVA_ERROR; - goto exit; + jPatch.reset(env->NewObject(gAudioPatchClass, gAudioPatchCstor, patchHandle, jSources.get(), + jSinks.get())); + if (jPatch == nullptr) { + setGeneration(env, jGeneration, generation1); + return AUDIO_JAVA_ERROR; } - env->CallBooleanMethod(jPatches, gArrayListMethods.add, jPatch); - env->DeleteLocalRef(jPatch); - jPatch = NULL; + env->CallBooleanMethod(jPatches, gArrayListMethods.add, jPatch.get()); } - -exit: - - nGeneration = env->GetIntArrayElements(jGeneration, NULL); - if (nGeneration == NULL) { + if (!setGeneration(env, jGeneration, generation1)) { jStatus = AUDIO_JAVA_ERROR; - } else { - nGeneration[0] = generation1; - env->ReleaseIntArrayElements(jGeneration, nGeneration, 0); - } - - if (jSources != NULL) { - env->DeleteLocalRef(jSources); - } - if (jSource != NULL) { - env->DeleteLocalRef(jSource); } - if (jSinks != NULL) { - env->DeleteLocalRef(jSinks); - } - if (jSink != NULL) { - env->DeleteLocalRef(jSink); - } - if (jPatch != NULL) { - env->DeleteLocalRef(jPatch); - } - free(nPatches); return jStatus; } @@ -2035,7 +1908,7 @@ android_media_AudioSystem_startAudioSource(JNIEnv *env, jobject clazz, } auto paa = JNIAudioAttributeHelper::makeUnique(); jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jAudioAttributes, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return jStatus; } audio_port_handle_t handle; @@ -2052,8 +1925,7 @@ static jint android_media_AudioSystem_stopAudioSource(JNIEnv *env, jobject clazz, jint handle) { ALOGV("stopAudioSource"); - status_t status = AudioSystem::stopAudioSource( - static_cast <audio_port_handle_t>(handle)); + status_t status = AudioSystem::stopAudioSource(static_cast<audio_port_handle_t>(handle)); ALOGV("AudioSystem::stopAudioSource() returned %d", status); return nativeToJavaStatus(status); } @@ -2085,7 +1957,7 @@ android_media_AudioSystem_eventHandlerFinalize(JNIEnv *env, jobject thiz) static jint android_media_AudioSystem_getAudioHwSyncForSession(JNIEnv *env, jobject thiz, jint sessionId) { - return (jint) AudioSystem::getAudioHwSyncForSession((audio_session_t) sessionId); + return AudioSystem::getAudioHwSyncForSession(static_cast<audio_session_t>(sessionId)); } static void @@ -2204,11 +2076,11 @@ static jint convertAudioMixToNative(JNIEnv *env, { nAudioMix->mMixType = env->GetIntField(jAudioMix, gAudioMixFields.mMixType); nAudioMix->mRouteFlags = env->GetIntField(jAudioMix, gAudioMixFields.mRouteFlags); - nAudioMix->mDeviceType = (audio_devices_t) - env->GetIntField(jAudioMix, gAudioMixFields.mDeviceType); + nAudioMix->mDeviceType = + static_cast<audio_devices_t>(env->GetIntField(jAudioMix, gAudioMixFields.mDeviceType)); - jstring jDeviceAddress = (jstring)env->GetObjectField(jAudioMix, - gAudioMixFields.mDeviceAddress); + jstring jDeviceAddress = + static_cast<jstring>(env->GetObjectField(jAudioMix, gAudioMixFields.mDeviceAddress)); const char *nDeviceAddress = env->GetStringUTFChars(jDeviceAddress, NULL); nAudioMix->mDeviceAddress = String8(nDeviceAddress); env->ReleaseStringUTFChars(jDeviceAddress, nDeviceAddress); @@ -2227,8 +2099,8 @@ static jint convertAudioMixToNative(JNIEnv *env, nAudioMix->mVoiceCommunicationCaptureAllowed = env->GetBooleanField(jRule, gAudioMixingRuleFields.mVoiceCommunicationCaptureAllowed); env->DeleteLocalRef(jRule); - jobjectArray jCriteria = (jobjectArray)env->CallObjectMethod(jRuleCriteria, - gArrayListMethods.toArray); + jobjectArray jCriteria = static_cast<jobjectArray>( + env->CallObjectMethod(jRuleCriteria, gArrayListMethods.toArray)); env->DeleteLocalRef(jRuleCriteria); jint numCriteria = env->GetArrayLength(jCriteria); @@ -2264,8 +2136,8 @@ static jint convertAudioMixToNative(JNIEnv *env, auto paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jAttributes, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { - return jStatus; + if (jStatus != AUDIO_JAVA_SUCCESS) { + return jStatus; } if (match_rule == RULE_MATCH_ATTRIBUTE_USAGE) { nCriterion.mValue.mUsage = paa->usage; @@ -2283,7 +2155,7 @@ static jint convertAudioMixToNative(JNIEnv *env, env->DeleteLocalRef(jCriteria); - return (jint)AUDIO_JAVA_SUCCESS; + return AUDIO_JAVA_SUCCESS; } static jint @@ -2293,34 +2165,29 @@ android_media_AudioSystem_registerPolicyMixes(JNIEnv *env, jobject clazz, ALOGV("registerPolicyMixes"); if (jMixesList == NULL) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (!env->IsInstanceOf(jMixesList, gArrayListClass)) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } - jobjectArray jMixes = (jobjectArray)env->CallObjectMethod(jMixesList, - gArrayListMethods.toArray); + jobjectArray jMixes = + static_cast<jobjectArray>(env->CallObjectMethod(jMixesList, gArrayListMethods.toArray)); jint numMixes = env->GetArrayLength(jMixes); if (numMixes > MAX_MIXES_PER_POLICY) { numMixes = MAX_MIXES_PER_POLICY; } status_t status; - jint jStatus; - jobject jAudioMix = NULL; Vector <AudioMix> mixes; for (jint i = 0; i < numMixes; i++) { - jAudioMix = env->GetObjectArrayElement(jMixes, i); - if (!env->IsInstanceOf(jAudioMix, gAudioMixClass)) { - jStatus = (jint)AUDIO_JAVA_BAD_VALUE; - goto exit; + ScopedLocalRef<jobject> jAudioMix(env, env->GetObjectArrayElement(jMixes, i)); + if (!env->IsInstanceOf(jAudioMix.get(), gAudioMixClass)) { + return AUDIO_JAVA_BAD_VALUE; } AudioMix mix; - jStatus = convertAudioMixToNative(env, &mix, jAudioMix); - env->DeleteLocalRef(jAudioMix); - jAudioMix = NULL; - if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; + if (jint jStatus = convertAudioMixToNative(env, &mix, jAudioMix.get()); + jStatus != AUDIO_JAVA_SUCCESS) { + return jStatus; } mixes.add(mix); } @@ -2329,16 +2196,7 @@ android_media_AudioSystem_registerPolicyMixes(JNIEnv *env, jobject clazz, status = AudioSystem::registerPolicyMixes(mixes, registration); ALOGV("AudioSystem::registerPolicyMixes() returned %d", status); - jStatus = nativeToJavaStatus(status); - if (jStatus != AUDIO_JAVA_SUCCESS) { - goto exit; - } - -exit: - if (jAudioMix != NULL) { - env->DeleteLocalRef(jAudioMix); - } - return jStatus; + return nativeToJavaStatus(status); } static jint android_media_AudioSystem_setUidDeviceAffinities(JNIEnv *env, jobject clazz, @@ -2348,14 +2206,14 @@ static jint android_media_AudioSystem_setUidDeviceAffinities(JNIEnv *env, jobjec if (results != NO_ERROR) { return results; } - status_t status = AudioSystem::setUidDeviceAffinities((uid_t) uid, deviceVector); - return (jint) nativeToJavaStatus(status); + status_t status = AudioSystem::setUidDeviceAffinities(uid, deviceVector); + return nativeToJavaStatus(status); } static jint android_media_AudioSystem_removeUidDeviceAffinities(JNIEnv *env, jobject clazz, jint uid) { - status_t status = AudioSystem::removeUidDeviceAffinities((uid_t) uid); - return (jint) nativeToJavaStatus(status); + status_t status = AudioSystem::removeUidDeviceAffinities(static_cast<uid_t>(uid)); + return nativeToJavaStatus(status); } static jint android_media_AudioSystem_setUserIdDeviceAffinities(JNIEnv *env, jobject clazz, @@ -2366,14 +2224,14 @@ static jint android_media_AudioSystem_setUserIdDeviceAffinities(JNIEnv *env, job if (results != NO_ERROR) { return results; } - status_t status = AudioSystem::setUserIdDeviceAffinities((int)userId, deviceVector); - return (jint)nativeToJavaStatus(status); + status_t status = AudioSystem::setUserIdDeviceAffinities(userId, deviceVector); + return nativeToJavaStatus(status); } static jint android_media_AudioSystem_removeUserIdDeviceAffinities(JNIEnv *env, jobject clazz, jint userId) { - status_t status = AudioSystem::removeUserIdDeviceAffinities((int)userId); - return (jint)nativeToJavaStatus(status); + status_t status = AudioSystem::removeUserIdDeviceAffinities(userId); + return nativeToJavaStatus(status); } static jint @@ -2386,19 +2244,18 @@ static jfloat android_media_AudioSystem_getStreamVolumeDB(JNIEnv *env, jobject thiz, jint stream, jint index, jint device) { - return (jfloat)AudioSystem::getStreamVolumeDB((audio_stream_type_t)stream, - (int)index, - (audio_devices_t)device); + return AudioSystem::getStreamVolumeDB(static_cast<audio_stream_type_t>(stream), index, + static_cast<audio_devices_t>(device)); } static jint android_media_AudioSystem_getOffloadSupport(JNIEnv *env, jobject thiz, jint encoding, jint sampleRate, jint channelMask, jint channelIndexMask, jint streamType) { audio_offload_info_t format = AUDIO_INFO_INITIALIZER; - format.format = (audio_format_t) audioFormatToNative(encoding); - format.sample_rate = (uint32_t) sampleRate; + format.format = static_cast<audio_format_t>(audioFormatToNative(encoding)); + format.sample_rate = sampleRate; format.channel_mask = nativeChannelMaskFromJavaChannelMasks(channelMask, channelIndexMask); - format.stream_type = (audio_stream_type_t) streamType; + format.stream_type = static_cast<audio_stream_type_t>(streamType); format.has_video = false; format.is_streaming = false; // offload duration unknown at this point: @@ -2415,11 +2272,11 @@ android_media_AudioSystem_getMicrophones(JNIEnv *env, jobject thiz, jobject jMic if (jMicrophonesInfo == NULL) { ALOGE("jMicrophonesInfo NULL MicrophoneInfo ArrayList"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (!env->IsInstanceOf(jMicrophonesInfo, gArrayListClass)) { ALOGE("getMicrophones not an arraylist"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } jint jStatus; @@ -2431,7 +2288,7 @@ android_media_AudioSystem_getMicrophones(JNIEnv *env, jobject thiz, jobject jMic return jStatus; } if (microphones.size() == 0) { - jStatus = (jint)AUDIO_JAVA_SUCCESS; + jStatus = AUDIO_JAVA_SUCCESS; return jStatus; } for (size_t i = 0; i < microphones.size(); i++) { @@ -2453,7 +2310,7 @@ static jint android_media_AudioSystem_getHwOffloadFormatsSupportedForBluetoothMe jint jStatus = AUDIO_JAVA_SUCCESS; if (!env->IsInstanceOf(jEncodingFormatList, gArrayListClass)) { ALOGE("%s: jEncodingFormatList not an ArrayList", __FUNCTION__); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } std::vector<audio_format_t> encodingFormats; status_t status = @@ -2572,12 +2429,10 @@ static jint android_media_AudioSystem_setSurroundFormatEnabled(JNIEnv *env, jobject thiz, jint audioFormat, jboolean enabled) { - status_t status = AudioSystem::setSurroundFormatEnabled(audioFormatToNative(audioFormat), - (bool)enabled); - if (status != NO_ERROR) { - ALOGE_IF(status != NO_ERROR, "AudioSystem::setSurroundFormatEnabled error %d", status); - } - return (jint)nativeToJavaStatus(status); + status_t status = + AudioSystem::setSurroundFormatEnabled(audioFormatToNative(audioFormat), enabled); + ALOGE_IF(status != NO_ERROR, "AudioSystem::setSurroundFormatEnabled error %d", status); + return nativeToJavaStatus(status); } static jint android_media_AudioSystem_getMaxChannelCount(JNIEnv *env, jobject thiz) { @@ -2618,7 +2473,7 @@ static jint android_media_AudioSystem_setAssistantServicesUids(JNIEnv *env, jobj status_t status = AudioSystem::setAssistantServicesUids(nativeUidsVector); - return (jint)nativeToJavaStatus(status); + return nativeToJavaStatus(status); } static jint android_media_AudioSystem_setActiveAssistantServicesUids(JNIEnv *env, jobject thiz, @@ -2627,7 +2482,7 @@ static jint android_media_AudioSystem_setActiveAssistantServicesUids(JNIEnv *env status_t status = AudioSystem::setActiveAssistantServicesUids(nativeActiveUidsVector); - return (jint)nativeToJavaStatus(status); + return nativeToJavaStatus(status); } static jint @@ -2635,12 +2490,12 @@ android_media_AudioSystem_setA11yServicesUids(JNIEnv *env, jobject thiz, jintArr std::vector<uid_t> nativeUidsVector = convertJIntArrayToUidVector(env, uids); status_t status = AudioSystem::setA11yServicesUids(nativeUidsVector); - return (jint)nativeToJavaStatus(status); + return nativeToJavaStatus(status); } static jint android_media_AudioSystem_setCurrentImeUid(JNIEnv *env, jobject thiz, jint uid) { status_t status = AudioSystem::setCurrentImeUid(uid); - return (jint)nativeToJavaStatus(status); + return nativeToJavaStatus(status); } static jboolean @@ -2658,7 +2513,7 @@ static jint android_media_AudioSystem_setSupportedSystemUsages(JNIEnv *env, jobj std::vector<audio_usage_t> nativeSystemUsagesVector; if (systemUsages == nullptr) { - return (jint) AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } int *nativeSystemUsages = nullptr; @@ -2675,7 +2530,7 @@ static jint android_media_AudioSystem_setSupportedSystemUsages(JNIEnv *env, jobj } status_t status = AudioSystem::setSupportedSystemUsages(nativeSystemUsagesVector); - return (jint)nativeToJavaStatus(status); + return nativeToJavaStatus(status); } static jint @@ -2686,16 +2541,16 @@ android_media_AudioSystem_setAllowedCapturePolicy(JNIEnv *env, jobject thiz, jin static jint android_media_AudioSystem_setRttEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { - return (jint) check_AudioSystem_Command(AudioSystem::setRttEnabled(enabled)); + return check_AudioSystem_Command(AudioSystem::setRttEnabled(enabled)); } static jint android_media_AudioSystem_setAudioHalPids(JNIEnv *env, jobject clazz, jintArray jPids) { if (jPids == NULL) { - return (jint) AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } - pid_t *nPidsArray = (pid_t *) env->GetIntArrayElements(jPids, NULL); + pid_t *nPidsArray = reinterpret_cast<pid_t *>(env->GetIntArrayElements(jPids, nullptr)); std::vector<pid_t> nPids(nPidsArray, nPidsArray + env->GetArrayLength(jPids)); status_t status = AudioSystem::setAudioHalPids(nPids); env->ReleaseIntArrayElements(jPids, nPidsArray, 0); @@ -2719,9 +2574,9 @@ static jint android_media_AudioSystem_setDevicesRoleForStrategy(JNIEnv *env, job return results; } int status = check_AudioSystem_Command( - AudioSystem::setDevicesRoleForStrategy((product_strategy_t)strategy, - (device_role_t)role, nDevices)); - return (jint) status; + AudioSystem::setDevicesRoleForStrategy(static_cast<product_strategy_t>(strategy), + static_cast<device_role_t>(role), nDevices)); + return status; } static jint android_media_AudioSystem_removeDevicesRoleForStrategy(JNIEnv *env, jobject thiz, @@ -2734,8 +2589,8 @@ static jint android_media_AudioSystem_removeDevicesRoleForStrategy(JNIEnv *env, return results; } int status = check_AudioSystem_Command( - AudioSystem::removeDevicesRoleForStrategy((product_strategy_t)strategy, - (device_role_t)role, nDevices)); + AudioSystem::removeDevicesRoleForStrategy(static_cast<product_strategy_t>(strategy), + static_cast<device_role_t>(role), nDevices)); return (jint)status; } @@ -2753,10 +2608,10 @@ static jint android_media_AudioSystem_getDevicesForRoleAndStrategy(JNIEnv *env, jobject jDevices) { AudioDeviceTypeAddrVector nDevices; status_t status = check_AudioSystem_Command( - AudioSystem::getDevicesForRoleAndStrategy((product_strategy_t)strategy, - (device_role_t)role, nDevices)); + AudioSystem::getDevicesForRoleAndStrategy(static_cast<product_strategy_t>(strategy), + static_cast<device_role_t>(role), nDevices)); if (status != NO_ERROR) { - return (jint) status; + return status; } for (const auto &device : nDevices) { jobject jAudioDeviceAttributes = NULL; @@ -2779,9 +2634,10 @@ static jint android_media_AudioSystem_setDevicesRoleForCapturePreset( return results; } int status = check_AudioSystem_Command( - AudioSystem::setDevicesRoleForCapturePreset((audio_source_t)capturePreset, - (device_role_t)role, nDevices)); - return (jint)status; + AudioSystem::setDevicesRoleForCapturePreset(static_cast<audio_source_t>(capturePreset), + static_cast<device_role_t>(role), + nDevices)); + return status; } static jint android_media_AudioSystem_addDevicesRoleForCapturePreset( @@ -2793,9 +2649,10 @@ static jint android_media_AudioSystem_addDevicesRoleForCapturePreset( return results; } int status = check_AudioSystem_Command( - AudioSystem::addDevicesRoleForCapturePreset((audio_source_t)capturePreset, - (device_role_t)role, nDevices)); - return (jint)status; + AudioSystem::addDevicesRoleForCapturePreset(static_cast<audio_source_t>(capturePreset), + static_cast<device_role_t>(role), + nDevices)); + return status; } static jint android_media_AudioSystem_removeDevicesRoleForCapturePreset( @@ -2807,17 +2664,20 @@ static jint android_media_AudioSystem_removeDevicesRoleForCapturePreset( return results; } int status = check_AudioSystem_Command( - AudioSystem::removeDevicesRoleForCapturePreset((audio_source_t)capturePreset, - (device_role_t)role, nDevices)); - return (jint)status; + AudioSystem::removeDevicesRoleForCapturePreset(static_cast<audio_source_t>( + capturePreset), + static_cast<device_role_t>(role), + nDevices)); + return status; } static jint android_media_AudioSystem_clearDevicesRoleForCapturePreset(JNIEnv *env, jobject thiz, jint capturePreset, jint role) { - return (jint)check_AudioSystem_Command( - AudioSystem::clearDevicesRoleForCapturePreset((audio_source_t)capturePreset, - (device_role_t)role)); + return static_cast<jint>(check_AudioSystem_Command( + AudioSystem::clearDevicesRoleForCapturePreset(static_cast<audio_source_t>( + capturePreset), + static_cast<device_role_t>(role)))); } static jint android_media_AudioSystem_getDevicesForRoleAndCapturePreset(JNIEnv *env, jobject thiz, @@ -2826,10 +2686,12 @@ static jint android_media_AudioSystem_getDevicesForRoleAndCapturePreset(JNIEnv * jobject jDevices) { AudioDeviceTypeAddrVector nDevices; status_t status = check_AudioSystem_Command( - AudioSystem::getDevicesForRoleAndCapturePreset((audio_source_t)capturePreset, - (device_role_t)role, nDevices)); + AudioSystem::getDevicesForRoleAndCapturePreset(static_cast<audio_source_t>( + capturePreset), + static_cast<device_role_t>(role), + nDevices)); if (status != NO_ERROR) { - return (jint)status; + return status; } for (const auto &device : nDevices) { jobject jAudioDeviceAttributes = NULL; @@ -2854,12 +2716,12 @@ static jint android_media_AudioSystem_getDevicesForAttributes(JNIEnv *env, jobje // components call this method often if (jDeviceArray == nullptr || maxResultSize == 0) { ALOGE("%s invalid array to store AudioDeviceAttributes", __FUNCTION__); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); - if (jStatus != (jint) AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return jStatus; } @@ -2888,7 +2750,7 @@ static jint android_media_AudioSystem_getDevicesForAttributes(JNIEnv *env, jobje static jint android_media_AudioSystem_setVibratorInfos(JNIEnv *env, jobject thiz, jobject jVibrators) { if (!env->IsInstanceOf(jVibrators, gListClass)) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } const jint size = env->CallIntMethod(jVibrators, gListMethods.size); std::vector<media::AudioVibratorInfo> vibratorInfos; @@ -2896,7 +2758,7 @@ static jint android_media_AudioSystem_setVibratorInfos(JNIEnv *env, jobject thiz ScopedLocalRef<jobject> jVibrator(env, env->CallObjectMethod(jVibrators, gListMethods.get, i)); if (!env->IsInstanceOf(jVibrator.get(), gVibratorClass)) { - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } media::AudioVibratorInfo vibratorInfo; vibratorInfo.id = env->CallIntMethod(jVibrator.get(), gVibratorMethods.getId); @@ -2907,7 +2769,7 @@ static jint android_media_AudioSystem_setVibratorInfos(JNIEnv *env, jobject thiz env->CallFloatMethod(jVibrator.get(), gVibratorMethods.getMaxAmplitude); vibratorInfos.push_back(vibratorInfo); } - return (jint)check_AudioSystem_Command(AudioSystem::setVibratorInfos(vibratorInfos)); + return check_AudioSystem_Command(AudioSystem::setVibratorInfos(vibratorInfos)); } static jobject android_media_AudioSystem_getSpatializer(JNIEnv *env, jobject thiz, @@ -2929,8 +2791,8 @@ static jboolean android_media_AudioSystem_canBeSpatialized(JNIEnv *env, jobject jobjectArray jDeviceArray) { JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { - return false; + if (jStatus != AUDIO_JAVA_SUCCESS) { + return false; } AudioDeviceTypeAddrVector nDevices; @@ -2943,7 +2805,7 @@ static jboolean android_media_AudioSystem_canBeSpatialized(JNIEnv *env, jobject return false; } jStatus = createAudioDeviceTypeAddrFromJava(env, &device, jDevice); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return false; } nDevices.push_back(device); @@ -3000,7 +2862,7 @@ static jint android_media_AudioSystem_getDirectPlaybackSupport(JNIEnv *env, jobj jobject jFormat, jobject jaa) { JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return DIRECT_NOT_SUPPORTED; } @@ -3023,20 +2885,20 @@ static jint android_media_AudioSystem_getDirectProfilesForAttributes(JNIEnv *env if (jAudioAttributes == nullptr) { ALOGE("jAudioAttributes is NULL"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (jAudioProfilesList == nullptr) { ALOGE("jAudioProfilesList is NULL"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } if (!env->IsInstanceOf(jAudioProfilesList, gArrayListClass)) { ALOGE("jAudioProfilesList not an ArrayList"); - return (jint)AUDIO_JAVA_BAD_VALUE; + return AUDIO_JAVA_BAD_VALUE; } JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique(); jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jAudioAttributes, paa.get()); - if (jStatus != (jint)AUDIO_JAVA_SUCCESS) { + if (jStatus != AUDIO_JAVA_SUCCESS) { return jStatus; } @@ -3049,7 +2911,7 @@ static jint android_media_AudioSystem_getDirectProfilesForAttributes(JNIEnv *env } for (const auto &audioProfile : audioProfiles) { - jobject jAudioProfile; + ScopedLocalRef<jobject> jAudioProfile(env); jint jConvertProfileStatus = convertAudioProfileFromNative( env, &jAudioProfile, &audioProfile, false); if (jConvertProfileStatus == AUDIO_JAVA_BAD_VALUE) { @@ -3059,8 +2921,7 @@ static jint android_media_AudioSystem_getDirectProfilesForAttributes(JNIEnv *env if (jConvertProfileStatus != AUDIO_JAVA_SUCCESS) { return jConvertProfileStatus; } - env->CallBooleanMethod(jAudioProfilesList, gArrayListMethods.add, jAudioProfile); - env->DeleteLocalRef(jAudioProfile); + env->CallBooleanMethod(jAudioProfilesList, gArrayListMethods.add, jAudioProfile.get()); } return jStatus; } @@ -3212,8 +3073,7 @@ static jboolean android_media_AudioSystem_supportsBluetoothVariableLatency(JNIEn static int android_media_AudioSystem_setBluetoothVariableLatencyEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { - return (jint)check_AudioSystem_Command( - AudioSystem::setBluetoothVariableLatencyEnabled(enabled)); + return check_AudioSystem_Command(AudioSystem::setBluetoothVariableLatencyEnabled(enabled)); } static jboolean android_media_AudioSystem_isBluetoothVariableLatencyEnabled(JNIEnv *env, @@ -3227,191 +3087,182 @@ static jboolean android_media_AudioSystem_isBluetoothVariableLatencyEnabled(JNIE // ---------------------------------------------------------------------------- -static const JNINativeMethod gMethods[] = - {{"setParameters", "(Ljava/lang/String;)I", - (void *)android_media_AudioSystem_setParameters}, - {"getParameters", "(Ljava/lang/String;)Ljava/lang/String;", - (void *)android_media_AudioSystem_getParameters}, - {"muteMicrophone", "(Z)I", (void *)android_media_AudioSystem_muteMicrophone}, - {"isMicrophoneMuted", "()Z", (void *)android_media_AudioSystem_isMicrophoneMuted}, - {"isStreamActive", "(II)Z", (void *)android_media_AudioSystem_isStreamActive}, - {"isStreamActiveRemotely", "(II)Z", - (void *)android_media_AudioSystem_isStreamActiveRemotely}, - {"isSourceActive", "(I)Z", (void *)android_media_AudioSystem_isSourceActive}, - {"newAudioSessionId", "()I", (void *)android_media_AudioSystem_newAudioSessionId}, - {"newAudioPlayerId", "()I", (void *)android_media_AudioSystem_newAudioPlayerId}, - {"newAudioRecorderId", "()I", (void *)android_media_AudioSystem_newAudioRecorderId}, - {"setDeviceConnectionState", "(ILandroid/os/Parcel;I)I", - (void *)android_media_AudioSystem_setDeviceConnectionState}, - {"getDeviceConnectionState", "(ILjava/lang/String;)I", - (void *)android_media_AudioSystem_getDeviceConnectionState}, - {"handleDeviceConfigChange", "(ILjava/lang/String;Ljava/lang/String;I)I", - (void *)android_media_AudioSystem_handleDeviceConfigChange}, - {"setPhoneState", "(II)I", (void *)android_media_AudioSystem_setPhoneState}, - {"setForceUse", "(II)I", (void *)android_media_AudioSystem_setForceUse}, - {"getForceUse", "(I)I", (void *)android_media_AudioSystem_getForceUse}, - {"initStreamVolume", "(III)I", (void *)android_media_AudioSystem_initStreamVolume}, - {"setStreamVolumeIndex", "(III)I", (void *)android_media_AudioSystem_setStreamVolumeIndex}, - {"getStreamVolumeIndex", "(II)I", (void *)android_media_AudioSystem_getStreamVolumeIndex}, - {"setVolumeIndexForAttributes", "(Landroid/media/AudioAttributes;II)I", - (void *)android_media_AudioSystem_setVolumeIndexForAttributes}, - {"getVolumeIndexForAttributes", "(Landroid/media/AudioAttributes;I)I", - (void *)android_media_AudioSystem_getVolumeIndexForAttributes}, - {"getMinVolumeIndexForAttributes", "(Landroid/media/AudioAttributes;)I", - (void *)android_media_AudioSystem_getMinVolumeIndexForAttributes}, - {"getMaxVolumeIndexForAttributes", "(Landroid/media/AudioAttributes;)I", - (void *)android_media_AudioSystem_getMaxVolumeIndexForAttributes}, - {"setMasterVolume", "(F)I", (void *)android_media_AudioSystem_setMasterVolume}, - {"getMasterVolume", "()F", (void *)android_media_AudioSystem_getMasterVolume}, - {"setMasterMute", "(Z)I", (void *)android_media_AudioSystem_setMasterMute}, - {"getMasterMute", "()Z", (void *)android_media_AudioSystem_getMasterMute}, - {"setMasterMono", "(Z)I", (void *)android_media_AudioSystem_setMasterMono}, - {"getMasterMono", "()Z", (void *)android_media_AudioSystem_getMasterMono}, - {"setMasterBalance", "(F)I", (void *)android_media_AudioSystem_setMasterBalance}, - {"getMasterBalance", "()F", (void *)android_media_AudioSystem_getMasterBalance}, - {"getPrimaryOutputSamplingRate", "()I", - (void *)android_media_AudioSystem_getPrimaryOutputSamplingRate}, - {"getPrimaryOutputFrameCount", "()I", - (void *)android_media_AudioSystem_getPrimaryOutputFrameCount}, - {"getOutputLatency", "(I)I", (void *)android_media_AudioSystem_getOutputLatency}, - {"setLowRamDevice", "(ZJ)I", (void *)android_media_AudioSystem_setLowRamDevice}, - {"checkAudioFlinger", "()I", (void *)android_media_AudioSystem_checkAudioFlinger}, - {"setAudioFlingerBinder", "(Landroid/os/IBinder;)V", - (void *)android_media_AudioSystem_setAudioFlingerBinder}, - {"listAudioPorts", "(Ljava/util/ArrayList;[I)I", - (void *)android_media_AudioSystem_listAudioPorts}, - {"createAudioPatch", - "([Landroid/media/AudioPatch;[Landroid/media/AudioPortConfig;[Landroid/media/" - "AudioPortConfig;)I", - (void *)android_media_AudioSystem_createAudioPatch}, - {"releaseAudioPatch", "(Landroid/media/AudioPatch;)I", - (void *)android_media_AudioSystem_releaseAudioPatch}, - {"listAudioPatches", "(Ljava/util/ArrayList;[I)I", - (void *)android_media_AudioSystem_listAudioPatches}, - {"setAudioPortConfig", "(Landroid/media/AudioPortConfig;)I", - (void *)android_media_AudioSystem_setAudioPortConfig}, - {"startAudioSource", "(Landroid/media/AudioPortConfig;Landroid/media/AudioAttributes;)I", - (void *)android_media_AudioSystem_startAudioSource}, - {"stopAudioSource", "(I)I", (void *)android_media_AudioSystem_stopAudioSource}, - {"getAudioHwSyncForSession", "(I)I", - (void *)android_media_AudioSystem_getAudioHwSyncForSession}, - {"registerPolicyMixes", "(Ljava/util/ArrayList;Z)I", - (void *)android_media_AudioSystem_registerPolicyMixes}, - {"setUidDeviceAffinities", "(I[I[Ljava/lang/String;)I", - (void *)android_media_AudioSystem_setUidDeviceAffinities}, - {"removeUidDeviceAffinities", "(I)I", - (void *)android_media_AudioSystem_removeUidDeviceAffinities}, - {"native_register_dynamic_policy_callback", "()V", - (void *)android_media_AudioSystem_registerDynPolicyCallback}, - {"native_register_recording_callback", "()V", - (void *)android_media_AudioSystem_registerRecordingCallback}, - {"native_register_routing_callback", "()V", - (void *)android_media_AudioSystem_registerRoutingCallback}, - {"native_register_vol_range_init_req_callback", "()V", - (void *)android_media_AudioSystem_registerVolRangeInitReqCallback}, - {"systemReady", "()I", (void *)android_media_AudioSystem_systemReady}, - {"getStreamVolumeDB", "(III)F", (void *)android_media_AudioSystem_getStreamVolumeDB}, - {"native_get_offload_support", "(IIIII)I", - (void *)android_media_AudioSystem_getOffloadSupport}, - {"getMicrophones", "(Ljava/util/ArrayList;)I", - (void *)android_media_AudioSystem_getMicrophones}, - {"getSurroundFormats", "(Ljava/util/Map;)I", - (void *)android_media_AudioSystem_getSurroundFormats}, - {"getReportedSurroundFormats", "(Ljava/util/ArrayList;)I", - (void *)android_media_AudioSystem_getReportedSurroundFormats}, - {"setSurroundFormatEnabled", "(IZ)I", - (void *)android_media_AudioSystem_setSurroundFormatEnabled}, - {"setAssistantServicesUids", "([I)I", - (void *)android_media_AudioSystem_setAssistantServicesUids}, - {"setActiveAssistantServicesUids", "([I)I", - (void *)android_media_AudioSystem_setActiveAssistantServicesUids}, - {"setA11yServicesUids", "([I)I", (void *)android_media_AudioSystem_setA11yServicesUids}, - {"isHapticPlaybackSupported", "()Z", - (void *)android_media_AudioSystem_isHapticPlaybackSupported}, - {"isUltrasoundSupported", "()Z", (void *)android_media_AudioSystem_isUltrasoundSupported}, - {"getHwOffloadFormatsSupportedForBluetoothMedia", "(ILjava/util/ArrayList;)I", - (void *)android_media_AudioSystem_getHwOffloadFormatsSupportedForBluetoothMedia}, - {"setSupportedSystemUsages", "([I)I", - (void *)android_media_AudioSystem_setSupportedSystemUsages}, - {"setAllowedCapturePolicy", "(II)I", - (void *)android_media_AudioSystem_setAllowedCapturePolicy}, - {"setRttEnabled", "(Z)I", (void *)android_media_AudioSystem_setRttEnabled}, - {"setAudioHalPids", "([I)I", (void *)android_media_AudioSystem_setAudioHalPids}, - {"isCallScreeningModeSupported", "()Z", - (void *)android_media_AudioSystem_isCallScreeningModeSupported}, - {"setDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I", - (void *)android_media_AudioSystem_setDevicesRoleForStrategy}, - {"removeDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I", - (void *)android_media_AudioSystem_removeDevicesRoleForStrategy}, - {"clearDevicesRoleForStrategy", "(II)I", - (void *)android_media_AudioSystem_clearDevicesRoleForStrategy}, - {"getDevicesForRoleAndStrategy", "(IILjava/util/List;)I", - (void *)android_media_AudioSystem_getDevicesForRoleAndStrategy}, - {"setDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I", - (void *)android_media_AudioSystem_setDevicesRoleForCapturePreset}, - {"addDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I", - (void *)android_media_AudioSystem_addDevicesRoleForCapturePreset}, - {"removeDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I", - (void *)android_media_AudioSystem_removeDevicesRoleForCapturePreset}, - {"clearDevicesRoleForCapturePreset", "(II)I", - (void *)android_media_AudioSystem_clearDevicesRoleForCapturePreset}, - {"getDevicesForRoleAndCapturePreset", "(IILjava/util/List;)I", - (void *)android_media_AudioSystem_getDevicesForRoleAndCapturePreset}, - {"getDevicesForAttributes", - "(Landroid/media/AudioAttributes;[Landroid/media/AudioDeviceAttributes;Z)I", - (void *)android_media_AudioSystem_getDevicesForAttributes}, - {"setUserIdDeviceAffinities", "(I[I[Ljava/lang/String;)I", - (void *)android_media_AudioSystem_setUserIdDeviceAffinities}, - {"removeUserIdDeviceAffinities", "(I)I", - (void *)android_media_AudioSystem_removeUserIdDeviceAffinities}, - {"setCurrentImeUid", "(I)I", (void *)android_media_AudioSystem_setCurrentImeUid}, - {"setVibratorInfos", "(Ljava/util/List;)I", - (void *)android_media_AudioSystem_setVibratorInfos}, - {"nativeGetSpatializer", - "(Landroid/media/INativeSpatializerCallback;)Landroid/os/IBinder;", - (void *)android_media_AudioSystem_getSpatializer}, - {"canBeSpatialized", - "(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;" - "[Landroid/media/AudioDeviceAttributes;)Z", - (void *)android_media_AudioSystem_canBeSpatialized}, - {"nativeGetSoundDose", "(Landroid/media/ISoundDoseCallback;)Landroid/os/IBinder;", - (void *)android_media_AudioSystem_nativeGetSoundDose}, - {"getDirectPlaybackSupport", - "(Landroid/media/AudioFormat;Landroid/media/AudioAttributes;)I", - (void *)android_media_AudioSystem_getDirectPlaybackSupport}, - {"getDirectProfilesForAttributes", - "(Landroid/media/AudioAttributes;Ljava/util/ArrayList;)I", - (void *)android_media_AudioSystem_getDirectProfilesForAttributes}, - {"getSupportedMixerAttributes", "(ILjava/util/List;)I", - (void *)android_media_AudioSystem_getSupportedMixerAttributes}, - {"setPreferredMixerAttributes", - "(Landroid/media/AudioAttributes;IILandroid/media/AudioMixerAttributes;)I", - (void *)android_media_AudioSystem_setPreferredMixerAttributes}, - {"getPreferredMixerAttributes", "(Landroid/media/AudioAttributes;ILjava/util/List;)I", - (void *)android_media_AudioSystem_getPreferredMixerAttributes}, - {"clearPreferredMixerAttributes", "(Landroid/media/AudioAttributes;II)I", - (void *)android_media_AudioSystem_clearPreferredMixerAttributes}, - {"supportsBluetoothVariableLatency", "()Z", - (void *)android_media_AudioSystem_supportsBluetoothVariableLatency}, - {"setBluetoothVariableLatencyEnabled", "(Z)I", - (void *)android_media_AudioSystem_setBluetoothVariableLatencyEnabled}, - {"isBluetoothVariableLatencyEnabled", "()Z", - (void *)android_media_AudioSystem_isBluetoothVariableLatencyEnabled}}; - -static const JNINativeMethod gEventHandlerMethods[] = { - {"native_setup", - "(Ljava/lang/Object;)V", - (void *)android_media_AudioSystem_eventHandlerSetup}, - {"native_finalize", - "()V", - (void *)android_media_AudioSystem_eventHandlerFinalize}, -}; +#define MAKE_AUDIO_SYSTEM_METHOD(x) \ + MAKE_JNI_NATIVE_METHOD_AUTOSIG(#x, android_media_AudioSystem_##x) -static const JNINativeMethod gFrameworkCapabilities[] = { - {"native_getMaxChannelCount", "()I", (void *)android_media_AudioSystem_getMaxChannelCount}, - {"native_getMaxSampleRate", "()I", (void *)android_media_AudioSystem_getMaxSampleRate}, - {"native_getMinSampleRate", "()I", (void *)android_media_AudioSystem_getMinSampleRate}, -}; +static const JNINativeMethod gMethods[] = + {MAKE_AUDIO_SYSTEM_METHOD(setParameters), + MAKE_AUDIO_SYSTEM_METHOD(getParameters), + MAKE_AUDIO_SYSTEM_METHOD(muteMicrophone), + MAKE_AUDIO_SYSTEM_METHOD(isMicrophoneMuted), + MAKE_AUDIO_SYSTEM_METHOD(isStreamActive), + MAKE_AUDIO_SYSTEM_METHOD(isStreamActiveRemotely), + MAKE_AUDIO_SYSTEM_METHOD(isSourceActive), + MAKE_AUDIO_SYSTEM_METHOD(newAudioSessionId), + MAKE_AUDIO_SYSTEM_METHOD(newAudioPlayerId), + MAKE_AUDIO_SYSTEM_METHOD(newAudioRecorderId), + MAKE_JNI_NATIVE_METHOD("setDeviceConnectionState", "(ILandroid/os/Parcel;I)I", + android_media_AudioSystem_setDeviceConnectionState), + MAKE_AUDIO_SYSTEM_METHOD(getDeviceConnectionState), + MAKE_AUDIO_SYSTEM_METHOD(handleDeviceConfigChange), + MAKE_AUDIO_SYSTEM_METHOD(setPhoneState), + MAKE_AUDIO_SYSTEM_METHOD(setForceUse), + MAKE_AUDIO_SYSTEM_METHOD(getForceUse), + MAKE_AUDIO_SYSTEM_METHOD(initStreamVolume), + MAKE_AUDIO_SYSTEM_METHOD(setStreamVolumeIndex), + MAKE_AUDIO_SYSTEM_METHOD(getStreamVolumeIndex), + MAKE_JNI_NATIVE_METHOD("setVolumeIndexForAttributes", + "(Landroid/media/AudioAttributes;II)I", + android_media_AudioSystem_setVolumeIndexForAttributes), + MAKE_JNI_NATIVE_METHOD("getVolumeIndexForAttributes", + "(Landroid/media/AudioAttributes;I)I", + android_media_AudioSystem_getVolumeIndexForAttributes), + MAKE_JNI_NATIVE_METHOD("getMinVolumeIndexForAttributes", + "(Landroid/media/AudioAttributes;)I", + android_media_AudioSystem_getMinVolumeIndexForAttributes), + MAKE_JNI_NATIVE_METHOD("getMaxVolumeIndexForAttributes", + "(Landroid/media/AudioAttributes;)I", + android_media_AudioSystem_getMaxVolumeIndexForAttributes), + MAKE_AUDIO_SYSTEM_METHOD(setMasterVolume), + MAKE_AUDIO_SYSTEM_METHOD(getMasterVolume), + MAKE_AUDIO_SYSTEM_METHOD(setMasterMute), + MAKE_AUDIO_SYSTEM_METHOD(getMasterMute), + MAKE_AUDIO_SYSTEM_METHOD(setMasterMono), + MAKE_AUDIO_SYSTEM_METHOD(getMasterMono), + MAKE_AUDIO_SYSTEM_METHOD(setMasterBalance), + MAKE_AUDIO_SYSTEM_METHOD(getMasterBalance), + MAKE_AUDIO_SYSTEM_METHOD(getPrimaryOutputSamplingRate), + MAKE_AUDIO_SYSTEM_METHOD(getPrimaryOutputFrameCount), + MAKE_AUDIO_SYSTEM_METHOD(getOutputLatency), + MAKE_AUDIO_SYSTEM_METHOD(setLowRamDevice), + MAKE_AUDIO_SYSTEM_METHOD(checkAudioFlinger), + MAKE_JNI_NATIVE_METHOD("setAudioFlingerBinder", "(Landroid/os/IBinder;)V", + android_media_AudioSystem_setAudioFlingerBinder), + MAKE_JNI_NATIVE_METHOD("listAudioPorts", "(Ljava/util/ArrayList;[I)I", + android_media_AudioSystem_listAudioPorts), + MAKE_JNI_NATIVE_METHOD("createAudioPatch", + "([Landroid/media/AudioPatch;[Landroid/media/" + "AudioPortConfig;[Landroid/media/AudioPortConfig;)I", + android_media_AudioSystem_createAudioPatch), + MAKE_JNI_NATIVE_METHOD("releaseAudioPatch", "(Landroid/media/AudioPatch;)I", + android_media_AudioSystem_releaseAudioPatch), + MAKE_JNI_NATIVE_METHOD("listAudioPatches", "(Ljava/util/ArrayList;[I)I", + android_media_AudioSystem_listAudioPatches), + MAKE_JNI_NATIVE_METHOD("setAudioPortConfig", "(Landroid/media/AudioPortConfig;)I", + android_media_AudioSystem_setAudioPortConfig), + MAKE_JNI_NATIVE_METHOD("startAudioSource", + "(Landroid/media/AudioPortConfig;Landroid/media/AudioAttributes;)I", + android_media_AudioSystem_startAudioSource), + MAKE_AUDIO_SYSTEM_METHOD(stopAudioSource), + MAKE_AUDIO_SYSTEM_METHOD(getAudioHwSyncForSession), + MAKE_JNI_NATIVE_METHOD("registerPolicyMixes", "(Ljava/util/ArrayList;Z)I", + android_media_AudioSystem_registerPolicyMixes), + MAKE_JNI_NATIVE_METHOD("setUidDeviceAffinities", "(I[I[Ljava/lang/String;)I", + android_media_AudioSystem_setUidDeviceAffinities), + MAKE_AUDIO_SYSTEM_METHOD(removeUidDeviceAffinities), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_register_dynamic_policy_callback", + android_media_AudioSystem_registerDynPolicyCallback), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_register_recording_callback", + android_media_AudioSystem_registerRecordingCallback), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_register_routing_callback", + android_media_AudioSystem_registerRoutingCallback), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_register_vol_range_init_req_callback", + android_media_AudioSystem_registerVolRangeInitReqCallback), + MAKE_AUDIO_SYSTEM_METHOD(systemReady), + MAKE_AUDIO_SYSTEM_METHOD(getStreamVolumeDB), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_get_offload_support", + android_media_AudioSystem_getOffloadSupport), + MAKE_JNI_NATIVE_METHOD("getMicrophones", "(Ljava/util/ArrayList;)I", + android_media_AudioSystem_getMicrophones), + MAKE_JNI_NATIVE_METHOD("getSurroundFormats", "(Ljava/util/Map;)I", + android_media_AudioSystem_getSurroundFormats), + MAKE_JNI_NATIVE_METHOD("getReportedSurroundFormats", "(Ljava/util/ArrayList;)I", + android_media_AudioSystem_getReportedSurroundFormats), + MAKE_AUDIO_SYSTEM_METHOD(setSurroundFormatEnabled), + MAKE_AUDIO_SYSTEM_METHOD(setAssistantServicesUids), + MAKE_AUDIO_SYSTEM_METHOD(setActiveAssistantServicesUids), + MAKE_AUDIO_SYSTEM_METHOD(setA11yServicesUids), + MAKE_AUDIO_SYSTEM_METHOD(isHapticPlaybackSupported), + MAKE_AUDIO_SYSTEM_METHOD(isUltrasoundSupported), + MAKE_JNI_NATIVE_METHOD( + "getHwOffloadFormatsSupportedForBluetoothMedia", "(ILjava/util/ArrayList;)I", + android_media_AudioSystem_getHwOffloadFormatsSupportedForBluetoothMedia), + MAKE_AUDIO_SYSTEM_METHOD(setSupportedSystemUsages), + MAKE_AUDIO_SYSTEM_METHOD(setAllowedCapturePolicy), + MAKE_AUDIO_SYSTEM_METHOD(setRttEnabled), + MAKE_AUDIO_SYSTEM_METHOD(setAudioHalPids), + MAKE_AUDIO_SYSTEM_METHOD(isCallScreeningModeSupported), + MAKE_JNI_NATIVE_METHOD("setDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I", + android_media_AudioSystem_setDevicesRoleForStrategy), + MAKE_JNI_NATIVE_METHOD("removeDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I", + android_media_AudioSystem_removeDevicesRoleForStrategy), + MAKE_AUDIO_SYSTEM_METHOD(clearDevicesRoleForStrategy), + MAKE_JNI_NATIVE_METHOD("getDevicesForRoleAndStrategy", "(IILjava/util/List;)I", + android_media_AudioSystem_getDevicesForRoleAndStrategy), + MAKE_JNI_NATIVE_METHOD("setDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I", + android_media_AudioSystem_setDevicesRoleForCapturePreset), + MAKE_JNI_NATIVE_METHOD("addDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I", + android_media_AudioSystem_addDevicesRoleForCapturePreset), + MAKE_JNI_NATIVE_METHOD("removeDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I", + android_media_AudioSystem_removeDevicesRoleForCapturePreset), + MAKE_AUDIO_SYSTEM_METHOD(clearDevicesRoleForCapturePreset), + MAKE_JNI_NATIVE_METHOD("getDevicesForRoleAndCapturePreset", "(IILjava/util/List;)I", + android_media_AudioSystem_getDevicesForRoleAndCapturePreset), + MAKE_JNI_NATIVE_METHOD("getDevicesForAttributes", + "(Landroid/media/AudioAttributes;[Landroid/media/" + "AudioDeviceAttributes;Z)I", + android_media_AudioSystem_getDevicesForAttributes), + MAKE_JNI_NATIVE_METHOD("setUserIdDeviceAffinities", "(I[I[Ljava/lang/String;)I", + android_media_AudioSystem_setUserIdDeviceAffinities), + MAKE_AUDIO_SYSTEM_METHOD(removeUserIdDeviceAffinities), + MAKE_AUDIO_SYSTEM_METHOD(setCurrentImeUid), + MAKE_JNI_NATIVE_METHOD("setVibratorInfos", "(Ljava/util/List;)I", + android_media_AudioSystem_setVibratorInfos), + MAKE_JNI_NATIVE_METHOD("nativeGetSpatializer", + "(Landroid/media/INativeSpatializerCallback;)Landroid/os/IBinder;", + android_media_AudioSystem_getSpatializer), + MAKE_JNI_NATIVE_METHOD("canBeSpatialized", + "(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;" + "[Landroid/media/AudioDeviceAttributes;)Z", + android_media_AudioSystem_canBeSpatialized), + MAKE_JNI_NATIVE_METHOD("nativeGetSoundDose", + "(Landroid/media/ISoundDoseCallback;)Landroid/os/IBinder;", + android_media_AudioSystem_nativeGetSoundDose), + MAKE_JNI_NATIVE_METHOD("getDirectPlaybackSupport", + "(Landroid/media/AudioFormat;Landroid/media/AudioAttributes;)I", + android_media_AudioSystem_getDirectPlaybackSupport), + MAKE_JNI_NATIVE_METHOD("getDirectProfilesForAttributes", + "(Landroid/media/AudioAttributes;Ljava/util/ArrayList;)I", + android_media_AudioSystem_getDirectProfilesForAttributes), + MAKE_JNI_NATIVE_METHOD("getSupportedMixerAttributes", "(ILjava/util/List;)I", + android_media_AudioSystem_getSupportedMixerAttributes), + MAKE_JNI_NATIVE_METHOD("setPreferredMixerAttributes", + "(Landroid/media/AudioAttributes;IILandroid/media/" + "AudioMixerAttributes;)I", + android_media_AudioSystem_setPreferredMixerAttributes), + MAKE_JNI_NATIVE_METHOD("getPreferredMixerAttributes", + "(Landroid/media/AudioAttributes;ILjava/util/List;)I", + android_media_AudioSystem_getPreferredMixerAttributes), + MAKE_JNI_NATIVE_METHOD("clearPreferredMixerAttributes", + "(Landroid/media/AudioAttributes;II)I", + android_media_AudioSystem_clearPreferredMixerAttributes), + MAKE_AUDIO_SYSTEM_METHOD(supportsBluetoothVariableLatency), + MAKE_AUDIO_SYSTEM_METHOD(setBluetoothVariableLatencyEnabled), + MAKE_AUDIO_SYSTEM_METHOD(isBluetoothVariableLatencyEnabled)}; + +static const JNINativeMethod gEventHandlerMethods[] = + {MAKE_JNI_NATIVE_METHOD("native_setup", "(Ljava/lang/Object;)V", + android_media_AudioSystem_eventHandlerSetup), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_finalize", + android_media_AudioSystem_eventHandlerFinalize)}; + +static const JNINativeMethod gFrameworkCapabilities[] = + {MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_getMaxChannelCount", + android_media_AudioSystem_getMaxChannelCount), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_getMaxSampleRate", + android_media_AudioSystem_getMaxSampleRate), + MAKE_JNI_NATIVE_METHOD_AUTOSIG("native_getMinSampleRate", + android_media_AudioSystem_getMinSampleRate)}; int register_android_media_AudioSystem(JNIEnv *env) { @@ -3589,7 +3440,7 @@ int register_android_media_AudioSystem(JNIEnv *env) gClsAudioTrackRoutingProxy = android::FindClassOrDie(env, "android/media/AudioTrackRoutingProxy"); // make sure this reference doesn't get deleted - gClsAudioTrackRoutingProxy = (jclass)env->NewGlobalRef(gClsAudioTrackRoutingProxy); + gClsAudioTrackRoutingProxy = static_cast<jclass>(env->NewGlobalRef(gClsAudioTrackRoutingProxy)); gMidAudioTrackRoutingProxy_ctor = android::GetMethodIDOrDie(env, gClsAudioTrackRoutingProxy, "<init>", "(J)V"); @@ -3600,7 +3451,8 @@ int register_android_media_AudioSystem(JNIEnv *env) gClsAudioRecordRoutingProxy = android::FindClassOrDie(env, "android/media/AudioRecordRoutingProxy"); // make sure this reference doesn't get deleted - gClsAudioRecordRoutingProxy = (jclass)env->NewGlobalRef(gClsAudioRecordRoutingProxy); + gClsAudioRecordRoutingProxy = + static_cast<jclass>(env->NewGlobalRef(gClsAudioRecordRoutingProxy)); gMidAudioRecordRoutingProxy_ctor = android::GetMethodIDOrDie(env, gClsAudioRecordRoutingProxy, "<init>", "(J)V"); diff --git a/core/jni/android_os_HwParcel.cpp b/core/jni/android_os_HwParcel.cpp index 4c4443fc29c3..0e3c51047b31 100644 --- a/core/jni/android_os_HwParcel.cpp +++ b/core/jni/android_os_HwParcel.cpp @@ -285,7 +285,7 @@ static void JHwParcel_native_writeInterfaceToken( hardware::Parcel *parcel = JHwParcel::GetNativeContext(env, thiz)->getParcel(); - status_t err = parcel->writeInterfaceToken(nameCopy.string()); + status_t err = parcel->writeInterfaceToken(nameCopy.c_str()); signalExceptionForError(env, err); } } @@ -687,9 +687,7 @@ static void JHwParcel_native_writeHidlMemory( static jstring MakeStringObjFromHidlString(JNIEnv *env, const hidl_string &s) { String16 utf16String(s.c_str(), s.size()); - return env->NewString( - reinterpret_cast<const jchar *>(utf16String.string()), - utf16String.size()); + return env->NewString(reinterpret_cast<const jchar *>(utf16String.c_str()), utf16String.size()); } static jstring JHwParcel_native_readString(JNIEnv *env, jobject thiz) { diff --git a/core/jni/android_os_UEventObserver.cpp b/core/jni/android_os_UEventObserver.cpp index 2df74b05d97b..43a8be1ddc26 100644 --- a/core/jni/android_os_UEventObserver.cpp +++ b/core/jni/android_os_UEventObserver.cpp @@ -51,8 +51,8 @@ static bool isMatch(const char* buffer, size_t length) { const char* field = buffer; const char* end = buffer + length + 1; do { - if (strstr(field, match.string())) { - ALOGV("Matched uevent message with pattern: %s", match.string()); + if (strstr(field, match.c_str())) { + ALOGV("Matched uevent message with pattern: %s", match.c_str()); return true; } field += strlen(field) + 1; @@ -71,7 +71,11 @@ static jstring nativeWaitForNextEvent(JNIEnv *env, jclass clazz) { } buffer[length] = '\0'; - ALOGV("Received uevent message: %s", buffer); + IF_ALOGV() { + std::string message(buffer, length); + std::replace(message.begin(), message.end(), '\0', ' '); + ALOGV("Received uevent message: %s", message.c_str()); + } if (isMatch(buffer, length)) { // Assume the message is ASCII. diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index a2205eb7dfdb..c9a5fa6c476e 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -273,7 +273,7 @@ static jobject NativeGetAssetAllocations(JNIEnv* env, jobject /*clazz*/) { if (alloc.length() <= 0) { return nullptr; } - return env->NewStringUTF(alloc.string()); + return env->NewStringUTF(alloc.c_str()); } static jint NativeGetGlobalAssetManagerCount(JNIEnv* /*env*/, jobject /*clazz*/) { @@ -429,7 +429,7 @@ static jobjectArray NativeList(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring } for (size_t i = 0; i < file_count; i++) { - jstring java_string = env->NewStringUTF(asset_dir->getFileName(i).string()); + jstring java_string = env->NewStringUTF(asset_dir->getFileName(i).c_str()); // Check for errors creating the strings (if malformed or no memory). if (env->ExceptionCheck()) { diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index b24dc8a9e63b..55382cc1d380 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -17,19 +17,8 @@ #define LOG_TAG "JavaBinder" //#define LOG_NDEBUG 0 -#include "android_os_Parcel.h" #include "android_util_Binder.h" -#include <atomic> -#include <fcntl.h> -#include <inttypes.h> -#include <mutex> -#include <stdio.h> -#include <string> -#include <sys/stat.h> -#include <sys/types.h> -#include <unistd.h> - #include <android-base/stringprintf.h> #include <binder/BpBinder.h> #include <binder/IInterface.h> @@ -40,8 +29,16 @@ #include <binder/Stability.h> #include <binderthreadstate/CallerUtils.h> #include <cutils/atomic.h> -#include <cutils/threads.h> +#include <fcntl.h> +#include <inttypes.h> #include <log/log.h> +#include <nativehelper/JNIHelp.h> +#include <nativehelper/ScopedLocalRef.h> +#include <nativehelper/ScopedUtfChars.h> +#include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> #include <utils/KeyedVector.h> #include <utils/List.h> #include <utils/Log.h> @@ -49,10 +46,11 @@ #include <utils/SystemClock.h> #include <utils/threads.h> -#include <nativehelper/JNIHelp.h> -#include <nativehelper/ScopedLocalRef.h> -#include <nativehelper/ScopedUtfChars.h> +#include <atomic> +#include <mutex> +#include <string> +#include "android_os_Parcel.h" #include "core_jni_helpers.h" //#undef ALOGV @@ -558,14 +556,48 @@ public: }; // ---------------------------------------------------------------------------- +#ifdef BINDER_DEATH_RECIPIENT_WEAK_FROM_JNI +#if __BIONIC__ +#include <android/api-level.h> +static bool target_sdk_is_at_least_vic() { + return android_get_application_target_sdk_version() >= __ANDROID_API_V__; +} +#else +static constexpr bool target_sdk_is_at_least_vic() { + // If not built for Android (i.e. glibc host), follow the latest behavior as there's no compat + // requirement there. + return true; +} +#endif // __BIONIC__ +#endif // BINDER_DEATH_RECIPIENT_WEAK_FROM_JNI class JavaDeathRecipient : public IBinder::DeathRecipient { public: JavaDeathRecipient(JNIEnv* env, jobject object, const sp<DeathRecipientList>& list) - : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)), - mObjectWeak(NULL), mList(list) - { + : mVM(jnienv_to_javavm(env)), mObject(NULL), mObjectWeak(NULL), mList(list) { + // b/298374304: For apps targeting Android V or beyond, we no longer hold the global JNI ref + // to the death recipient objects. This is to prevent the memory leak which can happen when + // the death recipient object internally has a strong reference to the proxy object. Under + // the old behavior, you were unable to kill the binder service by dropping all references + // to the proxy object - because it is still strong referenced from JNI (here). The only way + // to cut the strong reference was to call unlinkDeath(), but it was easy to forget. + // + // Now, the strong reference to the death recipient is held in the Java-side proxy object. + // See BinderProxy.mDeathRecipients. From JNI, only the weak reference is kept. An + // implication of this is that you may not receive binderDied() if you drop all references + // to the proxy object before the service dies. This should be okay for most cases because + // you normally are not interested in the death of a binder service which you don't have any + // reference to. If however you want to get binderDied() regardless of the proxy object's + // lifecycle, keep a strong reference to the death recipient object by yourself. +#ifdef BINDER_DEATH_RECIPIENT_WEAK_FROM_JNI + if (target_sdk_is_at_least_vic()) { + mObjectWeak = env->NewWeakGlobalRef(object); + } else +#endif + { + mObject = env->NewGlobalRef(object); + } // These objects manage their own lifetimes so are responsible for final bookkeeping. // The list holds a strong reference to this object. LOGDEATH("Adding JDR %p to DRL %p", this, list.get()); @@ -578,26 +610,49 @@ public: void binderDied(const wp<IBinder>& who) { LOGDEATH("Receiving binderDied() on JavaDeathRecipient %p\n", this); - if (mObject != NULL) { - JNIEnv* env = javavm_to_jnienv(mVM); - ScopedLocalRef<jobject> jBinderProxy(env, javaObjectForIBinder(env, who.promote())); - env->CallStaticVoidMethod(gBinderProxyOffsets.mClass, - gBinderProxyOffsets.mSendDeathNotice, mObject, - jBinderProxy.get()); - if (env->ExceptionCheck()) { - jthrowable excep = env->ExceptionOccurred(); - binder_report_exception(env, excep, - "*** Uncaught exception returned from death notification!"); - } + if (mObject == NULL && mObjectWeak == NULL) { + return; + } + JNIEnv* env = javavm_to_jnienv(mVM); + ScopedLocalRef<jobject> jBinderProxy(env, javaObjectForIBinder(env, who.promote())); + + // Hold a local reference to the recipient. This may fail if the recipient is weakly + // referenced, in which case we can't deliver the death notice. + ScopedLocalRef<jobject> jRecipient(env, + env->NewLocalRef(mObject != NULL ? mObject + : mObjectWeak)); + if (jRecipient.get() == NULL) { + ALOGW("Binder died, but death recipient is already garbage collected. If your target " + "sdk level is at or above 35, this can happen when you dropped all references to " + "the binder service before it died. If you want to get a death notice for a " + "binder service which you have no reference to, keep a strong reference to the " + "death recipient by yourself."); + return; + } + + if (mFired) { + ALOGW("Received multiple death notices for the same binder object. Binder driver bug?"); + return; + } + mFired = true; + + env->CallStaticVoidMethod(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mSendDeathNotice, + jRecipient.get(), jBinderProxy.get()); + if (env->ExceptionCheck()) { + jthrowable excep = env->ExceptionOccurred(); + binder_report_exception(env, excep, + "*** Uncaught exception returned from death notification!"); + } - // Serialize with our containing DeathRecipientList so that we can't - // delete the global ref on mObject while the list is being iterated. + // Demote from strong ref (if exists) to weak after binderDied() has been delivered, to + // allow the DeathRecipient and BinderProxy to be GC'd if no longer needed. Do this in sync + // with our containing DeathRecipientList so that we can't delete the global ref on mObject + // while the list is being iterated. + if (mObject != NULL) { sp<DeathRecipientList> list = mList.promote(); if (list != NULL) { AutoMutex _l(list->lock()); - // Demote from strong ref to weak after binderDied() has been delivered, - // to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed. mObjectWeak = env->NewWeakGlobalRef(mObject); env->DeleteGlobalRef(mObject); mObject = NULL; @@ -664,9 +719,19 @@ protected: private: JavaVM* const mVM; - jobject mObject; // Initial strong ref to Java-side DeathRecipient. Cleared on binderDied(). - jweak mObjectWeak; // Weak ref to the same Java-side DeathRecipient after binderDied(). + + // If target sdk version < 35, the Java-side DeathRecipient is strongly referenced from mObject + // upon linkToDeath() and then after binderDied() is called, the strong reference is demoted to + // a weak reference (mObjectWeak). + // If target sdk version >= 35, the strong reference is never made here (i.e. mObject == NULL + // always). Instead, the strong reference to the Java-side DeathRecipient is made in + // BinderProxy.mDeathRecipients. In the native world, only the weak reference is kept. + jobject mObject; + jweak mObjectWeak; wp<DeathRecipientList> mList; + + // Whether binderDied was called or not. + bool mFired = false; }; // ---------------------------------------------------------------------------- @@ -954,8 +1019,10 @@ void signalExceptionForError(JNIEnv* env, jobject obj, status_t err, String8 msg; msg.appendFormat("Unknown binder error code. 0x%" PRIx32, err); // RemoteException is a checked exception, only throw from certain methods. - jniThrowException(env, canThrowRemoteException - ? "android/os/RemoteException" : "java/lang/RuntimeException", msg.string()); + jniThrowException(env, + canThrowRemoteException ? "android/os/RemoteException" + : "java/lang/RuntimeException", + msg.c_str()); break; } } @@ -974,7 +1041,7 @@ static jint android_os_Binder_getCallingUid() return IPCThreadState::self()->getCallingUid(); } -static jboolean android_os_Binder_isDirectlyHandlingTransaction() { +static jboolean android_os_Binder_isDirectlyHandlingTransactionNative() { return getCurrentServingCall() == BinderCallType::BINDER; } @@ -1082,7 +1149,8 @@ static const JNINativeMethod gBinderMethods[] = { // @CriticalNative { "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid }, // @CriticalNative - { "isDirectlyHandlingTransaction", "()Z", (void*)android_os_Binder_isDirectlyHandlingTransaction }, + { "isDirectlyHandlingTransactionNative", "()Z", + (void*)android_os_Binder_isDirectlyHandlingTransactionNative }, // @CriticalNative { "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity }, // @CriticalNative @@ -1286,8 +1354,7 @@ static jstring android_os_BinderProxy_getInterfaceDescriptor(JNIEnv* env, jobjec IBinder* target = getBPNativeData(env, obj)->mObject.get(); if (target != NULL) { const String16& desc = target->getInterfaceDescriptor(); - return env->NewString(reinterpret_cast<const jchar*>(desc.string()), - desc.size()); + return env->NewString(reinterpret_cast<const jchar*>(desc.c_str()), desc.size()); } jniThrowException(env, "java/lang/RuntimeException", "No binder found for object"); @@ -1304,103 +1371,6 @@ static jboolean android_os_BinderProxy_isBinderAlive(JNIEnv* env, jobject obj) return alive ? JNI_TRUE : JNI_FALSE; } -static int getprocname(pid_t pid, char *buf, size_t len) { - char filename[32]; - FILE *f; - - snprintf(filename, sizeof(filename), "/proc/%d/cmdline", pid); - f = fopen(filename, "re"); - if (!f) { - *buf = '\0'; - return 1; - } - if (!fgets(buf, len, f)) { - *buf = '\0'; - fclose(f); - return 2; - } - fclose(f); - return 0; -} - -static bool push_eventlog_string(char** pos, const char* end, const char* str) { - jint len = strlen(str); - int space_needed = 1 + sizeof(len) + len; - if (end - *pos < space_needed) { - ALOGW("not enough space for string. remain=%" PRIdPTR "; needed=%d", - end - *pos, space_needed); - return false; - } - **pos = EVENT_TYPE_STRING; - (*pos)++; - memcpy(*pos, &len, sizeof(len)); - *pos += sizeof(len); - memcpy(*pos, str, len); - *pos += len; - return true; -} - -static bool push_eventlog_int(char** pos, const char* end, jint val) { - int space_needed = 1 + sizeof(val); - if (end - *pos < space_needed) { - ALOGW("not enough space for int. remain=%" PRIdPTR "; needed=%d", - end - *pos, space_needed); - return false; - } - **pos = EVENT_TYPE_INT; - (*pos)++; - memcpy(*pos, &val, sizeof(val)); - *pos += sizeof(val); - return true; -} - -// From frameworks/base/core/java/android/content/EventLogTags.logtags: - -static const bool kEnableBinderSample = false; - -#define LOGTAG_BINDER_OPERATION 52004 - -static void conditionally_log_binder_call(int64_t start_millis, - IBinder* target, jint code) { - int duration_ms = static_cast<int>(uptimeMillis() - start_millis); - - int sample_percent; - if (duration_ms >= 500) { - sample_percent = 100; - } else { - sample_percent = 100 * duration_ms / 500; - if (sample_percent == 0) { - return; - } - if (sample_percent < (random() % 100 + 1)) { - return; - } - } - - char process_name[40]; - getprocname(getpid(), process_name, sizeof(process_name)); - String8 desc(target->getInterfaceDescriptor()); - - char buf[LOGGER_ENTRY_MAX_PAYLOAD]; - buf[0] = EVENT_TYPE_LIST; - buf[1] = 5; - char* pos = &buf[2]; - char* end = &buf[LOGGER_ENTRY_MAX_PAYLOAD - 1]; // leave room for final \n - if (!push_eventlog_string(&pos, end, desc.string())) return; - if (!push_eventlog_int(&pos, end, code)) return; - if (!push_eventlog_int(&pos, end, duration_ms)) return; - if (!push_eventlog_string(&pos, end, process_name)) return; - if (!push_eventlog_int(&pos, end, sample_percent)) return; - *(pos++) = '\n'; // conventional with EVENT_TYPE_LIST apparently. - android_bWriteLog(LOGTAG_BINDER_OPERATION, buf, pos - buf); -} - -// We only measure binder call durations to potentially log them if -// we're on the main thread. -static bool should_time_binder_calls() { - return (getpid() == gettid()); -} - static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, jint code, jobject dataObj, jobject replyObj, jint flags) // throws RemoteException { @@ -1427,29 +1397,10 @@ static jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, ALOGV("Java code calling transact on %p in Java object %p with code %" PRId32 "\n", target, obj, code); - - bool time_binder_calls; - int64_t start_millis; - if (kEnableBinderSample) { - // Only log the binder call duration for things on the Java-level main thread. - // But if we don't - time_binder_calls = should_time_binder_calls(); - - if (time_binder_calls) { - start_millis = uptimeMillis(); - } - } - //printf("Transact from Java code to %p sending: ", target); data->print(); status_t err = target->transact(code, *data, reply, flags); //if (reply) printf("Transact from Java code to %p received: ", target); reply->print(); - if (kEnableBinderSample) { - if (time_binder_calls) { - conditionally_log_binder_call(start_millis, target, code); - } - } - if (err == NO_ERROR) { return JNI_TRUE; } else if (err == UNKNOWN_TRANSACTION) { @@ -1567,17 +1518,19 @@ static jobject android_os_BinderProxy_getExtension(JNIEnv* env, jobject obj) { // ---------------------------------------------------------------------------- +// clang-format off static const JNINativeMethod gBinderProxyMethods[] = { /* name, signature, funcPtr */ {"pingBinder", "()Z", (void*)android_os_BinderProxy_pingBinder}, {"isBinderAlive", "()Z", (void*)android_os_BinderProxy_isBinderAlive}, {"getInterfaceDescriptor", "()Ljava/lang/String;", (void*)android_os_BinderProxy_getInterfaceDescriptor}, {"transactNative", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact}, - {"linkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, - {"unlinkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, + {"linkToDeathNative", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, + {"unlinkToDeathNative", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, {"getNativeFinalizer", "()J", (void*)android_os_BinderProxy_getNativeFinalizer}, {"getExtension", "()Landroid/os/IBinder;", (void*)android_os_BinderProxy_getExtension}, }; +// clang-format on const char* const kBinderProxyPathName = "android/os/BinderProxy"; diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 4f2bf4a4f6cb..18c60a793166 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -148,7 +148,7 @@ jint android_os_Process_getUidForName(JNIEnv* env, jobject clazz, jstring name) const size_t N = name8.size(); if (N > 0) { - const char* str = name8.string(); + const char* str = name8.c_str(); for (size_t i=0; i<N; i++) { if (str[i] < '0' || str[i] > '9') { struct passwd* pwd = getpwnam(str); @@ -180,7 +180,7 @@ jint android_os_Process_getGidForName(JNIEnv* env, jobject clazz, jstring name) const size_t N = name8.size(); if (N > 0) { - const char* str = name8.string(); + const char* str = name8.c_str(); for (size_t i=0; i<N; i++) { if (str[i] < '0' || str[i] > '9') { struct group* grp = getgrnam(str); @@ -583,8 +583,8 @@ void android_os_Process_setArgV0(JNIEnv* env, jobject clazz, jstring name) env->ReleaseStringCritical(name, str); } - if (!name8.isEmpty()) { - AndroidRuntime::getRuntime()->setArgv0(name8.string(), true /* setProcName */); + if (!name8.empty()) { + AndroidRuntime::getRuntime()->setArgv0(name8.c_str(), true /* setProcName */); } } @@ -690,7 +690,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt return; } - int fd = open(file.string(), O_RDONLY | O_CLOEXEC); + int fd = open(file.c_str(), O_RDONLY | O_CLOEXEC); if (fd >= 0) { //ALOGI("Clearing %" PRId32 " sizes", count); @@ -704,7 +704,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt close(fd); if (len < 0) { - ALOGW("Unable to read %s", file.string()); + ALOGW("Unable to read %s", file.c_str()); len = 0; } buffer[len] = 0; @@ -717,7 +717,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt //ALOGI("Parsing at: %s", p); for (i=0; i<count; i++) { const String8& field = fields[i]; - if (strncmp(p, field.string(), field.length()) == 0) { + if (strncmp(p, field.c_str(), field.length()) == 0) { p += field.length(); while (*p == ' ' || *p == '\t') p++; char* num = p; @@ -729,7 +729,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt } char* end; sizesArray[i] = strtoll(num, &end, 10); - //ALOGI("Field %s = %" PRId64, field.string(), sizesArray[i]); + // ALOGI("Field %s = %" PRId64, field.c_str(), sizesArray[i]); foundCount++; break; } @@ -746,7 +746,7 @@ void android_os_Process_readProcLines(JNIEnv* env, jobject clazz, jstring fileSt free(buffer); } else { - ALOGW("Unable to open %s", file.string()); + ALOGW("Unable to open %s", file.c_str()); } //ALOGI("Done!"); diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index 624bd5f4da23..69fc515444b2 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -292,7 +292,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject if (status) { String8 message; message.appendFormat("Failed to initialize display event receiver. status=%d", status); - jniThrowRuntimeException(env, message.string()); + jniThrowRuntimeException(env, message.c_str()); return 0; } @@ -316,7 +316,7 @@ static void nativeScheduleVsync(JNIEnv* env, jclass clazz, jlong receiverPtr) { if (status) { String8 message; message.appendFormat("Failed to schedule next vertical sync pulse. status=%d", status); - jniThrowRuntimeException(env, message.string()); + jniThrowRuntimeException(env, message.c_str()); } } diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp index 15270efbde57..8d39ddfa0406 100644 --- a/core/jni/android_view_InputEventSender.cpp +++ b/core/jni/android_view_InputEventSender.cpp @@ -334,7 +334,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject senderWeak, if (status) { String8 message; message.appendFormat("Failed to initialize input event sender. status=%d", status); - jniThrowRuntimeException(env, message.string()); + jniThrowRuntimeException(env, message.c_str()); return 0; } diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp index 2c819874973a..ef5da979a314 100644 --- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp +++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp @@ -130,6 +130,7 @@ sumFiles(JNIEnv*, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntry, const char static install_status_t copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntry, const char* fileName) { + static const size_t kPageSize = getpagesize(); void** args = reinterpret_cast<void**>(arg); jstring* javaNativeLibPath = (jstring*) args[0]; jboolean extractNativeLibs = *(jboolean*) args[1]; @@ -156,9 +157,9 @@ copyFileIfChanged(JNIEnv *env, void* arg, ZipFileRO* zipFile, ZipEntryRO zipEntr return INSTALL_FAILED_INVALID_APK; } - if (offset % PAGE_SIZE != 0) { - ALOGE("Library '%s' is not page-aligned - will not be able to open it directly from" - " apk.\n", fileName); + if (offset % kPageSize != 0) { + ALOGE("Library '%s' is not PAGE(%zu)-aligned - will not be able to open it directly " + "from apk.\n", fileName, kPageSize); return INSTALL_FAILED_INVALID_APK; } diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index ce806a0fcc08..56066b2d813c 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -356,6 +356,7 @@ enum RuntimeFlags : uint32_t { GWP_ASAN_LEVEL_DEFAULT = 3 << 21, NATIVE_HEAP_ZERO_INIT_ENABLED = 1 << 23, PROFILEABLE = 1 << 24, + DEBUG_ENABLE_PTRACE = 1 << 25, }; enum UnsolicitedZygoteMessageTypes : uint32_t { @@ -1805,15 +1806,10 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, if (!is_system_server && getuid() == 0) { const int rc = createProcessGroup(uid, getpid()); if (rc != 0) { - if (rc == -ESRCH) { - // If process is dead, treat this as a non-fatal error - ALOGE("createProcessGroup(%d, %d) failed: %s", uid, /* pid= */ 0, strerror(-rc)); - } else { - fail_fn(rc == -EROFS ? CREATE_ERROR("createProcessGroup failed, kernel missing " - "CONFIG_CGROUP_CPUACCT?") - : CREATE_ERROR("createProcessGroup(%d, %d) failed: %s", uid, - /* pid= */ 0, strerror(-rc))); - } + fail_fn(rc == -EROFS ? CREATE_ERROR("createProcessGroup failed, kernel missing " + "CONFIG_CGROUP_CPUACCT?") + : CREATE_ERROR("createProcessGroup(%d, %d) failed: %s", uid, + /* pid= */ 0, strerror(-rc))); } } @@ -1887,8 +1883,10 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, } // Set process properties to enable debugging if required. - if ((runtime_flags & RuntimeFlags::DEBUG_ENABLE_JDWP) != 0) { + if ((runtime_flags & RuntimeFlags::DEBUG_ENABLE_PTRACE) != 0) { EnableDebugger(); + // Don't pass unknown flag to the ART runtime. + runtime_flags &= ~RuntimeFlags::DEBUG_ENABLE_PTRACE; } if ((runtime_flags & RuntimeFlags::PROFILE_FROM_SHELL) != 0) { // simpleperf needs the process to be dumpable to profile it. diff --git a/core/jni/com_android_internal_os_ZygoteInit.cpp b/core/jni/com_android_internal_os_ZygoteInit.cpp index a5152b6e689c..56c01ba2c3a3 100644 --- a/core/jni/com_android_internal_os_ZygoteInit.cpp +++ b/core/jni/com_android_internal_os_ZygoteInit.cpp @@ -23,43 +23,13 @@ namespace { -// Shadow call stack (SCS) is a security mitigation that uses a separate stack -// (the SCS) for return addresses. In versions of Android newer than P, the -// compiler cooperates with the system to ensure that the SCS address is always -// stored in register x18, as long as the app was compiled with a new enough -// compiler and does not use features that rely on SP-HALs (this restriction is -// because the SP-HALs might not preserve x18 due to potentially having been -// compiled with an old compiler as a consequence of Treble; it generally means -// that the app must be a system app without a UI). This struct is used to -// temporarily store the address on the stack while preloading the SP-HALs, so -// that such apps can use the same zygote as everything else. -struct ScopedSCSExit { -#ifdef __aarch64__ - void* scs; - - ScopedSCSExit() { - __asm__ __volatile__("str x18, [%0]" ::"r"(&scs)); - } - - ~ScopedSCSExit() { - __asm__ __volatile__("ldr x18, [%0]; str xzr, [%0]" ::"r"(&scs)); - } -#else - // Silence unused variable warnings in non-SCS builds. - ScopedSCSExit() {} - ~ScopedSCSExit() {} -#endif -}; - void android_internal_os_ZygoteInit_nativePreloadAppProcessHALs(JNIEnv* env, jclass) { - ScopedSCSExit x; android::GraphicBufferMapper::preloadHal(); // Add preloading here for other HALs that are (a) always passthrough, and // (b) loaded by most app processes. } void android_internal_os_ZygoteInit_nativePreloadGraphicsDriver(JNIEnv* env, jclass) { - ScopedSCSExit x; zygote_preload_graphics(); } diff --git a/core/jni/com_android_internal_security_VerityUtils.cpp b/core/jni/com_android_internal_security_VerityUtils.cpp index 4a9e2d4a192d..d7449e0495e3 100644 --- a/core/jni/com_android_internal_security_VerityUtils.cpp +++ b/core/jni/com_android_internal_security_VerityUtils.cpp @@ -70,7 +70,11 @@ int enableFsverity(JNIEnv *env, jobject clazz, jstring filePath) { int statxForFsverity(JNIEnv *env, jobject /* clazz */, jstring filePath) { ScopedUtfChars path(env, filePath); - // Call statx and check STATX_ATTR_VERITY. + // There are two ways to check whether a file has fs-verity enabled: statx() and FS_IOC_GETFLAGS + // (See https://www.kernel.org/doc/html/latest/filesystems/fsverity.html#statx and + // https://www.kernel.org/doc/html/latest/filesystems/fsverity.html#fs-ioc-getflags.) + // We try statx() first, since it doesn't require opening the file. + struct statx out = {}; if (statx(AT_FDCWD, path.c_str(), 0 /* flags */, STATX_ALL, &out) != 0) { return -errno; @@ -80,8 +84,12 @@ int statxForFsverity(JNIEnv *env, jobject /* clazz */, jstring filePath) { return (out.stx_attributes & STATX_ATTR_VERITY) != 0; } - // STATX_ATTR_VERITY is not supported for the file path. - // In this case, call ioctl(FS_IOC_GETFLAGS) and check FS_VERITY_FL. + // The filesystem doesn't support STATX_ATTR_VERITY. This normally means that it doesn't + // support fs-verity, in which case we should simply return 0. Unfortunately, virtio-fs is an + // exception, since it doesn't support STATX_ATTR_VERITY but does support querying FS_VERITY_FL + // via FS_IOC_GETFLAGS. So we have to fall back to FS_IOC_GETFLAGS. Note: despite being an + // ioctl, FS_IOC_GETFLAGS doesn't require the "ioctl" SELinux permission but rather "getattr". + ::android::base::unique_fd rfd(open(path.c_str(), O_RDONLY | O_CLOEXEC)); if (rfd.get() < 0) { ALOGE("open failed at %s", path.c_str()); @@ -90,6 +98,11 @@ int statxForFsverity(JNIEnv *env, jobject /* clazz */, jstring filePath) { unsigned int flags; if (ioctl(rfd.get(), FS_IOC_GETFLAGS, &flags) < 0) { + if (errno == ENOTTY) { + // If the filesystem supports neither STATX_ATTR_VERITY nor FS_IOC_GETFLAGS, then assume + // that it doesn't support fs-verity. + return 0; + } ALOGE("ioctl(FS_IOC_GETFLAGS) failed at %s", path.c_str()); return -errno; } diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp index 5c71f692b80f..8e4addd6f331 100644 --- a/core/jni/fd_utils.cpp +++ b/core/jni/fd_utils.cpp @@ -17,6 +17,7 @@ #include "fd_utils.h" #include <algorithm> +#include <utility> #include <fcntl.h> #include <grp.h> @@ -174,7 +175,7 @@ FileDescriptorAllowlist* FileDescriptorAllowlist::instance_ = nullptr; class FileDescriptorInfo { public: // Create a FileDescriptorInfo for a given file descriptor. - static FileDescriptorInfo* CreateFromFd(int fd, fail_fn_t fail_fn); + static std::unique_ptr<FileDescriptorInfo> CreateFromFd(int fd, fail_fn_t fail_fn); // Checks whether the file descriptor associated with this object refers to // the same description. @@ -213,7 +214,7 @@ class FileDescriptorInfo { DISALLOW_COPY_AND_ASSIGN(FileDescriptorInfo); }; -FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd, fail_fn_t fail_fn) { +std::unique_ptr<FileDescriptorInfo> FileDescriptorInfo::CreateFromFd(int fd, fail_fn_t fail_fn) { struct stat f_stat; // This should never happen; the zygote should always have the right set // of permissions required to stat all its open files. @@ -234,7 +235,7 @@ FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd, fail_fn_t fail_fn) socket_name.c_str(), fd)); } - return new FileDescriptorInfo(fd); + return std::unique_ptr<FileDescriptorInfo>(new FileDescriptorInfo(fd)); } // We only handle allowlisted regular files and character devices. Allowlisted @@ -315,7 +316,8 @@ FileDescriptorInfo* FileDescriptorInfo::CreateFromFd(int fd, fail_fn_t fail_fn) int open_flags = fs_flags & (kOpenFlags); fs_flags = fs_flags & (~(kOpenFlags)); - return new FileDescriptorInfo(f_stat, file_path, fd, open_flags, fd_flags, fs_flags, offset); + return std::unique_ptr<FileDescriptorInfo>( + new FileDescriptorInfo(f_stat, file_path, fd, open_flags, fd_flags, fs_flags, offset)); } bool FileDescriptorInfo::RefersToSameFile() const { @@ -482,11 +484,11 @@ static std::unique_ptr<std::set<int>> GetOpenFdsIgnoring(const std::vector<int>& FileDescriptorTable* FileDescriptorTable::Create(const std::vector<int>& fds_to_ignore, fail_fn_t fail_fn) { std::unique_ptr<std::set<int>> open_fds = GetOpenFdsIgnoring(fds_to_ignore, fail_fn); - std::unordered_map<int, FileDescriptorInfo*> open_fd_map; + std::unordered_map<int, std::unique_ptr<FileDescriptorInfo>> open_fd_map; for (auto fd : *open_fds) { open_fd_map[fd] = FileDescriptorInfo::CreateFromFd(fd, fail_fn); } - return new FileDescriptorTable(open_fd_map); + return new FileDescriptorTable(std::move(open_fd_map)); } static std::unique_ptr<std::set<int>> GetOpenFdsIgnoring(const std::vector<int>& fds_to_ignore, @@ -535,9 +537,9 @@ void FileDescriptorTable::Restat(const std::vector<int>& fds_to_ignore, fail_fn_ // Reopens all file descriptors that are contained in the table. void FileDescriptorTable::ReopenOrDetach(fail_fn_t fail_fn) { - std::unordered_map<int, FileDescriptorInfo*>::const_iterator it; + std::unordered_map<int, std::unique_ptr<FileDescriptorInfo>>::const_iterator it; for (it = open_fd_map_.begin(); it != open_fd_map_.end(); ++it) { - const FileDescriptorInfo* info = it->second; + const FileDescriptorInfo* info = it->second.get(); if (info == nullptr) { return; } else { @@ -547,15 +549,11 @@ void FileDescriptorTable::ReopenOrDetach(fail_fn_t fail_fn) { } FileDescriptorTable::FileDescriptorTable( - const std::unordered_map<int, FileDescriptorInfo*>& map) - : open_fd_map_(map) { + std::unordered_map<int, std::unique_ptr<FileDescriptorInfo>> map) + : open_fd_map_(std::move(map)) { } -FileDescriptorTable::~FileDescriptorTable() { - for (auto& it : open_fd_map_) { - delete it.second; - } -} +FileDescriptorTable::~FileDescriptorTable() {} void FileDescriptorTable::RestatInternal(std::set<int>& open_fds, fail_fn_t fail_fn) { // ART creates a file through memfd for optimization purposes. We make sure @@ -569,7 +567,7 @@ void FileDescriptorTable::RestatInternal(std::set<int>& open_fds, fail_fn_t fail // (b) they refer to the same file. // // We'll only store the last error message. - std::unordered_map<int, FileDescriptorInfo*>::iterator it = open_fd_map_.begin(); + std::unordered_map<int, std::unique_ptr<FileDescriptorInfo>>::iterator it = open_fd_map_.begin(); while (it != open_fd_map_.end()) { std::set<int>::const_iterator element = open_fds.find(it->first); if (element == open_fds.end()) { @@ -580,7 +578,6 @@ void FileDescriptorTable::RestatInternal(std::set<int>& open_fds, fail_fn_t fail // TODO(narayan): This will be an error in a future android release. // error = true; // ALOGW("Zygote closed file descriptor %d.", it->first); - delete it->second; it = open_fd_map_.erase(it); } else { // The entry from the file descriptor table is still open. Restat @@ -588,7 +585,6 @@ void FileDescriptorTable::RestatInternal(std::set<int>& open_fds, fail_fn_t fail if (!it->second->RefersToSameFile()) { // The file descriptor refers to a different description. We must // update our entry in the table. - delete it->second; it->second = FileDescriptorInfo::CreateFromFd(*element, fail_fn); } else { // It's the same file. Nothing to do here. Move on to the next open diff --git a/core/jni/fd_utils.h b/core/jni/fd_utils.h index a28ebf17d334..ac2d2a4eb2d7 100644 --- a/core/jni/fd_utils.h +++ b/core/jni/fd_utils.h @@ -17,6 +17,7 @@ #ifndef FRAMEWORKS_BASE_CORE_JNI_FD_UTILS_H_ #define FRAMEWORKS_BASE_CORE_JNI_FD_UTILS_H_ +#include <memory> #include <set> #include <string> #include <unordered_map> @@ -98,12 +99,12 @@ class FileDescriptorTable { void ReopenOrDetach(fail_fn_t fail_fn); private: - explicit FileDescriptorTable(const std::unordered_map<int, FileDescriptorInfo*>& map); + explicit FileDescriptorTable(std::unordered_map<int, std::unique_ptr<FileDescriptorInfo>> map); void RestatInternal(std::set<int>& open_fds, fail_fn_t fail_fn); // Invariant: All values in this unordered_map are non-NULL. - std::unordered_map<int, FileDescriptorInfo*> open_fd_map_; + std::unordered_map<int, std::unique_ptr<FileDescriptorInfo>> open_fd_map_; DISALLOW_COPY_AND_ASSIGN(FileDescriptorTable); }; diff --git a/core/proto/android/input/OWNERS b/core/proto/android/input/OWNERS new file mode 100644 index 000000000000..4c20c4dc9d35 --- /dev/null +++ b/core/proto/android/input/OWNERS @@ -0,0 +1 @@ +include /INPUT_OWNERS diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto index 10f07aca9cc0..5a3539acae26 100644 --- a/core/proto/android/os/system_properties.proto +++ b/core/proto/android/os/system_properties.proto @@ -172,7 +172,7 @@ message SystemPropertiesProto { optional Status tombstoned = 29; optional Status ueventd = 30; optional Status update_engine = 31; - optional Status update_verifier_nonencrypted = 32; + optional Status update_verifier = 32; optional Status virtual_touchpad = 33; optional Status vndservicemanager = 34; optional Status vold = 35; @@ -558,3 +558,4 @@ message SystemPropertiesProto { // Next Tag: 32 } + diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 2f9f6ae3f3c4..7d9d99113663 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2268,6 +2268,14 @@ <permission android:name="android.permission.MANAGE_ETHERNET_NETWORKS" android:protectionLevel="signature" /> + <!-- Allows system apps to call methods to register itself as a mDNS offload engine. + <p>Not for use by third-party or privileged applications. + @SystemApi + @hide This should only be used by system apps. + --> + <permission android:name="android.permission.REGISTER_NSD_OFFLOAD_ENGINE" + android:protectionLevel="signature" /> + <!-- ======================================= --> <!-- Permissions for short range, peripheral networks --> <!-- ======================================= --> @@ -2373,6 +2381,8 @@ <p>Protection level: normal --> <permission android:name="android.permission.NFC_TRANSACTION_EVENT" + android:description="@string/permdesc_nfcTransactionEvent" + android:label="@string/permlab_nfcTransactionEvent" android:protectionLevel="normal" /> <!-- Allows applications to receive NFC preferred payment service information. diff --git a/core/res/OWNERS b/core/res/OWNERS index bce500cd3320..0df7c2047bc1 100644 --- a/core/res/OWNERS +++ b/core/res/OWNERS @@ -33,6 +33,9 @@ per-file res/xml/public-final.xml = file:/tools/aapt2/OWNERS # Multiuser per-file res/xml/config_user_types.xml = file:/MULTIUSER_OWNERS +# Battery Saver +per-file res/values/config_battery_saver.xml = file:/services/core/java/com/android/server/power/batterysaver/OWNERS + # Car per-file res/values/dimens_car.xml = file:/platform/packages/services/Car:/OWNERS @@ -49,3 +52,6 @@ per-file res/xml/power_profile_test.xml = file:/BATTERY_STATS_OWNERS # Telephony per-file res/values/config_telephony.xml = file:/platform/frameworks/opt/telephony:/OWNERS per-file res/xml/sms_short_codes.xml = file:/platform/frameworks/opt/telephony:/OWNERS + +# TV Input Framework +per-file res/values/config_tv_external_input_logging.xml = file:/services/core/java/com/android/server/tv/OWNERS diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 6a7c06581d8a..0f3cd8fc477b 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Laat die program toe om voorkeur-NFC-betalingdiensinligting soos geregistreerde hulpmiddels en roetebestemming te kry."</string> <string name="permlab_nfc" msgid="1904455246837674977">"beheer kortveldkommunikasie"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Laat die program toe om met kortveldkommunikasie- (NFC) merkers, kaarte en lesers te kommunikeer."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Veilige Element-transaksiegeval"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Laat die app toe om inligting te ontvang oor transaksies wat op ’n Veilige Element plaasvind."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"deaktiveer jou skermslot"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Laat die program toe om die sleutelslot en enige verwante wagwoordsekuriteit te deaktiveer. Byvoorbeeld, die foon deaktiveer die sleutelslot wanneer ’n oproep inkom, en atkiveer dit dan weer wanneer die oproep eindig."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"versoek skermslot-kompleksiteit"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Laat ’n metgeselapp toe om voorgronddienste van agtergrond af te begin"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofoon is beskikbaar"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofoon is geblokkeer"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dubbelskerm"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dubbelskerm is aan"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen is aan"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> gebruik tans albei skerms om inhoud te wys"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Toestel is te warm"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dubbelskerm is nie beskikbaar nie omdat jou foon tans te warm word"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen is nie beskikbaar nie omdat jou foon tans te warm word"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is nie beskikbaar nie"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is nie beskikbaar nie omdat Batterybespaarder aan is. Jy kan dit in Instellings afskakel."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Gaan na Instellings"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index ecab978bee6c..2e2911d95ac5 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -202,7 +202,7 @@ <string name="device_policy_manager_service" msgid="5085762851388850332">"የመሣሪያ መመሪያ አስተዳዳሪ አገልግሎት"</string> <string name="music_recognition_manager_service" msgid="7481956037950276359">"የሙዚቃ ለይቶ ማወቅ አስተዳዳሪ አገልግሎት"</string> <string name="factory_reset_warning" msgid="6858705527798047809">"የእርስዎ መሣሪያ ይደመሰሳል"</string> - <string name="factory_reset_message" msgid="2657049595153992213">"የአስተዳዳሪ መተግበሪያ ስራ ላይ ሊውል አይችልም። የእርስዎን መሣሪያ አሁን ይደመሰሳል።\n\nጥያቄዎች ካለዎት የድርጅትዎን አስተዳዳሪ ያነጋግሩ።"</string> + <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> @@ -249,7 +249,7 @@ <string name="global_action_emergency" msgid="1387617624177105088">"ድንገተኛ አደጋ"</string> <string name="global_action_bug_report" msgid="5127867163044170003">"የሳንካ ሪፖርት"</string> <string name="global_action_logout" msgid="6093581310002476511">"ክፍለ-ጊዜን አብቃ"</string> - <string name="global_action_screenshot" msgid="2610053466156478564">"ቅጽበታዊ ገፅ እይታ"</string> + <string name="global_action_screenshot" msgid="2610053466156478564">"ቅጽበታዊ ገፅ ዕይታ"</string> <string name="bugreport_title" msgid="8549990811777373050">"የሳንካ ሪፖርት"</string> <string name="bugreport_message" msgid="5212529146119624326">"ይሄ እንደ የኢሜይል መልዕክት አድርጎ የሚልከውን ስለመሣሪያዎ የአሁኑ ሁኔታ መረጃ ይሰበስባል። የሳንካ ሪፖርቱን ከመጀመር ጀምሮ እስኪላክ ድረስ ትንሽ ጊዜ ይወስዳል፤ እባክዎ ይታገሱ።"</string> <string name="bugreport_option_interactive_title" msgid="7968287837902871289">"መስተጋብራዊ ሪፖርት"</string> @@ -257,7 +257,7 @@ <string name="bugreport_option_full_title" msgid="7681035745950045690">"ሙሉ ሪፖርት"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"መሣሪያዎ ምላሽ የማይሰጥ ወይም በጣም ቀርፋፋ ከሆነ፣ ወይም ሁሉንም የሪፖርት ክፍሎች የሚያስፈልገዎት ከሆነ ለዝቅተኛ የስርዓት ጣልቃ-ገብነት ይህን አማራጭ ይጠቀሙ። ተጨማሪ ዝርዝሮችን እንዲያስገቡ ወይም ተጨማሪ ቅጽበታዊ ገፅ እይታዎችን እንዲያነሱ አያስችልዎትም።"</string> <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{በ# ሰከንድ ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገፅ ዕይታን በማንሳት ላይ።}one{በ# ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገፅ ዕይታን በማንሳት ላይ።}other{በ# ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገፅ ዕይታን በማንሳት ላይ።}}"</string> - <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ቅጽበታዊ ገፅ እይታ ከሳንካ ሪፖርት ጋር ተነስቷል"</string> + <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"ቅጽበታዊ ገፅ ዕይታ ከሳንካ ሪፖርት ጋር ተነስቷል"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"ቅጽበታዊ ገፅ እይታን ከሳንካ ሪፖርት ጋር ማንሳት አልተሳካም"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"የፀጥታ ሁነታ"</string> <string name="global_action_silent_mode_on_status" msgid="2371892537738632013">"ድምፅ ጠፍቷል"</string> @@ -351,8 +351,8 @@ <string name="permdesc_statusBarService" msgid="6652917399085712557">"የኹናቴ አሞሌ እንዲሆን ለመተግበሪያው ይፈቅዳሉ።"</string> <string name="permlab_expandStatusBar" msgid="1184232794782141698">"የሁኔታ አሞሌ ዘርጋ/ሰብስብ"</string> <string name="permdesc_expandStatusBar" msgid="7180756900448498536">"የሁኔታ አሞሌን ለመዝረጋት እና ለመሰብሰብ ለመተግበሪያው ይፈቅዳሉ።"</string> - <string name="permlab_fullScreenIntent" msgid="4310888199502509104">"በአንድ የተቆለፈ መሣሪያ ላይ ማሳወቂያዎችን እንደ የሙሉ ገፅ እይታ እንቅስቃሴዎችን ማሳየት"</string> - <string name="permdesc_fullScreenIntent" msgid="1100721419406643997">"መተግበሪያው በአንድ የተቆለፈ መሣሪያ ላይ ማሳወቂያዎችን እንደ የሙሉ ገፅ እይታ እንቅስቃሴዎች አድርጎ እንዲያሳይ ያስችለዋል"</string> + <string name="permlab_fullScreenIntent" msgid="4310888199502509104">"በአንድ የተቆለፈ መሣሪያ ላይ ማሳወቂያዎችን እንደ የሙሉ ገፅ ዕይታ እንቅስቃሴዎችን ማሳየት"</string> + <string name="permdesc_fullScreenIntent" msgid="1100721419406643997">"መተግበሪያው በአንድ የተቆለፈ መሣሪያ ላይ ማሳወቂያዎችን እንደ የሙሉ ገፅ ዕይታ እንቅስቃሴዎች አድርጎ እንዲያሳይ ያስችለዋል"</string> <string name="permlab_install_shortcut" msgid="7451554307502256221">"አቋራጮችን ይጭናል"</string> <string name="permdesc_install_shortcut" msgid="4476328467240212503">"አንድ መተግበሪያ ያለተጠቃሚ ጣልቃ-ገብነት የመነሻ ማያ ገፅ አቋራጮችን እንዲያክል ያስችለዋል።"</string> <string name="permlab_uninstall_shortcut" msgid="295263654781900390">"አቋራጮችን ያራግፋል"</string> @@ -461,8 +461,8 @@ <string name="permdesc_writeCallLog" product="tablet" msgid="2657525794731690397">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የጡባዊተኮህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string> <string name="permdesc_writeCallLog" product="tv" msgid="3934939195095317432">"መተግበሪያው ስለገቢ እና ወጪ ጥሪዎች ያለ ውሂብም ጨምሮ የእርስዎ Android TV መሣሪያ ምዝግብ ማስታወሻ እንዲቀይር ያስችለዋል። ተንኮል-አዘል መተግበሪያዎች ይህን ተጠቅመው የስልክዎን ምዝግብ ማስታወሻ ሊደመስሱ ወይም ሊቀይሩ ይችላሉ።"</string> <string name="permdesc_writeCallLog" product="default" msgid="5903033505665134802">"ስለ ገቢ እና ወጪ ጥሪዎችን ውሂብ ጨምሮ፣ የስልክህን ምዝግብ ማስታወሻ ለመቀየር ለመተግበሪያው ይፈቅዳል። ይሄንን ተንኮል አዘል መተግበሪያዎች የስልክህን ምዝግብ ማስታወሻ ለመሰረዝ ወይም ለመለወጥ ሊጠቀሙበት ይችላሉ።"</string> - <string name="permlab_bodySensors" msgid="662918578601619569">"ስራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት ያለ የሰውነት ዳሳሽ ውሂብን መድረስ"</string> - <string name="permdesc_bodySensors" product="default" msgid="7652650410295512140">"መተግበሪያው ስራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት፣ የሙቀት መጠን እና የደም ኦክሲጅን መቶኛ ያለ የሰውነት ዳሳሽ ውሂብን እንዲደርስ ያስችለዋል።"</string> + <string name="permlab_bodySensors" msgid="662918578601619569">"ሥራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት ያለ የሰውነት ዳሳሽ ውሂብን መድረስ"</string> + <string name="permdesc_bodySensors" product="default" msgid="7652650410295512140">"መተግበሪያው ሥራ ላይ በሚውልበት ጊዜ እንደ የልብ ምት፣ የሙቀት መጠን እና የደም ኦክሲጅን መቶኛ ያለ የሰውነት ዳሳሽ ውሂብን እንዲደርስ ያስችለዋል።"</string> <string name="permlab_bodySensors_background" msgid="4912560779957760446">"ከበስተጀርባ እያለ እንደ የልብ ምት ያለ የሰውነት ዳሳሽ ውሂብን መድረስ"</string> <string name="permdesc_bodySensors_background" product="default" msgid="8870726027557749417">"መተግበሪያው ከበስተጀርባ እያለ እንደ የልብ ምት፣ የሙቀት መጠን እና የደም ኦክሲጅን መቶኛ ያለ የሰውነት ዳሳሽ ውሂብን እንዲደርስ ያስችለዋል።"</string> <string name="permlab_readCalendar" msgid="6408654259475396200">"የቀን መቁጠሪያ ክስተቶችን እና ዝርዝሮችን አንብብ"</string> @@ -474,27 +474,27 @@ <string name="permdesc_writeCalendar" product="tv" msgid="951246749004952706">"ይህ መተግበሪያ በእርስዎ Android TV መሣሪያ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string> <string name="permdesc_writeCalendar" product="default" msgid="5416380074475634233">"ይህ መተግበሪያ በእርስዎ ስልክ ላይ የቀን መቁጠሪያ ክስተቶችን ሊያክል፣ ሊያስወግድ ወይም ሊለውጥ ይችላል። ይህ መተግበሪያ ከቀን መቁጠሪያ የመጡ መስለው የሚታዩ መልእክቶችን ሊልክ ወይም ባለቤቶቹን ሳያሳውቅ ክስተቶችን ሊለውጥ ይችላል።"</string> <string name="permlab_accessLocationExtraCommands" msgid="5162339812057983988">"ተጨማሪ ሥፍራ አቅራቢ ትዕዛዞችን ድረስ።"</string> - <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"መተግበሪያው ተጨማሪ የአካባቢ አቅራቢ ትእዛዞችን እንዲደርስ ይፈቅድለታል። ይሄ መተግበሪያው በጂፒኤስ ወይም ሌላ የአካባቢ ምንጮች ስራ ላይ ጣልቃ እንዲገባ ሊፈቅድለት ይችላል።"</string> + <string name="permdesc_accessLocationExtraCommands" msgid="355369611979907967">"መተግበሪያው ተጨማሪ የአካባቢ አቅራቢ ትእዛዞችን እንዲደርስ ይፈቅድለታል። ይሄ መተግበሪያው በጂፒኤስ ወይም ሌላ የአካባቢ ምንጮች ሥራ ላይ ጣልቃ እንዲገባ ሊፈቅድለት ይችላል።"</string> <string name="permlab_accessFineLocation" msgid="6426318438195622966">"መዳረሻ ከፊት ለፊት ብቻ ትክክለኛ ነው"</string> - <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"ይህ መተግበሪያ ስራ ላይ ሳለ ከአካባቢ አገልግሎቶች ትክክለኛ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት። ይህ የባትሪ ፍጆታን ሊጨምር ይችላል።"</string> + <string name="permdesc_accessFineLocation" msgid="6732174080240016335">"ይህ መተግበሪያ ሥራ ላይ ሳለ ከአካባቢ አገልግሎቶች ትክክለኛ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት። ይህ የባትሪ ፍጆታን ሊጨምር ይችላል።"</string> <string name="permlab_accessCoarseLocation" msgid="1561042925407799741">"ከፊት ለፊት ብቻ ግምታዊ አካባቢን ድረስ"</string> - <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"ይህ መተግበሪያ ስራ ላይ ሳለ ከአካባቢ አገልግሎቶች ግምታዊ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት።"</string> + <string name="permdesc_accessCoarseLocation" msgid="778521847873199160">"ይህ መተግበሪያ ሥራ ላይ ሳለ ከአካባቢ አገልግሎቶች ግምታዊ አካባቢዎን ማግኘት ይችላል። መተግበሪያው አካባቢን ማግኘት እንዲችል የመሣሪያዎ የአካባቢ አገልግሎቶች መብራት አለበት።"</string> <string name="permlab_accessBackgroundLocation" msgid="1721164702777366138">"አካባቢን በበስተጀርባ ድረስ"</string> - <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"ይህ መተግበሪያ በማንኛውም ጊዜ አካባቢን መድረስ ይችላል፣ መተግበሪያው ስራ ላይ ባይውልም እንኳ።"</string> + <string name="permdesc_accessBackgroundLocation" msgid="8264885066095638105">"ይህ መተግበሪያ በማንኛውም ጊዜ አካባቢን መድረስ ይችላል፣ መተግበሪያው ሥራ ላይ ባይውልም እንኳ።"</string> <string name="permlab_modifyAudioSettings" msgid="6129039778010031815">"የድምፅ ቅንብሮችን ለውጥ"</string> <string name="permdesc_modifyAudioSettings" msgid="8687227609663124921">"መተግበሪያው አንደ የድምጽ መጠን እና ለውጽአት የትኛውን የድምጽ ማጉያ ጥቅም ላይ እንደዋለ የመሳሰሉ ሁለንተናዊ የድምጽ ቅንብሮችን እንዲያስተካክል ይፈቅድለታል።"</string> <string name="permlab_recordAudio" msgid="1208457423054219147">"ኦዲዮ ይቅዱ"</string> - <string name="permdesc_recordAudio" msgid="5857246765327514062">"ይህ መተግበሪያ መተግበሪያው ስራ ላይ ሳለ ማይክሮፎኑን በመጠቀም ኦዲዮን መቅዳት ይችላል።"</string> + <string name="permdesc_recordAudio" msgid="5857246765327514062">"ይህ መተግበሪያ መተግበሪያው ሥራ ላይ ሳለ ማይክሮፎኑን በመጠቀም ኦዲዮን መቅዳት ይችላል።"</string> <string name="permlab_recordBackgroundAudio" msgid="5891032812308878254">"በበስተጀርባ ኦዲዮን ይቅዱ"</string> <string name="permdesc_recordBackgroundAudio" msgid="1992623135737407516">"ይህ መተግበሪያ በማናቸውም ጊዜ ማይክራፎኑን በመጠቀም ኦዲዮን መቅዳት ይችላል።"</string> <string name="permlab_detectScreenCapture" msgid="4447042362828799433">"የመተግበሪያ መስኮቶች የማያ ገፅ ቀረጻዎችን ማወቅ"</string> - <string name="permdesc_detectScreenCapture" msgid="3485784917960342284">"መተግበሪያው በጥቅም ላይ ሳለ ቅጽበታዊ ገፅ እይታ ሲነሳ ይህ መተግበሪያ ማሳወቂያ ይደርሰዋል።"</string> + <string name="permdesc_detectScreenCapture" msgid="3485784917960342284">"መተግበሪያው በጥቅም ላይ ሳለ ቅጽበታዊ ገፅ ዕይታ ሲነሳ ይህ መተግበሪያ ማሳወቂያ ይደርሰዋል።"</string> <string name="permlab_sim_communication" msgid="176788115994050692">"ወደ ሲሙ ትዕዛዞችን መላክ"</string> <string name="permdesc_sim_communication" msgid="4179799296415957960">"መተግበሪያው ትዕዛዞችን ወደ ሲሙ እንዲልክ ያስችለዋል። ይሄ በጣማ አደገኛ ነው።"</string> <string name="permlab_activityRecognition" msgid="1782303296053990884">"አካላዊ እንቅስቃሴን ለይቶ ማወቅ"</string> <string name="permdesc_activityRecognition" msgid="8667484762991357519">"ይህ መተግበሪያ አካላዊ እንቅስቃሴዎን ለይቶ ሊያውቅ ይችላል።"</string> <string name="permlab_camera" msgid="6320282492904119413">"ፎቶዎች እና ቪዲዮዎች ያንሱ"</string> - <string name="permdesc_camera" msgid="5240801376168647151">"ይህ መተግበሪያ መተግበሪያው ስራ ላይ ሳለ ካሜራውን በመጠቀም ሥዕሎችን ማንሳት እና ቪዲዮዎችን መቅዳት ይችላል።"</string> + <string name="permdesc_camera" msgid="5240801376168647151">"ይህ መተግበሪያ መተግበሪያው ሥራ ላይ ሳለ ካሜራውን በመጠቀም ሥዕሎችን ማንሳት እና ቪዲዮዎችን መቅዳት ይችላል።"</string> <string name="permlab_backgroundCamera" msgid="7549917926079731681">"በበስተጀርባ ስዕሎችን እና ቪዲዮዎችን ያንሱ"</string> <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"ይህ መተግበሪያ በማናቸውም ጊዜ ካሜራውን በመጠቀም ፎቶ ሊያነሳ እና ቪዲዮዎችን ሊቀርጽ ይችላል።"</string> <string name="permlab_systemCamera" msgid="3642917457796210580">"ሥዕሎችን ለማንሣት እና ቪዲዮዎችን ለመቅረጽ እንዲችሉ ወደ ሥርዓት ካሜራዎች ለመተግበሪያ ወይም ለአገልግሎት መዳረሻ ይፍቀዱ"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"እንደ የተመዘገቡ እርዳታዎች እና የጉዞ መሥመር መዳረሻ የመሳሰለ ተመራጭ nfc የክፍያ አገልግሎት መረጃን ለማግኘት ለመተግበሪያው ያፈቅድለታል።"</string> <string name="permlab_nfc" msgid="1904455246837674977">"ቅርብ የግኑኙነትመስክ (NFC) ተቆጣጠር"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ከቅርብ ግኑኙነት መስክ (NFC) መለያዎች፣ ካርዶች እና አንባቢ ጋር ለማገናኘት ለመተግበሪያው ይፈቅዳሉ።"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"የክፍለ አካል ግብይት ክስተትን ደህንነቱ የተጠበቀ ያድርጉ"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ደህንነቱ በተጠበቀ ክፍለ አካል ላይ እየተከሰቱ ስላሉ ግብይቶች መተግበሪያው መረጃ እንዲቀበል ይፈቅዳል።"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"የማያ ገጽዎን መቆለፊያ ያሰናክሉ"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"መተግበሪያው መቆለፊያውና ማንኛውም የተጎዳኘ የይለፍ ቃል ደህንነት እንዲያሰናክል ይፈቅድለታል። ለምሳሌ ስልኩ ገቢ የስልክ ጥሪ በሚቀበልበት ጊዜ መቆለፊያውን ያሰናክልና ከዚያም ጥሪው ሲጠናቀቅ መቆለፊያውን በድጋሚ ያነቃዋል።"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"የማያ ገፅ መቆለፊያ ውስብስብነትን ጠይቅ"</string> @@ -599,11 +601,11 @@ <string name="permlab_turnScreenOn" msgid="219344053664171492">"ማያ ገጹን አብራ"</string> <string name="permdesc_turnScreenOn" msgid="4394606875897601559">"መተግበሪያው ማያ ገጹን እንዲያበራ ይፈቅድለታል።"</string> <string name="permlab_useBiometric" msgid="6314741124749633786">"ባዮሜትራዊ ሃርድዌርን መጠቀም"</string> - <string name="permdesc_useBiometric" msgid="7502858732677143410">"መተግበሪያው የባዮሜትራዊ ሃርድዌር ለማረጋገጥ ስራ እንዲጠቀም ያስችለዋል"</string> + <string name="permdesc_useBiometric" msgid="7502858732677143410">"መተግበሪያው የባዮሜትራዊ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</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> + <string name="permdesc_useFingerprint" msgid="412463055059323742">"መተግበሪያው የጣት አሻራ ሃርድዌር ለማረጋገጥ ሥራ እንዲጠቀም ያስችለዋል"</string> <string name="permlab_audioWrite" msgid="8501705294265669405">"የሙዚቃ ስብስብዎን መቀየር"</string> <string name="permdesc_audioWrite" msgid="8057399517013412431">"መተግበሪያው የሙዚቃ ስብስብዎን እንዲቀይረው ያስችለዋል።"</string> <string name="permlab_videoWrite" msgid="5940738769586451318">"የቪዲዮ ስብስብዎን መቀየር"</string> @@ -752,7 +754,7 @@ <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_bind_incall_service" msgid="5990625112603493016">"ከውስጠ-ጥሪ ማያ ገፅ ጋር መስተጋብር ይፈጥራል"</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> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"መተግበሪያው ጥሪዎችን እንዲያደርግ/እንዲቀበል ከስልክ አገልግሎቶች ጋር መስተጋብር እንዲፈጥር ያስችለዋል።"</string> @@ -839,7 +841,7 @@ <string-array name="phoneTypes"> <item msgid="8996339953292723951">"መነሻ"</item> <item msgid="7740243458912727194">"ተንቀሳቃሽ"</item> - <item msgid="8526146065496663766">"ስራ"</item> + <item msgid="8526146065496663766">"ሥራ"</item> <item msgid="8150904584178569699">"የስራ ፋክስ"</item> <item msgid="4537253139152229577">"የቤት ፋክስ"</item> <item msgid="6751245029698664340">"ምልክት ማድረጊያ"</item> @@ -848,24 +850,24 @@ </string-array> <string-array name="emailAddressTypes"> <item msgid="7786349763648997741">"መነሻ"</item> - <item msgid="435564470865989199">"ስራ"</item> + <item msgid="435564470865989199">"ሥራ"</item> <item msgid="4199433197875490373">"ሌላ"</item> <item msgid="3233938986670468328">"ብጁ"</item> </string-array> <string-array name="postalAddressTypes"> <item msgid="3861463339764243038">"መነሻ"</item> - <item msgid="5472578890164979109">"ስራ"</item> + <item msgid="5472578890164979109">"ሥራ"</item> <item msgid="5718921296646594739">"ሌላ"</item> <item msgid="5523122236731783179">"ብጁ"</item> </string-array> <string-array name="imAddressTypes"> <item msgid="588088543406993772">"መነሻ"</item> - <item msgid="5503060422020476757">"ስራ"</item> + <item msgid="5503060422020476757">"ሥራ"</item> <item msgid="2530391194653760297">"ሌላ"</item> <item msgid="7640927178025203330">"ብጁ"</item> </string-array> <string-array name="organizationTypes"> - <item msgid="6144047813304847762">"ስራ"</item> + <item msgid="6144047813304847762">"ሥራ"</item> <item msgid="7402720230065674193">"ሌላ"</item> <item msgid="808230403067569648">"ብጁ"</item> </string-array> @@ -882,7 +884,7 @@ <string name="phoneTypeCustom" msgid="5120365721260686814">"ብጁ"</string> <string name="phoneTypeHome" msgid="3880132427643623588">"መነሻ"</string> <string name="phoneTypeMobile" msgid="1178852541462086735">"ተንቀሳቃሽ"</string> - <string name="phoneTypeWork" msgid="6604967163358864607">"ስራ"</string> + <string name="phoneTypeWork" msgid="6604967163358864607">"ሥራ"</string> <string name="phoneTypeFaxWork" msgid="6757519896109439123">"የስራ ፋክስ"</string> <string name="phoneTypeFaxHome" msgid="6678559953115904345">"የቤት ፋክስ"</string> <string name="phoneTypePager" msgid="576402072263522767">"ምልክት ማድረጊያ"</string> @@ -906,16 +908,16 @@ <string name="eventTypeOther" msgid="530671238533887997">"ሌላ"</string> <string name="emailTypeCustom" msgid="1809435350482181786">"ብጁ"</string> <string name="emailTypeHome" msgid="1597116303154775999">"መነሻ"</string> - <string name="emailTypeWork" msgid="2020095414401882111">"ስራ"</string> + <string name="emailTypeWork" msgid="2020095414401882111">"ሥራ"</string> <string name="emailTypeOther" msgid="5131130857030897465">"ሌላ"</string> <string name="emailTypeMobile" msgid="787155077375364230">"ተንቀሳቃሽ"</string> <string name="postalTypeCustom" msgid="5645590470242939129">"ብጁ"</string> <string name="postalTypeHome" msgid="7562272480949727912">"መነሻ"</string> - <string name="postalTypeWork" msgid="8553425424652012826">"ስራ"</string> + <string name="postalTypeWork" msgid="8553425424652012826">"ሥራ"</string> <string name="postalTypeOther" msgid="7094245413678857420">"ሌላ"</string> <string name="imTypeCustom" msgid="5653384545085765570">"ብጁ"</string> <string name="imTypeHome" msgid="6996507981044278216">"መነሻ"</string> - <string name="imTypeWork" msgid="2099668940169903123">"ስራ"</string> + <string name="imTypeWork" msgid="2099668940169903123">"ሥራ"</string> <string name="imTypeOther" msgid="8068447383276219810">"ሌላ"</string> <string name="imProtocolCustom" msgid="4437878287653764692">"ብጁ"</string> <string name="imProtocolAim" msgid="4050198236506604378">"AIM"</string> @@ -927,7 +929,7 @@ <string name="imProtocolIcq" msgid="2410325380427389521">"ICQ"</string> <string name="imProtocolJabber" msgid="7919269388889582015">"Jabber"</string> <string name="imProtocolNetMeeting" msgid="4985002408136148256">"NetMeeting"</string> - <string name="orgTypeWork" msgid="8684458700669564172">"ስራ"</string> + <string name="orgTypeWork" msgid="8684458700669564172">"ሥራ"</string> <string name="orgTypeOther" msgid="5450675258408005553">"ሌላ"</string> <string name="orgTypeCustom" msgid="1126322047677329218">"ብጁ"</string> <string name="relationTypeCustom" msgid="282938315217441351">"ብጁ"</string> @@ -947,7 +949,7 @@ <string name="relationTypeSpouse" msgid="6916682664436031703">"የትዳር ጓደኛ"</string> <string name="sipAddressTypeCustom" msgid="6283889809842649336">"ብጁ"</string> <string name="sipAddressTypeHome" msgid="5918441930656878367">"መነሻ"</string> - <string name="sipAddressTypeWork" msgid="7873967986701216770">"ስራ"</string> + <string name="sipAddressTypeWork" msgid="7873967986701216770">"ሥራ"</string> <string name="sipAddressTypeOther" msgid="6317012577345187275">"ሌላ"</string> <string name="quick_contacts_not_available" msgid="1262709196045052223">"ምንም መተግበሪያ ይህንን እውቂያ ለመመልከት አልተገኘም።"</string> <string name="keyguard_password_enter_pin_code" msgid="6401406801060956153">"ፒን ኮድ ተይብ"</string> @@ -1859,9 +1861,9 @@ <string name="select_day" msgid="2060371240117403147">"ወር እና ቀን ይምረጡ"</string> <string name="select_year" msgid="1868350712095595393">"ዓመት ይምረጡ"</string> <string name="deleted_key" msgid="9130083334943364001">"<xliff:g id="KEY">%1$s</xliff:g> ተሰርዟል"</string> - <string name="managed_profile_label_badge" msgid="6762559569999499495">"ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> - <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3ኛ ስራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> + <string name="managed_profile_label_badge" msgid="6762559569999499495">"ሥራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> + <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"2ኛ ሥራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> + <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"3ኛ ሥራ <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="clone_profile_label_badge" msgid="1871997694718793964">"<xliff:g id="LABEL">%1$s</xliff:g>ን አባዛ"</string> <string name="lock_to_app_unlock_pin" msgid="3890940811866290782">"ከመንቀል በፊት ፒን ጠይቅ"</string> <string name="lock_to_app_unlock_pattern" msgid="2694204070499712503">"ከመንቀል በፊት የማስከፈቻ ስርዓተ-ጥለት ጠይቅ"</string> @@ -2132,7 +2134,7 @@ <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"ፈጣን ቅንብሮች"</string> <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"የኃይል መገናኛ"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"የማያ ገፅ ቁልፍ"</string> - <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ቅጽበታዊ ገፅ እይታ"</string> + <string name="accessibility_system_action_screenshot_label" msgid="3581566515062741676">"ቅጽበታዊ ገፅ ዕይታ"</string> <string name="accessibility_system_action_headset_hook_label" msgid="8524691721287425468">"የማዳመጫ መንጠቆ"</string> <string name="accessibility_system_action_on_screen_a11y_shortcut_label" msgid="8488701469459210309">"የማያ ገፅ ላይ ተደራሽነት አቋራጭ"</string> <string name="accessibility_system_action_on_screen_a11y_shortcut_chooser_label" msgid="1057878690209817886">"የማያ ገፅ ላይ ተደራሽነት አቋራጭ መራጭ"</string> @@ -2152,8 +2154,8 @@ <string name="unread_convo_overflow" msgid="920517615597353833">"<xliff:g id="MAX_UNREAD_COUNT">%1$d</xliff:g>+"</string> <string name="resolver_personal_tab" msgid="2051260504014442073">"የግል"</string> <string name="resolver_work_tab" msgid="2690019516263167035">"ሥራ"</string> - <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"የግል እይታ"</string> - <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"የስራ እይታ"</string> + <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"የግል ዕይታ"</string> + <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"የስራ ዕይታ"</string> <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"በእርስዎ የአይቲ አስተዳዳሪ ታግዷል"</string> <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"ይህ ይዘት በሥራ መተግበሪያዎች መጋራት አይችልም"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"ይህ ይዘት በሥራ መተግበሪያዎች መከፈት አይችልም"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"አጃቢ መተግበሪያ ከዳራ የፊት አገልግሎቶችን እንዲጀምር ያስችላል።"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"ማይክሮፎን ይገኛል"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"ማይክሮፎን ታግዷል"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ባለሁለት ማያ ገፅ"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ባለሁለት ማያ ገፅ በርቷል"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual screen ገፅ በርቷል"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ይዘትን ለማሳየት ሁለቱንም ማሳያዎች እየተጠቀመ ነው"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"መሣሪያ በጣም ሞቋል"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ስልክዎ በጣም እየሞቀ ስለሆነ ባለሁለት ማያ ገፅ አይገኝም"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ስልክዎ በጣም እየሞቀ ስለሆነ Dual screen አይገኝም"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen አይገኝም"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"የባትሪ ቆጣቢ ስለበራ Dual Screen አይገኝም። ይህን በቅንብሮች ውስጥ ሊያጠፉት ይችላሉ።"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"ወደ ቅንብሮች ሂድ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 87df6bb1e466..d4bfcd6d2772 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -594,6 +594,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"يسمح هذا الإذن للتطبيق بالحصول على معلومات الخدمات المدفوعة باستخدام الاتصال قصير المدى NFC المفضّل، مثلاً المساعدات المسجّلة ووجهة المسار."</string> <string name="permlab_nfc" msgid="1904455246837674977">"التحكم في اتصال الحقل القريب"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"للسماح للتطبيق بالاتصال بعلامات الاتصال قريب المدى (NFC)، والبطاقات وبرامج القراءة."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"حدث معاملة \"عنصر آمن\""</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"يسمح هذا الإذن للتطبيق بتلقّي معلومات حول المعاملات التي تتم على \"عنصر آمن\"."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"إيقاف قفل الشاشة"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"للسماح للتطبيق بإيقاف تأمين المفاتيح وأي أمان لكلمة مرور مرتبطة. على سبيل المثال، يعطل الهاتف تأمين المفاتيح عند استقبال مكالمة هاتفية واردة، ثم يعيد تفعيل تأمين المفاتيح عند انتهاء المكالمة."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"طلب معرفة مستوى صعوبة قفل الشاشة"</string> @@ -1596,7 +1598,7 @@ <string name="data_usage_restricted_body" msgid="5338694433686077733">"انقر لإزالة القيد."</string> <string name="data_usage_rapid_title" msgid="2950192123248740375">"استخدام مرتفع لبيانات الجوّال"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"استخدمت تطبيقاتك بيانات أكثر من المعتاد"</string> - <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"استخدمَ تطبيق <xliff:g id="APP">%s</xliff:g> بيانات أكثر من المعتاد"</string> + <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"استخدمَ تطبيق \"<xliff:g id="APP">%s</xliff:g>\" بيانات أكثر من المعتاد"</string> <string name="ssl_certificate" msgid="5690020361307261997">"شهادة الأمان"</string> <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"هذه الشهادة صالحة."</string> <string name="issued_to" msgid="5975877665505297662">"إصدار لـ:"</string> @@ -2167,7 +2169,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"إلغاء الإيقاف المؤقت"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ما مِن تطبيقات عمل."</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ما مِن تطبيقات شخصية."</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"هل تريد فتح تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في الملف الشخصي للعمل؟"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"هل تريد فتح تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في ملفك الشخصي للعمل؟"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"هل تريد فتح المحتوى في تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في الملف الشخصي؟"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"هل تريد فتح المحتوى في تطبيق \"<xliff:g id="APP">%s</xliff:g>\" في الملف الشخصي للعمل؟"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"هل تريد الاتصال من تطبيق العمل؟"</string> @@ -2327,11 +2329,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"يسمح هذا الإذن للتطبيق المصاحب ببدء الخدمات التي تعمل في المقدّمة من الخلفية."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"الميكروفون متاح."</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"تم حظر الميكروفون."</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"استخدام الشاشتين"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ميزة \"استخدام الشاشتين\" مفعّلة"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ميزة Dual Screen مفعّلة"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"يستخدم \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" كلتا الشاشتين لعرض المحتوى."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"الجهاز ساخن للغاية"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ميزة \"استخدام الشاشتين\" غير متاحة لأن هاتفك ساخن للغاية."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ميزة Dual Screen غير متاحة لأنّ هاتفك ساخن للغاية."</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ميزة Dual Screen غير متاحة"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ميزة Dual Screen غير متاحة لأن ميزة \"توفير شحن البطارية\" مفعّلة. ويمكنك إيقاف هذا الإجراء من خلال \"الإعدادات\"."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"الانتقال إلى الإعدادات"</string> diff --git a/core/res/res/values-as/strings.xml b/core/res/res/values-as/strings.xml index 2542163edfc0..93bc619c9854 100644 --- a/core/res/res/values-as/strings.xml +++ b/core/res/res/values-as/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"এপ্টোক অগ্ৰাধিকাৰ দিয়া nfc পৰিশোধ সেৱাৰ পঞ্জীকৃত সহায়কসমূহ আৰু পৰিশোধ কৰিব লগা লক্ষ্যস্থান দৰে তথ্য পাবলৈ অনুমতি দিয়ে।"</string> <string name="permlab_nfc" msgid="1904455246837674977">"নিয়েৰ ফিল্ড কমিউনিকেশ্বন নিয়ন্ত্ৰণ কৰক"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"এপ্টোক নিয়েৰ ফিল্ড কমিউনিকেশ্বন (NFC) টেগ, কাৰ্ড আৰু ৰিডাৰসমূহৰ সৈতে যোগাযোগ কৰিবলৈ অনুমতি দিয়ে।"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"সুৰক্ষিত উপাদানৰ লেনদেন সম্পৰ্কীয় অনুষ্ঠান"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"এপ্টোক এটা সুৰক্ষিত উপাদানত হোৱা লেনদেনৰ বিষয়ে তথ্য লাভ কৰাৰ অনুমতি দিয়ে।"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"আপোনাৰ স্ক্ৰীন লক অক্ষম কৰক"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"এপ্টোক কী ল\'ক আৰু জড়িত হোৱা যিকোনো পাছৱৰ্ডৰ সুৰক্ষা অক্ষম কৰিব দিয়ে৷ উদাহৰণস্বৰূপে, কোনো অন্তৰ্গামী ফ\'ন কল উঠোৱাৰ সময়ত ফ\'নটোৱে কী-লকটো অক্ষম কৰে, তাৰ পাছত কল শেষ হ\'লেই কী লকটো পুনৰ সক্ষম কৰে৷"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"স্ক্ৰীন লকৰ জটিলতাৰ অনুৰোধ"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"এটা সহযোগী এপক নেপথ্যৰ পৰা অগ্ৰভূমি সেৱাসমূহ আৰম্ভ কৰিবলৈ দিয়ে।"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"মাইক্ৰ’ফ’নটো উপলব্ধ"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"মাইক্ৰ’ফ’নটো অৱৰোধ কৰি থোৱা আছে"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"দ্বৈত স্ক্ৰীন"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ডুৱেল স্ক্ৰীন অন আছে"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen অন আছে"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>এ সমল দেখুৱাবলৈ দুয়োখন ডিছপ্লে’ ব্যৱহাৰ কৰি আছে"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ডিভাইচটো অতি বেছি গৰম হৈছে"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"আপোনাৰ ফ’নটো অতি বেছি গৰম হোৱাৰ বাবে ডুৱেল স্ক্ৰীন উপলব্ধ নহয়"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"আপোনাৰ ফ’নটো অতি বেছি গৰম হোৱাৰ বাবে Dual Screen উপলব্ধ নহয়"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen উপলব্ধ নহয়"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"বেটাৰী সঞ্চয়কাৰী অন হৈ থকাৰ কাৰণে Dual Screen সুবিধাটো উপলব্ধ নহয়। আপুনি ছেটিঙত এই সুবিধাটো অফ কৰিব পাৰে।"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"ছেটিঙলৈ যাওক"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 3d7e48779ce8..44bb72956982 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tətbiqə qeydiyyatdan keçmiş yardım və marşrut təyinatı kimi tərcih edilən nfc ödəniş xidməti məlumatını əldə etmək icazəsi verir."</string> <string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication\'ı kontrol et"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Tətbiqə Yaxın Məsafə Kommunikasiyası (NFC) teqləri, kartları və oxuyucuları ilə əlaqə qurmağa icazə verir."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Təhlükəsiz Element əməliyyatı"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Tətbiqə Təhlükəsiz Elementdəki əməliyyatlar haqqında məlumat almaq imkanı verir."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"Ekran kilidini deaktiv edir"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Tətbiqə kilid açarını və təhlükəsizlik parolunu deaktiv etməyə imkan verir. Qanuni misal budur ki, telefon zəng qəbul edən zaman kilidi açır və zəng qurtarandan sonra kilidi bağlayır."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ekran kilidi mürəkkəbliyi tələb edin"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 1e731e8813ea..11c9ad1ffc79 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -494,7 +494,7 @@ <string name="permdesc_sim_communication" msgid="4179799296415957960">"Omogućava aplikaciji da šalje komande SIM kartici. To je veoma opasno."</string> <string name="permlab_activityRecognition" msgid="1782303296053990884">"prepoznavanje fizičkih aktivnosti"</string> <string name="permdesc_activityRecognition" msgid="8667484762991357519">"Ova aplikacija može da prepozna fizičke aktivnosti."</string> - <string name="permlab_camera" msgid="6320282492904119413">"snimanje fotografija i video snimaka"</string> + <string name="permlab_camera" msgid="6320282492904119413">"snimanje fotografija i videa"</string> <string name="permdesc_camera" msgid="5240801376168647151">"Ova aplikacija može da snima slike i video snimke pomoću kamere dok se aplikacija koristi."</string> <string name="permlab_backgroundCamera" msgid="7549917926079731681">"da snima slike i video snimke u pozadini"</string> <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"Ova aplikacija može da snima fotografije i video snimke pomoću kamere u bilo kom trenutku."</string> @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Dozvoljava aplikaciji da preuzima informacije o željenoj NFC usluzi za plaćanje, poput registrovanih identifikatora aplikacija i odredišta preusmeravanja."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrola komunikacije u užem polju (Near Field Communication)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Dozvoljava aplikaciji da komunicira sa oznakama, karticama i čitačima komunikacije kratkog dometa (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Transakcija u okviru bezbednosnog elementa"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Omogućava aplikaciji da dobija informacije o transkacijama koje se izvršavaju u okviru bezbednosnog elementa."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"onemogućavanje zaključavanja ekrana"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Dozvoljava aplikaciji da onemogući zaključavanje tastature i sve povezane bezbednosne mere sa lozinkama. Na primer, telefon onemogućava zaključavanje tastature pri prijemu dolaznog telefonskog poziva, a zatim ga ponovo omogućava po završetku poziva."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"traženje složenosti zaključavanja ekrana"</string> @@ -741,8 +743,8 @@ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Omogućava aplikaciji da čita video fajlove iz deljenog memorijskog prostora."</string> <string name="permlab_readMediaImages" msgid="4057590631020986789">"čitanje fajlova slika iz deljenog memorijskog prostora"</string> <string name="permdesc_readMediaImages" msgid="5836219373138469259">"Omogućava aplikaciji da čita fajlove slika iz deljenog memorijskog prostora."</string> - <string name="permlab_readVisualUserSelect" msgid="5516204215354667586">"čitanje fajlova slika i video snimaka koje korisnik bira iz deljenog memorijskog prostora"</string> - <string name="permdesc_readVisualUserSelect" msgid="8027174717714968217">"Omogućava aplikaciji da čita fajlove slika i video snimaka koje izaberete iz deljenog memorijskog prostora."</string> + <string name="permlab_readVisualUserSelect" msgid="5516204215354667586">"čitanje fajlova slika i videa koje korisnik bira iz deljenog memorijskog prostora"</string> + <string name="permdesc_readVisualUserSelect" msgid="8027174717714968217">"Omogućava aplikaciji da čita fajlove slika i videa koje izaberete iz deljenog memorijskog prostora."</string> <string name="permlab_sdcardWrite" msgid="4863021819671416668">"menjanje ili brisanje sadržaja deljenog memorijskog prostora"</string> <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Dozvoljava aplikaciji da upisuje sadržaj deljenog memorijskog prostora."</string> <string name="permlab_use_sip" msgid="8250774565189337477">"upućivanje/prijem SIP poziva"</string> @@ -803,7 +805,7 @@ <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Dozvoljava vlasniku da ažurira aplikaciju koju je prethodno instalirala bez radnji korisnika"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Podešavanje pravila za lozinku"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Kontroliše dužinu i znakove dozvoljene u lozinkama i PIN-ovima za zaključavanje ekrana."</string> - <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadgledajte pokušaje otključavanja ekrana"</string> + <string name="policylab_watchLogin" msgid="7599669460083719504">"Nadzor pokušaja otključavanja ekrana"</string> <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Prati broj netačno unetih lozinki prilikom otključavanja ekrana i zaključava tablet ili briše podatke sa tableta ako je netačna lozinka uneta previše puta."</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Nadgleda broj netačnih lozinki unetih pri otključavanju ekrana i zaključava Android TV uređaj ili briše sve podatke sa Android TV uređaja ako se unese previše netačnih lozinki."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Prati broj netačno unetih lozinki pri otključavanju ekrana i zaključava sistem za info-zabavu ili briše sve podatke sa sistema za info-zabavu ako je netačna lozinka uneta previše puta."</string> @@ -1168,7 +1170,7 @@ <string name="app_running_notification_text" msgid="5120815883400228566">"Dodirnite za više informacija ili zaustavljanje aplikacije."</string> <string name="ok" msgid="2646370155170753815">"Potvrdi"</string> <string name="cancel" msgid="6908697720451760115">"Otkaži"</string> - <string name="yes" msgid="9069828999585032361">"Potvrdi"</string> + <string name="yes" msgid="9069828999585032361">"U redu"</string> <string name="no" msgid="5122037903299899715">"Otkaži"</string> <string name="dialog_alert_title" msgid="651856561974090712">"Pažnja"</string> <string name="loading" msgid="3138021523725055037">"Učitava se…"</string> @@ -1413,7 +1415,7 @@ <string name="ext_media_new_notification_message" msgid="6095403121990786986">"Dodirnite da biste podesili"</string> <string name="ext_media_new_notification_message" product="tv" msgid="216863352100263668">"Izaberite da biste podesili"</string> <string name="ext_media_new_notification_message" product="automotive" msgid="5140127881613227162">"Možda morate da reformatirate uređaj. Dodirnite da biste izbacili."</string> - <string name="ext_media_ready_notification_message" msgid="7509496364380197369">"Za čuvanje slika, video snimaka, muzike i drugog sadržaja"</string> + <string name="ext_media_ready_notification_message" msgid="7509496364380197369">"Za čuvanje slika, videa, muzike i drugog sadržaja"</string> <string name="ext_media_ready_notification_message" product="tv" msgid="8847134811163165935">"Pregledajte medijske fajlove"</string> <string name="ext_media_unmountable_notification_title" msgid="4895444667278979910">"Problem sa: <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unmountable_notification_title" product="automotive" msgid="3142723758949023280">"<xliff:g id="NAME">%s</xliff:g> ne radi"</string> @@ -2324,11 +2326,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Dozvoljava pratećoj aplikaciji da pokrene usluge u prvom planu iz pozadine."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofon je dostupan"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofon je blokiran"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dvojni ekran"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dvojni ekran je uključen"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen je uključen"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> koristi oba ekrana za prikazivanje sadržaja"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Uređaj je previše zagrejan"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvojni ekran je nedostupan jer je telefon previše zagrejan"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen je nedostupan jer je telefon previše zagrejan"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen nije dostupan"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen nije dostupan zato što je Ušteda baterije uključena. To možete da isključite u podešavanjima."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Idi u Podešavanja"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index f8b6daa797d4..5532d5226558 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дазваляе праграме атрымаць доступ да інфармацыі пра прыярытэтны сэрвіс аплаты NFC, напрыклад зарэгістраваныя ідэнтыфікатары праграм і маршруты адпраўкі даных."</string> <string name="permlab_nfc" msgid="1904455246837674977">"кантроль Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Дазваляе прыкладаннzv спалучацца з тэгамі, картамі і счытваючымі прыладамі Near Field Communication (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Трасанкцыі з выкарыстаннем ахоўнага элемента"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Праграма зможа атрымліваць інфармацыю пра трансакцыі, якія адбываюцца з выкарыстаннем ахоўнага элемента."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"адключэнне блакiроўкi экрана"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Дазваляе прыкладанням адключаць блакiроўку клавіятуры і любыя сродкі абароны, звязаныя з паролем. Прыкладам гэтага з\'яўляецца адключэнне тэлефонам блакiроўкi клавіятуры пры атрыманні ўваходнага выкліку і паўторнае ўключэнне блакiроўкi клавіятуры, калі выклік завершаны."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"запытваць узровень складанасці блакіроўкі экрана"</string> @@ -1258,7 +1260,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Запуск прыкладанняў."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Завяршэнне загрузкі."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Вы націснулі кнопку сілкавання. Звычайна ў выніку гэтага дзеяння выключаецца экран.\n\nПадчас наладжвання адбітка пальца злёгку дакраніцеся да кнопкі."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Каб завяршыць наладку, выключыце экран"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Каб скончыць наладку, выключыце экран"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Выключыць"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Працягнуць спраўджанне адбітка пальца?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Вы націснулі кнопку сілкавання. Звычайна ў выніку гэтага дзеяння выключаецца экран.\n\nКаб спраўдзіць адбітак пальца, злёгку дакраніцеся да кнопкі."</string> @@ -2325,11 +2327,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Спадарожная праграма зможа запускаць актыўныя сэрвісы з фонавага рэжыму."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Мікрафон даступны"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Мікрафон заблакіраваны"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Двайны экран"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Уключана функцыя \"Двайны экран\""</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Уключана функцыя Dual Screen"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Праграма \"<xliff:g id="APP_NAME">%1$s</xliff:g>\" выкарыстоўвае абодва экраны для паказу змесціва"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Прылада моцна нагрэлася"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функцыя \"Двайны экран\" недаступная, бо тэлефон моцна награваецца"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функцыя Dual Screen недаступная, бо тэлефон моцна награваецца"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функцыя Dual Screen недаступная"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функцыя Dual Screen недаступная, бо ўключаны рэжым энергазберажэння. Вы можаце выключыць яго ў Наладах."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Перайсці ў Налады."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 65c883a6eab5..ca223dc0f097 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дава възможност на приложението да получава информация за предпочитаната услуга за плащане чрез NFC, като например регистрирани помощни средства и местоназначение."</string> <string name="permlab_nfc" msgid="1904455246837674977">"контролиране на комуникацията в близкото поле"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Разрешава на приложението да комуникира с маркери, карти и четци, ползващи комуникация в близкото поле (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Събитие за транзакции в защитен елемент"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Разрешава на приложението да получава информация за транзакциите, които се осъществяват в защитен елемент."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"деактивиране на заключването на екрана ви"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Разрешава на приложението да деактивира заключването на клавиатурата и свързаната защита с парола. Например телефонът деактивира заключването при получаване на входящо обаждане и после го активира отново, когато обаждането завърши."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"заявяване на сложност на опцията за заключване на екрана"</string> @@ -2327,7 +2329,7 @@ <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Функцията Dual Screen е включена"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> използва и двата екрана, за да показва съдържание"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Устройството е твърде топло"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функцията за двоен екран не е налице, защото телефонът ви е твърде топъл"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функцията Dual Screen не е налице, защото телефонът ви е твърде топъл"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функцията Dual Screen не е налице"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функцията Dual Screen не е налице, защото режимът за запазване на батерията е включен. Можете да го изключите от настройките."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Към настройките"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index fe686db71c4e..ec433c35cb03 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"অ্যাপের মাধ্যমে পছন্দসই এনএফসি পেমেন্ট পরিষেবার তথ্য, যেমন রেজিস্ট্রার করার সহায়তা এবং রুট ডেস্টিনেশন সম্পর্কিত তথ্য অ্যাক্সেস করার অনুমতি দেয়।"</string> <string name="permlab_nfc" msgid="1904455246837674977">"নিয়ার ফিল্ড কমিউনিকেশন নিয়ন্ত্রণ করে"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"অ্যাপ্লিকেশানকে নিয়ার ফিল্ড কমিউনিকেশন (NFC) ট্যাগ, কার্ড এবং রিডারগুলির সাথে যোগাযোগ করতে দেয়৷"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"নিরাপদ এলিমেন্ট ট্রানজ্যাকশন ইভেন্ট"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"নিরাপদ এলিমেন্ট ব্যবহার করা হচ্ছে এমন ট্রানজ্যাকশন সম্পর্কে তথ্য পেতে অ্যাপকে অনুমতি দেয়।"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"আপনার স্ক্রিন লক অক্ষম করুন"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"কী-লক এবং যেকোনো সংশ্লিষ্ট পাসওয়ার্ড সুরক্ষা অক্ষম করতে অ্যাপ্লিকেশানটিকে মঞ্জুর করে৷ উদাহরণস্বরূপ, একটি ইনকামিং ফোন কল গ্রহণ করার সময়ে ফোনটি কী-লক অক্ষম করে, তারপরে কল শেষ হয়ে গেলে কী-লকটিকে আবার সক্ষম করে৷"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"স্ক্রিন লকের জটিলতা জানার অনুরোধ করুন"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"কম্প্যানিয়ন অ্যাপকে, ব্যাকগ্রাউন্ড থেকে ফোরগ্রাউন্ড পরিষেবা চালু করার অনুমতি দেয়।"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"মাইক্রোফোন উপলভ্য আছে"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"মাইক্রোফোন ব্লক করা হয়েছে"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ডুয়াল স্ক্রিন"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"\'ডুয়াল স্ক্রিন\' চালু করা আছে"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen চালু করা আছে"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"কন্টেন্ট দেখানোর জন্য <xliff:g id="APP_NAME">%1$s</xliff:g> দুটি ডিসপ্লে ব্যবহার করছে"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ডিভাইস খুব গরম হয়ে গেছে"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"আপনার ফোন খুব বেশি গরম হয়ে যাচ্ছে বলে \'ডুয়াল স্ক্রিন\' উপলভ্য নেই"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"আপনার ফোন খুব বেশি গরম হয়ে যাচ্ছে বলে Dual screen উপলভ্য নেই"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen উপলভ্য নেই"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"\'ব্যাটারি সেভার\' চালু করা আছে বলে Dual Screen ফিচারের সুবিধা উপলভ্য হবে না। আপনি সেটিংস থেকে এটি বন্ধ করতে পারবেন।"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"সেটিংসে যান"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 63fff4f2a920..74c148967378 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Dozvoljava aplikaciji da dobije informacije o preferiranoj usluzi plaćanja putem NFC-a kao što su registrirana pomagala i odredište rute."</string> <string name="permlab_nfc" msgid="1904455246837674977">"upravljanje NFC-om"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Dozvoljava aplikaciji komuniciranje sa NFC (komunikacija bliskog polja) oznakama, karticama i čitačima."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Događaj transakcije na sigurnom elementu"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Dozvoljava aplikaciji da prima informacije o transakcijama koje se događaju na sigurnom elementu"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"deaktivacija zaključavanja ekrana"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Omogućava aplikaciji deaktivaciju zaključane tastature i svih povezanih zaštita. Naprimjer, telefon deaktivira zaključavanje tastature kod dolaznog telefonskog poziva, a zatim ponovo aktivira zaključavanje tastature kada je poziv završen."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"zahtjev za kompleksnost zaključavanja ekrana"</string> @@ -2164,7 +2166,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"Ponovo pokreni"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Nema poslovnih aplikacija"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Nema ličnih aplikacija"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"Otvoriti poslovnu aplikaciju <xliff:g id="APP">%s</xliff:g>?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"Otvoriti aplikaciju <xliff:g id="APP">%s</xliff:g> za posao?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"Otvoriti u ličnoj aplikaciji <xliff:g id="APP">%s</xliff:g>?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"Otvoriti u poslovnoj aplikaciji <xliff:g id="APP">%s</xliff:g>?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"Pozvati iz poslovne aplikacije?"</string> @@ -2324,11 +2326,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Dozvoljava pratećoj aplikaciji da iz pozadine pokrene usluge u prvom planu."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofon je dostupan"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofon je blokiran"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dupli ekran"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dupli ekran je uključen"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen je uključen"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> koristi oba ekrana za prikazivanje sadržaja"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Uređaj je previše zagrijan"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dupli ekran nije dostupan je se telefon previše zagrijava"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen nije dostupan je se telefon previše zagrijava"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen nije dostupan"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen nije dostupan jer je Ušteda baterije uključena. To možete isključiti u Postavkama."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Idi u Postavke"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index b581d49384b2..6ce648cfc893 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet que l\'aplicació obtingui informació preferent sobre el servei de pagament per NFC, com ara complements registrats i destinacions de rutes."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlar Comunicació de camp proper (NFC)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permet que l\'aplicació es comuniqui amb les etiquetes, les targetes i els lectors de Comunicació de camp proper (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Esdeveniment de transacció d\'un element segur"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permet que l\'aplicació rebi informació sobre les transaccions que tenen lloc en un element segur."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"desactivació del bloqueig de pantalla"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permet que l\'aplicació desactivi el bloqueig del teclat i qualsevol element de seguretat de contrasenyes associat. Per exemple, el telèfon desactiva el bloqueig del teclat en rebre una trucada entrant i, a continuació, reactiva el bloqueig del teclat quan finalitza la trucada."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"sol·licita una determinada complexitat del bloqueig de pantalla"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index fc9786769799..c087fce2747d 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Umožňuje aplikaci získat informace o preferované platební službě NFC, například o registrovaných pomůckách a cíli směrování."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ovládání technologie NFC"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Umožňuje aplikaci komunikovat se štítky, kartami a čtečkami s podporou technologie NFC."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Událost transakce Secure Element"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Umožňuje aplikaci přijímat informace o transakcích probíhajících v prvku Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"vypnutí zámku obrazovky"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Umožňuje aplikaci vypnout zámek kláves a související zabezpečení heslem. Telefon například vypne zámek klávesnice při příchozím hovoru a po skončení hovoru jej zase zapne."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"zjištění složitosti zámku obrazovky"</string> @@ -1952,7 +1954,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"Aplikace <xliff:g id="APP_NAME_0">%1$s</xliff:g> momentálně není dostupná. Tato předvolba se spravuje v aplikaci <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Další informace"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Zrušit pozastavení aplikace"</string> - <string name="work_mode_off_title" msgid="6367463960165135829">"Zrušit pozast. prac. aplikací?"</string> + <string name="work_mode_off_title" msgid="6367463960165135829">"Zrušit pozastavení pracovních aplikací?"</string> <string name="work_mode_turn_on" msgid="5316648862401307800">"Zrušit pozastavení"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Stav nouze"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Aplikace není k dispozici"</string> @@ -2325,11 +2327,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Umožňuje doprovodné aplikaci spouštět z pozadí služby v popředí."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofon je dostupný"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofon je zablokován"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dvojitá obrazovka"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Je zapnutá funkce Dvojitá obrazovka"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Je zapnutá funkce Dual Screen"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> používá k zobrazení obsahu oba displeje"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Zařízení je příliš horké"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvojitá obrazovka není k dispozici, protože se telefon příliš zahřívá"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Funkce Dual Screen není k dispozici, protože se telefon příliš zahřívá"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Funkce Dual Screen není k dispozici"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Funkce Dual Screen není k dispozici, protože je zapnutý spořič baterie. Tuto možnost můžete vypnout v nastavení."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Přejít do Nastavení"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 43f6a8cdae03..d7b10d261d62 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -268,7 +268,7 @@ <string name="global_action_settings" msgid="4671878836947494217">"Indstillinger"</string> <string name="global_action_assist" msgid="2517047220311505805">"Assistance"</string> <string name="global_action_voice_assist" msgid="6655788068555086695">"Taleassistent"</string> - <string name="global_action_lockdown" msgid="2475471405907902963">"Ekstralås"</string> + <string name="global_action_lockdown" msgid="2475471405907902963">"Låsning"</string> <string name="status_bar_notification_info_overflow" msgid="3330152558746563475">"999+"</string> <string name="notification_hidden_text" msgid="2835519769868187223">"Ny notifikation"</string> <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"Fysisk tastatur"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tillader, at appen får foretrukne oplysninger vedrørende NFC-betalingstjeneste, f.eks. registrerede hjælpemidler og rutedestinationer."</string> <string name="permlab_nfc" msgid="1904455246837674977">"administrere Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Tillader, at appen kan kommunikere med NFC-tags (Near Field Communication), -kort og -læsere."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element-transaktion"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Tillader, at appen kan modtage oplysninger om transaktioner, der foretages via Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"deaktivere din skærmlås"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Tillader, at appen kan deaktivere tastaturlåsen og anden form for tilknyttet adgangskodesikkerhed. Telefonen deaktiverer f.eks. tastaturlåsen ved indgående telefonopkald og aktiverer tastaturlåsen igen, når opkaldet er afsluttet."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"anmode om skærmlåsens kompleksitet"</string> @@ -665,15 +667,15 @@ </string-array> <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Noget gik galt. Prøv igen."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Ikon for fingeraftryk"</string> - <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ansigtslås"</string> - <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Der er et problem med Ansigtslås"</string> + <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Ansigtsoplåsning"</string> + <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Der er et problem med Ansigtsoplåsning"</string> <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Tryk for at slette din ansigtsmodel, og tilføj derefter dit ansigt igen"</string> - <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfigurer ansigtslås"</string> + <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfigurer ansigtsoplåsning"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Lås din telefon op ved at kigge på den"</string> - <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Hvis du vil bruge ansigtslåsen, skal du aktivere "<b>"Kameraadgang"</b>" under Indstillinger > Privatliv"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Hvis du vil bruge ansigtsoplåsning, skal du aktivere "<b>"Kameraadgang"</b>" under Indstillinger > Privatliv"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfigurer flere måder at låse op på"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Tryk for at tilføje et fingeraftryk"</string> - <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Oplåsning med fingeraftryk"</string> + <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Fingeroplåsning"</string> <string name="fingerprint_recalibrate_notification_title" msgid="2406561052064558497">"Fingeraftrykssensoren kan ikke bruges"</string> <string name="fingerprint_recalibrate_notification_content" msgid="8519935717822194943">"Få den repareret."</string> <string name="face_acquired_insufficient" msgid="6889245852748492218">"Din ansigtsmodel kan ikke oprettes. Prøv igen."</string> @@ -706,19 +708,19 @@ <string-array name="face_acquired_vendor"> </string-array> <string name="face_error_hw_not_available" msgid="5085202213036026288">"Ansigt ikke verificeret. Hardware ikke tilgængelig."</string> - <string name="face_error_timeout" msgid="2598544068593889762">"Prøv ansigtslås igen"</string> + <string name="face_error_timeout" msgid="2598544068593889762">"Prøv ansigtsoplåsning igen"</string> <string name="face_error_no_space" msgid="5649264057026021723">"Der kan ikke gemmes nye ansigtsdata. Slet et gammelt først."</string> <string name="face_error_canceled" msgid="2164434737103802131">"Ansigtshandlingen blev annulleret."</string> - <string name="face_error_user_canceled" msgid="5766472033202928373">"Ansigtslås blev annulleret af brugeren"</string> + <string name="face_error_user_canceled" msgid="5766472033202928373">"Ansigtsoplåsning blev annulleret af brugeren"</string> <string name="face_error_lockout" msgid="7864408714994529437">"Du har prøvet for mange gange. Prøv igen senere."</string> - <string name="face_error_lockout_permanent" msgid="8533257333130473422">"Du har brugt for mange forsøg. Ansigtslås er utilgængelig."</string> + <string name="face_error_lockout_permanent" msgid="8533257333130473422">"Du har brugt for mange forsøg. Ansigtsoplåsning er utilgængelig."</string> <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Du har brugt for mange forsøg. Angiv skærmlåsen i stedet."</string> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Ansigtet kan ikke genkendes. Prøv igen."</string> - <string name="face_error_not_enrolled" msgid="1134739108536328412">"Du har ikke konfigureret ansigtslås."</string> - <string name="face_error_hw_not_present" msgid="7940978724978763011">"Ansigtslås understøttes ikke på denne enhed"</string> + <string name="face_error_not_enrolled" msgid="1134739108536328412">"Du har ikke konfigureret ansigtsoplåsning."</string> + <string name="face_error_hw_not_present" msgid="7940978724978763011">"Ansigtsoplåsning understøttes ikke på denne enhed"</string> <string name="face_error_security_update_required" msgid="5076017208528750161">"Sensoren er midlertidigt deaktiveret."</string> <string name="face_name_template" msgid="3877037340223318119">"Ansigt <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="5854024256907828015">"Brug ansigtslås"</string> + <string name="face_app_setting_name" msgid="5854024256907828015">"Brug ansigtsoplåsning"</string> <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Brug ansigts- eller skærmlås"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Brug dit ansigt for at fortsætte"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Brug din ansigts- eller skærmlås for at fortsætte"</string> @@ -752,8 +754,8 @@ <string name="permdesc_register_call_provider" msgid="4201429251459068613">"Tillader, at appen registrerer nye telefonforbindelser."</string> <string name="permlab_connection_manager" msgid="3179365584691166915">"administrere telefonforbindelser"</string> <string name="permdesc_connection_manager" msgid="1426093604238937733">"Tillader, at appen administrerer telefonforbindelser."</string> - <string name="permlab_bind_incall_service" msgid="5990625112603493016">"interager med skærmen under opkald"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"Tillader, at appen styrer, hvornår og hvordan brugeren ser skærmen for indgående opkald."</string> + <string name="permlab_bind_incall_service" msgid="5990625112603493016">"interager med Call Screen-skærmen"</string> + <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"Tillader, at appen styrer, hvornår og hvordan brugeren ser Call Screen-skærmen."</string> <string name="permlab_bind_connection_service" msgid="5409268245525024736">"interagere med telefonitjenester"</string> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"Tillader, at appen kan interagere med telefonitjenester for at foretage/modtage opkald."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"leverer brugeroplevelsen under opkald"</string> @@ -971,7 +973,7 @@ <string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"Prøv igen"</string> <string name="lockscreen_password_wrong" msgid="8605355913868947490">"Prøv igen"</string> <string name="lockscreen_storage_locked" msgid="634993789186443380">"Lås op for at se alle funktioner og data"</string> - <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Det maksimale antal forsøg på at bruge ansigtslås er overskredet"</string> + <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Det maksimale antal forsøg på at bruge ansigtsoplåsning er overskredet"</string> <string name="lockscreen_missing_sim_message_short" msgid="1229301273156907613">"Intet SIM-kort"</string> <string name="lockscreen_missing_sim_message" product="tablet" msgid="3986843848305639161">"Intet SIM-kort i tabletten."</string> <string name="lockscreen_missing_sim_message" product="tv" msgid="3903140876952198273">"Intet SIM-kort i din Android TV-enhed."</string> @@ -1041,7 +1043,7 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"Udvid oplåsningsområdet."</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"Lås op ved at stryge."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"Lås op med mønster."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"Ansigtslås."</string> + <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"Ansigtsoplåsning."</string> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"Lås op med pinkode."</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"Lås op ved hjælp af pinkoden til SIM-kortet."</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"Lås op ved hjælp af PUK-koden til SIM-kortet."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 55e845586ef1..d6c751956f4a 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ermöglicht der App, Informationen zum bevorzugten NFC-Zahlungsdienst abzurufen, etwa registrierte Hilfsmittel oder das Routenziel."</string> <string name="permlab_nfc" msgid="1904455246837674977">"Nahfeldkommunikation steuern"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Ermöglicht der App die Kommunikation mit Tags für die Nahfeldkommunikation, Karten und Readern"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Transaktion in einem Secure Element"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Ermöglicht der App, Informationen zu Transaktionen abzurufen, die in einem Secure Element stattfinden."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"Displaysperre deaktivieren"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Ermöglicht der App, die Tastensperre sowie den damit verbundenen Passwortschutz zu deaktivieren. Das Telefon deaktiviert die Tastensperre beispielsweise, wenn ein Anruf eingeht, und aktiviert sie wieder, nachdem das Gespräch beendet wurde."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"Komplexitätsstufe der Displaysperre anfragen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 5f7306ade927..ff447d5b5d7a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Επιτρέπει στην εφαρμογή να λαμβάνει πληροφορίες προτιμώμενης υπηρεσίας πληρωμής NFC, όπως καταχωρημένα βοηθήματα και προορισμό διαδρομής."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ελέγχει την Επικοινωνία κοντινού πεδίου (FNC)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Επιτρέπει στην εφαρμογή την επικοινωνία με ετικέτες, κάρτες και αναγνώστες της Επικοινωνίας κοντινού πεδίου (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Συμβάν συναλλαγής ασφαλούς στοιχείου"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Επιτρέπει στην εφαρμογή να λαμβάνει πληροφορίες σχετικά με συναλλαγές που πραγματοποιούνται σε ένα ασφαλές στοιχείο."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"απενεργοποιεί το κλείδωμα οθόνης"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Επιτρέπει στην εφαρμογή την απενεργοποίηση του κλειδώματος πληκτρολογίου και άλλης σχετικής ασφάλειας με κωδικό πρόσβασης. Για παράδειγμα, το κλείδωμα πληκτρολογίου στο τηλέφωνο απενεργοποιείται όταν λαμβάνεται εισερχόμενη τηλεφωνική κλήση και ενεργοποιείται ξανά όταν η κλήση τερματιστεί."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"υποβολή αιτήματος για πολυπλοκότητα οθόνης κλειδώματος"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 73b2968ab9cc..4bc294a351f1 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string> <string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element transaction event"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Allows the app to receive information about transactions happening on a Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"disable your screen lock"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"request screen lock complexity"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 73017c11ac25..0549d254025c 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred nfc payment service information like registered aids and route destination."</string> <string name="permlab_nfc" msgid="1904455246837674977">"control Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Allows the app to communicate with Near Field Communication (NFC) tags, cards, and readers."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element transaction event"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Allows the app to receive information about transactions happening on a Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"disable your screen lock"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"request screen lock complexity"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index aeabd0096974..7674bab12388 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string> <string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element transaction event"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Allows the app to receive information about transactions happening on a Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"disable your screen lock"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"request screen lock complexity"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 92f989728902..7821558b05ae 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred NFC payment service information, such as registered aids and route destination."</string> <string name="permlab_nfc" msgid="1904455246837674977">"control Near-Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Allows the app to communicate with Near Field Communication (NFC) tags, cards and readers."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element transaction event"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Allows the app to receive information about transactions happening on a Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"disable your screen lock"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"request screen lock complexity"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index b560c017b7f8..b916de1f2573 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Allows the app to get preferred nfc payment service information like registered aids and route destination."</string> <string name="permlab_nfc" msgid="1904455246837674977">"control Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Allows the app to communicate with Near Field Communication (NFC) tags, cards, and readers."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element transaction event"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Allows the app to receive information about transactions happening on a Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"disable your screen lock"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Allows the app to disable the keylock and any associated password security. For example, the phone disables the keylock when receiving an incoming phone call, then re-enables the keylock when the call is finished."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"request screen lock complexity"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index b39f86231e19..1f620d9fb7d8 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que la app reciba información del servicio de pago NFC preferido, como el servicio de asistencia registrado y el destino de la ruta."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlar la Transmisión de datos en proximidad"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permite que la aplicación se comunique con lectores, tarjetas y etiquetas de Comunicación de campo cercano (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Evento de transacción de Elemento seguro"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permite que la app reciba información sobre transacciones que ocurren en un Elemento seguro."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"desactivar el bloqueo de pantalla"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permite que la aplicación desactive el bloqueo del teclado y cualquier protección con contraseña asociada. Por ejemplo, el dispositivo puede desactivar el bloqueo del teclado cuando recibe una llamada telefónica y volver a activarlo cuando finaliza la llamada."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"solicitar complejidad del bloqueo de pantalla"</string> @@ -2324,20 +2326,20 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Permite que una aplicación complementaria inicie servicios en primer plano desde el segundo plano."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"El micrófono está disponible"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"El micrófono está bloqueado"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Pantalla dual"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"La función Dual Screen está activada"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> está usando ambas pantallas para mostrar contenido"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"El dispositivo está muy caliente"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"La Pantalla dual no está disponible porque el teléfono se está calentando demasiado"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen no está disponible porque el teléfono se está calentando demasiado"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen no está disponible"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen no está disponible porque el Ahorro de batería está activado. Puedes desactivar esta opción en la Configuración."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ir a Configuración"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desactivar"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Se configuró <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%s</xliff:g>. Presiona para cambiar esta opción."</string> - <string name="keyboard_layout_notification_two_selected_message" msgid="1876349944065922950">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g> y <xliff:g id="LAYOUT_2">%2$s</xliff:g>. Presiona para cambiar esta opción."</string> - <string name="keyboard_layout_notification_three_selected_message" msgid="280734264593115419">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> y <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Presiona para cambiar esta opción."</string> - <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> y <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Presiona para cambiarlo."</string> + <string name="keyboard_layout_notification_two_selected_message" msgid="1876349944065922950">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>. Presiona para cambiar esta opción."</string> + <string name="keyboard_layout_notification_three_selected_message" msgid="280734264593115419">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Presiona para cambiar esta opción."</string> + <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Diseño de teclado establecido en <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Presiona para cambiar esta opción."</string> <string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string> <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Presiona para ver los teclados"</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 4b58a6f94ee9..fc34e3e65f87 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que la aplicación obtenga información sobre el servicio de pago por NFC preferido, como identificadores de aplicación registrados y destinos de rutas."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlar Comunicación de campo cercano (NFC)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permite que la aplicación se comunique con lectores, tarjetas y etiquetas de Comunicación de campo cercano (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Evento de transacción de elemento seguro"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permite que la aplicación reciba información sobre las transacciones que ocurren en un elemento seguro."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"inhabilitar el bloqueo de pantalla"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permite que la aplicación inhabilite el bloqueo del teclado y cualquier protección con contraseña asociada. Por ejemplo, el teléfono puede inhabilitar el bloqueo del teclado cuando se recibe una llamada telefónica y volver a habilitarlo cuando finaliza la llamada."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"solicitar complejidad del bloqueo de pantalla"</string> @@ -1371,7 +1373,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Se ha detectado un accesorio de audio analógico"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"El dispositivo adjunto no es compatible con este teléfono. Toca para obtener más información."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"Depuración por USB activa"</string> - <string name="adb_active_notification_message" msgid="5617264033476778211">"Toca para desactivar depuración USB"</string> + <string name="adb_active_notification_message" msgid="5617264033476778211">"Toca para desactivar la depuración USB"</string> <string name="adb_active_notification_message" product="tv" msgid="6624498401272780855">"Seleccionar para inhabilitar la depuración por USB"</string> <string name="adbwifi_active_notification_title" msgid="6147343659168302473">"Depuración inalámbrica conectada"</string> <string name="adbwifi_active_notification_message" msgid="930987922852867972">"Toca para desactivar la depuración inalámbrica"</string> @@ -1568,7 +1570,7 @@ <string name="shareactionprovider_share_with" msgid="2753089758467748982">"Compartir con"</string> <string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"Compartir con <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="content_description_sliding_handle" msgid="982510275422590757">"Mantén pulsado el icono de desbloqueo y deslízalo."</string> - <string name="description_target_unlock_tablet" msgid="7431571180065859551">"Desliza el dedo para desbloquear."</string> + <string name="description_target_unlock_tablet" msgid="7431571180065859551">"Desliza para desbloquear"</string> <string name="action_bar_home_description" msgid="1501655419158631974">"Ir al escritorio"</string> <string name="action_bar_up_description" msgid="6611579697195026932">"Desplazarse hacia arriba"</string> <string name="action_menu_overflow_description" msgid="4579536843510088170">"Más opciones"</string> @@ -2335,8 +2337,8 @@ <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Desactivar"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> configurado"</string> <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%s</xliff:g>. Toca para cambiarlo."</string> - <string name="keyboard_layout_notification_two_selected_message" msgid="1876349944065922950">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g> y <xliff:g id="LAYOUT_2">%2$s</xliff:g>. Toca para cambiarlo."</string> - <string name="keyboard_layout_notification_three_selected_message" msgid="280734264593115419">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g> y <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Toca para cambiarlo."</string> + <string name="keyboard_layout_notification_two_selected_message" msgid="1876349944065922950">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>. Toca para cambiarlo."</string> + <string name="keyboard_layout_notification_three_selected_message" msgid="280734264593115419">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>. Toca para cambiarlo."</string> <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"Diseño del teclado definido como <xliff:g id="LAYOUT_1">%1$s</xliff:g>, <xliff:g id="LAYOUT_2">%2$s</xliff:g>, <xliff:g id="LAYOUT_3">%3$s</xliff:g>… Toca para cambiarlo."</string> <string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"Teclados físicos configurados"</string> <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"Toca para ver los teclados"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index e4c99482166d..eaa1266a3ec1 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Võimaldab rakendusel hankida eelistatud NFC-makseteenuse teavet (nt registreeritud abi ja marsruudi sihtkoht)."</string> <string name="permlab_nfc" msgid="1904455246837674977">"lähiväljaside juhtimine"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Võimaldab rakendusel suhelda lähiväljaside (NFC) märgendite, kaartide ja lugeritega."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Turvaelemendiga tehingu sündmus"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Võimaldab rakendusel võtta vastu teavet tehingute kohta, mis toimuvad turvaelemendi abil."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"keelake ekraanilukk"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Võimaldab rakendusel keelata klahviluku ja muu seotud parooli turvalisuse. Näiteks keelab telefon klahviluku sissetuleva kõne vastuvõtmisel ja lubab klahviluku uuesti, kui kõne on lõpetatud."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ekraaniluku keerukuse taotlemine"</string> @@ -2323,13 +2325,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Lubab kaasrakendusel taustal käivitada esiplaanil olevaid teenuseid."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofon on saadaval"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofon on blokeeritud"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Kahe ekraani režiim"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Kahe ekraani režiim on sisse lülitatud"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screeni režiim on sisse lülitatud"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> kasutab sisu kuvamiseks mõlemat ekraani"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Seade on liiga kuum"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Kahe ekraani režiim pole saadaval, kuna teie telefon läheb liiga kuumaks"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Kahe ekraani režiim ei ole saadaval"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Kahe ekraani režiim ei ole saadaval, kuna akusäästja on sisse lülitatud. Saate selle seadetes välja lülitada."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screeni režiim pole saadaval, kuna teie telefon läheb liiga kuumaks"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screeni režiim ei ole saadaval"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screeni režiim ei ole saadaval, kuna akusäästja on sisse lülitatud. Saate selle seadetes välja lülitada."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ava seaded"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Lülita välja"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> on seadistatud"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index a165af18472e..96967dc5efb3 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"NFC bidezko ordainketa-zerbitzu lehenetsiari buruzko informazioa jasotzeko baimena ematen die aplikazioei, hala nola erregistratutako laguntzaileak eta ibilbidearen helmuga."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrolatu Near Field Communication komunikazioa"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Near Field Communication (NFC) etiketekin, txartelekin eta irakurgailuekin komunikatzeko baimena ematen die aplikazioei."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Elementu seguruetako transakzioen gertaerak"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Elementu seguru batean egiten ari diren transakzioei buruzko informazioa jasotzeko baimena ematen dio aplikazioari."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"desgaitu pantailaren blokeoa"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Teklen blokeoa eta erlazionatutako pasahitz-segurtasuna desgaitzeko baimena ematen die aplikazioei. Adibidez, telefonoak teklen blokeoa desgaitzen du telefono-deiak jasotzen dituenean, eta berriro gaitzen du deiak amaitzean."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"eskatu pantailaren blokeoa konplexua izatea"</string> @@ -670,7 +672,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Sakatu hau aurpegi-eredua ezabatzeko eta, gero, gehitu aurpegia berriro"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Konfiguratu Aurpegi bidez desblokeatzea"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Telefonoa desblokeatzeko, begira iezaiozu"</string> - <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Aurpegi bidez desblokeatzeko aukera erabiltzeko, aktibatu "<b>"kamera erabiltzeko baimena"</b>" Ezarpenak > Pribatutasuna atalean"</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Aurpegi bidez desblokeatzeko eginbidea erabiltzeko, aktibatu "<b>"kamera erabiltzeko baimena"</b>" Ezarpenak > Pribatutasuna atalean"</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Konfiguratu telefonoa desblokeatzeko modu gehiago"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Sakatu hau hatz-marka bat gehitzeko"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Hatz-marka bidez desblokeatzea"</string> @@ -934,7 +936,7 @@ <string name="relationTypeAssistant" msgid="4057605157116589315">"Laguntzailea"</string> <string name="relationTypeBrother" msgid="7141662427379247820">"Anaia/Neba"</string> <string name="relationTypeChild" msgid="9076258911292693601">"Semea/Alaba"</string> - <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"Izatezko bikotea"</string> + <string name="relationTypeDomesticPartner" msgid="7825306887697559238">"Izatezko bikotekidea"</string> <string name="relationTypeFather" msgid="3856225062864790596">"Aita"</string> <string name="relationTypeFriend" msgid="3192092625893980574">"Laguna"</string> <string name="relationTypeManager" msgid="2272860813153171857">"Kudeatzailea"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Aurreko planoko zerbitzuak atzeko planotik abiarazteko baimena ematen die aplikazio osagarriei."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Erabilgarri dago mikrofonoa"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Blokeatuta dago mikrofonoa"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Bi pantailako modua"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Bi pantailako modua aktibatuta dago"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen aktibatuta dago"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> bi pantailak erabiltzen ari da edukia erakusteko"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Gailua beroegi dago"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Bi pantailako modua ez dago erabilgarri telefonoa berotzen ari delako"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen ez dago erabilgarri telefonoa berotzen ari delako"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ez dago erabilgarri"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ez dago erabilgarri, bateria-aurreztailea aktibatuta dagoelako. Aukera hori desaktibatzeko, joan ezarpenetara."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Joan Ezarpenak atalera"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 1813fc4f0439..68ea0530fb74 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -393,7 +393,7 @@ <string name="permdesc_killBackgroundProcesses" msgid="2357013583055434685">"به برنامه امکان میدهد به فرآیندهای پسزمینه سایر برنامهها پایان دهد. این ممکن است باعث شود سایر برنامهها متوقف شوند."</string> <string name="permlab_systemAlertWindow" msgid="5757218350944719065">"این برنامه میتواند روی برنامههای دیگر ظاهر شود"</string> <string name="permdesc_systemAlertWindow" msgid="1145660714855738308">"این برنامه میتواند روی برنامههای دیگر یا سایر قسمتهای صفحه ظاهر شود. ممکن است در عملکرد معمول برنامههای دیگر اختلال ایجاد کند و شیوه نمایش آنها را تغییر دهد."</string> - <string name="permlab_hideOverlayWindows" msgid="6382697828482271802">"پنهان کردن همپوشانی برنامههای دیگر"</string> + <string name="permlab_hideOverlayWindows" msgid="6382697828482271802">"پنهان کردن رونهاد برنامههای دیگر"</string> <string name="permdesc_hideOverlayWindows" msgid="5660242821651958225">"این برنامه میتواند از سیستم بخواهد تا همپوشانیهای ایجادشده توسط برنامههای دیگر را روی برنامه نشان ندهد."</string> <string name="permlab_runInBackground" msgid="541863968571682785">"اجرا شدن در پسزمینه"</string> <string name="permdesc_runInBackground" msgid="4344539472115495141">"این برنامه میتواند در پسزمینه اجرا شود. ممکن است شارژ باتری زودتر مصرف شود."</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"به برنامه اجازه میدهد اطلاعات ترجیحی سرویس پولی NFC، مانند کمکهای ثبتشده و مقصد مسیر را دریافت کند."</string> <string name="permlab_nfc" msgid="1904455246837674977">"کنترل ارتباط راه نزدیک"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"به برنامه اجازه میدهد تا با تگهای NFC، کارتها و فایلخوان ارتباط برقرار کند."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"رویداد تراکنش Secure Element"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"به برنامه اجازه میدهد اطلاعات مربوط به تراکنشهایی را که در Secure Element انجام میشود دریافت کند."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"غیرفعال کردن قفل صفحه شما"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"به برنامه امکان میدهد قفل کلید و هر گونه امنیت گذرواژه مرتبط را غیرفعال کند. بهعنوان مثال تلفن هنگام دریافت یک تماس تلفنی ورودی قفل کلید را غیرفعال میکند و بعد از پایان تماس، قفل کلید را دوباره فعال میکند."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"درخواست پیچیدگی قفل صفحه"</string> @@ -1129,9 +1131,9 @@ <string name="duration_hours_relative_future" msgid="6670440478481140565">"{count,plural, =1{# ساعت}one{# ساعت}other{# ساعت}}"</string> <string name="duration_days_relative_future" msgid="8870658635774250746">"{count,plural, =1{# روز}one{# روز}other{# روز}}"</string> <string name="duration_years_relative_future" msgid="8855853883925918380">"{count,plural, =1{# سال}one{# سال}other{# سال}}"</string> - <string name="VideoView_error_title" msgid="5750686717225068016">"مشکل در ویدئو"</string> - <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"متأسفیم، این ویدئو برای پخش جریانی با این دستگاه معتبر نیست."</string> - <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"پخش این ویدئو ممکن نیست."</string> + <string name="VideoView_error_title" msgid="5750686717225068016">"مشکل در ویدیو"</string> + <string name="VideoView_error_text_invalid_progressive_playback" msgid="3782449246085134720">"متأسفیم، این ویدیو برای پخش جریانی با این دستگاه معتبر نیست."</string> + <string name="VideoView_error_text_unknown" msgid="7658683339707607138">"پخش این ویدیو ممکن نیست."</string> <string name="VideoView_error_button" msgid="5138809446603764272">"تأیید"</string> <string name="relative_time" msgid="8572030016028033243">"<xliff:g id="DATE">%1$s</xliff:g>، <xliff:g id="TIME">%2$s</xliff:g>"</string> <string name="noon" msgid="8365974533050605886">"ظهر"</string> @@ -1592,7 +1594,7 @@ <string name="data_usage_restricted_body" msgid="5338694433686077733">"برای برداشتن محدودیت ضربه بزنید."</string> <string name="data_usage_rapid_title" msgid="2950192123248740375">"مصرف بالای داده تلفن همراه"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"برنامههای شما بیش از معمول داده مصرف کردهاند"</string> - <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> بیش از معمول داده مصرف کرده است"</string> + <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> بیش از معمول داده مصرف کرده است"</string> <string name="ssl_certificate" msgid="5690020361307261997">"گواهی امنیتی"</string> <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"این گواهی معتبر است."</string> <string name="issued_to" msgid="5975877665505297662">"صادرشده برای:"</string> @@ -1639,7 +1641,7 @@ <string name="media_route_status_in_use" msgid="6684112905244944724">"در حال استفاده"</string> <string name="display_manager_built_in_display_name" msgid="1015775198829722440">"صفحه نمایش از خود"</string> <string name="display_manager_hdmi_display_name" msgid="1022758026251534975">"صفحه HDMI"</string> - <string name="display_manager_overlay_display_name" msgid="5306088205181005861">"همپوشانی #<xliff:g id="ID">%1$d</xliff:g>"</string> + <string name="display_manager_overlay_display_name" msgid="5306088205181005861">"رونهاد #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="1480158037150469170">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="2810034719482834679">"، امن"</string> <string name="kg_forgot_pattern_button_text" msgid="406145459223122537">"الگو را فراموش کردهاید"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"لغو مکث"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"برنامه کاریای وجود ندارد"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"برنامه شخصیای وجود ندارد"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> کاری باز شود؟"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> کاری باز شود؟"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"در <xliff:g id="APP">%s</xliff:g> شخصی باز شود؟"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"در <xliff:g id="APP">%s</xliff:g> کاری باز شود؟"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"تماس ازطریق برنامه کاری برقرار شود؟"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"به برنامه همراه اجازه میدهد سرویسهای پیشنما را از پسزمینه راهاندازی کند."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"میکروفون دردسترس است"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"میکروفون مسدود شد"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"صفحه دوتایی"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"«صفحه دوتایی» روشن است"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen روشن است"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> از هر دو نمایشگر برای نمایش محتوا استفاده میکند"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"دستگاه بیشازحد گرم شده است"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"«صفحه دوتایی» دردسترس نیست زیرا تلفن بیشازحد گرم شده است"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen دردسترس نیست زیرا تلفن بیشازحد گرم شده است"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen دردسترس نیست"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen دردسترس نیست چون «بهینهسازی باتری» روشن است. میتوانید این ویژگی را در «تنظیمات» خاموش کنید."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"رفتن به تنظیمات"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 5f120c58d766..03df522f1788 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Sallii sovelluksen noutaa tietoja rekisteröidyistä sovellustunnuksista, maksureitin kohteesta ja muita ensisijaisia NFC-maksupalvelutietoja."</string> <string name="permlab_nfc" msgid="1904455246837674977">"hallitse Near Field Communication -tunnistusta"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Antaa sovelluksen kommunikoida NFC (Near Field Communication) -tagien, -korttien ja -lukijoiden kanssa."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element ‑maksutapahtuma"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Sallii sovelluksen vastaanottaa tietoa Secure Elementissä tapahtuvista maksutapahtumista."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"poista näytön lukitus käytöstä"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Antaa sovelluksen ottaa näppäinlukon ja siihen liittyvän salasanasuojauksen pois käytöstä. Esimerkki: puhelin poistaa näppäinlukon käytöstä puhelun saapuessa ja asettaa lukon takaisin käyttöön puhelun päättyessä."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"pyytää näytön lukituksen monimutkaisuutta"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index e72b41e2bf39..869b3d7f21e5 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -312,14 +312,14 @@ <string name="permgrouplab_storage" msgid="17339216290379241">"Fichiers"</string> <string name="permgroupdesc_storage" msgid="5378659041354582769">"accéder aux fichiers sur votre appareil"</string> <string name="permgrouplab_readMediaAural" msgid="1858331312624942053">"Musique et audio"</string> - <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accédez aux fichiers musicaux et audio sur votre appareil"</string> + <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accéder aux fichiers musicaux et audio sur votre appareil"</string> <string name="permgrouplab_readMediaVisual" msgid="4724874717811908660">"Photos et vidéos"</string> - <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accédez aux photos et aux vidéos sur votre appareil"</string> + <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accéder aux photos et aux vidéos sur votre appareil"</string> <string name="permgrouplab_microphone" msgid="2480597427667420076">"Microphone"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"enregistrer des fichiers audio"</string> <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Activité physique"</string> <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"accéder à vos activités physiques"</string> - <string name="permgrouplab_camera" msgid="9090413408963547706">"appareil photo"</string> + <string name="permgrouplab_camera" msgid="9090413408963547706">"Appareil photo"</string> <string name="permgroupdesc_camera" msgid="7585150538459320326">"prendre des photos et filmer des vidéos"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Appareils à proximité"</string> <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"découvrir les appareils à proximité et s\'y connecter"</string> @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet à l\'application d\'obtenir de l\'information sur le service préféré de paiement CCP comme les aides enregistrées et la route de destination."</string> <string name="permlab_nfc" msgid="1904455246837674977">"gérer la communication en champ proche"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permet à l\'application de communiquer avec des bornes, des cartes et des lecteurs compatibles avec la technologie CCP (communication en champ proche)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Événement de transaction relatif à un élément sécurisé"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Autorise l\'application à recevoir des informations relatives aux transactions effectuées sur un élément sécurisé."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"désactiver le verrouillage de l\'écran"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité par mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"demander la complexité du verrouillage d\'écran"</string> @@ -807,7 +809,7 @@ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouiller la tablette ou effacer toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint"</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Surveillez le nombre de mots de passe incorrects entrés lors du déverrouillage de l\'écran et verrouillez votre appareil Android TV ou effacez toutes les données qu\'il contient en cas d\'un nombre trop élevé de tentatives."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Surveillez le nombre de mots de passe incorrects entrés lors du déverrouillage de l\'écran et verrouillez le système d\'infodivertissement ou effacez toutes ses données en cas d\'un nombre trop élevé de tentatives."</string> - <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Contrôler le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran, puis verrouille le téléphone ou efface toutes ses données si le nombre maximal de tentatives de saisie du mot de passe est atteint."</string> + <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Le nombre de mots de passe incorrects saisis pour le déverrouillage de l\'écran est contrôlé. Si le nombre maximal de tentatives de saisie du mot de passe est atteint, le téléphone est verrouillé ou toutes ses données sont effacées."</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"Surveille le nombre de mots de passe incorrects entrés lors du déverrouillage de l\'écran et verrouille la tablette ou efface toutes les données de l\'utilisateur en cas d\'un nombre trop élevé de tentatives."</string> <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"Surveillez le nombre de mots de passe incorrects entrés lors du déverrouillage de l\'écran et verrouillez votre appareil Android TV ou effacez toutes les données de l\'utilisateur en cas d\'un nombre trop élevé de tentatives."</string> <string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"Surveillez le nombre de mots de passe incorrects entrés lors du déverrouillage de l\'écran et verrouillez le système d\'infodivertissement ou effacez toutes les données de ce profil en cas d\'un nombre trop élevé de tentatives."</string> @@ -820,7 +822,7 @@ <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="automotive" msgid="660804547737323300">"Effacez les données du système d\'infodivertissement sans avertissement en rétablissant les paramètres par défaut."</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="policydesc_wipeData" product="default" msgid="8036084184768379022">"Les données du téléphone sont effacées sans avertissement en rétablissant les paramètres par défaut."</string> <string name="policylab_wipeData_secondaryUser" product="automotive" msgid="115034358520328373">"Effacer les données de profil"</string> <string name="policylab_wipeData_secondaryUser" product="default" 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> @@ -2324,11 +2326,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Permet à une application compagnon en arrière-plan de lancer des services d\'avant-plan."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Le microphone est accessible"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Le microphone est bloqué"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Double écran"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Le double écran est activé"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen activé"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> utilise les deux écrans pour afficher le contenu"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"L\'appareil est trop chaud"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Le double écran n\'est pas accessible, car votre téléphone est trop chaud"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen n\'est pas accessible, car votre téléphone est trop chaud"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"La fonctionnalité Dual Screen n\'est pas accessible"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"La fonctionnalité Dual Screen n\'est pas accessible, car l\'économiseur de pile est activé. Vous pouvez désactiver cette option dans les paramètres."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Accéder aux paramètres"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index c162672c7ce0..9cf15bb5b6a7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permet à l\'application d\'obtenir des informations sur le service de paiement NFC préféré, y compris les ID d\'applications et les destinations de routage enregistrés."</string> <string name="permlab_nfc" msgid="1904455246837674977">"contrôler la communication en champ proche"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permet à l\'application de communiquer avec des tags, des cartes et des lecteurs compatibles avec la technologie NFC (communication en champ proche)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Événement de transaction sur un composant sécurisé"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permet à l\'appli de recevoir des informations sur les transactions qui ont lieu sur un composant sécurisé."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"Désactiver le verrouillage de l\'écran"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permet à l\'application de désactiver le verrouillage des touches et toute mesure de sécurité via mot de passe associée. Par exemple, votre téléphone désactive le verrouillage des touches lorsque vous recevez un appel, puis le réactive lorsque vous raccrochez."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"demander la complexité du verrouillage de l\'écran"</string> @@ -1645,7 +1647,7 @@ <string name="display_manager_overlay_display_secure_suffix" msgid="2810034719482834679">", sécurisé"</string> <string name="kg_forgot_pattern_button_text" msgid="406145459223122537">"J\'ai oublié le schéma"</string> <string name="kg_wrong_pattern" msgid="1342812634464179931">"Schéma incorrect."</string> - <string name="kg_wrong_password" msgid="2384677900494439426">"Mot de passe incorrect."</string> + <string name="kg_wrong_password" msgid="2384677900494439426">"Mot de passe incorrect"</string> <string name="kg_wrong_pin" msgid="3680925703673166482">"Code PIN incorrect."</string> <string name="kg_pattern_instructions" msgid="8366024510502517748">"Tracez votre schéma"</string> <string name="kg_sim_pin_instructions" msgid="6479401489471690359">"Saisissez le code PIN de la carte SIM."</string> @@ -2123,7 +2125,7 @@ <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Le Bluetooth restera activé en mode Avion"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Chargement…"</string> <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fichier}one{{file_name} + # fichier}many{{file_name} + # fichiers}other{{file_name} + # fichiers}}"</string> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucun destinataire recommandé"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Liste des applications"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Cette application n\'a pas reçu l\'autorisation d\'enregistrer des contenus audio, mais peut le faire via ce périphérique USB."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Accueil"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index 18fd29270d97..96400e38138f 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -256,7 +256,7 @@ <string name="bugreport_option_interactive_summary" msgid="8493795476325339542">"Usa esta opción na maioría das circunstancias. Permíteche realizar un seguimento do progreso do informe, introducir máis detalles sobre o problema e facer capturas de pantalla. É posible que omita algunhas seccións menos usadas para as que se tarda máis en facer o informe."</string> <string name="bugreport_option_full_title" msgid="7681035745950045690">"Informe completo"</string> <string name="bugreport_option_full_summary" msgid="1975130009258435885">"Usa esta opción para que a interferencia sexa mínima cando o teu dispositivo non responda ou funcione demasiado lento, ou ben cando precises todas as seccións do informe. Non poderás introducir máis detalles nin facer máis capturas de pantalla."</string> - <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundo.}other{Vaise facer unha captura de pantalla para o informe de erro dentro de # segundos.}}"</string> + <string name="bugreport_countdown" msgid="6418620521782120755">"{count,plural, =1{Vaise facer unha captura de pantalla para o informe de erros dentro de # segundo.}other{Vaise facer unha captura de pantalla para o informe de erros dentro de # segundos.}}"</string> <string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Realizouse a captura de pantalla co informe de erros"</string> <string name="bugreport_screenshot_failure_toast" msgid="6736320861311294294">"Produciuse un erro ao realizar a captura de pantalla co informe de erros"</string> <string name="global_action_toggle_silent_mode" msgid="8464352592860372188">"Modo silencioso"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que a aplicación obteña información do servizo de pago de NFC preferido, como as axudas rexistradas e o destino da ruta."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlar Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permite á aplicación comunicarse con etiquetas, tarxetas e lectores Near Field Communication (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Evento de transacción no elemento seguro"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permite que a aplicación reciba información sobre transaccións que ocorran nun elemento seguro."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"desactivar o bloqueo da pantalla"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permite á aplicación desactivar o bloqueo do teclado e calquera seguranza dos contrasinais asociada. Por exemplo, o teléfono desactiva o bloqueo do teclado ao recibir unha chamada telefónica entrante e, a continuación, volve activar o bloqueo do teclado unha vez finalizada a chamada."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"solicitar o nivel de complexidade do bloqueo de pantalla"</string> @@ -1393,7 +1395,7 @@ <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"ANULAR"</string> <string name="select_input_method" msgid="3971267998568587025">"Escoller método de introdución de texto"</string> <string name="show_ime" msgid="6406112007347443383">"Móstrase na pantalla mentres o teclado físico estea activo"</string> - <string name="hardware" msgid="1800597768237606953">"Mostrar teclado virtual"</string> + <string name="hardware" msgid="1800597768237606953">"Mostrar o teclado virtual"</string> <string name="select_keyboard_layout_notification_title" msgid="5823199895322205589">"Configura o teclado (<xliff:g id="DEVICE_NAME">%s</xliff:g>)"</string> <string name="select_multiple_keyboards_layout_notification_title" msgid="6999491025126641938">"Configura os teclados físicos"</string> <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"Toca para seleccionar o idioma e o deseño"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Permite que unha aplicación complementaria, desde un segundo plano, inicie servizos en primeiro plano."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"O micrófono está dispoñible"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"O micrófono está bloqueado"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Pantalla dual"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"A pantalla dual está activada"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen está activada"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> está usando ambas as pantallas para mostrar contido"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"O dispositivo está demasiado quente"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A pantalla dual non está dispoñible porque o teléfono está quentando demasiado"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen non está dispoñible porque o teléfono está quentando demasiado"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen non está dispoñible"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen non está dispoñible porque a opción Aforro de batería está activado. Podes desactivar esta función en Configuración."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ir a Configuración"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index ab3859e39800..17581b75704d 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"આ મંજૂરીને આપવાથી, ઍપ તમારી પસંદગીની NFC ચુકવણીની સેવા વિશે માહિતી મેળવી શકે છે, જેમ કે રજિસ્ટર થયેલી સહાય અને નિર્ધારિત સ્થાન."</string> <string name="permlab_nfc" msgid="1904455246837674977">"નિઅર ફીલ્ડ કમ્યુનિકેશન નિયંત્રિત કરો"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ઍપ્લિકેશનને નિઅર ફીલ્ડ કમ્યુનિકેશન (NFC) ટૅગ, કાર્ડ અને રીડર સાથે સંચાર કરવાની મંજૂરી આપે છે."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"સુરક્ષિત તત્વ પરના વ્યવહારની ઇવેન્ટ"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ઍપને સુરક્ષિત તત્વ પર થતા વ્યવહારો વિશેની માહિતી મેળવવાની મંજૂરી આપે છે."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"તમારું સ્ક્રીન લૉક અક્ષમ કરો"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"એપ્લિકેશનને કીલૉક અને કોઈપણ સંકળાયેલ પાસવર્ડ સુરક્ષા અક્ષમ કરવાની મંજૂરી આપે છે. ઉદાહરણ તરીકે, ઇનકમિંગ ફોન કૉલ પ્રાપ્ત કરતી વખતે ફોન, કીલૉકને અક્ષમ કરે છે, પછી કૉલ સમાપ્ત થઈ જવા પર કીલૉક ફરીથી સક્ષમ કરે છે."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"સ્ક્રીન લૉકની જટિલતા જાણવા માટે વિનંતી કરો"</string> @@ -2327,9 +2329,9 @@ <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual screen ચાલુ છે"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"કન્ટેન્ટ બતાવવા માટે <xliff:g id="APP_NAME">%1$s</xliff:g> બન્ને ડિસ્પ્લેનો ઉપયોગ કરી રહી છે"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ડિવાઇસ ખૂબ જ ગરમ છે"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ડ્યૂઅલ સ્ક્રીન અનુપલબ્ધ છે કારણ કે તમારો ફોન ખૂબ જ ગરમ થઈ રહ્યો છે"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ડ્યૂઅલ સ્ક્રીન અનુપલબ્ધ છે"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"બૅટરી સેવર ચાલુ હોવાને કારણે ડ્યૂઅલ સ્ક્રીન અનુપલબ્ધ છે. તમે સેટિંગમાં જઈને આને બંધ કરી શકો છો."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen ઉપલબ્ધ નથી કારણ કે તમારો ફોન ખૂબ જ ગરમ થઈ રહ્યો છે"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ઉપલબ્ધ નથી"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"બૅટરી સેવર ચાલુ હોવાને કારણે Dual Screen ઉપલબ્ધ નથી. તમે સેટિંગમાં જઈને આને બંધ કરી શકો છો."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"સેટિંગ પર જાઓ"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"બંધ કરો"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g>ની ગોઠવણી કરવામાં આવી છે"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 4c66168f36a8..3c578d61ad69 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"अगर ऐप्लिकेशन को अनुमति दी जाती है, तो वह पैसे चुकाने की आपकी उस पसंदीदा सेवा के बारे में जानकारी पा सकता है जो NFC का इस्तेमाल करती है. इसमें रजिस्टर किए गए डिवाइस और उनके आउटपुट के रूट जैसी जानकारी शामिल होती है."</string> <string name="permlab_nfc" msgid="1904455246837674977">"नियर फ़ील्ड कम्यूनिकेशन नियंत्रित करें"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ऐप्स को नियर फ़ील्ड कम्यूनिकेशन (NFC) टैग, कार्ड, और रीडर के साथ संचार करने देता है."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"सुरक्षा चिप में होने वाला लेन-देन की जानकारी"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"इससे ऐप्लिकेशन को सुरक्षा चिप पर होने वाले लेन-देन की जानकारी मिलेगी."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"अपना स्क्रीन लॉक अक्षम करें"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ऐप्स को कीलॉक और कोई भी संबद्ध पासवर्ड सुरक्षा बंद करने देता है. उदाहरण के लिए, इनकमिंग फ़ोन कॉल पाते समय फ़ोन, कीलॉक को बंद कर देता है, फिर कॉल खत्म होने पर कीलॉक को फिर से चालू कर देता है."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"जानें कि स्क्रीन लॉक कितना मुश्किल बनाया गया है"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"इससे साथी ऐप्लिकेशन को बैकग्राउंड में फ़ोरग्राउंड सेवाएं चलाने की अनुमति मिलती है."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"माइक्रोफ़ोन इस्तेमाल किया जा सकता है"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"माइक्रोफ़ोन को ब्लॉक किया गया है"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ड्यूअल स्क्रीन"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ड्यूअल स्क्रीन की सुविधा चालू है"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual screen की सुविधा चालू है"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>, कॉन्टेंट दिखाने के लिए दोनों स्क्रीन का इस्तेमाल कर रहा है"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"आपका फ़ोन बहुत गर्म हो गया है"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ड्यूअल स्क्रीन की सुविधा अभी उपलब्ध नहीं है, क्योंकि आपका फ़ोन बहुत गर्म हो रहा है"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen की सुविधा अभी उपलब्ध नहीं है, क्योंकि आपका फ़ोन बहुत गर्म हो रहा है"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen का इस्तेमाल नहीं किया जा सकता"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"बैटरी सेवर की सुविधा चालू होने पर, Dual Screen का इस्तेमाल नहीं किया जा सकता. इस सुविधा को सेटिंग में जाकर बंद करें."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"सेटिंग पर जाएं"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index eb8d11118970..d4c3ff2f3aca 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Omogućuje aplikaciji primanje informacija o preferiranoj usluzi plaćanja NFC kao što su registrirana pomagala i odredište."</string> <string name="permlab_nfc" msgid="1904455246837674977">"upravljanje beskontaktnom komunikacijom (NFC)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Aplikaciji omogućuje komunikaciju s oznakama, karticama i čitačima komunikacije kratkog dometa (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Događaj transakcije na sigurnosnom elementu"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Aplikaciji omogućuje da prima podatke o transakcijama koje se odvijaju na sigurnosnom elementu."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"onemogućavanje zaključavanja zaslona"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Aplikaciji omogućuje onemogućavanje zaključavanja tipkovnice i svih pripadajućih sigurnosnih zaporki. Na primjer, telefon onemogućuje zaključavanje tipkovnice kod primanja dolaznog telefonskog poziva, nakon kojeg se zaključavanje tipkovnice ponovo omogućuje."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"zahtijevati složenost zaključavanja zaslona"</string> @@ -753,8 +755,8 @@ <string name="permdesc_register_call_provider" msgid="4201429251459068613">"Aplikaciji omogućuje registriranje novih telekomunikacijskih veza."</string> <string name="permlab_connection_manager" msgid="3179365584691166915">"upravljanje telekomunikacijskim vezama"</string> <string name="permdesc_connection_manager" msgid="1426093604238937733">"Aplikaciji omogućuje upravljanje telekomunikacijskim vezama."</string> - <string name="permlab_bind_incall_service" msgid="5990625112603493016">"interakcija sa zaslonom tijekom poziva"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"Omogućuje aplikaciji upravljanje vremenom i načinom na koji se korisniku prikazuje zaslon tijekom poziva."</string> + <string name="permlab_bind_incall_service" msgid="5990625112603493016">"interakcija s filtriranjem poziva"</string> + <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"Omogućuje aplikaciji kada se i kako korisniku prikazuje zaslon filtriranja poziva."</string> <string name="permlab_bind_connection_service" msgid="5409268245525024736">"interakcija s telefonskim uslugama"</string> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"Omogućuje aplikacijama interakciju s telefonskim uslugama za uspostavljanje i primanje poziva."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"pružanje korisničkog iskustva tijekom poziva"</string> @@ -2329,8 +2331,8 @@ <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> upotrebljava oba zaslona za prikazivanje sadržaja"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Uređaj se pregrijao"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvostruki zaslon nije podržan jer se vaš telefon pregrijao"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Značajka Dual Screen nije dostupna"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Značajka Dual Screen nije dostupna jer je uključena štednja baterije. To možete isključiti u postavkama."</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dvostruki zaslon nije dostupan"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dvostruki zaslon nije dostupan jer je uključena štednja baterije. Možete je isključiti u postavkama."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Otvorite Postavke"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Isključi"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"Konfiguriran je uređaj <xliff:g id="DEVICE_NAME">%s</xliff:g>"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 793fc8699d1e..3709ccc21f3e 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Lehetővé teszi az alkalmazás számára preferált NFC fizetési szolgáltatási információk (pl. regisztrált alkalmazásazonosítók és útvonali cél) lekérését."</string> <string name="permlab_nfc" msgid="1904455246837674977">"NFC technológia vezérlése"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Lehetővé teszi az alkalmazás számára, hogy NFC (Near Field Communication - kis hatósugarú vezeték nélküli kommunikáció) technológiát használó címkékkel, kártyákkal és leolvasókkal kommunikáljon."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Biztonságos elemen zajló tranzakciós esemény"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Lehetővé teszi az alkalmazás számára, hogy információkat kapjon a biztonságos elemeken zajló tranzakciókról."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"képernyőzár kikapcsolása"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Lehetővé teszi az alkalmazás számára a billentyűzár és bármely kapcsolódó jelszavas védelem kikapcsolását. Például a telefon feloldja a billentyűzárat bejövő hívás esetén, majd újra bekapcsolja azt a hívás végeztével."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"képernyőzár összetettségi szintjének lekérése"</string> @@ -2323,13 +2325,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Lehetővé teszi a társalkalmazások számára, hogy előtérben futó szolgáltatásokat indítsanak a háttérből."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"A mikrofon rendelkezésre áll"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"A mikrofon le van tiltva"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Két képernyő"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"A Két képernyő funkció be van kapcsolva"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"A Dual Screen funkció be van kapcsolva"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"A(z) <xliff:g id="APP_NAME">%1$s</xliff:g> mindkét kijelzőt használja a tartalmak megjelenítésére"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Az eszköz túl meleg"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A Két képernyő funkció nem áll rendelkezésre, mert a telefon melegedni kezdett"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"A Két képernyő funkció nem használható"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"A Két képernyő funkció nem használható, mert az Akkumulátorkímélő mód be van kapcsolva. Ezt a funkciót a beállítások között lehet kikapcsolni."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A Dual Screen funkció nem áll rendelkezésre, mert a telefon melegedni kezdett"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"A Dual Screen funkció nem használható"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"A Dual Screen funkció nem használható, mert az Akkumulátorkímélő mód be van kapcsolva. Ezt a funkciót a beállítások között lehet kikapcsolni."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Lépjen a Beállítások menübe"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Kikapcsolás"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> beállítva"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index f20230f7049e..cff7e0803ee0 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Թույլ է տալիս հավելվածին ստանալ նախընտրելի NFC վճարային ծառայության մասին տեղեկություններ (օր․՝ գրանցված լրացուցիչ սարքերի և երթուղու նպատակակետի մասին տվյալներ)։"</string> <string name="permlab_nfc" msgid="1904455246837674977">"վերահսկել Մոտ Տարածությամբ Հաղորդակցումը"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Թույլ է տալիս հավելվածին հաղորդակցվել Մոտ տարածությամբ հաղորդակցման (NFC) պիտակների, քարտերի և ընթերցիչների հետ:"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element գործարքի իրադարձություն"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Թույլ է տալիս հավելվածին ստանալ տեղեկություններ Secure Element-ում կատարվող գործարքների մասին։"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"անջատել ձեր էկրանի կողպեքը"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Թույլ է տալիս հավելվածին անջատել ստեղնաշարի կողպումը և ցանկացած կապված գաղտնաբառի պաշտպանվածությունը: Սրա ճիշտ օրինակն է, երբ հեռախոսը անջատում է ստեղնաշարի կողպումը մուտքային զանգ ստանալիս, հետո այն կրկին միացնում է, երբ զանգը ավարտվում է:"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"հարցում էկրանի կողպման բարդության մակարդակի մասին"</string> @@ -1256,7 +1258,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Հավելվածները մեկնարկում են:"</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Բեռնումն ավարտվում է:"</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Դուք սեղմել եք սնուցման կոճակը։ Սովորաբար դրա արդյունքում էկրանն անջատվում է։\n\nՄատնահետքը ավելացնելու համար թեթևակի հպեք կոճակին։"</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Ավարտեք կարգավորումը՝ անջատելով էկրանը"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Անջատեք էկրանը և ավարտեք"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Անջատել"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Շարունակե՞լ մատնահետքի սկանավորումը"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Դուք սեղմել եք սնուցման կոճակը։ Սովորաբար դրա արդյունքում էկրանն անջատվում է։\n\nՄատնահետքը սկանավորելու համար թեթևակի հպեք կոճակին։"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Թույլատրում է ուղեկցող հավելվածին ակտիվ ծառայություններ գործարկել ֆոնային ռեժիմից։"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Խոսափողը հասանելի է"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Խոսափողն արգելափակված է"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Կրկնակի էկրան"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Կրկնակի էկրանը միացված է"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen-ը միացված է"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> հավելվածն օգտագործում է երկու էկրանները"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Սարքը գերտաքացել է"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Կրկնակի էկրանն անհասանելի է, քանի որ ձեր հեռախոսը գերտաքանում է"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen-ն անհասանելի է, քանի որ ձեր հեռախոսը գերտաքանում է"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen-ը հասանելի չէ"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen-ն անհասանելի է, քանի որ Մարտկոցի տնտեսումը միացված է։ Դուք կարող եք անջատել այս գործառույթը Կարգավորումներում։"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Անցնել Կարգավորումներ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index af5e5fe1d70f..da1094cf4776 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Mengizinkan aplikasi untuk mendapatkan informasi layanan pembayaran NFC pilihan seperti bantuan terdaftar dan tujuan rute."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrol NFC"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Mengizinkan apl berkomunikasi dengan tag, kartu, dan alat pembaca Komunikasi Nirkabel Jarak Dekat (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Peristiwa transaksi Elemen Pengaman"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Mengizinkan aplikasi menerima informasi tentang transaksi yang dilakukan pada Elemen Pengaman."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"nonaktifkan kunci layar Anda"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Memungkinkan aplikasi menonaktifkan kunci tombol dan keamanan sandi apa pun yang terkait. Misalnya, ponsel menonaktifkan kunci tombol saat menerima panggilan telepon masuk, kemudian mengaktifkan kembali kunci tombol ketika panggilan selesai."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"meminta kompleksitas kunci layar"</string> @@ -1592,7 +1594,7 @@ <string name="data_usage_restricted_body" msgid="5338694433686077733">"Ketuk untuk menghapus batasan."</string> <string name="data_usage_rapid_title" msgid="2950192123248740375">"Penggunaan data seluler tinggi"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"Aplikasi Anda menggunakan lebih banyak kuota daripada biasanya"</string> - <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> menggunakan lebih banyak kuota daripada biasanya"</string> + <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> menggunakan lebih banyak data daripada biasanya"</string> <string name="ssl_certificate" msgid="5690020361307261997">"Sertifikat keamanan"</string> <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"Sertifikat ini valid."</string> <string name="issued_to" msgid="5975877665505297662">"Diterbitkan ke:"</string> @@ -1639,7 +1641,7 @@ <string name="media_route_status_in_use" msgid="6684112905244944724">"Sedang digunakan"</string> <string name="display_manager_built_in_display_name" msgid="1015775198829722440">"Layar Built-In"</string> <string name="display_manager_hdmi_display_name" msgid="1022758026251534975">"Layar HDMI"</string> - <string name="display_manager_overlay_display_name" msgid="5306088205181005861">"Hamparan #<xliff:g id="ID">%1$d</xliff:g>"</string> + <string name="display_manager_overlay_display_name" msgid="5306088205181005861">"Overlay #<xliff:g id="ID">%1$d</xliff:g>"</string> <string name="display_manager_overlay_display_title" msgid="1480158037150469170">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="2810034719482834679">", aman"</string> <string name="kg_forgot_pattern_button_text" msgid="406145459223122537">"Lupa Pola?"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Mengizinkan aplikasi pendamping memulai layanan latar depan dari latar belakang."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofon tersedia"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofon diblokir"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Layar ganda"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual screen aktif"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> menggunakan kedua layar untuk menampilkan konten"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Suhu perangkat terlalu panas"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Layar ganda tidak tersedia karena suhu ponsel terlalu panas"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen tidak tersedia karena suhu ponsel terlalu panas"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen tidak tersedia"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen tidak tersedia karena Penghemat Baterai aktif. Anda dapat menonaktifkannya di Setelan."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Buka Setelan"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index b43935f17844..917e161b766f 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -296,9 +296,9 @@ <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="8974401416068943888">"Örugg stilling"</string> <string name="android_system_label" msgid="5974767339591067210">"Android kerfið"</string> - <string name="user_owner_label" msgid="8628726904184471211">"Skipta yfir í eigið snið"</string> + <string name="user_owner_label" msgid="8628726904184471211">"Skipta yfir í einkasnið"</string> <string name="managed_profile_label" msgid="7316778766973512382">"Skipta yfir í vinnusnið"</string> - <string name="user_owner_app_label" msgid="1553595155465750298">"Skipta yfir í eigið snið <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="user_owner_app_label" msgid="1553595155465750298">"Skipta yfir í einkasnið <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="managed_profile_app_label" msgid="367401088383965725">"Skipta yfir í vinnusnið <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="permgrouplab_contacts" msgid="4254143639307316920">"Tengiliðir"</string> <string name="permgroupdesc_contacts" msgid="9163927941244182567">"fá aðgang að tengiliðunum þínum"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Gerir forritinu kleift að fá valda NFC-greiðsluþjónustu, svo sem skráða aðstoð og áfangastað leiðar."</string> <string name="permlab_nfc" msgid="1904455246837674977">"stjórna nándarsamskiptum (NFC)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Leyfir forriti að eiga samskipti við NFC-merki, -spjöld og -lesara (nándarsamskipti)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Færslutilvik í öryggiseiningu"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Gerir forritinu kleift að móttaka upplýsingar um færslur sem fara fram í öryggiseiningu."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"slökkva á skjálásnum"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Leyfir forriti að slökkva á símalásnum og öðrum öryggisaðgerðum tengdum aðgangsorði. Til dæmis gerir síminn lásinn óvirkan þegar símtal berst og læsist svo aftur að símtali loknu."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"biðja um flókinn skjálás"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index f34b103360cd..97f5a38906ef 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -310,11 +310,11 @@ <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"Possono inviare e visualizzare SMS"</string> <string name="permgrouplab_storage" msgid="17339216290379241">"File"</string> - <string name="permgroupdesc_storage" msgid="5378659041354582769">"Consente di accedere ai file sul tuo dispositivo"</string> + <string name="permgroupdesc_storage" msgid="5378659041354582769">"accedere ai file sul tuo dispositivo"</string> <string name="permgrouplab_readMediaAural" msgid="1858331312624942053">"Musica e audio"</string> - <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accesso a musica e audio sul tuo dispositivo"</string> + <string name="permgroupdesc_readMediaAural" msgid="7565467343667089595">"accedere a musica e audio sul tuo dispositivo"</string> <string name="permgrouplab_readMediaVisual" msgid="4724874717811908660">"Foto e video"</string> - <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accesso a foto e video sul tuo dispositivo"</string> + <string name="permgroupdesc_readMediaVisual" msgid="4080463241903508688">"accedere a foto e video sul tuo dispositivo"</string> <string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfono"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"Possono registrare audio"</string> <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Attività fisica"</string> @@ -322,7 +322,7 @@ <string name="permgrouplab_camera" msgid="9090413408963547706">"Fotocamera"</string> <string name="permgroupdesc_camera" msgid="7585150538459320326">"Possono scattare foto e registrare video"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivi nelle vicinanze"</string> - <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"Consente di rilevare dispositivi nelle vicinanze e di connettersi a tali dispositivi"</string> + <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"rilevare e connettersi a dispositivi nelle vicinanze"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Registri chiamate"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"Possono leggere e modificare il registro chiamate del telefono"</string> <string name="permgrouplab_phone" msgid="570318944091926620">"Telefono"</string> @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Consente all\'app di recuperare informazioni del servizio di pagamento NFC preferito, quali destinazione della route e identificatori applicazione registrati."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controllo Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Consente all\'applicazione di comunicare con tag, schede e lettori NFC (Near Field Communication)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Evento di transazione Secure Element"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Consente all\'app di ricevere informazioni sulle transazioni in corso su Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"disattivazione blocco schermo"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Consente all\'applicazione di disattivare il blocco tastiera ed eventuali protezioni tramite password associate. Ad esempio, il telefono disattiva il blocco tastiera quando riceve una telefonata in arrivo e lo riattiva al termine della chiamata."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"richiesta di complessità del blocco schermo"</string> @@ -687,7 +689,7 @@ <string name="face_acquired_too_right" msgid="6245286514593540859">"Sposta lo smartphone verso sinistra"</string> <string name="face_acquired_too_left" msgid="9201762240918405486">"Sposta lo smartphone verso destra"</string> <string name="face_acquired_poor_gaze" msgid="4427153558773628020">"Guarda più direttamente verso il dispositivo."</string> - <string name="face_acquired_not_detected" msgid="1057966913397548150">"Volto non visible. Tieni lo smartphone all\'altezza degli occhi."</string> + <string name="face_acquired_not_detected" msgid="1057966913397548150">"Volto non visibile. Tieni lo smartphone all\'altezza degli occhi."</string> <string name="face_acquired_too_much_motion" msgid="8199691445085189528">"Troppo movimento. Tieni fermo il telefono."</string> <string name="face_acquired_recalibrate" msgid="8724013080976469746">"Ripeti l\'acquisizione del volto."</string> <string name="face_acquired_too_different" msgid="2520389515612972889">"Impossibile riconoscere il volto. Riprova."</string> @@ -1959,7 +1961,7 @@ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g> non disponibile"</string> <string name="app_streaming_blocked_title_for_permission_dialog" msgid="4483161748582966785">"Autorizzazione necessaria"</string> <string name="app_streaming_blocked_title_for_camera_dialog" msgid="3935701653713853065">"Fotocamera non disponibile"</string> - <string name="app_streaming_blocked_title_for_fingerprint_dialog" msgid="3516853717714141951">"Continua sul telefono"</string> + <string name="app_streaming_blocked_title_for_fingerprint_dialog" msgid="3516853717714141951">"Continua sullo smartphone"</string> <string name="app_streaming_blocked_title_for_microphone_dialog" msgid="544822455127171206">"Microfono non disponibile"</string> <string name="app_streaming_blocked_title_for_playstore_dialog" msgid="8149823099822897538">"Play Store non disponibile"</string> <string name="app_streaming_blocked_title_for_settings_dialog" product="tv" msgid="196994247017450357">"Impostazioni di Android TV non disponibili"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index cc032849fc28..e43833ac2846 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"מאפשרת לאפליקציה לקבל פרטים על שירות תשלום מועדף ב-NFC, כמו עזרים רשומים ויעד של נתיב."</string> <string name="permlab_nfc" msgid="1904455246837674977">"שליטה בתקשורת מטווח קצר"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"מאפשרת לאפליקציה נהל תקשורת עם תגים, כרטיסים וקוראים מסוג \'תקשורת מטווח קצר\' (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"אירוע עסקה של רכיב מאובטח"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ההרשאה הזו מאפשרת לאפליקציה לקבל מידע על עסקאות שמתרחשות ברכיב מאובטח."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ביטול נעילת המסך שלך"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"מאפשרת לאפליקציה להשבית את נעילת המקשים וכל אמצעי אבטחה משויך המבוסס על סיסמה. לדוגמה, הטלפון ישבית את נעילת המקשים במהלך שיחת טלפון נכנסת, ויפעיל מחדש את נעילת המקשים עם סיום השיחה."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"בקשת מידע לגבי מידת המורכבות של נעילת המסך"</string> @@ -1952,7 +1954,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"מידע נוסף"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"ביטול ההשהיה של האפליקציה"</string> <string name="work_mode_off_title" msgid="6367463960165135829">"להפעיל את האפליקציות לעבודה?"</string> - <string name="work_mode_turn_on" msgid="5316648862401307800">"הפעלה"</string> + <string name="work_mode_turn_on" msgid="5316648862401307800">"ביטול ההשהיה"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"שיחת חירום"</string> <string name="app_blocked_title" msgid="7353262160455028160">"האפליקציה לא זמינה"</string> <string name="app_blocked_message" msgid="542972921087873023">"האפליקציה <xliff:g id="APP_NAME">%1$s</xliff:g> לא זמינה בשלב זה."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index d8d721c0b741..1c7bd6a04ad5 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -321,7 +321,7 @@ <string name="permgrouplab_camera" msgid="9090413408963547706">"カメラ"</string> <string name="permgroupdesc_camera" msgid="7585150538459320326">"写真と動画の撮影"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"付近のデバイス"</string> - <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"付近のデバイスの検出と接続"</string> + <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"付近のデバイスの\\n検出と接続"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"通話履歴"</string> <string name="permgroupdesc_calllog" msgid="2026996642917801803">"通話履歴の読み取りと書き込み"</string> <string name="permgrouplab_phone" msgid="570318944091926620">"電話"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"登録されている支援やルートの目的地など、優先される NFC お支払いサービスの情報を取得することをアプリに許可します。"</string> <string name="permlab_nfc" msgid="1904455246837674977">"NFCの管理"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"NFCタグ、カード、リーダーとの通信をアプリに許可します。"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"セキュア エレメントのトランザクション イベント"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"セキュア エレメントで起きたトランザクションに関する情報の受信をアプリに許可します。"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"画面ロックの無効化"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"キーロックとキーロックに関連付けられたパスワードのセキュリティを無効にすることをアプリに許可します。たとえば、かかってきた電話を受ける際にキーロックを無効にし、通話が終了したらキーロックを再度有効にする場合などに使用します。"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"画面ロックの複雑さのリクエスト"</string> @@ -1590,7 +1592,7 @@ <string name="data_usage_limit_snoozed_body" msgid="545146591766765678">"設定した上限を <xliff:g id="SIZE">%s</xliff:g> 超えました"</string> <string name="data_usage_restricted_title" msgid="126711424380051268">"バックグラウンドデータに上限あり"</string> <string name="data_usage_restricted_body" msgid="5338694433686077733">"タップして制限を解除します。"</string> - <string name="data_usage_rapid_title" msgid="2950192123248740375">"モバイルデータ使用量の増加"</string> + <string name="data_usage_rapid_title" msgid="2950192123248740375">"高いモバイルデータ使用量"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"アプリが通常より多くのデータを使用しています"</string> <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"「<xliff:g id="APP">%s</xliff:g>」が通常より多くのデータを使用しています"</string> <string name="ssl_certificate" msgid="5690020361307261997">"セキュリティ証明書"</string> @@ -2336,7 +2338,7 @@ <string name="keyboard_layout_notification_one_selected_message" msgid="4314216053129257197">"キーボードのレイアウトは<xliff:g id="LAYOUT_1">%s</xliff:g>に設定されています。タップで変更できます。"</string> <string name="keyboard_layout_notification_two_selected_message" msgid="1876349944065922950">"キーボードのレイアウトは<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>に設定されています。タップで変更できます。"</string> <string name="keyboard_layout_notification_three_selected_message" msgid="280734264593115419">"キーボードのレイアウトは<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>に設定されています。タップで変更できます。"</string> - <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"キーボードのレイアウトは<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>に設定されています。タップで変更できます。"</string> + <string name="keyboard_layout_notification_more_than_three_selected_message" msgid="1581834181578206937">"キーボードのレイアウトは<xliff:g id="LAYOUT_1">%1$s</xliff:g>、<xliff:g id="LAYOUT_2">%2$s</xliff:g>、<xliff:g id="LAYOUT_3">%3$s</xliff:g>などに設定されています。タップで変更できます。"</string> <string name="keyboard_layout_notification_multiple_selected_title" msgid="5242444914367024499">"物理キーボードの設定完了"</string> <string name="keyboard_layout_notification_multiple_selected_message" msgid="6576533454124419202">"タップするとキーボードを表示できます"</string> </resources> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index c7fa7d0b2671..ccf27e5f9f65 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"საშუალებას აძლევს აპს, მიიღოს უპირატესი NFC გადახდის სერვისის ინფორმაცია, მაგალითად, რეგისტრირებული დახმარება და დანიშნულება."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ახლო მოქმედების რადიოკავშირი (NFC) მართვა"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"აპს შეეძლება ახლო მოქმედების რადიოკავშირის (NFC) მეშვეობით ტეგების, ბარათებისა და წამკითხველების შემცველი მონაცემების მიმოცვლა."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"უსაფრთხო ელემენტის ტრანზაქციის ღონისძიება"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"საშუალებს აძლევს აპს, მიიღოს ინფორმაცია უსაფრთხო ელემენტზე განხორციელებული ტრანზაქციების შესახებ."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"თქვენი ეკრანის ბლოკის გათიშვა"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"შეეძლება კლავიატურის დაბლოკვისა და პაროლით უზრუნველყოფილი ნებისმიერი უსაფრთხოების ფუნქციის დეაქტივაცია. მაგალითად, ტელეფონი შემომავალი ზარის დროს აუქმებს კლავიატურის დაბლოკვას და კვლავ ააქტიურებს მას, როგორც კი ზარი დასრულდება."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ეკრანის დაბლოკვის მეთოდის სირთულის შესახებ ინფორმაციის მოთხოვნა"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 29902e966847..dc27a908e791 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -229,7 +229,7 @@ <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Қайта іске қосылуда…"</string> <string name="reboot_to_reset_title" msgid="2226229680017882787">"Зауыттық деректерді қалпына келтіру"</string> <string name="reboot_to_reset_message" msgid="3347690497972074356">"Қайта іске қосылуда…"</string> - <string name="shutdown_progress" msgid="5017145516412657345">"Өшірілуде…"</string> + <string name="shutdown_progress" msgid="5017145516412657345">"Өшіріліп жатыр…"</string> <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"Планшет өшіріледі."</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"Android TV құрылғысы өшеді."</string> <string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"Сағатыңыз өшіріледі."</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Қолданба тіркелген көмектер және баратын жер маршруты сияқты таңдаулы NFC төлеу қызметі туралы ақпаратты ала алатын болады."</string> <string name="permlab_nfc" msgid="1904455246837674977">"NFC функциясын басқару"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Қолданбаға NFC белгілерімен, карталармен және оқу құралдарымен байланысуға рұқсат береді."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Қауіпсіз элемент арқылы жасалатын транзакция оқиғасы"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Қолданбаға қауіпсіз элемент арқылы жасалатын транзакциялар жөнінде ақпарат алуға мүмкіндік береді."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"экран бекітпесін істен шығару"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Қолданбаларға кілтперне және басқа кілтсөзге қатысты қауіпсіздік шараларын өшіру мүмкіндігін береді. Мысалы, телефон кіріс қоңырауларын алғанда кілтпернені өшіреді және қоңырау аяқталғанда қайта қосады."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"экранды құлыптау күрделілігін сұрау"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Қосымша қолданбаға экрандық режимдегі қызметтерді фоннан іске қосуға рұқсат беріледі."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофон қолжетімді."</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофон блокталған."</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Қос экран"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Қос экран функциясы қосулы"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen функциясы қосулы"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> қолданбасы контентті көрсету үшін екі дисплейді де пайдаланады."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Құрылғы қатты қызып кетті."</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Қос экран функциясы істемейді, себебі телефон қатты қызып кетеді."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen функциясы істемейді, себебі телефон қатты қызып кетеді."</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen қолжетімсіз"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Батареяны үнемдеу режимі қосулы болғандықтан, Dual Screen қолжетімсіз. Мұны параметрлерден өшіруге болады."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Параметрлерге өту"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 340135e8f385..8d44c8b05149 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"អនុញ្ញាតឱ្យកម្មវិធីទទួលបានព័ត៌មានអំពីសេវាបង់ប្រាក់តាម nfc ជាអាទិភាពដូចជា គោលដៅផ្លូវ និងព័ត៌មានកំណត់អត្តសញ្ញាណកម្មវិធី ដែលបានចុះឈ្មោះជាដើម។"</string> <string name="permlab_nfc" msgid="1904455246837674977">"ពិនិត្យការទាក់ទងនៅក្បែរ (NFC)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ឲ្យកម្មវិធីទាក់ទងជាមួយស្លាក (NFC) កាត និងកម្មវិធីអាន។"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"ព្រឹត្តិការណ៍ប្រតិបត្តិការធាតុសុវត្ថិភាព"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"អនុញ្ញាតឱ្យកម្មវិធីទទួលព័ត៌មានអំពីប្រតិបត្តិការដែលកើតឡើងនៅលើធាតុសុវត្ថិភាព។"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"បិទការចាក់សោអេក្រង់របស់អ្នក"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ឲ្យកម្មវិធីបិទការចាក់សោសុវត្ថិភាពពាក្យសម្ងាត់ដែលបានភ្ជាប់ណាមួយ។ ឧទាហរណ៍ត្រឹមត្រូវនៃការបិទទូរស័ព្ទពេលទទួលការហៅចូល បន្ទាប់មបើកសោពេលការហៅបានបញ្ចប់។"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ស្នើសុំកម្រិតស្មុគស្មាញនៃការចាក់សោអេក្រង់"</string> @@ -1041,7 +1043,7 @@ <string name="keyguard_accessibility_expand_lock_area" msgid="4215280881346033434">"ពង្រីកតំបន់ដោះសោ។"</string> <string name="keyguard_accessibility_slide_unlock" msgid="2968195219692413046">"រុញដោះសោ។"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="8669128146589233293">"លំនាំដោះសោ។"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"ដោះសោតាមទម្រង់មុខ។"</string> + <string name="keyguard_accessibility_face_unlock" msgid="4533832120787386728">"ការដោះសោដោយស្កេនមុខ។"</string> <string name="keyguard_accessibility_pin_unlock" msgid="4020864007967340068">"កូដ PIN ដោះសោ។"</string> <string name="keyguard_accessibility_sim_pin_unlock" msgid="4895939120871890557">"ដោះកូដ Pin របស់សីុម។"</string> <string name="keyguard_accessibility_sim_puk_unlock" msgid="3459003464041899101">"ដោះកូដ Puk របស់សីុម។"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 1f0cbfcd4767..ad5c582f2418 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -328,7 +328,7 @@ <string name="permgroupdesc_phone" msgid="270048070781478204">"ಫೋನ್ ಕರೆ ಮಾಡಲು ಹಾಗೂ ನಿರ್ವಹಿಸಲು"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"ಬಾಡಿ ಸೆನ್ಸರ್"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"ನಿಮ್ಮ ಮುಖ್ಯ ಲಕ್ಷಣಗಳ ಕುರಿತು ಸೆನ್ಸಾರ್ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಿ"</string> - <string name="permgrouplab_notifications" msgid="5472972361980668884">"ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="permgrouplab_notifications" msgid="5472972361980668884">"ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string> <string name="permgroupdesc_notifications" msgid="4608679556801506580">"ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಿ"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"ವಿಂಡೋ ವಿಷಯವನ್ನು ಹಿಂಪಡೆಯುತ್ತದೆ"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"ನೀವು ಬಳಸುತ್ತಿರುವ ವಿಂಡೋದ ವಿಷಯ ಪರೀಕ್ಷಿಸುತ್ತದೆ."</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ನೋಂದಾಯಿತ ಅಪ್ಲಿಕೇಶನ್ ಗುರುತಿಸುವಿಕೆಗಳು ಮತ್ತು ಮಾರ್ಗ ಗಮ್ಯಸ್ಥಾನಗಳಂತಹ ಆದ್ಯತೆಯ NFC ಪಾವತಿ ಸೇವೆಗಳ ಬಗ್ಗೆ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ಸಮೀಪ ಕ್ಷೇತ್ರ ಸಂವಹನವನ್ನು ನಿಯಂತ್ರಿಸಿ"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ಸಮೀಪದ ಕ್ಷೇತ್ರ ಸಂವಹನ (NFC) ಟ್ಯಾಗ್ಗಳು, ಕಾರ್ಡ್ಗಳು, ಮತ್ತು ಓದುಗರನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಅನುಮತಿಸುತ್ತದೆ."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"ಸುರಕ್ಷಿತ ಅಂಶದ ವಹಿವಾಟು ಈವೆಂಟ್"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ಸುರಕ್ಷಿತ ಅಂಶದಲ್ಲಿ ನಡೆಯುತ್ತಿರುವ ವಹಿವಾಟುಗಳ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸ್ವೀಕರಿಸಲು ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ಕೀಲಾಕ್ ಮತ್ತು ಯಾವುದೇ ಸಂಬಂಧಿತ ಭದ್ರತಾ ಪಾಸ್ವರ್ಡ್ ಭದ್ರತೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಒಳಬರುವ ಕರೆಯನ್ನು ಸ್ವೀಕರಿಸುವಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಫೋನ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ, ನಂತರ ಕರೆಯು ಅಂತ್ಯಗೊಂಡಾಗ ಕೀಲಾಕ್ ಅನ್ನು ಮರು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಸಂಕೀರ್ಣತೆಯನ್ನು ವಿನಂತಿಸಿ"</string> @@ -752,8 +754,8 @@ <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_bind_incall_service" msgid="5990625112603493016">"ಒಳ-ಕರೆ ಪರದೆಯ ಮೂಲಕ ಸಂವಹನ ನಡೆಸಿ"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"ಬಳಕೆದಾರರು ಒಳ-ಕರೆಯ ಪರದೆಯನ್ನು ಯಾವಾಗ ಮತ್ತು ಹೇಗೆ ನೋಡುತ್ತಾರೆ ಎಂಬುದನ್ನು ನಿಯಂತ್ರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ."</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> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"ಕರೆಗಳನ್ನು ಮಾಡಲು/ಸ್ವೀಕರಿಸುವ ನಿಟ್ಟಿನಲ್ಲಿ ಲಿಫೋನಿ ಸೇವೆಗಳ ಜೊತೆ ಸಂವಾದ ನಡೆಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಕೊಡಿ."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"ಒಳ ಕರೆ ಬಳಕೆದಾರರ ಅನುಭವವನ್ನು ಒದಗಿಸಿ"</string> @@ -2128,7 +2130,7 @@ <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"ಹೋಮ್"</string> <string name="accessibility_system_action_back_label" msgid="4205361367345537608">"ಹಿಂದಕ್ಕೆ"</string> <string name="accessibility_system_action_recents_label" msgid="4782875610281649728">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳು"</string> - <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="accessibility_system_action_notifications_label" msgid="6083767351772162010">"ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string> <string name="accessibility_system_action_quick_settings_label" msgid="4583900123506773783">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="accessibility_system_action_power_dialog_label" msgid="8095341821683910781">"ಪವರ್ ಡೈಲಾಗ್"</string> <string name="accessibility_system_action_lock_screen_label" msgid="5484190691945563838">"ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ಯಾವುದೇ ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ಯಾವುದೇ ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳಿಲ್ಲ"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"ಉದ್ಯೋಗದ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"ವರ್ಕ್ ಪ್ರೊಫೈಲ್ ಆದ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"ವೈಯಕ್ತಿಕ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"ವೈಯಕ್ತಿಕ <xliff:g id="APP">%s</xliff:g> ಆ್ಯಪ್ನಲ್ಲಿ ತೆರೆಯಬೇಕೆ?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ನಿಂದ ಕರೆ ಮಾಡಬೇಕೇ?"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"ಮುನ್ನೆಲೆ ಸೇವೆಗಳನ್ನು ಹಿನ್ನೆಲೆಯಿಂದ ಪ್ರಾರಂಭಿಸಲು ಕಂಪ್ಯಾನಿಯನ್ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"ಮೈಕ್ರೊಫೋನ್ ಲಭ್ಯವಿದೆ"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"ಮೈಕ್ರೊಫೋನ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ಡ್ಯೂಯಲ್ ಸ್ಕ್ರೀನ್"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ಡ್ಯೂಯಲ್ ಸ್ಕ್ರೀನ್ ಆನ್ ಆಗಿದೆ"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen ಆನ್ ಆಗಿದೆ"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"ಕಂಟೆಂಟ್ ಅನ್ನು ತೋರಿಸಲು <xliff:g id="APP_NAME">%1$s</xliff:g> ಎರಡೂ ಡಿಸ್ಪ್ಲೇಗಳನ್ನು ಬಳಸುತ್ತಿದೆ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ಸಾಧನವು ತುಂಬಾ ಬಿಸಿಯಾಗಿದೆ"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ನಿಮ್ಮ ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾಗುವುದರಿಂದ ಡ್ಯೂಯಲ್ ಸ್ಕ್ರೀನ್ ಲಭ್ಯವಿಲ್ಲ"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ನಿಮ್ಮ ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾಗುವುದರಿಂದ Dual Screen ಲಭ್ಯವಿಲ್ಲ"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ಲಭ್ಯವಿಲ್ಲ"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ಬ್ಯಾಟರಿ ಸೇವರ್ ಆನ್ ಆಗಿರುವ ಕಾರಣ Dual Screen ಲಭ್ಯವಿಲ್ಲ. ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಇದನ್ನು ಆಫ್ ಮಾಡಬಹುದು."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 7df606b89c7b..8b45d230faa9 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"앱이 등록된 AID와 경로 목적지 같은 기본 NFC 결제 서비스 정보를 확인하도록 허용합니다."</string> <string name="permlab_nfc" msgid="1904455246837674977">"NFC(Near Field Communication) 제어"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"앱이 NFC(근거리 무선 통신) 태그, 카드 및 리더와 통신할 수 있도록 허용합니다."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"보안 요소 트랜잭션 이벤트"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"앱이 보안 요소에서 발생하는 트랜잭션에 관한 정보를 받도록 허용합니다."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"화면 잠금 사용 중지"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"앱이 키 잠금 및 관련 비밀번호 보안을 사용중지할 수 있도록 허용합니다. 예를 들어, 휴대전화가 수신전화를 받을 때 키 잠금을 사용중지했다가 통화가 끝나면 키 잠금을 다시 사용할 수 있습니다."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"화면 잠금 복잡도 요청"</string> @@ -625,11 +627,11 @@ <string name="biometric_error_generic" msgid="6784371929985434439">"인증 오류"</string> <string name="screen_lock_app_setting_name" msgid="6054944352976789228">"화면 잠금 사용"</string> <string name="screen_lock_dialog_default_subtitle" msgid="120359538048533695">"계속하려면 화면 잠금용 사용자 인증 정보를 입력하세요"</string> - <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"센서 위에 손가락을 좀 더 오래 올려놓으세요"</string> + <string name="fingerprint_acquired_partial" msgid="4323789264604479684">"센서를 세게 누르세요"</string> <string name="fingerprint_acquired_insufficient" msgid="623888149088216458">"지문을 인식할 수 없습니다. 다시 시도해 주세요."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1770676120848224250">"지문 센서를 닦은 후 다시 시도해 보세요."</string> <string name="fingerprint_acquired_imager_dirty_alt" msgid="9169582140486372897">"센서를 닦은 후 다시 시도해 보세요."</string> - <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"센서 위에 손가락을 좀 더 오래 올려놓으세요"</string> + <string name="fingerprint_acquired_too_fast" msgid="1628459767349116104">"센서를 세게 누르세요"</string> <string name="fingerprint_acquired_too_slow" msgid="6683510291554497580">"손가락을 너무 느리게 움직였습니다. 다시 시도해 주세요."</string> <string name="fingerprint_acquired_already_enrolled" msgid="2285166003936206785">"다른 지문으로 시도"</string> <string name="fingerprint_acquired_too_bright" msgid="3863560181670915607">"너무 밝음"</string> @@ -1369,7 +1371,7 @@ <string name="usb_power_notification_message" msgid="7284765627437897702">"연결된 기기를 충전합니다. 옵션을 더 보려면 탭하세요."</string> <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_title" msgid="408390247354560331">"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> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"호환 앱이 백그라운드에서 포그라운드 서비스를 시작할 수 있게 허용합니다."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"마이크 사용 가능"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"마이크가 차단됨"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"듀얼 스크린"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"듀얼 스크린 켜짐"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen 켜짐"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>에서 두 화면을 모두 사용하여 콘텐츠를 표시합니다."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"기기 온도가 너무 높음"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"휴대전화 온도가 너무 높아지고 있으므로 듀얼 스크린을 사용할 수 없습니다."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"휴대전화 온도가 너무 높아지고 있으므로 Dual Screen을 사용할 수 없습니다."</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen을 사용할 수 없음"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"절전 모드가 사용 설정되어 있어 Dual Screen을 사용할 수 없습니다. 설정에서 이 기능을 사용 중지할 수 있습니다."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"설정으로 이동"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 80a0c7cf2a29..d49c4a714605 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Колдонмого катталган жардам же көздөлгөн жерге маршрут сыяктуу тандалган nfc төлөм кызматы жөнүндө маалыматты алууга уруксат берүү."</string> <string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication көзөмөлү"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Колдонмого Жакынкы аралыкта байланышуу (NFC) белгилери, карталары жана окугучтары менен байланышуу мүмкүнчүлүгүн берет."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Коргоочу элементтеги транзакция иш-чарасы"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Колдонмо Коргоочу элементте аткарылган транзакциялар жөнүндө маалымат ала алат."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"экранды бөгөттөөнү өчүрүү"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Колдонмого экрандын бөгөттөөчү жана ага байланыштуу сырсөз коргоосун өчүрүү уруксатын берет. Мисалы, чалуу келгенде экрандын бөгөтүн алып салат, чалуу бүткөндө кайрадан орнотот."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"экранды бөгөттөөнүн татаалдык деңгээлин суроо"</string> @@ -761,7 +763,7 @@ <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="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> @@ -1006,7 +1008,7 @@ <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="2205435033340091883">"Android TV түзмөгүңүздүн кулпусун <xliff:g id="NUMBER">%d</xliff:g> жолу туура эмес ачууга аракет жасадыңыз. Android TV түзмөгүңүз эми демейки параметрлерге кайтарылат."</string> <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"Сиз телефонду бөгөттөн чыгарууга <xliff:g id="NUMBER">%d</xliff:g> жолу туура эмес аракет кылдыңыз. Телефон баштапкы абалына келтирилет."</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"<xliff:g id="NUMBER">%d</xliff:g> секунддан кийин кайталаңыз."</string> - <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"Сүрөт үлгүсүн унутуп калдыңызбы?"</string> + <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"Сүрөт үлгүсүн унутуп койдуңузбу?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"Аккаунт менен кулпусун ачуу"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="3775904917743034195">"Өтө көп үлгү киргизүү аракети болду"</string> <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"Бөгөттөн чыгарыш үчүн, Google эсебиңиз менен кириңиз."</string> @@ -1014,7 +1016,7 @@ <string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"Сырсөз"</string> <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"Кирүү"</string> <string name="lockscreen_glogin_invalid_input" msgid="4369219936865697679">"Колдонуучу атыңыз же сырсөзүңүз туура эмес."</string> - <string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"Колдонуучу атыңызды же сырсөзүңүздү унутуп калдыңызбы?\n"<b>"google.com/accounts/recovery"</b>" дарегине кайрылыңыз."</string> + <string name="lockscreen_glogin_account_recovery_hint" msgid="1683405808525090649">"Колдонуучу атыңызды же сырсөзүңүздү унутуп койдуңузбу?\n"<b>"google.com/accounts/recovery"</b>" дарегине кайрылыңыз."</string> <string name="lockscreen_glogin_checking_password" msgid="2607271802803381645">"Текшерүүдө…"</string> <string name="lockscreen_unlock_label" msgid="4648257878373307582">"Кулпусун ачуу"</string> <string name="lockscreen_sound_on_label" msgid="1660281470535492430">"Добушу күйүк"</string> @@ -1665,7 +1667,7 @@ <string name="kg_login_password_hint" msgid="3330530727273164402">"Сырсөз"</string> <string name="kg_login_submit_button" msgid="893611277617096870">"Кирүү"</string> <string name="kg_login_invalid_input" msgid="8292367491901220210">"Колдонуучу атыңыз же сырсөзүңүз туура эмес."</string> - <string name="kg_login_account_recovery_hint" msgid="4892466171043541248">"Колдонуучу атыңызды же сырсөзүңүздү унутуп калдыңызбы?\n"<b>"google.com/accounts/recovery"</b>" дарегине кайрылыңыз."</string> + <string name="kg_login_account_recovery_hint" msgid="4892466171043541248">"Колдонуучу атыңызды же сырсөзүңүздү унутуп койдуңузбу?\n"<b>"google.com/accounts/recovery"</b>" дарегине кайрылыңыз."</string> <string name="kg_login_checking_password" msgid="4676010303243317253">"Эсеп текшерилүүдө…"</string> <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="23741434207544038">"Сиз PIN кодуңузду <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тердиңиз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундадан кийин кайталаңыз."</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="3328686432962224215">"Сиз сырсөзүңүздү <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тердиңиз. \n\n <xliff:g id="NUMBER_1">%2$d</xliff:g> секундадан кийин кайталаңыз."</string> @@ -1714,7 +1716,7 @@ <string name="color_inversion_feature_name" msgid="2672824491933264951">"Түстөрдү инверсиялоо"</string> <string name="color_correction_feature_name" msgid="7975133554160979214">"Түстөрдү тууралоо"</string> <string name="one_handed_mode_feature_name" msgid="2334330034828094891">"Бир кол режими"</string> - <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Дагы караңгы"</string> + <string name="reduce_bright_colors_feature_name" msgid="3222994553174604132">"Кошумча караңгылатуу"</string> <string name="hearing_aids_feature_name" msgid="1125892105105852542">"Угуу түзмөктөрү"</string> <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"Үндү катуулатуу/акырындатуу баскычтары басылып, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> күйгүзүлдү."</string> <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"Үндү катуулатуу/акырындатуу баскычтары басылып, <xliff:g id="SERVICE_NAME">%1$s</xliff:g> өчүрүлдү."</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"Иштетүү"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"Жумуш колдонмолору жок"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Жеке колдонмолор жок"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"Жумуш үчүн <xliff:g id="APP">%s</xliff:g> колдонмосун ачасызбы?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> жумуш колдонмосун ачасызбы?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"Жеке <xliff:g id="APP">%s</xliff:g> колдонмосунда ачасызбы?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"Жумуш <xliff:g id="APP">%s</xliff:g> колдонмосунда ачасызбы?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"Жумуш колдонмосунан чаласызбы?"</string> @@ -2324,12 +2326,12 @@ <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофон жеткиликтүү"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофон бөгөттөлгөн"</string> <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Кош экран"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Кош экран күйүк"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen күйүк"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> контентти эки түзмөктө тең көрсөтүүдө"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Түзмөк ысып кетти"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Телефонуңуз ысып кеткендиктен, Кош экран функциясы жеткиликсиз"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Телефонуңуз ысып кеткендиктен, Dual Screen функциясы иштебейт"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen жеткиликсиз"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen жеткиликсиз, анткени Батареяны үнөмдөгүч режими күйүк. Муну параметрлерден өчүрсөңүз болот."</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Батарея үнөмдөгүч режими күйүп тургандыктан, Dual Screen функциясы иштебейт. Аны параметрлерден өчүрүп койсоңуз болот."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Параметрлерге өтүү"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Өчүрүү"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> конфигурацияланды"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index 15517b5ee3e3..5e95879862de 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ອະນຸຍາດໃຫ້ແອັບຮັບຂໍ້ມູນບໍລິການການຈ່າຍເງິນ NFC ທີ່ຕ້ອງການໄດ້ ເຊັ່ນ: ການຊ່ວຍເຫຼືອແບບລົງທະບຽນ ແລະ ປາຍທາງເສັ້ນທາງ."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ຄວບຄຸມ Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ອະນຸຍາດໃຫ້ແອັບຯຕິດຕໍ່ສື່ສານກັບປ້າຍກຳກັບ, ບັດ ແລະໂຕອ່ານຂອງການສື່ສານໄລຍະສັ້ນ (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"ເຫດການທຸລະກໍາອົງປະກອບຄວາມປອດໄພ"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ອະນຸຍາດໃຫ້ແອັບຮັບຂໍ້ມູນກ່ຽວກັບທຸລະກໍາທີ່ເກີດຂຶ້ນຢູ່ໃນອົງປະກອບທີ່ປອດໄພ."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ປິດການລັອກໜ້າຈໍ"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ອະນຸຍາດໃຫ້ແອັບຯປິດການເຮັດວຽກຂອງປຸ່ມລັອກ ແລະລະບົບຄວາມປອດໄພຂອງລະຫັດຜ່ານທີ່ເຊື່ອມໂຍງກັນ. ໂຕຢ່າງ: ໂທລະສັບຈະປິດການເຮັດວຽກຂອງປຸ່ມລັອກເມື່ອມີສາຍໂທເຂົ້າ ຈາກນັ້ນຈຶ່ງເປີດໃຊ້ໄດ້ອີກເມື່ອວາງສາຍແລ້ວ."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ຮ້ອງຂໍຄວາມຊັບຊ້ອນການລັອກໜ້າຈໍ"</string> @@ -2324,7 +2326,7 @@ <string name="mic_access_on_toast" msgid="2666925317663845156">"ໄມໂຄຣໂຟນພ້ອມໃຫ້ນຳໃຊ້"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"ໄມໂຄຣໂຟນຖືກບລັອກໄວ້"</string> <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ໜ້າຈໍຄູ່"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ເປີດໜ້າຈໍຄູ່ຢູ່"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ເປີດ Dual Screen ຢູ່"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ກຳລັງໃຊ້ຈໍສະແດງຜົນທັງສອງເພື່ອສະແດງເນື້ອຫາ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ອຸປະກອນຮ້ອນເກີນໄປ"</string> <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ໜ້າຈໍຄູ່ບໍ່ພ້ອມໃຫ້ນຳໃຊ້ເນື່ອງຈາກໂທລະສັບຂອງທ່ານຮ້ອນເກີນໄປ"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 6a12170004c8..dd3ab12cf3e2 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Programai leidžiama gauti pageidaujamą ARL mokamos paslaugos informaciją, pvz., užregistruotą pagalbą ir maršrutų tikslus."</string> <string name="permlab_nfc" msgid="1904455246837674977">"valdyti artimo lauko perdavimą (angl. „Near Field Communication“)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Leidžiama programai perduoti artimojo lauko ryšių technologijos (ALR) žymas, korteles ir skaitymo programas."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Saugos elemento operacijos įvykis"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Leidžiama programai gauti informaciją apie operacijas, vykstančias saugos elemente."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"išjungti ekrano užraktą"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Leidžiama programai neleisti klavišo užrakto ir visos susijusios slaptažodžio apsaugos. Pvz., telefonas neleidžia klavišo užrakto priimant gaunamąjį skambutį ir pakartotinai jį įgalina, kai skambutis baigiamas."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"pateikti ekrano užrakto sudėtingumo užklausą"</string> @@ -2325,11 +2327,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Leidžiama papildomai programai paleisti priekinio plano paslaugas fone."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofonas pasiekiamas"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofonas užblokuotas"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dvigubas ekranas"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Įjungtas dvigubas ekranas"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Įjungta „Dual Screen“"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"„<xliff:g id="APP_NAME">%1$s</xliff:g>“ naudoja abu ekranus turiniui rodyti"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Įrenginys per daug kaista"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvigubas ekranas nepasiekiamas, nes telefonas per daug kaista"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"„Dual Screen“ nepasiekiamas, nes telefonas per daug kaista"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Funkcija „Dual Screen“ nepasiekiama"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Funkcija „Dual Screen“ nepasiekiama, nes įjungta Akumuliatoriaus tausojimo priemonė. Šią parinktį bet kada galite išjungti skiltyje „Nustatymai“."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Eiti į skiltį „Nustatymai“"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index fade02ed8dac..c564e29efc40 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ļauj lietotnei iegūt informāciju par vēlamo NFC maksājumu pakalpojumu, piemēram, par reģistrētajiem lietojumprogrammu ID un maršruta galamērķi."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrolē tuvlauka saziņu"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Ļauj lietotnei sazināties ar tuva darbības lauka sakaru (Near Field Communication — NFC) atzīmēm, kartēm un lasītājiem."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Darījums, kas apstrādājams, izmantojot drošības elementu"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Ļauj lietotnei saņemt informāciju par darījumiem, kas apstrādājami, izmantojot drošības elementu."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"atspējot ekrāna bloķēšanu"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Ļauj lietotnei atspējot taustiņslēgu un visu saistīto paroļu drošību. Piemēram, tālrunis atspējo taustiņslēgu, saņemot ienākošu zvanu, un pēc zvana pabeigšanas atkārtoti iespējo taustiņslēgu."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ekrāna bloķēšanas sarežģītības pakāpes informācijas pieprasījums"</string> @@ -2324,13 +2326,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Ļauj palīglietotnei sākt priekšplāna pakalpojumus no fona."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofons ir pieejams."</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofons ir bloķēts."</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Divu ekrānu režīms"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Ieslēgts divu ekrānu režīms"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen režīms"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Ieslēgts Dual Screen režīms"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> satura rādīšanai izmanto abus displejus."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Ierīce ir pārāk sakarsusi"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Divu ekrānu režīms nav pieejams, jo tālrunis sāk pārāk sakarst."</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Divu ekrānu režīms nav pieejams"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Divu ekrānu režīms nav pieejams, jo ir ieslēgts akumulatora enerģijas taupīšanas režīms. To var izslēgt iestatījumos."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen režīms nav pieejams, jo tālrunis sāk pārāk sakarst."</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen režīms nav pieejams"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen režīms nav pieejams, jo ir ieslēgts akumulatora enerģijas taupīšanas režīms. To var izslēgt iestatījumos."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Atvērt iestatījumus"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Izslēgt"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> ir konfigurēta"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 1f2341dd5387..7bfaf8f04cb7 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -296,7 +296,7 @@ <string name="foreground_service_multiple_separator" msgid="5002287361849863168">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string> <string name="safeMode" msgid="8974401416068943888">"Безбеден режим"</string> <string name="android_system_label" msgid="5974767339591067210">"Систем Android"</string> - <string name="user_owner_label" msgid="8628726904184471211">"Префрли на личен профил"</string> + <string name="user_owner_label" msgid="8628726904184471211">"Префрлете се на личен профил"</string> <string name="managed_profile_label" msgid="7316778766973512382">"Префрли се на работен профил"</string> <string name="user_owner_app_label" msgid="1553595155465750298">"Префрлете се на личната апликација <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="managed_profile_app_label" msgid="367401088383965725">"Префрлете се на работната апликација <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозволува апликацијата да добие информации за претпочитаната услуга за плаќање преку NFC, како регистрирани помагала и дестинација на маршрутата."</string> <string name="permlab_nfc" msgid="1904455246837674977">"контролирај комуникација на блиско поле"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Дозволува апликацијата да комуницира со ознаки, картички и читачи за Комуникација при непосредна близина (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Трансакциски настан на безбедносен елемент"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Овозможува апликацијата да прима податоци за трансакциите што се случуваат на безбедносен елемент."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"оневозможи заклучување на екран"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Овозможува апликацијата да го оневозможи заклучувањето и каква било безбедност поврзана со лозинка. На пример, телефонот го оневозможува заклучувањето при прием на телефонски повик, а потоа повторно го овозможува заклучувањето кога повикот ќе заврши."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"побарува сложеност за заклучувањето на екранот"</string> @@ -1256,7 +1258,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Се стартуваат апликациите."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Подигањето завршува."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Го притиснавте копчето за вклучување — така обично се исклучува екранот.\n\nДопрете лесно додека го поставувате отпечатокот."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"За да завршите со поставувањето, исклучете го екранот"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"За излез, исклучете го екранот"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Исклучи"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Да продолжи потврдувањето на отпечаток?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Го притиснавте копчето за вклучување — така обично се исклучува екранот.\n\nДопрете лесно за да го потврдите отпечатокот."</string> @@ -2323,13 +2325,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Дозволува придружна апликација да започне услуги во преден план од заднината."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофонот е достапен"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофонот е блокиран"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Двоен екран"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Вклучен е двоен екран"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Вклучен е Dual Screen"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ги користи двата екрани за да прикажува содржини"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Уредот е претопол"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Двојниот екран е недостапен бидејќи вашиот телефон станува претопол"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"„Двојниот екран“ е недостапен"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Двојниот екран е недостапен бидејќи е вклучен „Штедач на батерија“. Ова може да се исклучи во „Поставки“."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen е недостапен бидејќи вашиот телефон станува претопол"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen е недостапен"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen е недостапен бидејќи е вклучен „Штедач на батерија“. Ова може да се исклучи во „Поставки“."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Отворете „Поставки“"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Исклучи"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> е конфигуриран"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index c3b86e382399..0629062086f2 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"റൂട്ട് ലക്ഷ്യസ്ഥാനം, രജിസ്റ്റർ ചെയ്തിരിക്കുന്ന സഹായങ്ങൾ എന്നിവ പോലുള്ള, തിരഞ്ഞെടുത്ത NFC പേയ്മെന്റ് സേവനത്തെ സംബന്ധിച്ച വിവരങ്ങൾ ലഭിക്കാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_nfc" msgid="1904455246837674977">"സമീപ ഫീൽഡുമായുള്ള ആശയവിനിമയം നിയന്ത്രിക്കുക"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"നിയർ ഫീൽഡ് കമ്മ്യൂണിക്കേഷൻ (NFC) ടാഗുകളുമായും കാർഡുകളുമായും റീഡറുകളുമായുള്ള ആശയവിനിമയത്തിന് അപ്ലിക്കേഷനുകളെ അനുവദിക്കുന്നു."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"സുരക്ഷിത ഘടക ഇടപാട് ഇവന്റ്"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ഒരു സുരക്ഷിത ഘടകത്തിൽ നടക്കുന്ന ഇടപാടുകളെ കുറിച്ചുള്ള വിവരങ്ങൾ നേടാൻ ആപ്പിനെ അനുവദിക്കുന്നു."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"നിങ്ങളുടെ സ്ക്രീൻ ലോക്ക് പ്രവർത്തനരഹിതമാക്കുക"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"കീലോക്കും ഏതെങ്കിലും അനുബന്ധ പാസ്വേഡ് സുരക്ഷയും പ്രവർത്തനരഹിതമാക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. ഉദാഹരണത്തിന്, ഒരു ഇൻകമിംഗ് കോൾ സ്വീകരിക്കുമ്പോൾ ഫോൺ കീലോക്ക് പ്രവർത്തനരഹിതമാക്കുന്നു, കോൾ അവസാനിക്കുമ്പോൾ കീലോക്ക് വീണ്ടും പ്രവർത്തനക്ഷമമാകുന്നു."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"സ്ക്രീൻ ലോക്ക് സങ്കീർണ്ണത അഭ്യർത്ഥിക്കുക"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index b69fb83dde35..3647d6ea6107 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Бүртгүүлсэн төхөөрөмж болон маршрутын хүрэх цэг зэрэг сонгосон nfc төлбөрийн үйлчилгээний мэдээллийг авахыг аппад зөвшөөрдөг."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ойролцоо талбарын холбоог удирдах"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Апп нь Ойролцоо Талбарын Холболт(NFC) таг, карт, болон уншигчтай холбогдох боломжтой."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Аюулгүй элементийн гүйлгээний үйл явдал"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Аппад Аюулгүй элементэд хийгдэж буй гүйлгээний талаарх мэдээллийг хүлээн авахыг зөвшөөрнө."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"дэлгэцний түгжээг идэвхгүй болгох"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Апп нь түгжээ болон бусад холбоотой нууц үгийн аюулгүй байдлыг идэвхгүй болгох боломжтой. Жишээ нь бол утас нь дуудлага ирэх үед түгжээг идэвхгүй болгох ба дуудлага дуусахад буцаан идэвхтэй болгодог."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"дэлгэцийн түгжээний төвөгтэй байдлын хүсэлт тавих"</string> @@ -752,8 +754,8 @@ <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_bind_incall_service" msgid="5990625112603493016">"дуудлагын дэлгэцтэй харьцах"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"Апп-д дуудлагын дэлгэцийг хэрэглэгчид хэзээ хэрхэн харуулахыг удирдахыг зөвшөөрнө."</string> + <string name="permlab_bind_incall_service" msgid="5990625112603493016">"call screen-тай харьцах"</string> + <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"Апп-д call screen-г хэрэглэгчид хэзээ хэрхэн харуулахыг удирдахыг зөвшөөрнө."</string> <string name="permlab_bind_connection_service" msgid="5409268245525024736">"телефоны үйлчилгээтэй харилцах"</string> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"Апп-д телефон үйлчилгээтэй харилцаж дуудлага хийх/авахыг зөвшөөрнө."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"дуудлага хийж байгаа хэрэглэгчтэй харьцах"</string> @@ -806,7 +808,7 @@ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Дэлгэц түгжигдсэн үед нууц үг буруу оруулалтын тоог хянах ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал таблетыг түгжих болон таблетын бүх датаг арилгана"</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Дэлгэцийн түгжээг тайлахаар буруу оруулсан нууц үгийн тоог хянаж, нууц үгийг хэт олон удаа буруу оруулсан тохиолдолд таны Android TV төхөөрөмжийг түгжиж эсвэл үүний бүх өгөгдлийг устгана."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Дэлгэцийн түгжээг тайлахад буруу бичиж оруулсан нууц үгний тоог хянаж, инфотэйнмент системийг түгжих эсвэл хэт олон удаа нууц үгийг буруу бичиж оруулсан тохиолдолд инфотэйнмент системийн бүх өгөгдлийг устгана."</string> - <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Дэлгэц түгжигдсэн үед нууц үг буруу оруулалтын тоог хянах, ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал утсыг түгжих болон утасны бүх датаг арилгана"</string> + <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"Дэлгэц түгжигдсэн үед нууц үг буруу оруулалтын тоог хянах, ба хэрэв хэт олон удаа нууц үгийг буруу оруулбал утсыг түгжиж эсвэл утасны бүх өгөгдлийг арилгана"</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"Дэлгэцийн түгжээг тайлахад оруулсан буруу нууц үгийн давтамжийг хянаж таблетыг түгжих эсвэл буруу нууц үгийг хэт олон удаа оруулсан тохиолдолд энэ хэрэглэгчийн мэдээллийг устгах."</string> <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"Дэлгэцийн түгжээг тайлахаар буруу оруулсан нууц үгийн тоог хянаж, нууц үгийг хэт олон удаа буруу оруулсан тохиолдолд таны Android TV төхөөрөмжийг түгжиж эсвэл энэ хэрэглэгчийн бүх өгөгдлийг устгана."</string> <string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"Дэлгэцийн түгжээг тайлахад буруу бичиж оруулсан нууц үгний тоог хянаж, инфотэйнмент системийг түгжих эсвэл хэт олон удаа нууц үгийг буруу бичиж оруулсан тохиолдолд энэ профайлын бүх өгөгдлийг устгана."</string> @@ -815,11 +817,11 @@ <string name="policydesc_resetPassword" msgid="4626419138439341851">"Дэлгэцийн түгжээг өөрчлөх."</string> <string name="policylab_forceLock" msgid="7360335502968476434">"Дэлгэц түгжих"</string> <string name="policydesc_forceLock" msgid="1008844760853899693">"Дэлгэц хэзээ яаж түгжихийг удирдах"</string> - <string name="policylab_wipeData" msgid="1359485247727537311">"Бүх датаг арилгах"</string> + <string name="policylab_wipeData" msgid="1359485247727537311">"Бүх өгөгдлийг арилгах"</string> <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Үйлдвэрийн дата утгыг өгсөнөөр таблетын дата шууд арилгагдана."</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Таны Android TV төхөөрөмжийн өгөгдлийг танд анхааруулалгүйгээр үйлдвэрээс гарсан төлөвт шилжүүлэн устгана."</string> <string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Үйлдвэрийн өгөгдлийн төлөвт үйлдлийг гүйцэтгэснээр инфотэйнмент системийн өгөгдлийг сануулгагүйгээр устгана."</string> - <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Сануулахгүйгээр утасны бүх мэдээллийг устгаж, үйлдвэрийн өгөгдмөл байдалд шилжүүлнэ"</string> + <string name="policydesc_wipeData" product="default" msgid="8036084184768379022">"Сануулахгүйгээр утасны бүх өгөгдлийг арилгаж, үйлдвэрийн өгөгдлийн тохиргоонд шинэчилнэ"</string> <string name="policylab_wipeData_secondaryUser" product="automotive" msgid="115034358520328373">"Профайлын өгөгдлийг устгах"</string> <string name="policylab_wipeData_secondaryUser" product="default" msgid="413813645323433166">"Хэрэглэгчийн мэдээллийг арилгах"</string> <string name="policydesc_wipeData_secondaryUser" product="tablet" msgid="2336676480090926470">"Анхааруулга өгөхгүйгээр энэ хэрэглэгчийн энэ таблет дээрх мэдээллийг устгах."</string> @@ -967,7 +969,7 @@ <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> - <string name="lockscreen_pattern_correct" msgid="8050630103651508582">"Зөв!"</string> + <string name="lockscreen_pattern_correct" msgid="8050630103651508582">"Зөв"</string> <string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"Дахин оролдох"</string> <string name="lockscreen_password_wrong" msgid="8605355913868947490">"Дахин оролдох"</string> <string name="lockscreen_storage_locked" msgid="634993789186443380">"Бүх онцлог, өгөгдлийн түгжээг тайлах"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Дэмжигч аппад нүүрэн талын үйлчилгээнүүдийг ардаас эхлүүлэхийг зөвшөөрнө."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофоныг ашиглах боломжгүй байна"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофоныг блоклосон байна"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Хоёр дэлгэц"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Хоёр дэлгэц асаалттай байна"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual screen асаалттай байна"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> контент харуулахын тулд хоёр дэлгэцийг хоёуланг нь ашиглаж байна"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Төхөөрөмж хэт халуун байна"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Таны утас хэт халж байгаа тул Хоёр дэлгэц боломжгүй байна"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Таны утас хэт халж байгаа тул Dual screen боломжгүй байна"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen боломжгүй байна"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Батарей хэмнэгч асаалттай байгаа тул Dual Screen боломжгүй байна. Та үүнийг Тохиргоонд унтрааж болно."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Тохиргоо руу очих"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 5f6b35dfb887..472e16130b34 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"नोंदणीकृत एड्स आणि मार्ग गंतव्यस्थान सारखी प्राधान्यकृत एनएफसी पेमेंट सेवेची माहिती मिळवण्यासाठी अॅपला अनुमती देते."</string> <string name="permlab_nfc" msgid="1904455246837674977">"फील्ड जवळील कम्युनिकेशन नियंत्रित करा"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"फील्ड जवळील कम्युनिकेशन (NFC) टॅग, कार्डे आणि वाचक यांच्यासह संवाद करण्यासाठी ॲपला अनुमती देते."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"सुरक्षित घटक यावरील व्यवहार इव्हेंट"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"अॅपला सुरक्षित घटक यावर होत असलेल्या व्यवहारांविषयी माहिती मिळवू देते."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"तुमचे स्क्रीन लॉक अक्षम करा"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"कीलॉक आणि कोणतीही संबद्ध पासवर्ड सुरक्षितता अक्षम करण्यासाठी अॅप ला अनुमती देते. उदाहरणार्थ, येणारा फोन कॉल प्राप्त करताना फोन कीलॉक अक्षम करतो, नंतर जेव्हा कॉल समाप्त होतो तेव्हा तो कीलॉक पुन्हा-सक्षम करतो."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"स्क्रीन लॉक क्लिष्टतेची विनंती करा"</string> @@ -752,8 +754,8 @@ <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_bind_incall_service" msgid="5990625112603493016">"कॉल-मधील स्क्रीनशी परस्परसंवाद करा"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"वापरकर्ता कॉल-मधील स्क्रीन केव्हा आणि कशी पाहतो ते नियंत्रित करण्याची अॅपला अनुमती देते."</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> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"कॉल करण्यासाठी/घेण्यासाठी टेलिफोनी सेवांशी परस्परसंवाद साधण्यासाठी अॅप ला अनुमती देते."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"एक कॉल-मधील वापरकर्ता अनुभव प्रदान करा"</string> @@ -802,11 +804,11 @@ <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"होल्डरला वापरकर्त्याच्या कृतीशिवाय पूर्वी इंस्टॉल केलेले अॅप अपडेट करण्याची अनुमती देते"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"पासवर्ड नियम सेट करा"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"स्क्रीन लॉक पासवर्ड आणि पिन मध्ये अनुमती दिलेले लांबी आणि वर्ण नियंत्रित करा."</string> - <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक प्रयत्नांचे परीक्षण करा"</string> + <string name="policylab_watchLogin" msgid="7599669460083719504">"स्क्रीन अनलॉक प्रयत्नांवर लक्ष ठेवा"</string> <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"टाइप केलेल्या अयोग्य पासवर्डांच्या अंकांचे परीक्षण करा. स्क्रीन अनलॉक केली जाते, तेव्हा टॅबलेट लॉक करा किंवा बरेच पासवर्ड टाइप केले असल्यास टॅबलेटचा सर्व डेटा मिटवा."</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"स्क्रीन अनलॉक करताना टाइप केलेल्या चुकीच्या पासवर्ड संख्येचे परीक्षण करते आणि Android TV डिव्हाइस लॉक करते किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास Android TV डिव्हाइसचा सर्व डेटा मिटवते."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"टाइप केलेल्या चुकीच्या पासवर्डच्या संख्येचे निरीक्षण करा. स्क्रीन अनलॉक करताना, इंफोटेनमेंट सिस्टीम लॉक करा किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास, इंफोटेनमेंट सिस्टीमचा सर्व डेटा मिटवा."</string> - <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"टाइप केलेल्या अयोग्य पासवर्डांच्या अंकांचे परीक्षण करा. स्क्रीन अनलॉक केली जाते, तेव्हा फोन लॉक करा किंवा बरेच पासवर्ड टाइप केले असल्यास फोनचा सर्व डेटा मिटवा."</string> + <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"स्क्रीन अनलॉक करताना टाइप केलेल्या अयोग्य पासवर्डच्या संख्येवर लक्ष ठेवा. बरेच पासवर्ड टाइप केले असल्यास फोन लॉक करा किंवा फोनचा सर्व डेटा मिटवा."</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"स्क्रीन अनलॉक करताना टाइप केलेल्या चुकीच्या पासवर्डांच्या संख्येचे परीक्षण करा आणि टॅबलेट लॉक करा किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास या वापरकर्त्याचा सर्व डेटा मिटवा."</string> <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"स्क्रीन अनलॉक करताना टाइप केलेल्या चुकीच्या पासवर्ड संख्येचे परीक्षण करते आणि Android TV डिव्हाइस लॉक करते किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास वापरकर्त्याचा सर्व डेटा मिटवते."</string> <string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"स्क्रीन अनलॉक करताना टाइप केलेल्या चुकीच्या पासवर्डच्या संख्येचे निरीक्षण करा आणि इंफोटेनमेंट सिस्टीम लॉक करा किंवा अनेक चुकीचे पासवर्ड टाइप केले असल्यास, या प्रोफाइलचा सर्व डेटा मिटवा."</string> @@ -1592,7 +1594,7 @@ <string name="data_usage_restricted_body" msgid="5338694433686077733">"प्रतिबंध काढण्यासाठी टॅप करा."</string> <string name="data_usage_rapid_title" msgid="2950192123248740375">"मोबाइल डेटाचा उच्च वापर"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"तुमच्या अॅप्सनी नेहमीपेक्षा जास्त डेटा वापरला आहे"</string> - <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> ने नेहमीपेक्षा जास्त डेटा वपरला आहे"</string> + <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"<xliff:g id="APP">%s</xliff:g> ने नेहमीपेक्षा जास्त डेटा वापरला आहे"</string> <string name="ssl_certificate" msgid="5690020361307261997">"सुरक्षितता प्रमाणपत्र"</string> <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"हे प्रमाणपत्र वैध आहे."</string> <string name="issued_to" msgid="5975877665505297662">"यावर जारी केले:"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"पुन्हा सुरू करा"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"कोणतीही कार्य ॲप्स सपोर्ट करत नाहीत"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"कोणतीही वैयक्तिक ॲप्स सपोर्ट करत नाहीत"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"ऑफिसची प्रोफाइल <xliff:g id="APP">%s</xliff:g> उघडायची आहे का?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"ऑफिसची प्रोफाइल <xliff:g id="APP">%s</xliff:g> उघडायचे आहे का?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"वैयक्तिक प्रोफाइल <xliff:g id="APP">%s</xliff:g> मध्ये उघडायची आहे का?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"ऑफिसची प्रोफाइल <xliff:g id="APP">%s</xliff:g> मध्ये उघडायची आहे का?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"work app मधून कॉल करायचा आहे का?"</string> @@ -2323,13 +2325,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"सहयोगी अॅपला बॅकग्राउंडमधून फोरग्राउंड सेवा सुरू करण्याची अनुमती देते."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"मायक्रोफोन उपलब्ध आहे"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"मायक्रोफोन ब्लॉक केलेला आहे"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ड्युअल स्क्रीन"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ड्युअल स्क्रीन सुरू आहे"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual screen सुरू आहे"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"आशय दाखवण्यासाठी <xliff:g id="APP_NAME">%1$s</xliff:g> दोन्ही डिस्प्ले वापरत आहे"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"डिव्हाइस खूप गरम आहे"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"तुमचा फोन खूप गरम होत असल्यामुळे ड्युअल स्क्रीन उपलब्ध नाही"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ड्युअल स्क्रीन उपलब्ध नाही"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"बॅटरी सेव्हर सुरू असल्यामुळे ड्युअल स्क्रीन उपलब्ध नाही. तुम्ही हे सेटिंग्ज मध्ये बंद करू शकता."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"तुमचा फोन खूप गरम होत असल्यामुळे Dual Screen उपलब्ध नाही"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen उपलब्ध नाही"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"बॅटरी सेव्हर सुरू असल्यामुळे Dual Screen उपलब्ध नाही. तुम्ही हे सेटिंग्ज मध्ये बंद करू शकता."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"सेटिंग्ज वर जा"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"बंद करा"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> कॉंफिगर केले आहे"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index f62c70690f05..8af6abc03f4b 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Membenarkan apl mendapatkan maklumat perkhidmatan pembayaran nfc pilihan seperti bantuan berdaftar dan destinasi laluan."</string> <string name="permlab_nfc" msgid="1904455246837674977">"mengawal Komunikasi Medan Dekat"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Membenarkan apl berkomunikasi dengan teg, kad dan pembaca Komunikasi Medan Dekat (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Peristiwa transaksi Unsur Selamat"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Membenarkan apl menerima maklumat tentang transaksi yang berlaku pada Unsur Selamat."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"lumpuhkan kunci skrin anda"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Membenarkan apl melumpuhkan kunci kekunci dan sebarang keselamatan kata laluan yang berkaitan. Sebagai contoh, telefon melumpuhkan kunci kekunci apabila menerima panggilan telefon masuk kemudian mendayakan semula kunci kekunci apabila panggilan selesai."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"minta kerumitan kunci skrin"</string> @@ -2122,7 +2124,7 @@ <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"Bluetooth akan kekal hidup semasa dalam mod pesawat"</string> <string name="car_loading_profile" msgid="8219978381196748070">"Memuatkan"</string> <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # fail}other{{file_name} + # fail}}"</string> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Tiada orang yang disyorkan untuk berkongsi"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Tiada orang yang disyorkan untuk membuat perkongsian"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"Senarai apl"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"Apl ini belum diberikan kebenaran merakam tetapi dapat merakam audio melalui peranti USB ini."</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"Skrin Utama"</string> @@ -2327,7 +2329,7 @@ <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dwiskrin dihidupkan"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> menggunakan kedua-dua paparan untuk menunjukkan kandungan"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Peranti terlalu panas"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dwiskrin tidak tersedia kerana telefon anda terlalu panas"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen tidak tersedia kerana telefon anda terlalu panas"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen tidak tersedia"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen tidak tersedia kerana Penjimat Bateri dihidupkan. Anda boleh mematikan ciri ini dalam Tetapan."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Akses Tetapan"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 5a849570766c..5de91583204e 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -229,7 +229,7 @@ <string name="reboot_to_update_reboot" msgid="4474726009984452312">"ပြန်လည်စတင်နေ…"</string> <string name="reboot_to_reset_title" msgid="2226229680017882787">"စက်ရုံထုတ်အခြေအနေပြန်ယူခြင်း"</string> <string name="reboot_to_reset_message" msgid="3347690497972074356">"ပြန်လည်စတင်နေ…"</string> - <string name="shutdown_progress" msgid="5017145516412657345">"စက်ပိတ်ပါမည်"</string> + <string name="shutdown_progress" msgid="5017145516412657345">"စက်ပိတ်နေသည်…"</string> <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"သင့်တက်ဘလက်အား စက်ပိတ်ပါမည်"</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"သင့် Android TV စက်ပစ္စည်း ပိတ်သွားပါမည်။"</string> <string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"သင်၏ ကြည့်ရှုမှု ပိတ်ပစ်မည်။"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"အက်ပ်အား ဦစားပေး NFC ငွေပေးချေမှုဆိုင်ရာ ဝန်ဆောင်မှု အချက်အလက်များဖြစ်သည့် မှတ်ပုံတင်ထားသော အကူအညီများနှင့် သွားလာရာ လမ်းကြောင်းတို့ကို ရယူရန် ခွင့်ပြုသည်။"</string> <string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communicationအား ထိန်းချုပ်ရန်"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"အက်ပ်အား တာတို စက်ကွင်း ဆက်သွယ်ရေး (NFC) တဲဂ်များ၊ ကဒ်များ နှင့် ဖတ်ကြသူတို့နှင့် ဆက်သွယ်ပြောဆိုခွင့် ပြုသည်။"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"‘လုံခြုံရေး အစိတ်အပိုင်း’ ငွေလွှဲပြောင်းမှု အစီအစဉ်"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"‘လုံခြုံရေး အစိတ်အပိုင်း’ တွင် ဖြစ်ပေါ်နေသည့် ငွေလွှဲပြောင်းမှုများအကြောင်း အချက်အလက်ကိုရယူရန် အက်ပ်အား ခွင့်ပြုနိုင်သည်။"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ဖန်သားပြင် သော့ချခြင်းအား မလုပ်နိုင်အောင် ပိတ်ရန်"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"အပလီကေးရှင်းအား သော့ချခြင်းနှင့် သက်ဆိုင်ရာ စကားဝှက်သတ်မှတ်ခြင်းများအား မသုံးနိုင်အောင် ပိတ်ခြင်းကို ခွင့်ပြုရန်။ ဥပမာ ဖုန်းလာလျှင် သော့ပိတ်ခြင်း ပယ်ဖျက်ခြင်း၊ ဖုန်းပြောပြီးလျှင် သော့ကို အလိုအလျောက် ပြန်ပိတ်ခြင်း"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ဖုန်းမျက်နှာပြင် လော့ခ်ချရန် ရှုပ်ထွေးမှုအဆင့် တောင်းခံခြင်း"</string> @@ -806,7 +808,7 @@ <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် တက်ဘလက်ကို သော့ခတ်ရန် သို့မဟုတ် တက်ဘလက် ဒေတာ အားလုံးကို ဖျက်ရန်။"</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"မျက်နှာပြင်ကို လော့ခ်ဖွင့်သည့်အခါ စကားဝှက်မှားယွင်းစွာ ရိုက်သွင်းသည့်အကြိမ်ရေကို စောင့်ကြည့်ပြီး မှားယွင်းသည့်အကြိမ်ရေ အလွန်များလာပါက သင့် Android TV စက်ပစ္စည်းကို လော့ခ်ချခြင်း သို့မဟုတ် သင့် Android TV ရှိ အသုံးပြုသူဒေတာများအားလုံးကို ဖျက်ခြင်းတို့ ပြုလုပ်သွားပါမည်။"</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"ဖန်သားပြင်လော့ခ်ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက် စကားဝှက် မမှန်မကန် ရိုက်ထည့်မှု များနေလျှင် သတင်းနှင့်ဖျော်ဖြေရေး စနစ်ကို လော့ခ်ချသည် (သို့) ၎င်း၏ ဒေတာအားလုံးကို ဖျက်သည်။"</string> - <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"မျက်နှာပြင်ကို သော့ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက်၊ စကားဝှက် ရိုက်ထည့်မှု သိပ်များနေလျှင် ဖုန်းကို သော့ခတ်ရန် သို့မဟုတ် ဖုန်း ဒေတာ အားလုံးကို ဖျက်ရန်။"</string> + <string name="policydesc_watchLogin" product="default" msgid="4885030206253600299">"မျက်နှာပြင်ကို လောခ်ဖွင့်ရန်အတွက် ရိုက်ထည့်သည့် မှားယွင်းသောစကားဝှက် အကြိမ်ရေကို စောင့်ကြည့်ပြီး မမှန်သောစကားဝှက် ရိုက်ထည့်မှု အလွန်များနေလျှင် ဖုန်းကိုလော့ခ်ချသည် (သို့) ဖုန်း ဒေတာအားလုံးကို ဖျက်သည်။"</string> <string name="policydesc_watchLogin_secondaryUser" product="tablet" msgid="2049038943004297474">"ဖန်မျက်နှာပြင်အား သော့ဖွင့်စဉ် လျှို့ဝှက်ကုဒ်အမှားများ ရိုက်သွင်းမှုအား စောင့်ကြည့်ရန်နှင့်၊ လျှို့ဝှက်ကုဒ်အမှားများ များစွာ ရိုက်သွင်းပါက တက်ဘလက်အား သော့ချခြင်း သို့မဟုတ် တက်ဘလက်၏ အချက်အလက်များအား ဖျက်ပစ်ခြင်းများ ပြုလုပ်မည်။"</string> <string name="policydesc_watchLogin_secondaryUser" product="tv" msgid="8965224107449407052">"မျက်နှာပြင်ကို လော့ခ်ဖွင့်သည့်အခါ စကားဝှက်မှားယွင်းစွာ ရိုက်သွင်းသည့်အကြိမ်ရေကို စောင့်ကြည့်ပြီး မှားယွင်းသည့်အကြိမ်ရေ အလွန်များလာပါက သင့် Android TV စက်ပစ္စည်းကို လော့ခ်ချခြင်း သို့မဟုတ် ဤအသုံးပြုသူဒေတာများအားလုံးကို ဖျက်ခြင်းတို့ ပြုလုပ်သွားပါမည်။"</string> <string name="policydesc_watchLogin_secondaryUser" product="automotive" msgid="7180857406058327941">"ဖန်သားပြင်လော့ခ်ဖွင့်ရန် အတွက် စကားဝှက် မမှန်မကန် ထည့်သွင်းမှု အရေအတွက်ကို စောင့်ကြည့်လျက် စကားဝှက် မမှန်မကန် ရိုက်ထည့်မှု များနေလျှင် သတင်းနှင့်ဖျော်ဖြေရေး စနစ်ကို လော့ခ်ချသည် (သို့) ဤပရိုဖိုင်၏ ဒေတာအားလုံးကို ဖျက်သည်။"</string> @@ -1951,7 +1953,7 @@ <string name="app_suspended_more_details" msgid="211260942831587014">"ပိုမိုလေ့လာရန်"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"အက်ပ်ကို ခဏမရပ်တော့ရန်"</string> <string name="work_mode_off_title" msgid="6367463960165135829">"အလုပ်သုံးအက်ပ် ပြန်ဖွင့်မလား။"</string> - <string name="work_mode_turn_on" msgid="5316648862401307800">"ပြန်စရန်"</string> + <string name="work_mode_turn_on" msgid="5316648862401307800">"ပြန်ဖွင့်ရန်"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"အရေးပေါ်"</string> <string name="app_blocked_title" msgid="7353262160455028160">"အက်ပ်ကို မရနိုင်ပါ"</string> <string name="app_blocked_message" msgid="542972921087873023">"<xliff:g id="APP_NAME">%1$s</xliff:g> ကို ယခု မရနိုင်ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 15ef328cfbb0..0b7569973b1e 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Gir appen tilgang til informasjon om prioritert NFC-betalingstjeneste, for eksempel registrerte hjelpemidler og destinasjon."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontroller overføring av data med NFC-teknologi"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Lar appen kommunisere med etiketter, kort og lesere som benytter NFC-teknologi."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Transaksjonshendelse på sikkert element"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Lar appen motta informasjon om transaksjoner som finner sted på et sikkert element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"deaktivere skjermlåsen"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Lar appen deaktivere tastelåsen og eventuell tilknyttet passordsikkerhet. Et eksempel er at telefonen deaktiverer tastelåsen når du mottar et innkommende anrop, og deretter aktiverer tastelåsen igjen når samtalen er ferdig."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"be om skjermlåsens kompleksitet"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Lar en følgeapp starte forgrunnstjenester fra bakgrunnen."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofonen er tilgjengelig"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofonen er blokkert"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dobbel skjerm"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dobbel skjerm er på"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen er på"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> bruker begge skjermene til å vise innhold"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Enheten er for varm"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dobbel skjerm er ikke tilgjengelig fordi telefonen begynner å bli for varm"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen er ikke tilgjengelig fordi telefonen begynner å bli for varm"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen er ikke tilgjengelig"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen er ikke tilgjengelig fordi Batterisparing er slått på. Du kan slå av denne funksjonen i innstillingene."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Gå til innstillingene"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 92ee0a1cad69..6e0ebd9c5176 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"यसले एपलाई दर्ता गरिएका सहायता तथा मार्गको गन्तव्य जस्ता रुचाइएका NFC भुक्तानी सेवासम्बन्धी जानकारी प्राप्त गर्न दिन्छ।"</string> <string name="permlab_nfc" msgid="1904455246837674977">"नजिक क्षेत्र संचार नियन्त्रणहरू"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"एपलाई नयाँ क्षेत्र संचार (NFC) ट्यागहरू, कार्डहरू र पाठकहरूसँग अन्तर्क्रिया गर्न अनुमति दिन्छ।"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"\"सुरक्षित तत्त्व\" मा भएको कारोबार"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"यो विकल्प छनौट गर्नाले एपलाई \"सुरक्षित तत्त्व\" मा भएका कारोबारहरूका बारेमा जानकारी प्राप्त गर्ने अनुमति दिन्छ।"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"स्क्रिन लक असक्षम पार्नुहोस्"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"कुनै सम्बन्धित पासवर्ड सुरक्षा र किलकलाई असक्षम पार्न एपलाई अनुमति दिन्छ। उदाहरणको लागि, अन्तर्गमन फोन कल प्राप्त गर्दा फोनले किलकलाई असक्षम पार्छ, त्यसपछि कल सकिएको बेला किलक पुनःसक्षम पार्छ।"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"स्क्रिन लकको जटिलतासम्बन्धी जानकारी प्राप्त गर्ने अनुरोध गर्नुहोस्"</string> @@ -752,8 +754,8 @@ <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_bind_incall_service" msgid="5990625112603493016">"आगमन कल स्क्रिन संग अन्तर्क्रिया गर्नुहोस्"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"कहिले र कसरी प्रयोगकर्ताले आगमन कल स्क्रीन हेर्न सक्दछ भनेर नियन्त्रण गर्न एपलाई अनुमति दिनुहोस्।"</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> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"एपलाई कल बनाउन/प्राप्त गर्न टेलीफोनी सेवा साथ अन्तरक्रिया गर्न अनुमति दिन्छ।"</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"आउने-कल प्रयोगकर्ता अनुभव प्रदान गर्नुहोस्"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"यसले सहयोगी एपलाई ब्याकग्राउन्डमा फोरग्राउन्ड सेवाहरू चलाउने अनुमति दिन्छ।"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"माइक्रोफोन अनम्युट गरिएको छ"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"माइक्रोफोन म्युट गरिएको छ"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"डुअल स्क्रिन"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"डुअल स्क्रिन अन छ"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen अन छ"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ले सामग्री देखाउन दुई वटै डिस्प्ले प्रयोग गरिरहेको छ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"डिभाइस ज्यादै तातेको छ"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"तपाईंको फोन ज्यादै तातिरहेको हुनाले डुअल स्क्रिन उपलब्ध छैन"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"तपाईंको फोन ज्यादै तातिरहेको हुनाले Dual Screen उपलब्ध छैन"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen उपलब्ध छैन"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ब्याट्री सेभर अन भएकाले Dual Screen उपलब्ध छैन। तपाईं सेटिङमा गई यो सुविधा अफ गर्न सक्नुहुन्छ।"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"सेटिङमा जानुहोस्"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 80082c86cc7b..498150a8cce2 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -192,7 +192,7 @@ <string name="network_logging_notification_text" msgid="1327373071132562512">"Dit apparaat wordt beheerd door je organisatie. Het netwerkverkeer kan worden bijgehouden. Tik voor meer informatie."</string> <string name="location_changed_notification_title" msgid="3620158742816699316">"Apps hebben toegang tot je locatie"</string> <string name="location_changed_notification_text" msgid="7158423339982706912">"Neem contact op met je IT-beheerder voor meer informatie"</string> - <string name="geofencing_service" msgid="3826902410740315456">"Service voor geo-fencing"</string> + <string name="geofencing_service" msgid="3826902410740315456">"Service voor geofencing"</string> <string name="country_detector" msgid="7023275114706088854">"Landdetectie"</string> <string name="location_service" msgid="2439187616018455546">"Locatieservice"</string> <string name="gnss_service" msgid="8907781262179951385">"GNSS-service"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Hiermee kun je zorgen dat de app informatie krijgt over de voorkeursservice voor NFC-betaling, zoals geregistreerde hulpmiddelen en routebestemmingen."</string> <string name="permlab_nfc" msgid="1904455246837674977">"Near Field Communication regelen"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Hiermee kan de app communiceren met NFC-tags (Near Field Communication), kaarten en lezers."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element-transactiegebeurtenis"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Staat toe dat de app informatie krijgt over transacties die plaatsvinden in een Secure Element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"je schermvergrendeling uitzetten"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Hiermee kan de app de toetsenblokkering en bijbehorende wachtwoordbeveiliging uitzetten. Zo kan de telefoon de toetsenblokkering uitzetten als je wordt gebeld en de toetsenblokkering weer aanzetten als het gesprek is beëindigd."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"complexiteit van schermvergrendeling opvragen"</string> @@ -1567,7 +1569,7 @@ <string name="shareactionprovider_share_with" msgid="2753089758467748982">"Delen met"</string> <string name="shareactionprovider_share_with_application" msgid="4902832247173666973">"Delen met <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string> <string name="content_description_sliding_handle" msgid="982510275422590757">"Schuifgreep. Tikken en blijven aanraken."</string> - <string name="description_target_unlock_tablet" msgid="7431571180065859551">"Swipen om te ontgrendelen"</string> + <string name="description_target_unlock_tablet" msgid="7431571180065859551">"Swipe om te ontgrendelen"</string> <string name="action_bar_home_description" msgid="1501655419158631974">"Navigeren naar startpositie"</string> <string name="action_bar_up_description" msgid="6611579697195026932">"Omhoog navigeren"</string> <string name="action_menu_overflow_description" msgid="4579536843510088170">"Meer opties"</string> @@ -2293,7 +2295,7 @@ <string name="sensor_privacy_start_use_mic_notification_content_title" msgid="2420858361276370367">"Blokkeren van apparaatmicrofoon opheffen"</string> <string name="sensor_privacy_start_use_camera_notification_content_title" msgid="7287720213963466672">"Blokkeren van apparaatcamera opheffen"</string> <string name="sensor_privacy_start_use_notification_content_text" msgid="7595608891015777346">"Voor <b><xliff:g id="APP">%s</xliff:g></b> en alle andere apps en services"</string> - <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Blokkeren opheffen"</string> + <string name="sensor_privacy_start_use_dialog_turn_on_button" msgid="7089318886628390827">"Niet meer blokkeren"</string> <string name="sensor_privacy_notification_channel_label" msgid="936036783155261349">"Sensorprivacy"</string> <string name="splash_screen_view_icon_description" msgid="180638751260598187">"App-icoon"</string> <string name="splash_screen_view_branding_description" msgid="7911129347402728216">"Merkafbeelding voor app"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Hiermee kan een bijbehorende app services op de voorgrond vanuit de achtergrond starten."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Microfoon is beschikbaar"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Microfoon is geblokkeerd"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dubbel scherm"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dubbel scherm staat aan"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen staat aan"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> gebruikt beide schermen om content te tonen"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Het apparaat is te warm"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dubbel scherm is niet beschikbaar, omdat je telefoon te warm wordt"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen is niet beschikbaar, omdat je telefoon te warm wordt"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen is niet beschikbaar"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen is niet beschikbaar omdat Batterijbesparing aanstaat. Je kunt dit uitzetten via Instellingen."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Naar Instellingen"</string> diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index 680cf9b71dcc..1c42b04509b0 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -229,7 +229,7 @@ <string name="reboot_to_update_reboot" msgid="4474726009984452312">"ରିଷ୍ଟାର୍ଟ କରାଯାଉଛି…"</string> <string name="reboot_to_reset_title" msgid="2226229680017882787">"ଫ୍ୟାକ୍ଟୋରୀ ଡାଟା ରିସେଟ୍"</string> <string name="reboot_to_reset_message" msgid="3347690497972074356">"ରିଷ୍ଟାର୍ଟ କରାଯାଉଛି…"</string> - <string name="shutdown_progress" msgid="5017145516412657345">"ବନ୍ଦ କରାଯାଉଛି…"</string> + <string name="shutdown_progress" msgid="5017145516412657345">"ବନ୍ଦ ହେଉଛି…"</string> <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"ଆପଣଙ୍କ ଟାବଲେଟ୍ ବନ୍ଦ ହୋଇଯିବ।"</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"ଆପଣଙ୍କର Android TV ଡିଭାଇସ୍ ବନ୍ଦ ହୋଇଯିବ।"</string> <string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"ଆପଣଙ୍କ ଘଣ୍ଟା ବନ୍ଦ ହୋଇଯିବ।"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ପଞ୍ଜିକୃତ ଯନ୍ତ୍ର ଏବଂ ମାର୍ଗ ଲକ୍ଷସ୍ଥଳ ପରି ପସନ୍ଦର nfc ପେମେଣ୍ଟ ସେବା ସୂଚନା ପାଇବାକୁ ଆପ୍ ଅନୁମତି କରିଥାଏ।"</string> <string name="permlab_nfc" msgid="1904455246837674977">"ନିଅର୍ ଫିଲ୍ଡ କମ୍ୟୁନିକେଶନ୍ ଉପରେ ନିୟନ୍ତ୍ରଣ ରଖନ୍ତୁ"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ନିଅର୍ ଫିଲ୍ଡ କମ୍ୟୁନିକେସନ୍ନ (NFC) ଟାଗ୍, କାର୍ଡ ଓ ରିଡରଗୁଡ଼ିକ ସହ ଯୋଗାଯୋଗ କରିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"ସୁରକ୍ଷିତ ଏଲିମେଣ୍ଟ ଟ୍ରାଞ୍ଜେକସନ ଇଭେଣ୍ଟ"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ଏହା ଏକ ସୁରକ୍ଷିତ ଏଲିମେଣ୍ଟରେ ହେଉଥିବା ଟ୍ରାଞ୍ଜେକସନ ବିଷୟରେ ସୂଚନା ପାଇବା ପାଇଁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ ଲକ୍ ଅକ୍ଷମ କରନ୍ତୁ"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ଆପ୍କୁ କୀ\'ଲକ୍ କିମ୍ବା ସେଥିରେ ଥିବା କୌଣସି ପାସ୍ୱର୍ଡ ସୁରକ୍ଷାକୁ ଅକ୍ଷମ କରିବା ପାଇଁ ଅନୁମତି ଦିଏ, ଉଦାହରଣସ୍ୱରୂପ, ଇନ୍କମିଙ୍ଗ ଫୋନ୍ କଲ୍ ପ୍ରାପ୍ତ କରିବା ସମୟରେ ଫୋନ୍ଟି କୀ\'ଲକ୍କୁ ଅକ୍ଷମ କରିଦିଏ, ତା’ପରେ କଲ୍ ସମାପ୍ତ ହେବାପରେ ପୁଣି କୀ\'ଲକ୍କୁ ସକ୍ଷମ କରିଥାଏ।"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ସ୍କ୍ରିନ୍ ଲକ୍ ଜଟିଳତା ସଂକ୍ରାନ୍ତ ଅନୁରୋଧ"</string> @@ -752,8 +754,8 @@ <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_bind_incall_service" msgid="5990625112603493016">"ଇନ୍ କଲ୍ ସ୍କ୍ରୀନ୍ ସହିତ ସଂଯୋଗ କରନ୍ତୁ"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"ୟୁଜର୍ କଲ୍ ଇନ୍ ସ୍କ୍ରୀନ୍ କେବେ ଓ କିପରି ଦେଖୁଛି, ତାହାକୁ ନିୟନ୍ତ୍ରିତ କରିବା ପାଇଁ ଆପ୍କୁ ଅନୁମତି ଦିଅନ୍ତୁ।"</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> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"ଆପ୍କୁ କଲ୍ କରିବା ଏବଂ ପ୍ରାପ୍ତ କରିବା ପାଇଁ ଟେଲିଫୋନୀ ସେବା ସହିତ ସଂଯୋଗ କରିବା ପାଇଁ ଅନୁମତି ଦିଅନ୍ତୁ।"</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"ଏକ କଲ୍ ୟୁଜର୍ ଅନୁଭବ ପ୍ରଦାନ କରିଥାଏ"</string> @@ -1430,7 +1432,7 @@ <string name="ext_media_nomedia_notification_message" msgid="2832724384636625852">"କିଛି କାର୍ଯ୍ୟକ୍ଷମତା ଠିକ୍ ଭାବେ କାମ ନକରିପାରେ। ନୂଆ ଷ୍ଟୋରେଜ୍ ଭର୍ତ୍ତି କରନ୍ତୁ।"</string> <string name="ext_media_unmounting_notification_title" msgid="4147986383917892162">"<xliff:g id="NAME">%s</xliff:g>କୁ ଇଜେକ୍ଟ କରାଯାଉଛି"</string> <string name="ext_media_unmounting_notification_message" msgid="5717036261538754203">"କାଢ଼ନ୍ତୁ ନାହିଁ"</string> - <string name="ext_media_init_action" msgid="2312974060585056709">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> + <string name="ext_media_init_action" msgid="2312974060585056709">"ସେଟ ଅପ କରନ୍ତୁ"</string> <string name="ext_media_unmount_action" msgid="966992232088442745">"କାଢ଼ି ଦିଅନ୍ତୁ"</string> <string name="ext_media_browse_action" msgid="344865351947079139">"ଖୋଜନ୍ତୁ"</string> <string name="ext_media_seamless_action" msgid="8837030226009268080">"ଆଉଟ୍ପୁଟ୍ ସ୍ୱିଚ୍ କରନ୍ତୁ"</string> @@ -2323,13 +2325,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"ପୃଷ୍ଠପଟରୁ ଫୋରଗ୍ରାଉଣ୍ଡ ସେବାଗୁଡ଼ିକ ଆରମ୍ଭ କରିବାକୁ ଏକ ସହଯୋଗୀ ଆପକୁ ଅନୁମତି ଦିଏ।"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"ମାଇକ୍ରୋଫୋନ ଉପଲବ୍ଧ ଅଛି"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"ମାଇକ୍ରୋଫୋନକୁ ବ୍ଲକ କରାଯାଇଛି"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ଡୁଆଲ ସ୍କ୍ରିନ"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ଡୁଆଲ ସ୍କ୍ରିନ ଚାଲୁ ଅଛି"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen ଚାଲୁ ଅଛି"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"ବିଷୟବସ୍ତୁ ଦେଖାଇବା ପାଇଁ <xliff:g id="APP_NAME">%1$s</xliff:g> ଉଭୟ ଡିସପ୍ଲେକୁ ବ୍ୟବହାର କରୁଛି"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ଡିଭାଇସ ବହୁତ ଗରମ ଅଛି"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ଆପଣଙ୍କ ଫୋନ ବହୁତ ଗରମ ହେଉଥିବା ଯୋଗୁଁ ଡୁଆଲ ସ୍କ୍ରିନ ଉପଲବ୍ଧ ନାହିଁ"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"ଡୁଆଲ ସ୍କ୍ରିନ ଉପଲବ୍ଧ ନାହିଁ"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ବେଟେରୀ ସେଭର ଚାଲୁ ଥିବା ଯୋଗୁଁ ଡୁଆଲ ସ୍କ୍ରିନ ଉପଲବ୍ଧ ନାହିଁ। ଆପଣ ସେଟିଂସରେ ଏହାକୁ ବନ୍ଦ କରିପାରିବେ।"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ଆପଣଙ୍କ ଫୋନ ବହୁତ ଗରମ ହେଉଥିବା ଯୋଗୁଁ Dual Screen ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"ବେଟେରୀ ସେଭର ଚାଲୁ ଥିବା ଯୋଗୁଁ Dual Screen ଉପଲବ୍ଧ ନାହିଁ। ଆପଣ ସେଟିଂସରେ ଏହାକୁ ବନ୍ଦ କରିପାରିବେ।"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"ସେଟିଂସକୁ ଯାଆନ୍ତୁ"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g>କୁ କନଫିଗର କରାଯାଇଛି"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 9c61e5b3f03c..eb20f20d2f47 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ਐਪ ਨੂੰ ਤਰਜੀਹੀ NFC ਭੁਗਤਾਨਸ਼ੁਦਾ ਸੇਵਾ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦਿੰਦਾ ਹੈ ਜਿਵੇਂ ਕਿ ਰਜਿਸਟਰ ਕੀਤੇ ਸਾਧਨ ਅਤੇ ਮੰਜ਼ਿਲ ਰਸਤਾ।"</string> <string name="permlab_nfc" msgid="1904455246837674977">"ਨਜ਼ਦੀਕੀ ਖੇਤਰ ਸੰਚਾਰ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ਐਪ ਨੂੰ ਨਜ਼ਦੀਕੀ ਖੇਤਰ ਸੰਚਾਰ (NFC) ਟੈਗਾਂ, ਕਾਰਡਾਂ ਅਤੇ ਰੀਡਰਾਂ ਨਾਲ ਸੰਚਾਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"ਸੁਰੱਖਿਅਤ ਅੰਸ਼ ਦੇ ਲੈਣ-ਦੇਣ ਸੰਬੰਧੀ ਇਵੈਂਟ"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ਐਪ ਨੂੰ ਸੁਰੱਖਿਅਤ ਅੰਸ਼ \'ਤੇ ਹੋਣ ਵਾਲੇ ਲੈਣ-ਦੇਣ ਬਾਰੇ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ਆਪਣਾ ਸਕ੍ਰੀਨ ਲਾਕ ਅਸਮਰੱਥ ਬਣਾਓ"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ਐਪ ਨੂੰ ਕੀਲਾਕ ਅਤੇ ਕਿਸੇ ਵੀ ਸੰਬੰਧਿਤ ਪਾਸਵਰਡ ਸੁਰੱਖਿਆ ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਫ਼ੋਨ ਇੱਕ ਇਨਕਮਿੰਗ ਫ਼ੋਨ ਕਾਲ ਪ੍ਰਾਪਤ ਕਰਨ ਵੇਲੇ ਬੰਦ ਕਰਦਾ ਹੈ, ਫਿਰ ਜਦੋਂ ਕਾਲ ਖਤਮ ਹੁੰਦੀ ਹੈ ਤਾਂ ਕੀਲਾਕ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰਦਾ ਹੈ।"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ਸਕ੍ਰੀਨ ਲਾਕ ਦੀ ਜਟਿਲਤਾ ਲਈ ਬੇਨਤੀ ਕਰੋ"</string> @@ -2122,7 +2124,7 @@ <string name="bluetooth_airplane_mode_toast" msgid="2066399056595768554">"ਹਵਾਈ-ਜਹਾਜ਼ ਮੋਡ ਵੇਲੇ ਬਲੂਟੁੱਥ ਹਾਲੇ ਵੀ ਚਾਲੂ ਹੋ ਜਾਵੇਗਾ"</string> <string name="car_loading_profile" msgid="8219978381196748070">"ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> <string name="file_count" msgid="3220018595056126969">"{count,plural, =1{{file_name} + # ਫ਼ਾਈਲ}one{{file_name} + # ਫ਼ਾਈਲ}other{{file_name} + # ਫ਼ਾਈਲਾਂ}}"</string> - <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ਸਾਂਝਾ ਕਰਨ ਲਈ ਕੋਈ ਸਿਫ਼ਾਰਸ਼ ਕੀਤੇ ਲੋਕ ਨਹੀਂ"</string> + <string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"ਸਾਂਝਾ ਕਰਨ ਲਈ ਕੋਈ ਸਿਫ਼ਾਰਸ਼ ਕੀਤਾ ਵਿਅਕਤੀ ਨਹੀਂ ਹੈ"</string> <string name="chooser_all_apps_button_label" msgid="3230427756238666328">"ਐਪ ਸੂਚੀ"</string> <string name="usb_device_resolve_prompt_warn" msgid="325871329788064199">"ਇਸ ਐਪ ਨੂੰ ਰਿਕਾਰਡ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਗਈ ਪਰ ਇਹ USB ਡੀਵਾਈਸ ਰਾਹੀਂ ਆਡੀਓ ਕੈਪਚਰ ਕਰ ਸਕਦੀ ਹੈ।"</string> <string name="accessibility_system_action_home_label" msgid="3234748160850301870">"ਹੋਮ"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"ਰੋਕ ਹਟਾਓ"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"ਕੋਈ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਨਹੀਂ"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"ਕੋਈ ਨਿੱਜੀ ਐਪ ਨਹੀਂ"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"ਕੀ ਕੰਮ ਸੰਬੰਧੀ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"ਕੰਮ ਸੰਬੰਧੀ <xliff:g id="APP">%s</xliff:g> ਨੂੰ ਖੋਲ੍ਹਣਾ ਹੈ?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"ਕੀ ਨਿੱਜੀ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"ਕੀ ਕੰਮ ਸੰਬੰਧੀ <xliff:g id="APP">%s</xliff:g> ਵਿੱਚ ਖੋਲ੍ਹਣਾ ਹੈ?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"ਕੀ ਕੰਮ ਸੰਬੰਧੀ ਐਪ ਤੋਂ ਕਾਲ ਕਰਨੀ ਹੈ?"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"ਸੰਬੰਧੀ ਐਪ ਨੂੰ ਬੈਕਗ੍ਰਾਊਂਡ ਤੋਂ ਫੋਰਗ੍ਰਾਊਂਡ ਸੇਵਾਵਾਂ ਸ਼ੁਰੂ ਕਰਨ ਦੀ ਆਗਿਆ ਮਿਲਦੀ ਹੈ।"</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਉਪਲਬਧ ਹੈ"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਬਲਾਕ ਕੀਤਾ ਗਿਆ ਹੈ"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ਦੋਹਰੀ ਸਕ੍ਰੀਨ"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ਦੋਹਰੀ ਸਕ੍ਰੀਨ ਚਾਲੂ ਹੈ"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen ਚਾਲੂ ਹੈ"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> ਸਮੱਗਰੀ ਨੂੰ ਦਿਖਾਉਣ ਲਈ ਦੋਵੇਂ ਡਿਸਪਲੇਆਂ ਦੀ ਵਰਤੋਂ ਕਰ ਰਹੀ ਹੈ"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"ਡੀਵਾਈਸ ਬਹੁਤ ਗਰਮ ਹੈ"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ਦੋਹਰੀ ਸਕ੍ਰੀਨ ਵਿਸ਼ੇਸ਼ਤਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen ਵਿਸ਼ੇਸ਼ਤਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ਵਿਸ਼ੇਸ਼ਤਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ਵਿਸ਼ੇਸ਼ਤਾ ਉਪਲਬਧ ਨਹੀਂ ਹੈ ਕਿਉਂਕਿ ਬੈਟਰੀ ਸੇਵਰ ਚਾਲੂ ਹੈ। ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਬੰਦ ਕਰ ਸਕਦੇ ਹੋ।"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"ਸੈਟਿੰਗਾਂ \'ਤੇ ਜਾਓ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 7a8684f4e8bc..03b82f366878 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Pozwala aplikacji uzyskiwać informacje o preferowanych usługach płatniczych NFC, np. zarejestrowanych pomocach i miejscach docelowych tras."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrolowanie łączności Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Pozwala aplikacji na komunikowanie się z tagami, kartami i czytnikami NFC (Near Field Communication)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Wydarzenie transakcji w Bezpiecznym elemencie"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Zezwala na otrzymywanie przez aplikację informacji o transakcjach realizowanych w Bezpiecznym elemencie."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"wyłączanie blokady ekranu"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Pozwala aplikacji na wyłączenie blokady klawiatury i wszystkich związanych z tym haseł zabezpieczających. Na przykład telefon wyłącza blokadę klawiatury, gdy odbiera połączenie przychodzące, a następnie włącza ją ponownie po zakończeniu połączenia."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"żądaj informacji o stopniu złożoności blokady ekranu"</string> @@ -2329,7 +2331,7 @@ <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Włączono podwójny ekran"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Aplikacja <xliff:g id="APP_NAME">%1$s</xliff:g> korzysta z obu wyświetlaczy, aby pokazać treści"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Urządzenie jest za ciepłe"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Podwójny ekran jest niedostępny, ponieważ telefon za bardzo się nagrzewa"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Funkcja Dual Screen jest niedostępna, ponieważ telefon za bardzo się nagrzewa"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Funkcja Dual Screen jest niedostępna"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Funkcja Dual Screen jest niedostępna, ponieważ włączono Oszczędzanie baterii. Możesz to wyłączyć w Ustawieniach."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Otwórz ustawienia"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 0a6f769a13dc..7086e57f77fe 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que o app acesse as informações preferidas de serviço de pagamento por NFC, como auxílios registrados ou destinos de trajetos."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlar a comunicação a curta distância"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permite que o app se comunique com leitores, cartões e etiqueta NFC (comunicação a curta distância)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Evento de transação do Elemento de segurança"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permite que o app receba informações sobre transações que ocorrem em um Elemento de segurança."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"desativar o bloqueio de tela"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permite que o app desative o bloqueio de teclas e qualquer segurança por senha associada. Por exemplo, o telefone desativa o bloqueio de telas ao receber uma ligação e o reativa quando a chamada é finalizada."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"Solicitar complexidade do bloqueio de tela"</string> @@ -778,7 +780,7 @@ <string name="permlab_accessNetworkConditions" msgid="1270732533356286514">"detectar observações nas condições da rede"</string> <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"Permite que o app detecte observações nas condições da rede. Não deve ser necessário para apps comuns."</string> <string name="permlab_setInputCalibration" msgid="932069700285223434">"alterar calibragem do dispositivo de entrada"</string> - <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"Permite que o app modifique os parâmetros de calibragem da tela sensível ao toque. Não deve ser necessário para apps normais."</string> + <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"Permite que o app modifique os parâmetros de calibragem da tela touch. Não deve ser necessário para apps normais."</string> <string name="permlab_accessDrmCertificates" msgid="6473765454472436597">"acessar certificados de DRM"</string> <string name="permdesc_accessDrmCertificates" msgid="6983139753493781941">"Permite que o app provisione e use certificados de DRM. Não deve ser necessário para apps comuns."</string> <string name="permlab_handoverStatus" msgid="7620438488137057281">"receber status de transferência do Android Beam"</string> @@ -1591,7 +1593,7 @@ <string name="data_usage_limit_snoozed_body" msgid="545146591766765678">"Você ultrapassou <xliff:g id="SIZE">%s</xliff:g> do limite definido"</string> <string name="data_usage_restricted_title" msgid="126711424380051268">"Dados de segundo plano restritos"</string> <string name="data_usage_restricted_body" msgid="5338694433686077733">"Toque para remover a restrição."</string> - <string name="data_usage_rapid_title" msgid="2950192123248740375">"Alto uso de dados móveis"</string> + <string name="data_usage_rapid_title" msgid="2950192123248740375">"Uso elevado de dados móveis"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"Seus apps usaram mais dados do que o normal"</string> <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"O app <xliff:g id="APP">%s</xliff:g> usou mais dados do que o normal"</string> <string name="ssl_certificate" msgid="5690020361307261997">"Certificado de segurança"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 96242e16dcae..10099d644a65 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -235,9 +235,9 @@ <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"O dispositivo Android TV será encerrado."</string> <string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"As suas visualizações vão ser encerradas."</string> <string name="shutdown_confirm" product="default" msgid="136816458966692315">"O seu telefone será encerrado."</string> - <string name="shutdown_confirm_question" msgid="796151167261608447">"Pretende encerrar?"</string> + <string name="shutdown_confirm_question" msgid="796151167261608447">"Quer encerrar?"</string> <string name="reboot_safemode_title" msgid="5853949122655346734">"Reiniciar no modo de segurança"</string> - <string name="reboot_safemode_confirm" msgid="1658357874737219624">"Pretende reiniciar no modo de segurança? Se sim, irá desativar todas as aplicações de terceiros instaladas. Estas serão restauradas quando reiniciar novamente."</string> + <string name="reboot_safemode_confirm" msgid="1658357874737219624">"Quer reiniciar no modo de segurança? Se sim, irá desativar todas as aplicações de terceiros instaladas. Estas serão restauradas quando reiniciar novamente."</string> <string name="recent_tasks_title" msgid="8183172372995396653">"Recente"</string> <string name="no_recent_tasks" msgid="9063946524312275906">"Não existem aplicações recentes"</string> <string name="global_actions" product="tablet" msgid="4412132498517933867">"Opções do tablet"</string> @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que a app obtenha informações de serviços de pagamento com NFC preferenciais, como apoios registados e destino da rota."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlo Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permite que a app comunique com etiquetas, cartões e leitores Near Field Communication (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Evento de transação do elemento seguro"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permite que a app receba informações sobre transações que ocorram num elemento seguro."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"desativar o bloqueio do ecrã"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permite que a app desative o bloqueio de teclas e qualquer segurança por palavra-passe associada. Por exemplo, o telemóvel desativa o bloqueio de teclas quando recebe uma chamada e reativa o bloqueio de teclas ao terminar a chamada."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"solicitar a complexidade do bloqueio de ecrã"</string> @@ -961,7 +963,7 @@ <string name="keyguard_password_wrong_pin_code" msgid="8583732939138432793">"Código PIN incorreto."</string> <string name="keyguard_label_text" msgid="3841953694564168384">"Para desbloquear, prima Menu e, em seguida, 0."</string> <string name="emergency_call_dialog_number_for_display" msgid="2978165477085612673">"Número de emergência"</string> - <string name="lockscreen_carrier_default" msgid="6192313772955399160">"Sem rede móvel"</string> + <string name="lockscreen_carrier_default" msgid="6192313772955399160">"Sem dados"</string> <string name="lockscreen_screen_locked" msgid="7364905540516041817">"Ecrã bloqueado."</string> <string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"Prima Menu para desbloquear ou efectuar uma chamada de emergência."</string> <string name="lockscreen_instructions_when_pattern_disabled" msgid="7434061749374801753">"Prima Menu para desbloquear."</string> @@ -1065,7 +1067,7 @@ <string name="js_dialog_before_unload_title" msgid="7012587995876771246">"Confirmar Navegação"</string> <string name="js_dialog_before_unload_positive_button" msgid="4274257182303565509">"Sair desta Página"</string> <string name="js_dialog_before_unload_negative_button" msgid="3873765747622415310">"Permanecer nesta Página"</string> - <string name="js_dialog_before_unload" msgid="7213364985774778744">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nTem a certeza de que pretende navegar para outra página?"</string> + <string name="js_dialog_before_unload" msgid="7213364985774778744">"<xliff:g id="MESSAGE">%s</xliff:g>\n\nTem a certeza de que quer navegar para outra página?"</string> <string name="autofill_window_title" msgid="4379134104008111961">"Preenchimento automático com <xliff:g id="SERVICENAME">%1$s</xliff:g>"</string> <string name="permlab_setAlarm" msgid="1158001610254173567">"definir um alarme"</string> <string name="permdesc_setAlarm" msgid="2185033720060109640">"Permite que a app defina um alarme numa app de despertador instalada. Algumas aplicações de despertador podem não integrar esta funcionalidade."</string> @@ -1091,8 +1093,8 @@ <string name="searchview_description_submit" msgid="6771060386117334686">"Enviar consulta"</string> <string name="searchview_description_voice" msgid="42360159504884679">"Pesquisa por voz"</string> <string name="enable_explore_by_touch_warning_title" msgid="5095399706284943314">"Ativar Explorar Através do Toque?"</string> - <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o tablet."</string> - <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> pretende ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel."</string> + <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="1037295476738940824">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o tablet."</string> + <string name="enable_explore_by_touch_warning_message" product="default" msgid="4312979647356179250">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar a funcionalidade Explorar Através do Toque. Quando a funcionalidade Explorar Através do Toque estiver ativada, pode ouvir ou visualizar descrições sobre o que está por baixo do seu dedo ou executar gestos para interagir com o telemóvel."</string> <string name="oneMonthDurationPast" msgid="4538030857114635777">"Há 1 mês"</string> <string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Há mais de 1 mês"</string> <string name="last_num_days" msgid="2393660431490280537">"{count,plural, =1{# dia anterior}many{# dias anteriores}other{# dias anteriores}}"</string> @@ -1230,7 +1232,7 @@ <string name="force_close" msgid="9035203496368973803">"OK"</string> <string name="report" msgid="2149194372340349521">"Relatório"</string> <string name="wait" msgid="7765985809494033348">"Esperar"</string> - <string name="webpage_unresponsive" msgid="7850879412195273433">"A página deixou de responder. \n \n Pretende fechá-la?"</string> + <string name="webpage_unresponsive" msgid="7850879412195273433">"A página deixou de responder. \n \n Quer fechá-la?"</string> <string name="launch_warning_title" msgid="6725456009564953595">"Aplicação redirecionada"</string> <string name="launch_warning_replace" msgid="3073392976283203402">"<xliff:g id="APP_NAME">%1$s</xliff:g> está agora a ser executado."</string> <string name="launch_warning_original" msgid="3332206576800169626">"<xliff:g id="APP_NAME">%1$s</xliff:g> foi originalmente iniciado."</string> @@ -1273,7 +1275,7 @@ <string name="dump_heap_notification" msgid="5316644945404825032">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite da memória"</string> <string name="dump_heap_ready_notification" msgid="2302452262927390268">"A captura da área dinâmica para dados do processo <xliff:g id="PROC">%1$s</xliff:g> está pronta."</string> <string name="dump_heap_notification_detail" msgid="8431586843001054050">"Foi recolhida a captura da área dinâmica para dados. Toque para partilhar."</string> - <string name="dump_heap_title" msgid="4367128917229233901">"Pretende partilhar a captura da área dinâmica para dados?"</string> + <string name="dump_heap_title" msgid="4367128917229233901">"Quer partilhar a captura da área dinâmica para dados?"</string> <string name="dump_heap_text" msgid="1692649033835719336">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu o respetivo limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Está disponível uma captura da área dinâmica para dados para partilhar com o respetivo programador. Atenção: esta captura da área dinâmica para dados pode conter algumas das suas informações pessoais a que a app tem acesso."</string> <string name="dump_heap_system_text" msgid="6805155514925350849">"O processo <xliff:g id="PROC">%1$s</xliff:g> excedeu o respetivo limite de memória de <xliff:g id="SIZE">%2$s</xliff:g>. Está disponível uma captura da área dinâmica para dados para partilhar. Atenção: esta captura da área dinâmica para dados pode conter informações pessoais confidenciais a que o processo tem acesso, que podem incluir coisas que escreveu."</string> <string name="dump_heap_ready_text" msgid="5849618132123045516">"Está disponível uma captura da área dinâmica para dados do processo <xliff:g id="PROC">%1$s</xliff:g> para partilhar. Atenção: esta captura da área dinâmica para dados pode conter informações pessoais confidenciais a que o processo tem acesso, que podem incluir coisas que escreveu."</string> @@ -1325,7 +1327,7 @@ <string name="decline" msgid="6490507610282145874">"Recusar"</string> <string name="select_character" msgid="3352797107930786979">"Introduzir carácter"</string> <string name="sms_control_title" msgid="4748684259903148341">"A enviar mensagens SMS"</string> - <string name="sms_control_message" msgid="6574313876316388239">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> está a enviar um grande número de mensagens SMS. Pretende autorizar que a app continue a enviar mensagens?"</string> + <string name="sms_control_message" msgid="6574313876316388239">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> está a enviar um grande número de mensagens SMS. Quer autorizar que a app continue a enviar mensagens?"</string> <string name="sms_control_yes" msgid="4858845109269524622">"Permitir"</string> <string name="sms_control_no" msgid="4845717880040355570">"Recusar"</string> <string name="sms_short_code_confirm_message" msgid="1385416688897538724">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> gostaria de enviar uma mensagem para <b><xliff:g id="DEST_ADDRESS">%2$s</xliff:g></b>."</string> @@ -1387,7 +1389,7 @@ <string name="usb_contaminant_not_detected_title" msgid="2651167729563264053">"É seguro utilizar a porta USB"</string> <string name="usb_contaminant_not_detected_message" msgid="892863190942660462">"O telemóvel já não deteta líquidos nem resíduos."</string> <string name="taking_remote_bugreport_notification_title" msgid="1582531382166919850">"A criar relatório de erro…"</string> - <string name="share_remote_bugreport_notification_title" msgid="6708897723753334999">"Pretende partilhar o relatório de erro?"</string> + <string name="share_remote_bugreport_notification_title" msgid="6708897723753334999">"Quer partilhar o relatório de erro?"</string> <string name="sharing_remote_bugreport_notification_title" msgid="3077385149217638550">"A partilhar relatório de erro…"</string> <string name="share_remote_bugreport_notification_message_finished" msgid="7325635795739260135">"O seu gestor solicitou um relatório de erro para ajudar na resolução de problemas deste dispositivo. As aplicações e os dados podem ser partilhados."</string> <string name="share_remote_bugreport_action" msgid="7630880678785123682">"PARTILHAR"</string> @@ -1403,7 +1405,7 @@ <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"Sobrepor a outras apps"</string> <string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"A app <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplicações"</string> <string name="alert_windows_notification_title" msgid="6331662751095228536">"O <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras app"</string> - <string name="alert_windows_notification_message" msgid="6538171456970725333">"Se não pretende que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string> + <string name="alert_windows_notification_message" msgid="6538171456970725333">"Se não quer que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string> <string name="alert_windows_notification_turn_off_action" msgid="7805857234839123780">"Desligar"</string> <string name="ext_media_checking_notification_title" msgid="8299199995416510094">"A verificar o <xliff:g id="NAME">%s</xliff:g>…"</string> <string name="ext_media_checking_notification_message" msgid="2231566971425375542">"A rever o conteúdo atual…"</string> @@ -1479,7 +1481,7 @@ <string name="dial_number_using" msgid="6060769078933953531">"Marcar número\nutilizando <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="6200708808003692594">"Criar contacto\nutilizando <xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"Uma ou várias das aplicações seguintes solicitam permissão para aceder à sua conta, agora e no futuro."</string> - <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Pretende autorizar este pedido?"</string> + <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"Quer autorizar este pedido?"</string> <string name="grant_permissions_header_text" msgid="3420736827804657201">"Pedido de acesso"</string> <string name="allow" msgid="6195617008611933762">"Permitir"</string> <string name="deny" msgid="6632259981847676572">"Recusar"</string> @@ -1531,7 +1533,7 @@ <string name="gpsVerifYes" msgid="3719843080744112940">"Sim"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"Não"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"Limite de eliminações excedido"</string> - <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens eliminados de <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que pretende fazer?"</string> + <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"Há <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> itens eliminados de <xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>, conta <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g>. O que quer fazer?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"Eliminar os itens"</string> <string name="sync_undo_deletes" msgid="5786033331266418896">"Anular as eliminações"</string> <string name="sync_do_nothing" msgid="4528734662446469646">"Não fazer nada por agora"</string> @@ -1593,7 +1595,7 @@ <string name="data_usage_restricted_body" msgid="5338694433686077733">"Toque para remover a restrição."</string> <string name="data_usage_rapid_title" msgid="2950192123248740375">"Utilização elevada de dados móveis"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"As suas aplicações utilizaram mais dados do que o habitual."</string> - <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"A app <xliff:g id="APP">%s</xliff:g> utilizou mais dados do que o habitual."</string> + <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"A app <xliff:g id="APP">%s</xliff:g> usou mais dados do que o habitual"</string> <string name="ssl_certificate" msgid="5690020361307261997">"Certificado de segurança"</string> <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"Este certificado é válido."</string> <string name="issued_to" msgid="5975877665505297662">"Emitido para:"</string> @@ -1685,7 +1687,7 @@ <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"Aumentar o volume acima do nível recomendado?\n\nOuvir com um volume elevado durante longos períodos poderá ser prejudicial para a sua audição."</string> <string name="csd_dose_reached_warning" product="default" msgid="491875107583931974">"Quer continuar a ouvir com um volume elevado?\n\nO volume dos auscultadores está elevado há mais tempo do que o recomendado, o que pode ser prejudicial para a sua audição"</string> <string name="csd_momentary_exposure_warning" product="default" msgid="7730840903435405501">"Som alto detetado\n\nO volume dos auscultadores tem estado mais elevado do que o recomendado, o que pode ser prejudicial para a sua audição"</string> - <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Pretende utilizar o atalho de acessibilidade?"</string> + <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"Quer utilizar o atalho de acessibilidade?"</string> <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"Quando o atalho está ativado, premir ambos os botões de volume durante 3 segundos inicia uma funcionalidade de acessibilidade."</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"Ativar o atalho das funcionalidades de acessibilidade?"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"Manter premidas ambas as teclas de volume durante alguns segundos ativa as funcionalidades de acessibilidade. Estas podem alterar a forma como o seu dispositivo funciona.\n\nFuncionalidades atuais:\n<xliff:g id="SERVICE">%1$s</xliff:g>\npode alterar as funcionalidades selecionadas em Definições > Acessibilidade."</string> @@ -2018,14 +2020,14 @@ <string name="autofill_error_cannot_autofill" msgid="6528827648643138596">"Não é possível preencher automaticamente o conteúdo"</string> <string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Sem sugestões do preenchimento automático"</string> <string name="autofill_picker_some_suggestions" msgid="5560549696296202701">"{count,plural, =1{Uma sugestão do preenchimento automático}many{# sugestões de preenchimento automático}other{# sugestões de preenchimento automático}}"</string> - <string name="autofill_save_title" msgid="7719802414283739775">"Pretende guardar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> - <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> - <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> - <string name="autofill_save_title_with_3types" msgid="6598228952100102578">"Pretende guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>"?"</string> - <string name="autofill_update_title" msgid="3630695947047069136">"Pretende atualizar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> - <string name="autofill_update_title_with_type" msgid="5264152633488495704">"Pretende atualizar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> - <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Pretende atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> - <string name="autofill_update_title_with_3types" msgid="1312232153076212291">"Pretende atualizar estes itens em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string> + <string name="autofill_save_title" msgid="7719802414283739775">"Quer guardar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> + <string name="autofill_save_title_with_type" msgid="3002460014579799605">"Quer guardar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> + <string name="autofill_save_title_with_2types" msgid="3783270967447869241">"Quer guardar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> + <string name="autofill_save_title_with_3types" msgid="6598228952100102578">"Quer guardar <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g> em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>"?"</string> + <string name="autofill_update_title" msgid="3630695947047069136">"Quer atualizar em "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string> + <string name="autofill_update_title_with_type" msgid="5264152633488495704">"Quer atualizar <xliff:g id="TYPE">%1$s</xliff:g> em "<b>"<xliff:g id="LABEL">%2$s</xliff:g>"</b>"?"</string> + <string name="autofill_update_title_with_2types" msgid="1797514386321086273">"Quer atualizar <xliff:g id="TYPE_0">%1$s</xliff:g> e <xliff:g id="TYPE_1">%2$s</xliff:g> em "<b>"<xliff:g id="LABEL">%3$s</xliff:g>"</b>"?"</string> + <string name="autofill_update_title_with_3types" msgid="1312232153076212291">"Quer atualizar estes itens em "<b>"<xliff:g id="LABEL">%4$s</xliff:g>"</b>": <xliff:g id="TYPE_0">%1$s</xliff:g>, <xliff:g id="TYPE_1">%2$s</xliff:g> e <xliff:g id="TYPE_2">%3$s</xliff:g>?"</string> <string name="autofill_save_yes" msgid="8035743017382012850">"Guardar"</string> <string name="autofill_save_no" msgid="9212826374207023544">"Não, obrigado"</string> <string name="autofill_save_notnow" msgid="2853932672029024195">"Agora não"</string> @@ -2064,7 +2066,7 @@ <string name="harmful_app_warning_uninstall" msgid="6472912975664191772">"DESINSTALAR"</string> <string name="harmful_app_warning_open_anyway" msgid="5963657791740211807">"ABRIR MESMO ASSIM"</string> <string name="harmful_app_warning_title" msgid="8794823880881113856">"Aplicação prejudicial detetada"</string> - <string name="slices_permission_request" msgid="3677129866636153406">"A app <xliff:g id="APP_0">%1$s</xliff:g> pretende mostrar partes da app <xliff:g id="APP_2">%2$s</xliff:g>."</string> + <string name="slices_permission_request" msgid="3677129866636153406">"A app <xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes da app <xliff:g id="APP_2">%2$s</xliff:g>."</string> <string name="screenshot_edit" msgid="7408934887203689207">"Editar"</string> <string name="volume_dialog_ringer_guidance_vibrate" msgid="2055927873175228519">"As chamadas e as notificações vibram."</string> <string name="volume_dialog_ringer_guidance_silent" msgid="1011246774949993783">"É desativado o som das chamadas e das notificações."</string> @@ -2324,11 +2326,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Permite que uma app associada em segundo plano inicie serviços em primeiro plano."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"O microfone está disponível"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"O microfone está bloqueado"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dois ecrãs"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Funcionalidade Dual Screen ativada"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"A app <xliff:g id="APP_NAME">%1$s</xliff:g> está a usar ambos os ecrãs para mostrar conteúdo"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"O dispositivo está a ficar demasiado quente"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A funcionalidade Dois ecrãs está indisponível porque o seu telemóvel está a ficar demasiado quente"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"A funcionalidade Dual Screen está indisponível porque o seu telemóvel está a ficar demasiado quente"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"A funcionalidade Dual Screen está indisponível"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"A funcionalidade Dual Screen está indisponível porque a Poupança de bateria está ativada. Pode desativar esta opção nas Definições."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Aceder às Definições"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 0a6f769a13dc..7086e57f77fe 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite que o app acesse as informações preferidas de serviço de pagamento por NFC, como auxílios registrados ou destinos de trajetos."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlar a comunicação a curta distância"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permite que o app se comunique com leitores, cartões e etiqueta NFC (comunicação a curta distância)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Evento de transação do Elemento de segurança"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permite que o app receba informações sobre transações que ocorrem em um Elemento de segurança."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"desativar o bloqueio de tela"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permite que o app desative o bloqueio de teclas e qualquer segurança por senha associada. Por exemplo, o telefone desativa o bloqueio de telas ao receber uma ligação e o reativa quando a chamada é finalizada."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"Solicitar complexidade do bloqueio de tela"</string> @@ -778,7 +780,7 @@ <string name="permlab_accessNetworkConditions" msgid="1270732533356286514">"detectar observações nas condições da rede"</string> <string name="permdesc_accessNetworkConditions" msgid="2959269186741956109">"Permite que o app detecte observações nas condições da rede. Não deve ser necessário para apps comuns."</string> <string name="permlab_setInputCalibration" msgid="932069700285223434">"alterar calibragem do dispositivo de entrada"</string> - <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"Permite que o app modifique os parâmetros de calibragem da tela sensível ao toque. Não deve ser necessário para apps normais."</string> + <string name="permdesc_setInputCalibration" msgid="2937872391426631726">"Permite que o app modifique os parâmetros de calibragem da tela touch. Não deve ser necessário para apps normais."</string> <string name="permlab_accessDrmCertificates" msgid="6473765454472436597">"acessar certificados de DRM"</string> <string name="permdesc_accessDrmCertificates" msgid="6983139753493781941">"Permite que o app provisione e use certificados de DRM. Não deve ser necessário para apps comuns."</string> <string name="permlab_handoverStatus" msgid="7620438488137057281">"receber status de transferência do Android Beam"</string> @@ -1591,7 +1593,7 @@ <string name="data_usage_limit_snoozed_body" msgid="545146591766765678">"Você ultrapassou <xliff:g id="SIZE">%s</xliff:g> do limite definido"</string> <string name="data_usage_restricted_title" msgid="126711424380051268">"Dados de segundo plano restritos"</string> <string name="data_usage_restricted_body" msgid="5338694433686077733">"Toque para remover a restrição."</string> - <string name="data_usage_rapid_title" msgid="2950192123248740375">"Alto uso de dados móveis"</string> + <string name="data_usage_rapid_title" msgid="2950192123248740375">"Uso elevado de dados móveis"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"Seus apps usaram mais dados do que o normal"</string> <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"O app <xliff:g id="APP">%s</xliff:g> usou mais dados do que o normal"</string> <string name="ssl_certificate" msgid="5690020361307261997">"Certificado de segurança"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 5a5132c6b24f..799ed5109895 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Permite aplicației să obțină informații despre serviciul de plăți NFC preferat, de exemplu, identificatorii de aplicație înregistrați și destinația traseului."</string> <string name="permlab_nfc" msgid="1904455246837674977">"controlare schimb de date prin Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Permite aplicației să comunice cu etichetele, cardurile și cititoarele NFC (Near Field Communication)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Eveniment de tranzacție în cadrul unui element securizat"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Permite aplicației să primească informații despre tranzacțiile care au loc în cadrul unui element securizat."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"dezactivează blocarea ecranului"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Permite aplicației să dezactiveze blocarea tastelor și orice modalitate asociată de securizare prin parolă. De exemplu, telefonul dezactivează blocarea tastelor când se primește un apel telefonic și reactivează blocarea tastelor la terminarea apelului."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"să solicite complexitatea blocării ecranului"</string> @@ -1257,7 +1259,7 @@ <string name="android_upgrading_starting_apps" msgid="6206161195076057075">"Se pornesc aplicațiile."</string> <string name="android_upgrading_complete" msgid="409800058018374746">"Se finalizează pornirea."</string> <string name="fp_power_button_enrollment_message" msgid="5648173517663246140">"Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor când îți configurezi amprenta."</string> - <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Ca să termini configurarea, dezactivează ecranul"</string> + <string name="fp_power_button_enrollment_title" msgid="6976841690455338563">"Termină configurarea dezactivând ecranul"</string> <string name="fp_power_button_enrollment_button_text" msgid="3199783266386029200">"Dezactivează"</string> <string name="fp_power_button_bp_title" msgid="5585506104526820067">"Continui cu verificarea amprentei?"</string> <string name="fp_power_button_bp_message" msgid="2983163038168903393">"Ai apăsat butonul de pornire. De obicei, astfel se dezactivează ecranul.\n\nAtinge ușor pentru verificarea amprentei."</string> @@ -1951,7 +1953,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"Momentan, aplicația <xliff:g id="APP_NAME_0">%1$s</xliff:g> nu este disponibilă. Aceasta este gestionată de <xliff:g id="APP_NAME_1">%2$s</xliff:g>."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Află mai multe"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Anulează întreruperea aplicației"</string> - <string name="work_mode_off_title" msgid="6367463960165135829">"Reactivezi aplicații lucru?"</string> + <string name="work_mode_off_title" msgid="6367463960165135829">"Reactivezi aplicații de lucru?"</string> <string name="work_mode_turn_on" msgid="5316648862401307800">"Reactivează"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Urgență"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Aplicația nu este disponibilă"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index e48c48711a3b..f0118fa0c44a 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Приложение сможет получать сведения о предпочтительном платежном сервисе NFC (например, зарегистрированные идентификаторы AID и конечный пункт маршрута)."</string> <string name="permlab_nfc" msgid="1904455246837674977">"Управление NFC-модулем"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Приложение сможет обмениваться данными с NFC-метками, картами и устройствами считывания, используя NFC."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Транзакции, обрабатываемые в защитном элементе"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Позволяет приложению получать информацию о транзакциях, обрабатываемых в защитном элементе."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"Отключение функции блокировки экрана"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Приложение сможет отключать блокировку экрана и другие функции защиты. Например, блокировка экрана будет отключаться при получении входящего вызова и включаться после завершения разговора."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"Запрос данных об уровне сложности блокировки экрана"</string> @@ -1594,7 +1596,7 @@ <string name="data_usage_restricted_body" msgid="5338694433686077733">"Нажмите, чтобы отменить ограничение."</string> <string name="data_usage_rapid_title" msgid="2950192123248740375">"Высокое потребление трафика"</string> <string name="data_usage_rapid_body" msgid="3886676853263693432">"В ваших приложениях было передано больше трафика, чем обычно."</string> - <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"В приложении \"<xliff:g id="APP">%s</xliff:g>\" было передано больше трафика, чем обычно."</string> + <string name="data_usage_rapid_app_body" msgid="5425779218506513861">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" использовало больше трафика, чем обычно."</string> <string name="ssl_certificate" msgid="5690020361307261997">"Сертификат безопасности"</string> <string name="ssl_certificate_is_valid" msgid="7293675884598527081">"Этот сертификат действителен."</string> <string name="issued_to" msgid="5975877665505297662">"Кому выдан:"</string> @@ -1861,7 +1863,7 @@ <string name="select_day" msgid="2060371240117403147">"Выберите месяц и число"</string> <string name="select_year" msgid="1868350712095595393">"Выберите год"</string> <string name="deleted_key" msgid="9130083334943364001">"Цифра <xliff:g id="KEY">%1$s</xliff:g> удалена"</string> - <string name="managed_profile_label_badge" msgid="6762559569999499495">"Рабочий <xliff:g id="LABEL">%1$s</xliff:g>"</string> + <string name="managed_profile_label_badge" msgid="6762559569999499495">"<xliff:g id="LABEL">%1$s</xliff:g> (рабочий профиль)"</string> <string name="managed_profile_label_badge_2" msgid="5673187309555352550">"Задача 2: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="managed_profile_label_badge_3" msgid="6882151970556391957">"Задача 3: <xliff:g id="LABEL">%1$s</xliff:g>"</string> <string name="clone_profile_label_badge" msgid="1871997694718793964">"Клонировать <xliff:g id="LABEL">%1$s</xliff:g>"</string> @@ -2325,11 +2327,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Сопутствующее приложение сможет запускать активные службы из фонового режима."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофон доступен."</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофон заблокирован."</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Двойной экран"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Двойной экран включен"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Функция Dual Screen включена"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> использует оба экрана."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Устройство перегрелось"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Двойной экран недоступен из-за перегрева телефона."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функция Dual Screen недоступна из-за перегрева телефона."</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функция Dual Screen недоступна"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функция Dual Screen недоступна, так как включен режим энергосбережения. Вы можете отключить его в настройках."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Открыть настройки"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 0df5c652a35a..ecc6161e17ff 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ලියාපදිංචි කළ ආධාර සහ ගමන් මාර්ග ගමනාන්ත වැනි කැමති nfc ගෙවීම් සේවා තොරතුරු ලබා ගැනීමට යෙදුමට ඉඩ දෙයි."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ආසන්න ක්ෂේත්ර සන්නිවේදනය පාලනය කරන්න"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ආසන්න ක්ෂේත්ර සන්නිවේදන (NFC) ටැග්, පත්, සහ කියවන්නන් සමඟ සන්නිවේදනය කිරීමට යෙදුමට අවසර දෙන්න."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"සුරක්ෂිත මූලද්රව්ය ගනුදෙනු සිදුවීම"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"සුරක්ෂිත මූලද්රව්යයක සිදු වන ගනුදෙනු පිළිබඳ තොරතුරු ලබා ගැනීමට යෙදුමට ඉඩ දෙයි."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ඔබගේ තිරයේ අගුල අබල කරන්න"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"යතුරු අගුල සහ ඕනෑම සම්බන්ධිත මුරපද ආරක්ෂාවක් අබල කිරීමට යෙදුමට අවසර දෙන්න. මෙහි උදාහරණයක් වන්නේ පැමිණෙන ඇමතුමක් ලැබෙද්දී, දුරකථනය අක්රිය වන අතර ඇමතුම අවසාන වන විට යතුරු අගුල නැවත සක්රිය වෙයි."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"තිර අඟුලු සංකීර්ණතාව ඉල්ලන්න"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"පසුබිමේ සිට පෙරබිම් සේවා ආරම්භ කිරීමට සහායක යෙදුමකට ඉඩ දෙයි."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"මයික්රෆෝනය තිබේ"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"මයික්රෆෝනය අවහිර කර ඇත"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"ද්විත්ව තිරය"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"ද්විත්ව තිරය සක්රීයයි"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen සක්රීයයි"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"අන්තර්ගතය පෙන්වීමට <xliff:g id="APP_NAME">%1$s</xliff:g> සංදර්ශන දෙකම භාවිත කරයි"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"උපාංගය ඉතා උණුසුම් වේ"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ඔබේ දුරකථනය ඉතා උණුසුම් නිසා ද්විත්ව තිරය ලබා ගත නොහැක"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"ඔබේ දුරකථනය ඉතා උණුසුම් නිසා Dual Screen ලබා ගත නොහැක"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen නොමැත"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"බැටරි සුරැකුම ක්රියාත්මක නිසා Dual Screen නොමැත. ඔබට මෙය සැකසීම් තුළ ක්රියාවිරහිත කළ හැක."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"සැකසීම් වෙත යන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index f13ef2b2e120..5d0c712535dd 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -231,7 +231,7 @@ <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Reštartuje sa…"</string> <string name="reboot_to_reset_title" msgid="2226229680017882787">"Obnovenie výrobných nastavení"</string> <string name="reboot_to_reset_message" msgid="3347690497972074356">"Reštartuje sa…"</string> - <string name="shutdown_progress" msgid="5017145516412657345">"Prebieha vypínanie..."</string> + <string name="shutdown_progress" msgid="5017145516412657345">"Vypína sa..."</string> <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"Váš tablet bude vypnutý."</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"Zariadenie Android TV sa vypne."</string> <string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"Hodinky sa vypnú."</string> @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Umožňuje aplikácii získavať preferované informácie platenej služby NFC, napríklad o registrovanej pomoci a trasách k cieľu."</string> <string name="permlab_nfc" msgid="1904455246837674977">"ovládať technológiu NFC"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Umožňuje aplikácii komunikovať so značkami, kartami a čítačkami s podporou technológie NFC."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Udalosť transakcie bezpečnostného prvku"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Umožňuje aplikácii dostávať informácie o transakciách prebiehajúcich v bezpečnostnom prvku."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"deaktivácia zámky obrazovky"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Umožňuje aplikácii zakázať uzamknutie klávesnice a akékoľvek súvisiace zabezpečenie heslom. Príkladom je zakázanie uzamknutia klávesnice pri prichádzajúcom telefonickom hovore a jeho opätovné povolenie po skončení hovoru."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"požadovať zložitosť zámky obrazovky"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 4647ed9fba7b..4798fb1dae32 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -231,7 +231,7 @@ <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Vnovičen zagon …"</string> <string name="reboot_to_reset_title" msgid="2226229680017882787">"Ponastavitev na tovarniške nastavitve"</string> <string name="reboot_to_reset_message" msgid="3347690497972074356">"Vnovičen zagon …"</string> - <string name="shutdown_progress" msgid="5017145516412657345">"Se zaustavlja ..."</string> + <string name="shutdown_progress" msgid="5017145516412657345">"Izklaplja se ..."</string> <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"Tablični računalnik se bo zaustavil."</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"Naprava Android TV se bo zaustavila."</string> <string name="shutdown_confirm" product="watch" msgid="2977299851200240146">"Ura se bo izklopila."</string> @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Aplikaciji omogoča pridobivanje podatkov o prednostni storitvi za plačevanje prek povezave NFC, kot so registrirani pripomočki in cilj preusmeritve."</string> <string name="permlab_nfc" msgid="1904455246837674977">"nadzor nad komunikacijo s tehnologijo bližnjega polja"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Podpira komunikacijo med računalnikom in oznakami, karticami in bralniki komunikacije s tehnologijo bližnjega polja."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Dogodek transakcije prek varnostnega elementa"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Aplikaciji omogoča prejemanje podatkov o transakcijah, ki potekajo prek varnostnega elementa."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"onemogočanje zaklepanja zaslona"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Aplikaciji dovoljuje, da onemogoči zaklep tipkovnice in morebitno povezano varnostno geslo. Telefon na primer onemogoči zaklep tipkovnice pri dohodnem klicu ter vnovič omogoči zaklep, ko je klic končan."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"zahteva zapletenost zaklepanja zaslona"</string> @@ -2325,11 +2327,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Spremljevalni aplikaciji dovoljuje, da storitve v ospredju zažene iz ozadja."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofon je na voljo"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofon je blokiran"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dvojni zaslon"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dvojni zaslon je vklopljen"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen je vklopljen"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> uporablja oba zaslona za prikaz vsebine."</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Naprava se pregreva"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dvojni zaslon ni na voljo, ker se telefon pregreva."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen ni na voljo, ker se telefon pregreva."</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ni na voljo"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ni na voljo, ker je vklopljeno varčevanje z energijo baterije. To lahko izklopite v nastavitvah."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Odpri nastavitve"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 82d92c1d9039..a4cb43cdfc1c 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Lejon aplikacionin të marrë informacione për shërbimin e preferuar të pagesës me NFC si p.sh. ndihmat e regjistruara dhe destinacionin e itinerarit."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrollo \"Komunikimin e fushës në afërsi\" NFC"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Lejon aplikacionin të komunikojë me etiketimet e \"Komunikimit të fushës së afërt (NFC)\", kartat dhe lexuesit."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Ngjarje transaksioni me elementin e sigurt"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Lejon që aplikacioni të marrë informacione për transaksionet që kryhen në një element të sigurt."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"çaktivizo kyçjen e ekranit"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Lejon aplikacionin të çaktivizojë kyçjen e tasteve dhe çdo mbrojtje të lidhur me fjalëkalimin. Për shembull, telefoni çaktivizon kyçjen e tasteve kur merr një telefonatë hyrëse, pastaj riaktivizon kyçjen e tasteve kur mbaron telefonata."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"kërko kompleksitetin e kyçjes së ekranit"</string> @@ -2155,9 +2157,9 @@ <string name="resolver_personal_tab_accessibility" msgid="5739524949153091224">"Pamja personale"</string> <string name="resolver_work_tab_accessibility" msgid="4753168230363802734">"Pamja e punës"</string> <string name="resolver_cross_profile_blocked" msgid="3014597376026044840">"Bllokuar nga administratori yt i teknologjisë së informacionit"</string> - <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Kjo përmbajtje nuk mund të shpërndahet me aplikacione pune"</string> + <string name="resolver_cant_share_with_work_apps_explanation" msgid="9071442683080586643">"Kjo përmbajtje nuk mund të ndahet me aplikacione pune"</string> <string name="resolver_cant_access_work_apps_explanation" msgid="1129960195389373279">"Kjo përmbajtje nuk mund të hapet me aplikacione pune"</string> - <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Kjo përmbajtje nuk mund të shpërndahet me aplikacione personale"</string> + <string name="resolver_cant_share_with_personal_apps_explanation" msgid="6349766201904601544">"Kjo përmbajtje nuk mund të ndahet me aplikacione personale"</string> <string name="resolver_cant_access_personal_apps_explanation" msgid="1679399548862724359">"Kjo përmbajtje nuk mund të hapet me aplikacione personale"</string> <string name="resolver_turn_on_work_apps" msgid="1535946298236678122">"Aplikacionet e punës janë vendosur në pauzë"</string> <string name="resolver_switch_on_work" msgid="4527096360772311894">"Hiq nga pauza"</string> @@ -2323,13 +2325,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Lejon një aplikacion shoqërues të fillojë shërbimet në plan të parë nga sfondi."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofoni ofrohet"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofoni është i bllokuar"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Ekran i dyfishtë"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Ekrani i dyfishtë është aktiv"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen është aktiv"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> po i përdor të dyja ekranet për të shfaqur përmbajtje"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Pajisja është shumë e nxehtë"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"\"Ekrani i dyfishtë\" nuk ofrohet sepse telefoni yt po nxehet shumë"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"\"Ekrani i dyfishtë\" nuk ofrohet"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"\"Ekrani i dyfishtë\" nuk ofrohet sepse \"Kursyesi i baterisë\" është aktiv. Mund ta çaktivizosh këtë te \"Cilësimet\"."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen nuk ofrohet sepse telefoni yt po nxehet shumë"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen nuk ofrohet"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen nuk ofrohet sepse \"Kursyesi i baterisë\" është aktiv. Mund ta çaktivizosh këtë te \"Cilësimet\"."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Shko te \"Cilësimet\""</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Çaktivizoje"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> u konfigurua"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index ef2456e24bae..8c5a5b490a2e 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -494,7 +494,7 @@ <string name="permdesc_sim_communication" msgid="4179799296415957960">"Омогућава апликацији да шаље команде SIM картици. То је веома опасно."</string> <string name="permlab_activityRecognition" msgid="1782303296053990884">"препознавање физичких активности"</string> <string name="permdesc_activityRecognition" msgid="8667484762991357519">"Ова апликација може да препозна физичке активности."</string> - <string name="permlab_camera" msgid="6320282492904119413">"снимање фотографија и видео снимака"</string> + <string name="permlab_camera" msgid="6320282492904119413">"снимање фотографија и видеа"</string> <string name="permdesc_camera" msgid="5240801376168647151">"Ова апликација може да снима слике и видео снимке помоћу камере док се апликација користи."</string> <string name="permlab_backgroundCamera" msgid="7549917926079731681">"да снима слике и видео снимке у позадини"</string> <string name="permdesc_backgroundCamera" msgid="1615291686191138250">"Ова апликација може да снима фотографије и видео снимке помоћу камере у било ком тренутку."</string> @@ -591,6 +591,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозвољава апликацији да преузима информације о жељеној NFC услузи за плаћање, попут регистрованих идентификатора апликација и одредишта преусмеравања."</string> <string name="permlab_nfc" msgid="1904455246837674977">"контрола комуникације у ужем пољу (Near Field Communication)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Дозвољава апликацији да комуницира са ознакама, картицама и читачима комуникације кратког домета (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Трансакција у оквиру безбедносног елемента"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Омогућава апликацији да добија информације о транскацијама које се извршавају у оквиру безбедносног елемента."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"онемогућавање закључавања екрана"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Дозвољава апликацији да онемогући закључавање тастатуре и све повезане безбедносне мере са лозинкама. На пример, телефон онемогућава закључавање тастатуре при пријему долазног телефонског позива, а затим га поново омогућава по завршетку позива."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"тражење сложености закључавања екрана"</string> @@ -741,8 +743,8 @@ <string name="permdesc_readMediaVideo" msgid="3846400073770403528">"Омогућава апликацији да чита видео фајлове из дељеног меморијског простора."</string> <string name="permlab_readMediaImages" msgid="4057590631020986789">"читање фајлова слика из дељеног меморијског простора"</string> <string name="permdesc_readMediaImages" msgid="5836219373138469259">"Омогућава апликацији да чита фајлове слика из дељеног меморијског простора."</string> - <string name="permlab_readVisualUserSelect" msgid="5516204215354667586">"читање фајлова слика и видео снимака које корисник бира из дељеног меморијског простора"</string> - <string name="permdesc_readVisualUserSelect" msgid="8027174717714968217">"Омогућава апликацији да чита фајлове слика и видео снимака које изаберете из дељеног меморијског простора."</string> + <string name="permlab_readVisualUserSelect" msgid="5516204215354667586">"читање фајлова слика и видеа које корисник бира из дељеног меморијског простора"</string> + <string name="permdesc_readVisualUserSelect" msgid="8027174717714968217">"Омогућава апликацији да чита фајлове слика и видеа које изаберете из дељеног меморијског простора."</string> <string name="permlab_sdcardWrite" msgid="4863021819671416668">"мењање или брисање садржаја дељеног меморијског простора"</string> <string name="permdesc_sdcardWrite" msgid="8376047679331387102">"Дозвољава апликацији да уписује садржај дељеног меморијског простора."</string> <string name="permlab_use_sip" msgid="8250774565189337477">"упућивање/пријем SIP позива"</string> @@ -803,7 +805,7 @@ <string name="permdesc_updatePackagesWithoutUserAction" msgid="4567739631260526366">"Дозвољава власнику да ажурира апликацију коју је претходно инсталирала без радњи корисника"</string> <string name="policylab_limitPassword" msgid="4851829918814422199">"Подешавање правила за лозинку"</string> <string name="policydesc_limitPassword" msgid="4105491021115793793">"Контролише дужину и знакове дозвољене у лозинкама и PIN-овима за закључавање екрана."</string> - <string name="policylab_watchLogin" msgid="7599669460083719504">"Надгледајте покушаје откључавања екрана"</string> + <string name="policylab_watchLogin" msgid="7599669460083719504">"Надзор покушаја откључавања екрана"</string> <string name="policydesc_watchLogin" product="tablet" msgid="2388436408621909298">"Прати број нетачно унетих лозинки приликом откључавања екрана и закључава таблет или брише податке са таблета ако је нетачна лозинка унета превише пута."</string> <string name="policydesc_watchLogin" product="tv" msgid="2140588224468517507">"Надгледа број нетачних лозинки унетих при откључавању екрана и закључава Android TV уређај или брише све податке са Android TV уређаја ако се унесе превише нетачних лозинки."</string> <string name="policydesc_watchLogin" product="automotive" msgid="7011438994051251521">"Прати број нетачно унетих лозинки при откључавању екрана и закључава систем за инфо-забаву или брише све податке са система за инфо-забаву ако је нетачна лозинка унета превише пута."</string> @@ -1168,7 +1170,7 @@ <string name="app_running_notification_text" msgid="5120815883400228566">"Додирните за више информација или заустављање апликације."</string> <string name="ok" msgid="2646370155170753815">"Потврди"</string> <string name="cancel" msgid="6908697720451760115">"Откажи"</string> - <string name="yes" msgid="9069828999585032361">"Потврди"</string> + <string name="yes" msgid="9069828999585032361">"У реду"</string> <string name="no" msgid="5122037903299899715">"Откажи"</string> <string name="dialog_alert_title" msgid="651856561974090712">"Пажња"</string> <string name="loading" msgid="3138021523725055037">"Учитава се…"</string> @@ -1413,7 +1415,7 @@ <string name="ext_media_new_notification_message" msgid="6095403121990786986">"Додирните да бисте подесили"</string> <string name="ext_media_new_notification_message" product="tv" msgid="216863352100263668">"Изаберите да бисте подесили"</string> <string name="ext_media_new_notification_message" product="automotive" msgid="5140127881613227162">"Можда морате да реформатирате уређај. Додирните да бисте избацили."</string> - <string name="ext_media_ready_notification_message" msgid="7509496364380197369">"За чување слика, видео снимака, музике и другог садржаја"</string> + <string name="ext_media_ready_notification_message" msgid="7509496364380197369">"За чување слика, видеа, музике и другог садржаја"</string> <string name="ext_media_ready_notification_message" product="tv" msgid="8847134811163165935">"Прегледајте медијске фајлове"</string> <string name="ext_media_unmountable_notification_title" msgid="4895444667278979910">"Проблем са: <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_unmountable_notification_title" product="automotive" msgid="3142723758949023280">"<xliff:g id="NAME">%s</xliff:g> не ради"</string> @@ -2324,11 +2326,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Дозвољава пратећој апликацији да покрене услуге у првом плану из позадине."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Микрофон је доступан"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Микрофон је блокиран"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Двојни екран"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Двојни екран је укључен"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen је укључен"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> користи оба екрана за приказивање садржаја"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Уређај је превише загрејан"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Двојни екран је недоступан јер је телефон превише загрејан"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen је недоступан јер је телефон превише загрејан"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen није доступан"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen није доступан зато што је Уштеда батерије укључена. То можете да искључите у подешавањима."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Иди у Подешавања"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index c40b2055986d..7b270a1edce1 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Tillåter att appen hämtar information kopplad till standardtjänsten för NFC-betalning, till exempel registrerade hjälpmedel och ruttdestinationer."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrollera närfältskommunikationen"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Tillåter att appen kommunicerar med etiketter, kort och läsare för närfältskommunikation (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Transaktionshändelse i ett säkert element"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Tillåter att appen tar emot information om transaktioner som sker i ett säkert element."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"inaktivera skärmlåset"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Tillåter att appen inaktiverar tangentlåset och tillhörande lösenordsskydd. Ett exempel kan vara att tangentlåset inaktiveras vid inkommande samtal och aktiveras igen när samtalet är avslutat."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"begär komplexitetsnivå för skärmlåset"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Tillåter att en tillhörande app startar förgrundstjänster i bakgrunden."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofonen är tillgänglig"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofonen är blockerad"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dubbel skärm"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dubbel skärm är på"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen är på"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> använder båda skärmarna för att visa innehåll"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Enheten är för varm"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dubbel skärm kan inte användas eftersom telefonen börjar bli för varm"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen kan inte användas eftersom telefonen börjar bli för varm"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen är inte tillgängligt"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen kan inte användas eftersom battersparläget är aktiverat. Du kan inaktivera detta i inställningarna."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Öppna inställningarna"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index caf09cbd81c6..68726f8afea7 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -298,7 +298,7 @@ <string name="android_system_label" msgid="5974767339591067210">"Mfumo wa Android"</string> <string name="user_owner_label" msgid="8628726904184471211">"Tumia wasifu wa binafsi"</string> <string name="managed_profile_label" msgid="7316778766973512382">"Tumia wasifu wa kazini"</string> - <string name="user_owner_app_label" msgid="1553595155465750298">"Badili uweke wasifu wa binafsi <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="user_owner_app_label" msgid="1553595155465750298">"Badili utumie wasifu wa binafsi wa <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="managed_profile_app_label" msgid="367401088383965725">"Badili uweke wasifu wa kazini <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="permgrouplab_contacts" msgid="4254143639307316920">"Anwani"</string> <string name="permgroupdesc_contacts" msgid="9163927941244182567">"ifikie anwani zako"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Huruhusu programu kupata maelezo ya huduma inayopendelewa ya malipo ya nfc kama vile huduma zilizosajiliwa na njia."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kudhibiti Mawasiliano ya Vifaa Vilivyokaribu (NFC)"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Inaruhusu programu kuwasiliana na lebo, kadi na wasomaji wa Near Field Communication (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Muamala kupitia Kipengele Salama"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Huruhusu programu kupokea maelezo kuhusu miamala inayofanyika kupitia Kipengele Salama."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"zima kufuli la skrini yako"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Inaruhusu programu kulemaza ufunguo wa vitufe na usalama mwingine ambata wa nenosiri. Kwa mfano, simu inalemaza ufunguo wa viitufe inapopokea simu inayoingia, kisha inawezesha upya ufunguo wa vitufe wakati simu inapokamilika."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"iombe kiwango cha uchangamano wa kufunga skrini"</string> @@ -2324,12 +2326,12 @@ <string name="mic_access_on_toast" msgid="2666925317663845156">"Maikrofoni inapatikana"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Maikrofoni imezuiwa"</string> <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual screen"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Umewasha kipengele cha hali ya skrini mbili"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual screen imewasha"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> inatumia skrini zote kuonyesha maudhui"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Kifaa kina joto sana"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Kipengele cha Hali ya Skrini Mbili hakipatikani kwa sababu simu yako inapata joto sana"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Kipengele cha Hali ya Skrini Mbili hakipatikani"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Kipengele cha Hali ya Skrini Mbili hakipatikani kwa sababu kipengele cha Kiokoa Betri kimewashwa. Unaweza kuzima kipengele hiki katika Mipangilio."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Kipengele cha Dual Screen hakipatikani kwa sababu simu yako inapata joto sana"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen haipatikani"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Kipengele cha Dual Screen hakipatikani kwa sababu Kiokoa Betri kimewashwa. Unaweza kukizima katika Mipangilio."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Nenda kwenye Mipangilio"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"Zima"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> imewekewa mipangilio"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 4c765ed52773..b55a3cf17d86 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"பதிவுசெய்யப்பட்ட கருவிகள், சேருமிடத்திற்கான வழி போன்ற விருப்பமான NFC பேமெண்ட் சேவை தொடர்பான தகவல்களைப் பெற ஆப்ஸை அனுமதிக்கிறது."</string> <string name="permlab_nfc" msgid="1904455246837674977">"குறுகிய இடைவெளி தகவல்பரிமாற்றத்தைக் கட்டுப்படுத்துதல்"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"குறுகிய இடைவெளி தகவல்பரிமாற்றம் (NFC), குறிகள், கார்டுகள் மற்றும் ரீடர்கள் ஆகியவற்றுடன் தொடர்புகொள்ள, ஆப்ஸை அனுமதிக்கிறது."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"பாதுகாப்பு உறுப்பில் நிகழ்கின்ற பணப் பரிமாற்ற நிகழ்வு"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"பாதுகாப்பு உறுப்பில் நிகழ்கின்ற பணப் பரிமாற்றங்கள் குறித்த தகவல்களைப் பெற ஆப்ஸை அனுமதிக்கும்."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"உங்கள் திரைப் பூட்டை முடக்குதல்"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"விசைப்பூட்டையும், தொடர்புடைய கடவுச்சொல் பாதுகாப்பையும் முடக்கப் ஆப்ஸை அனுமதிக்கிறது. எடுத்துக்காட்டாக, உள்வரும் மொபைல் அழைப்பைப் பெறும்போது மொபைல் விசைப்பூட்டை முடக்குகிறது, பிறகு அழைப்பு முடிந்தவுடன் விசைப்பூட்டை மீண்டும் இயக்குகிறது."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"திரைப் பூட்டு தொடர்பான சிக்கலைத் தீர்க்க அனுமதி கோருதல்"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 89468860c141..ca971e3121ea 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -322,7 +322,7 @@ <string name="permgroupdesc_camera" msgid="7585150538459320326">"చిత్రాలను తీయడానికి మరియు వీడియోను రికార్డ్ చేయడానికి"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"సమీపంలోని పరికరాలు"</string> <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"సమీప పరికరాలను కనుగొనండి అలాగే కనెక్ట్ చేయండి"</string> - <string name="permgrouplab_calllog" msgid="7926834372073550288">"కాల్ లాగ్లు"</string> + <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> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ప్రాధాన్యత ఇవ్వబడిన NFC చెల్లింపు సేవల సమాచారాన్ని, అంటే రిజిస్టర్ చేయబడిన సహాయక సాధనాలు, మార్గం, గమ్యస్థానం వంటి వాటిని పొందేందుకు యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_nfc" msgid="1904455246837674977">"సమీప క్షేత్ర కమ్యూనికేషన్ను నియంత్రించడం"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"సమీప ఫీల్డ్ కమ్యూనికేషన్ (NFC) ట్యాగ్లు, కార్డులు మరియు రీడర్లతో కమ్యూనికేట్ చేయడానికి యాప్ను అనుమతిస్తుంది."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"సెక్యూర్ ఎలిమెంట్ లావాదేవీ ఈవెంట్"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"సెక్యూర్ ఎలిమెంట్లో జరుగుతున్న లావాదేవీల గురించిన సమాచారాన్ని స్వీకరించడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"మీ స్క్రీన్ లాక్ను నిలిపివేయడం"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"కీలాక్ను, అలాగే ఏదైనా అనుబంధించబడిన పాస్వర్డ్ సెక్యూరిటీని డిజేబుల్ చేయడానికి యాప్ను అనుమతిస్తుంది. ఉదాహరణకు, ఇన్కమింగ్ ఫోన్ కాల్ వస్తున్నప్పుడు ఫోన్ కీలాక్ను డిజేబుల్ చేస్తుంది, ఆపై కాల్ ముగిసిన తర్వాత కీలాక్ను మళ్లీ ఎనేబుల్ చేస్తుంది."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"స్క్రీన్ లాక్ సంక్లిష్టత రిక్వెస్ట్"</string> @@ -656,7 +658,7 @@ <string name="fingerprint_error_security_update_required" msgid="7750187320640856433">"సెన్సార్ తాత్కాలికంగా డిజేబుల్ చేయబడింది."</string> <string name="fingerprint_error_bad_calibration" msgid="4385512597740168120">"వేలిముద్ర సెన్సార్ను ఉపయోగించడం సాధ్యం కాదు. రిపెయిర్ ప్రొవైడర్ను సందర్శించండి"</string> <string name="fingerprint_error_power_pressed" msgid="5479524500542129414">"Power button pressed"</string> - <string name="fingerprint_name_template" msgid="8941662088160289778">"వేలు <xliff:g id="FINGERID">%d</xliff:g>"</string> + <string name="fingerprint_name_template" msgid="8941662088160289778">"<xliff:g id="FINGERID">%d</xliff:g>వ వేలు"</string> <string name="fingerprint_app_setting_name" msgid="4253767877095495844">"వేలిముద్రను ఉపయోగించండి"</string> <string name="fingerprint_or_screen_lock_app_setting_name" msgid="3501743523487644907">"వేలిముద్ర లేదా స్క్రీన్ లాక్ను ఉపయోగించండి"</string> <string name="fingerprint_dialog_default_subtitle" msgid="3879832845486835905">"కొనసాగించడానికి మీ వేలిముద్రను ఉపయోగించండి"</string> @@ -752,8 +754,8 @@ <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_bind_incall_service" msgid="5990625112603493016">"ఇన్-కాల్ స్క్రీన్తో పరస్పర చర్య చేయడం"</string> - <string name="permdesc_bind_incall_service" msgid="4124917526967765162">"వినియోగదారునికి ఇన్-కాల్ స్క్రీన్ ఎప్పుడు, ఎలా కనిపించాలనే దాన్ని నియంత్రించడానికి యాప్ను అనుమతిస్తుంది."</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> <string name="permdesc_bind_connection_service" msgid="6261796725253264518">"కాల్స్ చేయడం/స్వీకరించడం కోసం టెలిఫోన్ సేవలతో పరస్పర చర్య చేయడానికి యాప్ను అనుమతిస్తుంది."</string> <string name="permlab_control_incall_experience" msgid="6436863486094352987">"ఇన్-కాల్ వినియోగదారు అనుభవాన్ని అందించడం"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"అన్పాజ్ చేయండి"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"వర్క్ యాప్లు లేవు"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"వ్యక్తిగత యాప్లు లేవు"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"వర్క్ <xliff:g id="APP">%s</xliff:g> యాప్ను తెరవాలా?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> వర్క్ యాప్ను తెరవాలా?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"వ్యక్తిగత <xliff:g id="APP">%s</xliff:g> యాప్లో తెరవాలా?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"వర్క్ <xliff:g id="APP">%s</xliff:g> యాప్లో తెరవాలా?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"వర్క్ యాప్ నుండి కాల్ చేయాలా?"</string> @@ -2323,13 +2325,13 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"బ్యాక్గ్రౌండ్ నుండి ఫోర్గ్రౌండ్ సర్వీస్లను ప్రారంభించడానికి సహాయక యాప్ను అనుమతిస్తుంది."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"మైక్రోఫోన్ అందుబాటులో ఉంది"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"మైక్రోఫోన్ బ్లాక్ చేయబడింది"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"డ్యూయల్ స్క్రీన్"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"డ్యూయల్ స్క్రీన్ ఆన్లో ఉంది"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen ఆన్లో ఉంది"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"కంటెంట్ను చూపడం కోసం <xliff:g id="APP_NAME">%1$s</xliff:g> రెండు డిస్ప్లేలనూ ఉపయోగిస్తోంది"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"పరికరం చాలా వేడిగా ఉంది"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"మీ ఫోన్ చాలా వేడిగా అవుతున్నందున, డ్యూయల్ స్క్రీన్ అందుబాటులో లేదు"</string> - <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"డ్యూయల్ స్క్రీన్ అందుబాటులో లేదు"</string> - <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"బ్యాటరీ సేవర్ ఆన్లో ఉన్నందున డ్యూయల్ స్క్రీన్ అందుబాటులో లేదు. మీరు దీన్ని సెట్టింగ్లలో ఆఫ్ చేయవచ్చు."</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"మీ ఫోన్ చాలా వేడిగా అవుతున్నందున, Dual Screen అందుబాటులో లేదు"</string> + <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen అందుబాటులో లేదు"</string> + <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"బ్యాటరీ సేవర్ ఆన్లో ఉన్నందున Dual Screen అందుబాటులో లేదు. మీరు దీన్ని సెట్టింగ్లలో ఆఫ్ చేయవచ్చు."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"సెట్టింగ్లకు వెళ్లండి"</string> <string name="device_state_notification_turn_off_button" msgid="6327161707661689232">"ఆఫ్ చేయండి"</string> <string name="keyboard_layout_notification_selected_title" msgid="1202560174252421219">"<xliff:g id="DEVICE_NAME">%s</xliff:g> కాన్ఫిగర్ చేయబడింది"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 107a66a77710..472c7e1131ed 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"อนุญาตให้แอปรับข้อมูลบริการชำระเงิน NFC ที่ต้องการ เช่น รหัสแอป (AID) ที่ลงทะเบียนและปลายทางของเส้นทาง"</string> <string name="permlab_nfc" msgid="1904455246837674977">"ควบคุม Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"อนุญาตให้แอปพลิเคชันสื่อสารกับแท็ก Near Field Communication (NFC) การ์ด และโปรแกรมอ่าน"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"เหตุการณ์เกี่ยวกับธุรกรรมในองค์ประกอบความปลอดภัย"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"อนุญาตให้แอปรับข้อมูลเกี่ยวกับธุรกรรมที่เกิดขึ้นในองค์ประกอบความปลอดภัย"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ปิดใช้งานการล็อกหน้าจอของคุณ"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"อนุญาตให้แอปพลิเคชันปิดใช้งานการล็อกปุ่มกดและการรักษาความปลอดภัยด้วยรหัสผ่านใดๆ ที่เกี่ยวข้อง ตัวอย่างเช่น โทรศัพท์ปิดใช้งานการล็อกปุ่มกดเมื่อรับสายเรียกเข้า จากนั้นจึงเปิดใช้งานการล็อกปุ่มกดใหม่หลังจากวางสาย"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ขอความซับซ้อนของการล็อกหน้าจอ"</string> @@ -1399,7 +1401,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8835158247369158154">"แตะเพื่อเลือกภาษาและรูปแบบ"</string> <string name="fast_scroll_alphabet" msgid="8854435958703888376">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string> <string name="fast_scroll_numeric_alphabet" msgid="2529539945421557329">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string> - <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"แสดงทับแอปอื่นๆ"</string> + <string name="alert_windows_notification_channel_group_name" msgid="6063891141815714246">"แสดงทับบนแอปอื่นๆ"</string> <string name="alert_windows_notification_channel_name" msgid="3437528564303192620">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่นๆ"</string> <string name="alert_windows_notification_title" msgid="6331662751095228536">"<xliff:g id="NAME">%s</xliff:g> กำลังแสดงทับแอปอื่นๆ"</string> <string name="alert_windows_notification_message" msgid="6538171456970725333">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string> @@ -2327,7 +2329,7 @@ <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen เปิดอยู่"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังใช้จอแสดงผลทั้งสองจอเพื่อแสดงเนื้อหา"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"อุปกรณ์ร้อนเกินไป"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"หน้าจอคู่ไม่พร้อมให้ใช้งานเนื่องจากโทรศัพท์ของคุณร้อนเกินไป"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Dual Screen ไม่พร้อมให้ใช้งานเนื่องจากโทรศัพท์ของคุณร้อนเกินไป"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen ใช้งานไม่ได้"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Dual Screen ใช้งานไม่ได้เนื่องจากเปิดโหมดประหยัดแบตเตอรี่อยู่ คุณปิดโหมดนี้ได้ในการตั้งค่า"</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"ไปที่การตั้งค่า"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 549882b8480d..96a354ec45ef 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Pinapayagan ang app na makakuha ng impormasyon sa gustong nfc na serbisyo sa pagbabayad tulad ng mga nakarehistrong application ID at destinasyon ng ruta."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kontrolin ang Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Pinapayagan ang app na makipag-ugnay sa Near Field Communication (NFC) na mga tag, card, at reader."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Event ng transaksyon sa Secure na Elemento"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Nagbibigay-daan sa app na makatanggap ng impormasyon tungkol sa mga transaksyong nangyayari sa isang Secure na Elemento."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"i-disable ang iyong screen lock"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Pinapayagan ang app na i-disable ang keylock at anumang nauugnay na seguridad sa password. Halimbawa, hindi pinapagana ng telepono ang keylock kapag nakakatanggap ng papasok na tawag sa telepono, pagkatapos ay muling pinapagana ang keylock kapag tapos na ang tawag."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"humiling ng pagiging kumplikado ng lock ng screen"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 33b66d31cd84..5bf018d3415f 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Uygulamaya, kayıtlı yardımlar ve rota hedefi gibi tercih edilen NFC ödeme hizmeti bilgilerini alma izni verir."</string> <string name="permlab_nfc" msgid="1904455246837674977">"Yakın Alan İletişimini denetle"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Uygulamaya, Near Field Communication (NFC) etiketleri, kartlar ve okuyucular ile iletişim kurma izni verir."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Güvenlik Unsuru işlemiyle ilgili etkinlik"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Uygulamanın bir Güvenlik Unsuru\'nda gerçekleşen işlemlerle ilgili bilgi almasına izin verir."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ekran kilidimi devre dışı bırak"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Uygulamaya, tuş kilidini ve ilişkili tüm şifreli güvenlik önlemlerini devre dışı bırakma izni verir. Örneğin, telefon, çağrı alındığında tuş kilidinin devre dışı bırakır ve sonra, görüşme bittiğinde kilidi yeniden etkinleştirir."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ekran kilidi karmaşıklığı iste"</string> @@ -815,7 +817,7 @@ <string name="policydesc_resetPassword" msgid="4626419138439341851">"Ekran kilidini değiştirir."</string> <string name="policylab_forceLock" msgid="7360335502968476434">"Ekranı kilitleme"</string> <string name="policydesc_forceLock" msgid="1008844760853899693">"Ekranın nasıl ve ne zaman kilitleneceğini denetler."</string> - <string name="policylab_wipeData" msgid="1359485247727537311">"Tüm verileri silme"</string> + <string name="policylab_wipeData" msgid="1359485247727537311">"Tüm verileri sil"</string> <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Fabrika verilerine sıfırlama işlemi gerçekleştirerek tabletteki verileri uyarıda bulunmadan siler."</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Fabrika verilerine sıfırlama işlemi gerçekleştirerek Android TV cihazınızdaki verileri uyarıda bulunmadan siler."</string> <string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Fabrika verilerine sıfırlama işlemi gerçekleştirerek bilgi-eğlence sistemindeki veriler uyarıda bulunmadan silinir."</string> @@ -1950,7 +1952,7 @@ <string name="app_suspended_default_message" msgid="6451215678552004172">"<xliff:g id="APP_NAME_0">%1$s</xliff:g> uygulaması şu anda kullanılamıyor. Uygulamanın kullanım durumu <xliff:g id="APP_NAME_1">%2$s</xliff:g> tarafından yönetiliyor."</string> <string name="app_suspended_more_details" msgid="211260942831587014">"Daha fazla bilgi"</string> <string name="app_suspended_unsuspend_message" msgid="1665438589450555459">"Uygulamanın duraklatmasını kaldır"</string> - <string name="work_mode_off_title" msgid="6367463960165135829">"İş uygulamaları açılsın mı?"</string> + <string name="work_mode_off_title" msgid="6367463960165135829">"İş uygulamaları devam ettirilsin mi?"</string> <string name="work_mode_turn_on" msgid="5316648862401307800">"Devam ettir"</string> <string name="work_mode_emergency_call_button" msgid="6818855962881612322">"Acil durum"</string> <string name="app_blocked_title" msgid="7353262160455028160">"Uygulama kullanılamıyor"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"Devam ettir"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"İş uygulaması yok"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"Kişisel uygulama yok"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"İş uygulaması (<xliff:g id="APP">%s</xliff:g>) açılsın mı?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"<xliff:g id="APP">%s</xliff:g> iş uygulaması açılsın mı?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"Kişisel uygulamada (<xliff:g id="APP">%s</xliff:g>) açılsın mı?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"İş uygulamasında (<xliff:g id="APP">%s</xliff:g>) açılsın mı?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"İş uygulamasından aransın mı?"</string> @@ -2323,11 +2325,11 @@ <string name="permdesc_startForegroundServicesFromBackground" msgid="4071826571656001537">"Tamamlayıcı uygulamanın arka plandan ön plan hizmetlerini başlatmasına izin verir."</string> <string name="mic_access_on_toast" msgid="2666925317663845156">"Mikrofon kullanılabilir"</string> <string name="mic_access_off_toast" msgid="8111040892954242437">"Mikrofon engellenmiş"</string> - <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Çift ekran"</string> - <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Çift ekran açık"</string> + <string name="concurrent_display_notification_name" msgid="1526911253558311131">"Dual Screen"</string> + <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen açık"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"<xliff:g id="APP_NAME">%1$s</xliff:g>, içeriği göstermek için her iki ekranı da kullanıyor"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Cihaz çok ısındı"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Telefonunuz çok ısındığı için Çift Ekran kullanılamıyor"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Telefonunuz çok ısındığı için Dual Screen kullanılamıyor"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Dual Screen kullanılamıyor"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Pil Tasarrufu açık olduğundan Dual Screen kullanılamıyor. Bu özelliği Ayarlar\'dan kapatabilirsiniz."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Ayarlar\'a git"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 5dd6037bac73..c1db10883bd4 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -592,6 +592,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Дозволяє додатку отримувати доступ до інформації потрібного платіжного NFC-сервісу (наприклад, пов\'язаних ідентифікаторів чи даних про маршрутизацію трансакцій)."</string> <string name="permlab_nfc" msgid="1904455246837674977">"контрол. Near Field Communication"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Дозволяє програмі обмінюватися даними з тегами, картками та читачами екрана Near Field Communication (NFC)."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Подія, пов’язана з транcакцією в Компоненті захисту"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Надає додатку доступ до інформації про транcакції, що відбуваються в Компоненті захисту."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"вимикати блокування екрана"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Дозволяє програмі вимикати блокування клавіатури та будь-який пов’язаний паролем захист. Наприклад: телефон вимикає блокування клавіатури під час отримання вхідного дзвінка, після закінчення якого блокування клавіатури відновлюється."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"запитувати рівень складності блокування екрана"</string> @@ -672,7 +674,7 @@ <string name="face_recalibrate_notification_content" msgid="3064513770251355594">"Натисніть, щоб видалити свою модель обличчя, а потім знову додайте її"</string> <string name="face_setup_notification_title" msgid="8843461561970741790">"Налаштування фейс-контролю"</string> <string name="face_setup_notification_content" msgid="5463999831057751676">"Ви зможете розблоковувати телефон, подивившись на нього"</string> - <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Щоб використовувати фейсконтроль, увімкніть "<b>"Доступ до камери"</b>" в розділі \"Налаштування\" > \"Конфіденційність\""</string> + <string name="face_sensor_privacy_enabled" msgid="7407126963510598508">"Щоб використовувати фейс-контроль, увімкніть "<b>"Доступ до камери"</b>" в розділі \"Налаштування\" > \"Конфіденційність\""</string> <string name="fingerprint_setup_notification_title" msgid="2002630611398849495">"Налаштуйте більше способів розблокування"</string> <string name="fingerprint_setup_notification_content" msgid="205578121848324852">"Натисніть, щоб додати відбиток пальця"</string> <string name="fingerprint_recalibrate_notification_name" msgid="1414578431898579354">"Розблокування відбитком пальця"</string> @@ -716,12 +718,12 @@ <string name="face_error_lockout_permanent" msgid="8533257333130473422">"Забагато спроб. Фейс-контроль недоступний."</string> <string name="face_error_lockout_screen_lock" msgid="5062609811636860928">"Забагато спроб. Розблокуйте екран іншим способом."</string> <string name="face_error_unable_to_process" msgid="5723292697366130070">"Не вдається перевірити обличчя. Повторіть спробу."</string> - <string name="face_error_not_enrolled" msgid="1134739108536328412">"Ви не налаштували фейсконтроль"</string> - <string name="face_error_hw_not_present" msgid="7940978724978763011">"Фейсконтроль не підтримується на цьому пристрої"</string> + <string name="face_error_not_enrolled" msgid="1134739108536328412">"Ви не налаштували фейс-контроль"</string> + <string name="face_error_hw_not_present" msgid="7940978724978763011">"Фейс-контроль не підтримується на цьому пристрої"</string> <string name="face_error_security_update_required" msgid="5076017208528750161">"Датчик тимчасово вимкнено."</string> <string name="face_name_template" msgid="3877037340223318119">"Обличчя <xliff:g id="FACEID">%d</xliff:g>"</string> - <string name="face_app_setting_name" msgid="5854024256907828015">"Доступ через фейсконтроль"</string> - <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Використовувати фейсконтроль або дані для розблокування екрана"</string> + <string name="face_app_setting_name" msgid="5854024256907828015">"Доступ через фейс-контроль"</string> + <string name="face_or_screen_lock_app_setting_name" msgid="1603149075605709106">"Використовувати фейс-контроль або дані для розблокування екрана"</string> <string name="face_dialog_default_subtitle" msgid="6620492813371195429">"Щоб продовжити, скористайтеся фейсконтролем"</string> <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Щоб продовжити, скористайтеся фейсконтролем або даними для розблокування екрана"</string> <string-array name="face_error_vendor"> @@ -817,7 +819,7 @@ <string name="policydesc_resetPassword" msgid="4626419138439341851">"Змінити спосіб розблокування екрана."</string> <string name="policylab_forceLock" msgid="7360335502968476434">"Блокувати екран"</string> <string name="policydesc_forceLock" msgid="1008844760853899693">"Контролювати, як і коли блокується екран."</string> - <string name="policylab_wipeData" msgid="1359485247727537311">"Видалити всі дані"</string> + <string name="policylab_wipeData" msgid="1359485247727537311">"Видаляти всі дані"</string> <string name="policydesc_wipeData" product="tablet" msgid="7245372676261947507">"Стирати дані планшетного ПК без попередження, відновлюючи заводські налаштування."</string> <string name="policydesc_wipeData" product="tv" msgid="513862488950801261">"Видаляйте дані пристрою Android TV без попередження шляхом відновлення заводських налаштувань."</string> <string name="policydesc_wipeData" product="automotive" msgid="660804547737323300">"Видаляйте всі дані інформаційно-розважальної системи без попередження, відновлюючи заводські налаштування."</string> @@ -973,7 +975,7 @@ <string name="lockscreen_pattern_wrong" msgid="2940138714468358458">"Повторіть спробу"</string> <string name="lockscreen_password_wrong" msgid="8605355913868947490">"Повторіть спробу"</string> <string name="lockscreen_storage_locked" msgid="634993789186443380">"Розблокуйте, щоб бачити всі функції й дані"</string> - <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Перевищено максимальну кількість спроб розблокування за допомогою функції \"Фейсконтроль\""</string> + <string name="faceunlock_multiple_failures" msgid="681991538434031708">"Перевищено максимальну кількість спроб розблокування за допомогою функції \"Фейс-контроль\""</string> <string name="lockscreen_missing_sim_message_short" msgid="1229301273156907613">"Немає SIM-карти"</string> <string name="lockscreen_missing_sim_message" product="tablet" msgid="3986843848305639161">"У планшеті немає SIM-карти."</string> <string name="lockscreen_missing_sim_message" product="tv" msgid="3903140876952198273">"У пристрої Android TV немає SIM-карти."</string> @@ -2329,7 +2331,7 @@ <string name="concurrent_display_notification_active_title" msgid="4892473462327943673">"Dual Screen увімкнено"</string> <string name="concurrent_display_notification_active_content" msgid="5889355473710601270">"Додаток <xliff:g id="APP_NAME">%1$s</xliff:g> використовує обидва екрани для показу контенту"</string> <string name="concurrent_display_notification_thermal_title" msgid="5921609404644739229">"Пристрій сильно нагрівається"</string> - <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Подвійний екран недоступний, оскільки телефон сильно нагрівається"</string> + <string name="concurrent_display_notification_thermal_content" msgid="2075484836527609319">"Функція Dual Screen недоступна, оскільки телефон сильно нагрівається"</string> <string name="concurrent_display_notification_power_save_title" msgid="1794569070730736281">"Функція Dual Screen недоступна"</string> <string name="concurrent_display_notification_power_save_content" msgid="2198116070583851493">"Функція Dual Screen недоступна, оскільки ввімкнено режим енергозбереження. Її можна вимкнути в налаштуваннях."</string> <string name="device_state_notification_settings_button" msgid="691937505741872749">"Перейти до налаштувань"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index e692be7d9f7c..0cc31a814e3b 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"ایپ کو رجسٹرشدہ ایڈز اور روٹ ڈسٹنیشن جیسی ترجیح شدہ nfc ادائیگی سروس کی معلومات حاصل کرنے کی اجازت دیتا ہے۔"</string> <string name="permlab_nfc" msgid="1904455246837674977">"Near Field کمیونیکیشن کنٹرول کریں"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"ایپ کو Near Field Communication (NFC) ٹیگز، کارڈز اور ریڈرز کے ساتھ مواصلت کرنے کی اجازت دیٹا ہے۔"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"محفوظ عنصر کے ٹرانزیکشن کا ایونٹ"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"ایپ کو ایک محفوظ عنصر پر ہونے والے ٹرانزیکشنز کے بارے میں معلومات حاصل کرنے کی اجازت دیتا ہے۔"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"اپنے اسکرین لاک کو غیر فعال کریں"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"ایپ کو کلیدی لاک اور کسی بھی متعلقہ پاس ورڈ سیکیورٹی کو غیر فعال کرنے کی اجازت دیتا ہے۔ مثلاً، کوئی آنے والی فون کال موصول ہونے کے وقت فون کلیدی لاک کو غیر فعال کرتا ہے، پھر کال پوری ہوجانے پر کلیدی لاک کو دوبارہ فعال کردیتا ہے۔"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"اسکرین لاک کی پیچیدگی کی درخواست کریں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index bb9cbd28b680..e69caa2e840f 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Bu ilovaga asosiy NFC toʻlov xizmati haqidagi axborotni olish imkonini beradi (masalan, qayd qilingan AID identifikatorlari va marshrutning yakuniy manzili)."</string> <string name="permlab_nfc" msgid="1904455246837674977">"NFC modulini boshqarish"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Ilova qisqa masofali aloqa (NFC) texnologiyasi yordamida NFC yorliqlari, kartalar va o‘qish moslamalari bilan ma’lumot almashishi mumkin."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Secure Element tranzaksiya hodisasi"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Ilovaga Secure Element orqali amalga oshuvchi tranzaksiyalar axborotini olishga ruxsat beradi."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"ekran qulfini o‘chirib qo‘yish"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Ilovaga ekran qulfini va har qanday parol yordamidagi xavfsizlik himoyalarini o‘chirishga ruxsat beradi. Masalan, kirish qo‘ng‘irog‘ida telefon ekran qulfini o‘chiradi va qo‘ng‘iroq tugashi bilan qulfni yoqadi."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"ekran qulfi qiyinligi darajasini talab qilish"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 83730d5862df..be5d14c46659 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Cho phép ứng dụng nhận thông tin về dịch vụ thanh toán qua công nghệ giao tiếp tầm gần mà bạn ưu tiên, chẳng hạn như các hình thức hỗ trợ đã đăng ký và điểm đến trong hành trình."</string> <string name="permlab_nfc" msgid="1904455246837674977">"kiểm soát Liên lạc trường gần"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Cho phép ứng dụng giao tiếp với thẻ Giao tiếp trường gần (NFC), thẻ và trình đọc."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Sự kiện giao dịch trên Phần tử bảo mật"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Cho phép ứng dụng nhận thông tin về giao dịch diễn ra trên Phần tử bảo mật."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"vô hiệu hóa khóa màn hình của bạn"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Cho phép ứng dụng tắt khóa phím và bất kỳ bảo mật mật khẩu được liên kết nào. Ví dụ: điện thoại tắt khóa phím khi nhận được cuộc gọi đến, sau đó bật lại khóa phím khi cuộc gọi kết thúc."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"cần biết độ phức tạp của khóa màn hình"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 80558133a287..b8d5a064f803 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -274,7 +274,7 @@ <string name="notification_channel_physical_keyboard" msgid="5417306456125988096">"实体键盘"</string> <string name="notification_channel_security" msgid="8516754650348238057">"安全性"</string> <string name="notification_channel_car_mode" msgid="2123919247040988436">"车载模式"</string> - <string name="notification_channel_account" msgid="6436294521740148173">"帐号状态"</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_updates" msgid="7907863984825495278">"更新"</string> @@ -448,9 +448,9 @@ <string name="permdesc_broadcastSticky" product="tv" msgid="2338185920171000650">"允许应用发送置顶广播,这类广播在广播结束后仍会继续存在。过度使用这项功能可能会导致 Android TV 设备使用过多内存,从而降低其运行速度或稳定性。"</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 TV 设备上存储的联系人相关数据。应用还将有权访问您的 Android TV 设备上已创建联系人的帐号,其中可能包括您已安装的应用所创建的帐号。此权限允许应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。"</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 TV 设备上存储的联系人相关数据。应用还将有权访问您的 Android TV 设备上已创建联系人的账号,其中可能包括您已安装的应用所创建的账号。此权限允许应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。"</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 TV 设备上存储的联系人相关数据。此权限允许应用删除联系人数据。"</string> @@ -542,10 +542,10 @@ <string name="permdesc_setTimeZone" product="tablet" msgid="1788868809638682503">"允许应用更改平板电脑的时区。"</string> <string name="permdesc_setTimeZone" product="tv" msgid="9069045914174455938">"允许应用更改 Android TV 设备的时区。"</string> <string name="permdesc_setTimeZone" product="default" msgid="4611828585759488256">"允许应用更改手机的时区。"</string> - <string name="permlab_getAccounts" msgid="5304317160463582791">"查找设备上的帐号"</string> - <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"允许该应用获取平板电脑已知的帐号列表,其中可能包括由已安装的应用创建的所有帐号。"</string> - <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"允许应用获取 Android TV 设备已知的帐号列表,其中可能包括您已安装的应用所创建的任何帐号。"</string> - <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"允许该应用获取手机已知的帐号列表,其中可能包括由已安装的应用创建的所有帐号。"</string> + <string name="permlab_getAccounts" msgid="5304317160463582791">"查找设备上的账号"</string> + <string name="permdesc_getAccounts" product="tablet" msgid="1784452755887604512">"允许该应用获取平板电脑已知的账号列表,其中可能包括由已安装的应用创建的所有账号。"</string> + <string name="permdesc_getAccounts" product="tv" msgid="437604680436540822">"允许应用获取 Android TV 设备已知的账号列表,其中可能包括您已安装的应用所创建的任何账号。"</string> + <string name="permdesc_getAccounts" product="default" msgid="2491273043569751867">"允许该应用获取手机已知的账号列表,其中可能包括由已安装的应用创建的所有账号。"</string> <string name="permlab_accessNetworkState" msgid="2349126720783633918">"查看网络连接"</string> <string name="permdesc_accessNetworkState" msgid="4394564702881662849">"允许该应用查看网络连接的相关信息,例如存在和连接的网络。"</string> <string name="permlab_createNetworkSockets" msgid="3224420491603590541">"拥有完全的网络访问权限"</string> @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允许应用获取首选 NFC 付款服务信息,例如注册的应用标识符和路线目的地。"</string> <string name="permlab_nfc" msgid="1904455246837674977">"控制近距离通信"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"允许应用与近距离无线通信(NFC)标签、卡和读取器通信。"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"安全元件事务事件"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"允许应用接收与安全元件上发生的事务相关的信息。"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"停用屏幕锁定"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"允许该应用停用键锁以及任何关联的密码安全措施。例如,让手机在接听来电时停用键锁,在通话结束后重新启用键锁。"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"请求屏幕锁定复杂度"</string> @@ -727,11 +729,11 @@ <string name="face_error_vendor_unknown" msgid="7387005932083302070">"出了点问题,请重试。"</string> <string name="face_icon_content_description" msgid="465030547475916280">"面孔图标"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"读取同步设置"</string> - <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"允许该应用读取某个帐号的同步设置。例如,此权限可确定“联系人”应用是否与某个帐号同步。"</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="permdesc_readSyncStats" msgid="3867809926567379434">"允许该应用读取某个账号的同步统计信息,包括同步活动历史记录和同步数据量。"</string> <string name="permlab_sdcardRead" msgid="5791467020950064920">"读取您共享存储空间中的内容"</string> <string name="permdesc_sdcardRead" msgid="6872973242228240382">"允许该应用读取您共享存储空间中的内容。"</string> <string name="permlab_readMediaAudio" msgid="8723513075731763810">"从共享存储空间读取音频文件"</string> @@ -997,7 +999,7 @@ <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">"您已经<xliff:g id="NUMBER_0">%1$d</xliff:g>次输错了PIN码。\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="tv" msgid="6399092175942158529">"您已画错解锁图案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您登录 Google 帐号来解锁 Android TV 设备。\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> 次后仍不成功,系统就会要求您登录 Google 账号来解锁 Android TV 设备。\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> @@ -1007,9 +1009,9 @@ <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="2203704707679895487">"您已经<xliff:g id="NUMBER">%d</xliff:g>次错误地尝试解锁手机。手机现在将恢复为出厂默认设置。"</string> <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6807200118164539589">"<xliff:g id="NUMBER">%d</xliff:g>秒后重试。"</string> <string name="lockscreen_forgot_pattern_button_text" msgid="8362442730606839031">"忘记了图案?"</string> - <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"帐号解锁"</string> + <string name="lockscreen_glogin_forgot_pattern" msgid="9218940117797602518">"账号解锁"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="3775904917743034195">"图案尝试次数过多"</string> - <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"要解除锁定,请使用您的 Google 帐号登录。"</string> + <string name="lockscreen_glogin_instructions" msgid="4695162942525531700">"要解除锁定,请使用您的 Google 账号登录。"</string> <string name="lockscreen_glogin_username_hint" msgid="6916101478673157045">"用户名(电子邮件)"</string> <string name="lockscreen_glogin_password_hint" msgid="3031027901286812848">"密码"</string> <string name="lockscreen_glogin_submit_button" msgid="3590556636347843733">"登录"</string> @@ -1477,14 +1479,14 @@ <string name="ime_action_default" msgid="8265027027659800121">"执行"</string> <string name="dial_number_using" msgid="6060769078933953531">"拨打电话\n<xliff:g id="NUMBER">%s</xliff:g>"</string> <string name="create_contact_using" msgid="6200708808003692594">"创建电话号码为\n<xliff:g id="NUMBER">%s</xliff:g> 的联系人"</string> - <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"以下一个或多个应用请求获得相应权限,以便在当前和以后访问您的帐号。"</string> + <string name="grant_credentials_permission_message_header" msgid="5365733888842570481">"以下一个或多个应用请求获得相应权限,以便在当前和以后访问您的账号。"</string> <string name="grant_credentials_permission_message_footer" msgid="1886710210516246461">"您是否同意此请求?"</string> <string name="grant_permissions_header_text" msgid="3420736827804657201">"访问权限请求"</string> <string name="allow" msgid="6195617008611933762">"允许"</string> <string name="deny" msgid="6632259981847676572">"拒绝"</string> <string name="permission_request_notification_title" msgid="1810025922441048273">"权限请求"</string> - <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"应用对帐号 <xliff:g id="ACCOUNT">%s</xliff:g>\n 提出权限请求。"</string> - <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"“<xliff:g id="APP">%1$s</xliff:g>”请求获得以下帐号的访问权限:\n<xliff:g id="ACCOUNT">%2$s</xliff:g>。"</string> + <string name="permission_request_notification_with_subtitle" msgid="3743417870360129298">"应用对账号 <xliff:g id="ACCOUNT">%s</xliff:g>\n 提出权限请求。"</string> + <string name="permission_request_notification_for_app_with_subtitle" msgid="1298704005732851350">"“<xliff:g id="APP">%1$s</xliff:g>”请求获得以下账号的访问权限:\n<xliff:g id="ACCOUNT">%2$s</xliff:g>。"</string> <string name="forward_intent_to_owner" msgid="4620359037192871015">"您目前是在工作资料之外使用此应用"</string> <string name="forward_intent_to_work" msgid="3620262405636021151">"您目前是在工作资料内使用此应用"</string> <string name="input_method_binding_label" msgid="1166731601721983656">"输入法"</string> @@ -1530,13 +1532,13 @@ <string name="gpsVerifYes" msgid="3719843080744112940">"是"</string> <string name="gpsVerifNo" msgid="1671201856091564741">"否"</string> <string name="sync_too_many_deletes" msgid="6999440774578705300">"超出删除限制"</string> - <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"帐号 <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 在进行“<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>”同步时删除了 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> 项内容。您要如何处理这些删除的内容?"</string> + <string name="sync_too_many_deletes_desc" msgid="7409327940303504440">"账号 <xliff:g id="ACCOUNT_NAME">%3$s</xliff:g> 在进行“<xliff:g id="TYPE_OF_SYNC">%2$s</xliff:g>”同步时删除了 <xliff:g id="NUMBER_OF_DELETED_ITEMS">%1$d</xliff:g> 项内容。您要如何处理这些删除的内容?"</string> <string name="sync_really_delete" msgid="5657871730315579051">"删除这些内容"</string> <string name="sync_undo_deletes" msgid="5786033331266418896">"撤消删除"</string> <string name="sync_do_nothing" msgid="4528734662446469646">"目前不进行任何操作"</string> - <string name="choose_account_label" msgid="5557833752759831548">"选择帐号"</string> - <string name="add_account_label" msgid="4067610644298737417">"添加帐号"</string> - <string name="add_account_button_label" msgid="322390749416414097">"添加帐号"</string> + <string name="choose_account_label" msgid="5557833752759831548">"选择账号"</string> + <string name="add_account_label" msgid="4067610644298737417">"添加账号"</string> + <string name="add_account_button_label" msgid="322390749416414097">"添加账号"</string> <string name="number_picker_increment_button" msgid="7621013714795186298">"增大"</string> <string name="number_picker_decrement_button" msgid="5116948444762708204">"减小"</string> <string name="number_picker_increment_scroll_mode" msgid="8403893549806805985">"<xliff:g id="VALUE">%s</xliff:g> 触摸并按住。"</string> @@ -1660,13 +1662,13 @@ <string name="kg_invalid_puk" msgid="4809502818518963344">"请重新输入正确的PUK码。如果尝试错误次数过多,SIM卡将永久停用。"</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="4705368340409816254">"PIN 码不匹配"</string> <string name="kg_login_too_many_attempts" msgid="699292728290654121">"图案尝试次数过多"</string> - <string name="kg_login_instructions" msgid="3619844310339066827">"要解锁,请登录您的 Google 帐号。"</string> + <string name="kg_login_instructions" msgid="3619844310339066827">"要解锁,请登录您的 Google 账号。"</string> <string name="kg_login_username_hint" msgid="1765453775467133251">"用户名(电子邮件地址)"</string> <string name="kg_login_password_hint" msgid="3330530727273164402">"密码"</string> <string name="kg_login_submit_button" msgid="893611277617096870">"登录"</string> <string name="kg_login_invalid_input" msgid="8292367491901220210">"用户名或密码无效。"</string> <string name="kg_login_account_recovery_hint" msgid="4892466171043541248">"忘记了用户名或密码?\n请访问 "<b>"google.com/accounts/recovery"</b>"。"</string> - <string name="kg_login_checking_password" msgid="4676010303243317253">"正在检查帐号…"</string> + <string name="kg_login_checking_password" msgid="4676010303243317253">"正在检查账号…"</string> <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="23741434207544038">"您已经<xliff:g id="NUMBER_0">%1$d</xliff:g>次输错了PIN码。\n\n请在<xliff:g id="NUMBER_1">%2$d</xliff:g>秒后重试。"</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="3328686432962224215">"您已连续 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次输错密码。\n\n请在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒后重试。"</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="7357404233979139075">"您已连续 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。\n\n请在 <xliff:g id="NUMBER_1">%2$d</xliff:g> 秒后重试。"</string> @@ -1676,9 +1678,9 @@ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2299099385175083308">"您已经<xliff:g id="NUMBER">%d</xliff:g>次错误地尝试解锁平板电脑。平板电脑现在将恢复为出厂默认设置。"</string> <string name="kg_failed_attempts_now_wiping" product="tv" msgid="5045460916106267585">"您尝试解锁 Android TV 设备失败的次数已达 <xliff:g id="NUMBER">%d</xliff:g> 次。您的 Android TV 设备现在将恢复出厂设置。"</string> <string name="kg_failed_attempts_now_wiping" product="default" msgid="5043730590446071189">"您已经<xliff:g id="NUMBER">%d</xliff:g>次错误地尝试解锁手机。手机现在将恢复为出厂默认设置。"</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"您已连续 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁平板电脑。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> - <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"您已画错解锁图案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用电子邮件帐号解锁 Android TV 设备。\n\n 请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"您已连续 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="7086799295109717623">"您已连续 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件账号解锁平板电脑。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> + <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4670840383567106114">"您已画错解锁图案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用电子邮件账号解锁 Android TV 设备。\n\n 请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="5270861875006378092">"您已连续 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件账号解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> <string name="kg_text_message_separator" product="default" msgid="4503708889934976866">" — "</string> <string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"删除"</string> <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"要将音量调高到建议的音量以上吗?\n\n长时间保持高音量可能会损伤听力。"</string> @@ -1728,7 +1730,7 @@ <string name="accessibility_magnification_chooser_text" msgid="1502075582164931596">"放大功能"</string> <string name="user_switched" msgid="7249833311585228097">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string> <string name="user_switching_message" msgid="1912993630661332336">"正在切换为<xliff:g id="NAME">%1$s</xliff:g>…"</string> - <string name="user_logging_out_message" msgid="7216437629179710359">"正在将<xliff:g id="NAME">%1$s</xliff:g>退出帐号…"</string> + <string name="user_logging_out_message" msgid="7216437629179710359">"正在将<xliff:g id="NAME">%1$s</xliff:g>退出账号…"</string> <string name="owner_name" msgid="8713560351570795743">"机主"</string> <string name="guest_name" msgid="8502103277839834324">"访客"</string> <string name="error_message_title" msgid="4082495589294631966">"错误"</string> @@ -1933,7 +1935,7 @@ <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="user_creation_account_exists" msgid="2239146360099708035">"允许<xliff:g id="APP">%1$s</xliff:g>使用 <xliff:g id="ACCOUNT">%2$s</xliff:g>(目前已有用户使用此帐号)创建新用户吗?"</string> + <string name="user_creation_account_exists" msgid="2239146360099708035">"允许<xliff:g id="APP">%1$s</xliff:g>使用 <xliff:g id="ACCOUNT">%2$s</xliff:g>(目前已有用户使用此账号)创建新用户吗?"</string> <string name="user_creation_adding" msgid="7305185499667958364">"允许<xliff:g id="APP">%1$s</xliff:g>使用 <xliff:g id="ACCOUNT">%2$s</xliff:g> 创建新用户吗?"</string> <string name="supervised_user_creation_label" msgid="6884904353827427515">"添加受监管用户"</string> <string name="language_selection_title" msgid="52674936078683285">"添加语言"</string> @@ -1958,7 +1960,7 @@ <string name="app_streaming_blocked_title" msgid="6090945835898766139">"<xliff:g id="ACTIVITY">%1$s</xliff:g>不可用"</string> <string name="app_streaming_blocked_title_for_permission_dialog" msgid="4483161748582966785">"需要权限"</string> <string name="app_streaming_blocked_title_for_camera_dialog" msgid="3935701653713853065">"无法使用摄像头"</string> - <string name="app_streaming_blocked_title_for_fingerprint_dialog" msgid="3516853717714141951">"继续在手机上操作"</string> + <string name="app_streaming_blocked_title_for_fingerprint_dialog" msgid="3516853717714141951">"在手机上继续操作"</string> <string name="app_streaming_blocked_title_for_microphone_dialog" msgid="544822455127171206">"无法使用麦克风"</string> <string name="app_streaming_blocked_title_for_playstore_dialog" msgid="8149823099822897538">"无法使用 Play 商店"</string> <string name="app_streaming_blocked_title_for_settings_dialog" product="tv" msgid="196994247017450357">"无法使用 Android TV 设置"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"取消暂停"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"没有支持该内容的工作应用"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"没有支持该内容的个人应用"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"打开工作 <xliff:g id="APP">%s</xliff:g>?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"打开工作应用 <xliff:g id="APP">%s</xliff:g>?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"在个人 <xliff:g id="APP">%s</xliff:g> 中打开?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"在工作 <xliff:g id="APP">%s</xliff:g> 中打开?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"通过工作应用拨打电话?"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 305560032d00..e0bcec6cae8f 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允許應用程式取得由用戶允許授權的 NFC 付款服務資訊 (如已註冊的付款輔助功能和最終付款對象)。"</string> <string name="permlab_nfc" msgid="1904455246837674977">"控制近距離無線通訊"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"允許應用程式使用近距離無線通訊 (NFC) 標記、卡片及讀取程式進行通訊。"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"安全元件交易活動"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"允許應用程式接收在安全元件上發生的交易相關資訊。"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"停用螢幕上鎖"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"允許應用程式停用按鍵鎖定以及其他相關的密碼安全措施。例如:手機收到來電時停用按鍵鎖定,通話結束後重新啟用按鍵鎖定。"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"要求螢幕鎖定複雜程度"</string> @@ -1940,7 +1942,7 @@ <string name="country_selection_title" msgid="5221495687299014379">"地區偏好設定"</string> <string name="search_language_hint" msgid="7004225294308793583">"輸入語言名稱"</string> <string name="language_picker_section_suggested" msgid="6556199184638990447">"建議"</string> - <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"建議的語言"</string> + <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"建議地區"</string> <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"建議的語言"</string> <string name="region_picker_section_suggested_bilingual" msgid="704607569328224133">"建議地區"</string> <string name="language_picker_section_all" msgid="1985809075777564284">"所有語言"</string> @@ -2163,7 +2165,7 @@ <string name="resolver_switch_on_work" msgid="4527096360772311894">"取消暫停"</string> <string name="resolver_no_work_apps_available" msgid="3298291360133337270">"沒有適用的工作應用程式"</string> <string name="resolver_no_personal_apps_available" msgid="6284837227019594881">"沒有適用的個人應用程式"</string> - <string name="miniresolver_open_work" msgid="6286176185835401931">"要開啟「<xliff:g id="APP">%s</xliff:g>」嗎?"</string> + <string name="miniresolver_open_work" msgid="6286176185835401931">"要開啟工作應用程式「<xliff:g id="APP">%s</xliff:g>」嗎?"</string> <string name="miniresolver_open_in_personal" msgid="807427577794490375">"要在個人「<xliff:g id="APP">%s</xliff:g>」中開啟嗎?"</string> <string name="miniresolver_open_in_work" msgid="941341494673509916">"要在工作「<xliff:g id="APP">%s</xliff:g>」中開啟嗎?"</string> <string name="miniresolver_call_in_work" msgid="528779988307529039">"要透過工作應用程式打電話嗎?"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index f26cbe8d20a2..3eb96cfb7f5b 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"允許應用程式取得首選 NFC 付費服務資訊,例如已註冊的輔助工具和路線目的地。"</string> <string name="permlab_nfc" msgid="1904455246837674977">"控制近距離無線通訊"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"允許應用程式與近距離無線通訊 (NFC) 電子感應標籤、卡片及感應器進行通訊。"</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"安全元件交易事件"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"允許應用程式接收在安全元件上發生的交易相關資訊。"</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"停用螢幕鎖定"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"允許應用程式停用按鍵鎖定以及其他相關的密碼安全性功能。例如:手機收到來電時停用按鍵鎖定,通話結束後重新啟用按鍵鎖定。"</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"要求螢幕鎖定的複雜度"</string> @@ -1392,7 +1394,7 @@ <string name="share_remote_bugreport_action" msgid="7630880678785123682">"分享"</string> <string name="decline_remote_bugreport_action" msgid="4040894777519784346">"拒絕"</string> <string name="select_input_method" msgid="3971267998568587025">"選擇輸入法"</string> - <string name="show_ime" msgid="6406112007347443383">"使用實體鍵盤時仍繼續顯示虛擬鍵盤"</string> + <string name="show_ime" msgid="6406112007347443383">"使用實體鍵盤時仍繼續顯示螢幕小鍵盤"</string> <string name="hardware" msgid="1800597768237606953">"顯示虛擬鍵盤"</string> <string name="select_keyboard_layout_notification_title" msgid="5823199895322205589">"設定「<xliff:g id="DEVICE_NAME">%s</xliff:g>」"</string> <string name="select_multiple_keyboards_layout_notification_title" msgid="6999491025126641938">"設定實體鍵盤"</string> @@ -1940,7 +1942,7 @@ <string name="country_selection_title" msgid="5221495687299014379">"地區偏好設定"</string> <string name="search_language_hint" msgid="7004225294308793583">"請輸入語言名稱"</string> <string name="language_picker_section_suggested" msgid="6556199184638990447">"建議語言"</string> - <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"建議的語言"</string> + <string name="language_picker_regions_section_suggested" msgid="6080131515268225316">"建議地區"</string> <string name="language_picker_section_suggested_bilingual" msgid="5932198319583556613">"建議語言"</string> <string name="region_picker_section_suggested_bilingual" msgid="704607569328224133">"建議地區"</string> <string name="language_picker_section_all" msgid="1985809075777564284">"所有語言"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 270cc4bf1d61..52e850959421 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -590,6 +590,8 @@ <string name="permdesc_preferredPaymentInfo" msgid="8583552469807294967">"Ivuemela uhlelo lokusebenza ukuthola ulwazi lesevisi yenkokhelo ye-nfc njengezinsiza zokubhalisa nezindawo zomzila."</string> <string name="permlab_nfc" msgid="1904455246837674977">"lawula Uxhumano Lwenkambu Eseduze"</string> <string name="permdesc_nfc" msgid="8352737680695296741">"Ivuela uhlelo lokusebenza ukuthi ixhumane ne-Near Field Communication (NFC) amathegi, amakhadi kanye nezinhlelo zokufunda."</string> + <string name="permlab_nfcTransactionEvent" msgid="5868209446710407679">"Umcimbi wokwenziwe Ku-elementi Evikelekile"</string> + <string name="permdesc_nfcTransactionEvent" msgid="1904286701876487397">"Ivumela i-app ukuthi ithole ulwazi mayelana nemisebenzi eyenzekayo Ku-elementi Evikelekile."</string> <string name="permlab_disableKeyguard" msgid="3605253559020928505">"khubaza ukukhiya kwakho iskrini"</string> <string name="permdesc_disableKeyguard" msgid="3223710003098573038">"Ivumela uhlelo lokusebenza ukukhubaza ukuvala ukhiye nanoma yikuphi ukuphepha kwephasiwedi okuhlobene. Isibonelo, ifoni ikhubaza ukuvala ukhiye lapho ithola ikholi yefoni engenayo, bese inike amandla kabusha ukuvala ukhiye lapho ikholi isiqedile."</string> <string name="permlab_requestPasswordComplexity" msgid="1808977190557794109">"cela ubunkimbinkimbi kokukhiya isikrini"</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index bd0fe40e758d..0b67b6ca734f 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4764,6 +4764,9 @@ <!-- Whether or not we should show the option to show battery percentage --> <bool name="config_battery_percentage_setting_available">true</bool> + <!-- Default value set for battery percentage in status bar false = disabled, true = enabled --> + <bool name="config_defaultBatteryPercentageSetting">false</bool> + <!-- Whether or not battery saver should be "sticky" when manually enabled. --> <bool name="config_batterySaverStickyBehaviourDisabled">false</bool> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index a5b2b853fddd..8762e0c7a66e 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1711,6 +1711,12 @@ with Near Field Communication (NFC) tags, cards, and readers.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_nfcTransactionEvent">Secure Element transaction event</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_nfcTransactionEvent">Allows the app to receive information about + transactions happening on a Secure Element.</string> + + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_disableKeyguard">disable your screen lock</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_disableKeyguard">Allows the app to disable the diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2d040bb66d83..63bfa13387b6 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2335,6 +2335,7 @@ <java-symbol type="style" name="Animation.RecentApplications" /> <java-symbol type="integer" name="dock_enter_exit_duration" /> <java-symbol type="bool" name="config_battery_percentage_setting_available" /> + <java-symbol type="bool" name="config_defaultBatteryPercentageSetting" /> <java-symbol type="string" name="nas_upgrade_notification_title" /> <java-symbol type="string" name="nas_upgrade_notification_content" /> <java-symbol type="string" name="nas_upgrade_notification_enable_action" /> diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml index df3ae0e37547..af8c69ea1441 100644 --- a/core/res/res/xml/sms_short_codes.xml +++ b/core/res/res/xml/sms_short_codes.xml @@ -40,7 +40,7 @@ <shortcode country="al" pattern="\\d{5}" premium="15191|55[56]00" /> <!-- Argentina: 5 digits, known short codes listed --> - <shortcode country="ar" pattern="\\d{5}" free="11711|28291|44077" /> + <shortcode country="ar" pattern="\\d{5}" free="11711|28291|44077|78887" /> <!-- Armenia: 3-4 digits, emergency numbers 10[123] --> <shortcode country="am" pattern="\\d{3,4}" premium="11[2456]1|3024" free="10[123]" /> @@ -162,7 +162,7 @@ <shortcode country="jp" pattern="\\d{1,5}" free="8083" /> <!-- Kenya: 5 digits, known premium codes listed --> - <shortcode country="ke" pattern="\\d{5}" free="21725|21562|40520" /> + <shortcode country="ke" pattern="\\d{5}" free="21725|21562|40520|23342|40023" /> <!-- Kyrgyzstan: 4 digits, known premium codes listed --> <shortcode country="kg" pattern="\\d{4}" premium="415[2367]|444[69]" /> @@ -208,7 +208,7 @@ <shortcode country="nz" pattern="\\d{3,4}" premium="3903|8995|4679" free="1737|176|2141|3067|3068|3110|4006|4053|4061|4062|4202|4300|4334|4412|4575|5626|8006|8681" /> <!-- Peru: 4-5 digits (not confirmed), known premium codes listed --> - <shortcode country="pe" pattern="\\d{4,5}" free="9963|40777" /> + <shortcode country="pe" pattern="\\d{4,5}" free="9963|40778" /> <!-- Philippines --> <shortcode country="ph" pattern="\\d{1,5}" free="2147|5495|5496" /> @@ -216,6 +216,9 @@ <!-- Pakistan --> <shortcode country="pk" pattern="\\d{1,5}" free="2057" /> + <!-- Palestine: 5 digits, known premium codes listed --> + <shortcode country="ps" pattern="\\d{1,5}" free="37477" /> + <!-- Poland: 4-5 digits (not confirmed), known premium codes listed, plus EU --> <shortcode country="pl" pattern="\\d{4,5}" premium="74240|79(?:10|866)|92525" free="116\\d{3}|8012|80921" /> @@ -235,6 +238,9 @@ <!-- Russia: 4 digits, known premium codes listed: http://smscoin.net/info/pricing-russia/ --> <shortcode country="ru" pattern="\\d{4}" premium="1(?:1[56]1|899)|2(?:09[57]|322|47[46]|880|990)|3[589]33|4161|44(?:4[3-9]|81)|77(?:33|81)|8424" free="6954|8501" standard="2037|2044"/> + <!-- Rwanda: 4 digits --> + <shortcode country="rw" pattern="\\d{4}" free="5060" /> + <!-- Saudi Arabia --> <shortcode country="sa" pattern="\\d{1,5}" free="8145" /> diff --git a/core/tests/PackageInstallerSessions/src/android/content/pm/PackageSessionTests.kt b/core/tests/PackageInstallerSessions/src/android/content/pm/PackageSessionTests.kt index 9acb99a8c1c2..b794352e5e27 100644 --- a/core/tests/PackageInstallerSessions/src/android/content/pm/PackageSessionTests.kt +++ b/core/tests/PackageInstallerSessions/src/android/content/pm/PackageSessionTests.kt @@ -445,7 +445,9 @@ class PackageSessionTests { Manifest.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION) } handlerThread = HandlerThread("PackageSessionTests") - handlerThread?.start() - handler = Handler(handlerThread?.looper) + handlerThread?.let { + it.start() + handler = Handler(it.looper) + } } } diff --git a/core/tests/coretests/OWNERS b/core/tests/coretests/OWNERS index e8c9fe70272d..b7e008b196ff 100644 --- a/core/tests/coretests/OWNERS +++ b/core/tests/coretests/OWNERS @@ -2,3 +2,4 @@ include platform/frameworks/base:/services/core/java/com/android/server/am/OWNER per-file BinderTest.java = file:platform/frameworks/native:/libs/binder/OWNERS per-file ParcelTest.java = file:platform/frameworks/native:/libs/binder/OWNERS +per-file SurfaceControlRegistryTests.java = file:/services/core/java/com/android/server/wm/OWNERS diff --git a/core/tests/coretests/res/values-id/strings.xml b/core/tests/coretests/res/values-id/strings.xml new file mode 100644 index 000000000000..6d71c90866cc --- /dev/null +++ b/core/tests/coretests/res/values-id/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Used in ResourcesLocaleTest. --> + <string name="locale_test_res_1">Pengujian ID</string> +</resources> diff --git a/core/tests/coretests/res/values-in/strings.xml b/core/tests/coretests/res/values-in/strings.xml new file mode 100644 index 000000000000..63846603ed60 --- /dev/null +++ b/core/tests/coretests/res/values-in/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <!-- Used in ResourcesLocaleTest. --> + <string name="locale_test_res_2">Pengujian IN</string> +</resources> diff --git a/core/tests/coretests/res/values/strings.xml b/core/tests/coretests/res/values/strings.xml index e51eab60a998..09e1c690f4e2 100644 --- a/core/tests/coretests/res/values/strings.xml +++ b/core/tests/coretests/res/values/strings.xml @@ -131,6 +131,13 @@ <string name="textview_hebrew_text">םמab?!</string> + <!-- Used in ResourcesLocaleTest. Also defined in values-id. "id" is the new ISO code for Indonesian. --> + <string name="locale_test_res_1">Testing ID</string> + <!-- Used in ResourcesLocaleTest. Also defined in values-in. "in" is the deprecated ISO code for Indonesian. --> + <string name="locale_test_res_2">Testing IN</string> + <!-- Used in ResourcesLocaleTest. --> + <string name="locale_test_res_3">Testing EN</string> + <!-- SizeAdaptiveLayout --> <string name="first">Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.</string> <string name="actor">Abe Lincoln</string> diff --git a/core/tests/coretests/src/android/app/OWNERS b/core/tests/coretests/src/android/app/OWNERS index 8d9461d8035d..64f5e6c68a95 100644 --- a/core/tests/coretests/src/android/app/OWNERS +++ b/core/tests/coretests/src/android/app/OWNERS @@ -7,3 +7,6 @@ per-file *StatusBar* = file:/packages/SystemUI/OWNERS # A11Y and related per-file *UiAutomation* = file:/services/accessibility/OWNERS + +# KeyguardManagerTest +per-file KeyguardManagerTest.java = file:/services/core/java/com/android/server/locksettings/OWNERS diff --git a/core/tests/coretests/src/android/content/res/FontScaleConverterActivityTest.java b/core/tests/coretests/src/android/content/res/FontScaleConverterActivityTest.java index df4fb44cd1ba..0941a2b6d263 100644 --- a/core/tests/coretests/src/android/content/res/FontScaleConverterActivityTest.java +++ b/core/tests/coretests/src/android/content/res/FontScaleConverterActivityTest.java @@ -137,7 +137,7 @@ public class FontScaleConverterActivityTest { ); }); - PollingCheck.waitFor(/* timeout= */ 5000, () -> { + PollingCheck.waitFor(/* timeout= */ 7000, () -> { AtomicBoolean isActivityAtCorrectScale = new AtomicBoolean(false); rule.getScenario().onActivity(activity -> isActivityAtCorrectScale.set( @@ -146,12 +146,7 @@ public class FontScaleConverterActivityTest { .fontScale == fontScale ) ); - return isActivityAtCorrectScale.get() && InstrumentationRegistry - .getInstrumentation() - .getContext() - .getResources() - .getConfiguration() - .fontScale == fontScale; + return isActivityAtCorrectScale.get(); }); } diff --git a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java index 25c3db5c6910..26e4349243a5 100644 --- a/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java +++ b/core/tests/coretests/src/android/content/res/ResourcesLocaleTest.java @@ -16,6 +16,7 @@ package android.content.res; +import android.content.Context; import android.os.FileUtils; import android.os.LocaleList; import android.platform.test.annotations.Presubmit; @@ -97,4 +98,24 @@ public class ResourcesLocaleTest extends AndroidTestCase { assertEquals(Locale.forLanguageTag("pl-PL"), resources.getConfiguration().getLocales().get(0)); } + + @SmallTest + public void testDeprecatedISOLanguageCode() { + assertResGetString(Locale.US, R.string.locale_test_res_1, "Testing ID"); + assertResGetString(Locale.forLanguageTag("id"), R.string.locale_test_res_2, "Pengujian IN"); + assertResGetString(Locale.forLanguageTag("id"), R.string.locale_test_res_3, "Testing EN"); + assertResGetString(new Locale("id"), R.string.locale_test_res_2, "Pengujian IN"); + assertResGetString(new Locale("id"), R.string.locale_test_res_3, "Testing EN"); + // The new ISO code "id" isn't supported yet, and thus the values-id are ignored. + assertResGetString(new Locale("id"), R.string.locale_test_res_1, "Testing ID"); + assertResGetString(Locale.forLanguageTag("id"), R.string.locale_test_res_1, "Testing ID"); + } + + private void assertResGetString(Locale locale, int resId, String expectedString) { + LocaleList locales = new LocaleList(locale); + final Configuration config = new Configuration(); + config.setLocales(locales); + Context newContext = getContext().createConfigurationContext(config); + assertEquals(expectedString, newContext.getResources().getString(resId)); + } } diff --git a/core/tests/coretests/src/android/database/sqlite/OWNERS b/core/tests/coretests/src/android/database/sqlite/OWNERS new file mode 100644 index 000000000000..3bebc7c56f61 --- /dev/null +++ b/core/tests/coretests/src/android/database/sqlite/OWNERS @@ -0,0 +1 @@ +include /SQLITE_OWNERS diff --git a/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java b/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java new file mode 100644 index 000000000000..5aeab42eaaea --- /dev/null +++ b/core/tests/coretests/src/android/hardware/input/InputFlagsTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.hardware.input; + +import static com.android.hardware.input.Flags.keyboardA11yStickyKeysFlag; +import static com.android.hardware.input.Flags.keyboardLayoutPreviewFlag; + +import android.platform.test.annotations.Presubmit; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests for {@link com.android.hardware.input.Flags} + * + * Build/Install/Run: + * atest FrameworksCoreTests:InputFlagsTest + */ +@RunWith(AndroidJUnit4.class) +@SmallTest +@Presubmit +public class InputFlagsTest { + + /** + * Test that the flags work + */ + @Test + public void testFlags() { + // No crash when accessing the flag. + keyboardLayoutPreviewFlag(); + keyboardA11yStickyKeysFlag(); + } +} + diff --git a/core/tests/coretests/src/android/os/AidlTest.java b/core/tests/coretests/src/android/os/AidlTest.java index 5f54b093e5e5..d0c3470c4c1f 100644 --- a/core/tests/coretests/src/android/os/AidlTest.java +++ b/core/tests/coretests/src/android/os/AidlTest.java @@ -28,12 +28,14 @@ public class AidlTest extends TestCase { private IAidlTest mRemote; private AidlObject mLocal; + private NonAutoGeneratedObject mNonAutoGenerated; @Override protected void setUp() throws Exception { super.setUp(); mLocal = new AidlObject(); mRemote = IAidlTest.Stub.asInterface(mLocal); + mNonAutoGenerated = new NonAutoGeneratedObject("NonAutoGeneratedObject"); } private static boolean check(TestParcelable p, int n, String s) { @@ -84,6 +86,12 @@ public class AidlTest extends TestCase { } } + private static class NonAutoGeneratedObject extends Binder { + NonAutoGeneratedObject(String descriptor) { + super(descriptor); + } + } + private static class AidlObject extends IAidlTest.Stub { public IInterface queryLocalInterface(String descriptor) { // overriding this to return null makes asInterface always @@ -194,7 +202,7 @@ public class AidlTest extends TestCase { TestParcelable[] a1, TestParcelable[] a2) { return null; } - + public void voidSecurityException() { throw new SecurityException("gotcha!"); } @@ -396,7 +404,7 @@ public class AidlTest extends TestCase { assertEquals("s2[1]", s2[1]); assertEquals("s2[2]", s2[2]); } - + @SmallTest public void testVoidSecurityException() throws Exception { boolean good = false; @@ -407,7 +415,7 @@ public class AidlTest extends TestCase { } assertEquals(good, true); } - + @SmallTest public void testIntSecurityException() throws Exception { boolean good = false; @@ -420,7 +428,7 @@ public class AidlTest extends TestCase { } @SmallTest - public void testGetTransactionName() throws Exception { + public void testGetTransactionNameAutoGenerated() throws Exception { assertEquals(15, mLocal.getMaxTransactionId()); assertEquals("booleanArray", @@ -430,12 +438,21 @@ public class AidlTest extends TestCase { assertEquals("parcelableIn", mLocal.getTransactionName(IAidlTest.Stub.TRANSACTION_parcelableIn)); - assertEquals("IAidlTest:booleanArray", + assertEquals("AIDL::java::IAidlTest::booleanArray::server", mLocal.getTransactionTraceName(IAidlTest.Stub.TRANSACTION_booleanArray)); - assertEquals("IAidlTest:voidSecurityException", + assertEquals("AIDL::java::IAidlTest::voidSecurityException::server", mLocal.getTransactionTraceName(IAidlTest.Stub.TRANSACTION_voidSecurityException)); - assertEquals("IAidlTest:parcelableIn", + assertEquals("AIDL::java::IAidlTest::parcelableIn::server", mLocal.getTransactionTraceName(IAidlTest.Stub.TRANSACTION_parcelableIn)); } -} + @SmallTest + public void testGetTransactionNameNonAutoGenerated() throws Exception { + assertEquals(0, mNonAutoGenerated.getMaxTransactionId()); + + assertEquals("AIDL::java::NonAutoGeneratedObject::#0::server", + mNonAutoGenerated.getTransactionTraceName(0)); + assertEquals("AIDL::java::NonAutoGeneratedObject::#1::server", + mNonAutoGenerated.getTransactionTraceName(1)); + } +} diff --git a/core/tests/coretests/src/android/os/OWNERS b/core/tests/coretests/src/android/os/OWNERS index f2d6ff87f7f2..8b333f3c3eaa 100644 --- a/core/tests/coretests/src/android/os/OWNERS +++ b/core/tests/coretests/src/android/os/OWNERS @@ -5,4 +5,7 @@ per-file BrightnessLimit.java = michaelwr@google.com, santoscordon@google.com per-file *Vibrat*.java = file:/services/core/java/com/android/server/vibrator/OWNERS # Power -per-file PowerManager*.java = michaelwr@google.com, santoscordon@google.com
\ No newline at end of file +per-file PowerManager*.java = michaelwr@google.com, santoscordon@google.com + +# PerformanceHintManager +per-file PerformanceHintManagerTest.java = file:/ADPF_OWNERS diff --git a/core/tests/coretests/src/android/os/ParcelTest.java b/core/tests/coretests/src/android/os/ParcelTest.java index e2fe87b4cfe3..4b993fadc1e0 100644 --- a/core/tests/coretests/src/android/os/ParcelTest.java +++ b/core/tests/coretests/src/android/os/ParcelTest.java @@ -246,4 +246,93 @@ public class ParcelTest { assertThrows(IllegalArgumentException.class, () -> Parcel.compareData(pA, -1, pB, iB, 0)); assertThrows(IllegalArgumentException.class, () -> Parcel.compareData(pA, 0, pB, -1, 0)); } + + /*** + * Tests for b/205282403 + * This test checks if allocations made over limit of 1MB for primitive types + * and 1M length for complex objects are not allowed. + */ + @Test + public void testAllocationsOverLimit_whenOverLimit_throws() { + Binder.setIsDirectlyHandlingTransactionOverride(true); + Parcel p = Parcel.obtain(); + p.setDataPosition(0); + p.writeInt(Integer.MAX_VALUE); + + p.setDataPosition(0); + assertThrows(BadParcelableException.class, () ->p.createBooleanArray()); + + p.setDataPosition(0); + assertThrows(BadParcelableException.class, () ->p.createCharArray()); + + p.setDataPosition(0); + assertThrows(BadParcelableException.class, () ->p.createIntArray()); + + p.setDataPosition(0); + assertThrows(BadParcelableException.class, () ->p.createLongArray()); + + p.setDataPosition(0); + assertThrows(BadParcelableException.class, () ->p.createBinderArray()); + + int[] dimensions = new int[]{Integer.MAX_VALUE, 100, 100}; + p.setDataPosition(0); + assertThrows(BadParcelableException.class, + () -> p.createFixedArray(int[][][].class, dimensions)); + + p.setDataPosition(0); + assertThrows(BadParcelableException.class, + () -> p.createFixedArray(String[][][].class, dimensions)); + + p.setDataPosition(0); + assertThrows(BadParcelableException.class, + () -> p.createFixedArray(IBinder[][][].class, dimensions)); + + p.recycle(); + Binder.setIsDirectlyHandlingTransactionOverride(false); + } + + /*** + * Tests for b/205282403 + * This test checks if allocations made under limit of 1MB for primitive types + * and 1M length for complex objects are allowed. + */ + @Test + public void testAllocations_whenWithinLimit() { + Binder.setIsDirectlyHandlingTransactionOverride(true); + Parcel p = Parcel.obtain(); + p.setDataPosition(0); + p.writeInt(100000); + + p.setDataPosition(0); + p.createByteArray(); + + p.setDataPosition(0); + p.createCharArray(); + + p.setDataPosition(0); + p.createIntArray(); + + p.setDataPosition(0); + p.createLongArray(); + + p.setDataPosition(0); + p.createBinderArray(); + + int[] dimensions = new int[]{ 100, 100, 100 }; + + p.setDataPosition(0); + int[][][] data = new int[100][100][100]; + p.writeFixedArray(data, 0, dimensions); + p.setDataPosition(0); + p.createFixedArray(int[][][].class, dimensions); + + p.setDataPosition(0); + IBinder[][][] parcelables = new IBinder[100][100][100]; + p.writeFixedArray(parcelables, 0, dimensions); + p.setDataPosition(0); + p.createFixedArray(IBinder[][][].class, dimensions); + + p.recycle(); + Binder.setIsDirectlyHandlingTransactionOverride(false); + } } diff --git a/core/tests/coretests/src/android/security/keystore/OWNERS b/core/tests/coretests/src/android/security/keystore/OWNERS new file mode 100644 index 000000000000..d9e01161ce6d --- /dev/null +++ b/core/tests/coretests/src/android/security/keystore/OWNERS @@ -0,0 +1 @@ +include /keystore/OWNERS diff --git a/core/tests/coretests/src/android/service/euicc/OWNERS b/core/tests/coretests/src/android/service/euicc/OWNERS new file mode 100644 index 000000000000..41fc56b45dde --- /dev/null +++ b/core/tests/coretests/src/android/service/euicc/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/telephony/java/android/service/euicc/OWNERS diff --git a/core/tests/coretests/src/android/service/quicksettings/OWNERS b/core/tests/coretests/src/android/service/quicksettings/OWNERS new file mode 100644 index 000000000000..5665490ac3bd --- /dev/null +++ b/core/tests/coretests/src/android/service/quicksettings/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/core/java/android/service/quicksettings/OWNERS diff --git a/core/tests/coretests/src/android/util/PatternsTest.java b/core/tests/coretests/src/android/util/PatternsTest.java index 6cea2f3c92bd..dd8f73fd54c4 100644 --- a/core/tests/coretests/src/android/util/PatternsTest.java +++ b/core/tests/coretests/src/android/util/PatternsTest.java @@ -399,7 +399,7 @@ public class PatternsTest extends TestCase { @SmallTest public void testAutoLinkWebUrl_doesNotMatchUrlsWithoutProtocolAndWithUnknownTld() throws Exception { - String url = "thank.you"; + String url = "thank.unknowntld"; assertFalse("Should not match URL that does not start with a protocol and " + "does not contain a known TLD", Patterns.AUTOLINK_WEB_URL.matcher(url).matches()); @@ -422,7 +422,7 @@ public class PatternsTest extends TestCase { @SmallTest public void testAutoLinkWebUrl_doesNotMatchUrlsWithEmojiWithoutProtocolAndWithoutKnownTld() throws Exception { - String url = "Thank\u263A.you"; + String url = "Thank\u263A.unknowntld"; assertFalse("Should not match URLs containing emoji and with unknown TLD", Patterns.AUTOLINK_WEB_URL.matcher(url).matches()); } diff --git a/core/tests/coretests/src/android/util/apk/SourceStampVerifierTest.java b/core/tests/coretests/src/android/util/apk/SourceStampVerifierTest.java index bc0bddba2f20..e0c583ddc978 100644 --- a/core/tests/coretests/src/android/util/apk/SourceStampVerifierTest.java +++ b/core/tests/coretests/src/android/util/apk/SourceStampVerifierTest.java @@ -100,7 +100,7 @@ public class SourceStampVerifierTest { SourceStampVerificationResult result = SourceStampVerifier.verify(mPrimaryApk.getAbsolutePath()); - assertTrue(result.isPresent()); + assertFalse(result.isPresent()); assertFalse(result.isVerified()); assertNull(result.getCertificate()); } diff --git a/core/tests/coretests/src/android/window/flags/WindowFlagsTest.java b/core/tests/coretests/src/android/window/flags/WindowFlagsTest.java new file mode 100644 index 000000000000..a8b40325a713 --- /dev/null +++ b/core/tests/coretests/src/android/window/flags/WindowFlagsTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.window.flags; + +import static com.android.window.flags.Flags.syncWindowConfigUpdateFlag; + +import android.platform.test.annotations.Presubmit; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests for {@link com.android.window.flags.Flags} + * + * Build/Install/Run: + * atest FrameworksCoreTests:WindowFlagsTest + */ +@RunWith(AndroidJUnit4.class) +@SmallTest +@Presubmit +public class WindowFlagsTest { + + @Test + public void testSyncWindowConfigUpdateFlag() { + // No crash when accessing the flag. + syncWindowConfigUpdateFlag(); + } +} diff --git a/core/tests/coretests/src/com/android/internal/content/OWNERS b/core/tests/coretests/src/com/android/internal/content/OWNERS new file mode 100644 index 000000000000..4bb83438b193 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/content/OWNERS @@ -0,0 +1,2 @@ + +per-file Overlay* = file:/core/java/android/content/res/OWNERS diff --git a/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java b/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java index 0f30cfead4f7..246a1e78bd5e 100644 --- a/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java +++ b/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import android.content.pm.PackagePartitions; import android.os.FileUtils; import android.os.SystemProperties; import android.platform.test.annotations.Presubmit; @@ -32,6 +33,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.frameworks.coretests.R; import com.android.internal.content.om.OverlayConfig; import com.android.internal.content.om.OverlayConfig.IdmapInvocation; +import com.android.internal.content.om.OverlayConfigParser.OverlayPartition; import com.android.internal.content.om.OverlayScanner; import org.junit.Rule; @@ -46,6 +48,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.List; @Presubmit @RunWith(AndroidJUnit4.class) @@ -88,6 +91,17 @@ public class OverlayConfigTest { assertEquals(configIndex, config.configIndex); } + private String generatePartitionOrderString(List<OverlayPartition> partitions) { + StringBuilder partitionOrder = new StringBuilder(); + for (int i = 0; i < partitions.size(); i++) { + partitionOrder.append(partitions.get(i).getName()); + if (i < partitions.size() - 1) { + partitionOrder.append(", "); + } + } + return partitionOrder.toString(); + } + @Test public void testImmutableAfterNonImmutableFails() throws IOException { mExpectedException.expect(IllegalStateException.class); @@ -685,4 +699,122 @@ public class OverlayConfigTest { OverlayConfig.Configuration o3 = overlayConfig.getConfiguration("three"); assertNotNull(o3); } + + @Test + public void testSortPartitionsWithoutXml() throws IOException { + ArrayList<OverlayPartition> partitions = new ArrayList<>( + PackagePartitions.getOrderedPartitions(OverlayPartition::new)); + + final OverlayConfig overlayConfig = createConfigImpl(); + String partitionOrderFilePath = String.format("%s/%s", mTestFolder.getRoot(), + "/product/overlay/partition_order.xml"); + assertEquals(false, overlayConfig.sortPartitions(partitionOrderFilePath, partitions)); + assertEquals("system, vendor, odm, oem, product, system_ext", + generatePartitionOrderString(partitions)); + } + + @Test + public void testSortPartitionsWithInvalidXmlRootElement() throws IOException { + ArrayList<OverlayPartition> partitions = new ArrayList<>( + PackagePartitions.getOrderedPartitions(OverlayPartition::new)); + createFile("/product/overlay/partition_order.xml", + "<partition-list>\n" + + " <partition name=\"system_ext\"/>\n" + + " <partition name=\"vendor\"/>\n" + + " <partition name=\"oem\"/>\n" + + " <partition name=\"odm\"/>\n" + + " <partition name=\"product\"/>\n" + + " <partition name=\"system\"/>\n" + + "</partition-list>\n"); + final OverlayConfig overlayConfig = createConfigImpl(); + String partitionOrderFilePath = String.format("%s/%s", mTestFolder.getRoot(), + "/product/overlay/partition_order.xml"); + assertEquals(false, overlayConfig.sortPartitions(partitionOrderFilePath, partitions)); + assertEquals("system, vendor, odm, oem, product, system_ext", + generatePartitionOrderString(partitions)); + } + + @Test + public void testSortPartitionsWithInvalidPartition() throws IOException { + ArrayList<OverlayPartition> partitions = new ArrayList<>( + PackagePartitions.getOrderedPartitions(OverlayPartition::new)); + createFile("/product/overlay/partition_order.xml", + "<partition-order>\n" + + " <partition name=\"INVALID\"/>\n" + + " <partition name=\"vendor\"/>\n" + + " <partition name=\"oem\"/>\n" + + " <partition name=\"odm\"/>\n" + + " <partition name=\"product\"/>\n" + + " <partition name=\"system\"/>\n" + + "</partition-order>\n"); + final OverlayConfig overlayConfig = createConfigImpl(); + String partitionOrderFilePath = String.format("%s/%s", mTestFolder.getRoot(), + "/product/overlay/partition_order.xml"); + assertEquals(false, overlayConfig.sortPartitions(partitionOrderFilePath, partitions)); + assertEquals("system, vendor, odm, oem, product, system_ext", + generatePartitionOrderString(partitions)); + } + + @Test + public void testSortPartitionsWithDuplicatePartition() throws IOException { + ArrayList<OverlayPartition> partitions = new ArrayList<>( + PackagePartitions.getOrderedPartitions(OverlayPartition::new)); + createFile("/product/overlay/partition_order.xml", + "<partition-order>\n" + + " <partition name=\"system_ext\"/>\n" + + " <partition name=\"system\"/>\n" + + " <partition name=\"vendor\"/>\n" + + " <partition name=\"oem\"/>\n" + + " <partition name=\"odm\"/>\n" + + " <partition name=\"product\"/>\n" + + " <partition name=\"system\"/>\n" + + "</partition-order>\n"); + final OverlayConfig overlayConfig = createConfigImpl(); + String partitionOrderFilePath = String.format("%s/%s", mTestFolder.getRoot(), + "/product/overlay/partition_order.xml"); + assertEquals(false, overlayConfig.sortPartitions(partitionOrderFilePath, partitions)); + assertEquals("system, vendor, odm, oem, product, system_ext", + generatePartitionOrderString(partitions)); + } + + @Test + public void testSortPartitionsWithMissingPartition() throws IOException { + ArrayList<OverlayPartition> partitions = new ArrayList<>( + PackagePartitions.getOrderedPartitions(OverlayPartition::new)); + createFile("/product/overlay/partition_order.xml", + "<partition-order>\n" + + " <partition name=\"vendor\"/>\n" + + " <partition name=\"oem\"/>\n" + + " <partition name=\"odm\"/>\n" + + " <partition name=\"product\"/>\n" + + " <partition name=\"system\"/>\n" + + "</partition-order>\n"); + final OverlayConfig overlayConfig = createConfigImpl(); + String partitionOrderFilePath = String.format("%s/%s", mTestFolder.getRoot(), + "/product/overlay/partition_order.xml"); + assertEquals(false, overlayConfig.sortPartitions(partitionOrderFilePath, partitions)); + assertEquals("system, vendor, odm, oem, product, system_ext", + generatePartitionOrderString(partitions)); + } + + @Test + public void testSortPartitionsWithCorrectPartitionOrderXml() throws IOException { + ArrayList<OverlayPartition> partitions = new ArrayList<>( + PackagePartitions.getOrderedPartitions(OverlayPartition::new)); + createFile("/product/overlay/partition_order.xml", + "<partition-order>\n" + + " <partition name=\"system_ext\"/>\n" + + " <partition name=\"vendor\"/>\n" + + " <partition name=\"oem\"/>\n" + + " <partition name=\"odm\"/>\n" + + " <partition name=\"product\"/>\n" + + " <partition name=\"system\"/>\n" + + "</partition-order>\n"); + final OverlayConfig overlayConfig = createConfigImpl(); + String partitionOrderFilePath = String.format("%s/%s", mTestFolder.getRoot(), + "/product/overlay/partition_order.xml"); + assertEquals(true, overlayConfig.sortPartitions(partitionOrderFilePath, partitions)); + assertEquals("system_ext, vendor, oem, odm, product, system", + generatePartitionOrderString(partitions)); + } } diff --git a/core/tests/fuzzers/ParcelFuzzer/Android.bp b/core/tests/fuzzers/ParcelFuzzer/Android.bp index b71a06e3572e..eff19853fc7e 100644 --- a/core/tests/fuzzers/ParcelFuzzer/Android.bp +++ b/core/tests/fuzzers/ParcelFuzzer/Android.bp @@ -34,6 +34,7 @@ java_fuzz { "smoreland@google.com", "waghpawan@google.com", ], + triage_assignee: "cobark@google.com", // TODO(b/280770893) // Adds bugs to hotlist "AIDL fuzzers bugs" on buganizer hotlists: ["4637097"], }, diff --git a/core/tests/fuzzers/ParcelFuzzer/ReadUtils.java b/core/tests/fuzzers/ParcelFuzzer/ReadUtils.java index b5e5b258b7d6..cb988555d5f7 100644 --- a/core/tests/fuzzers/ParcelFuzzer/ReadUtils.java +++ b/core/tests/fuzzers/ParcelFuzzer/ReadUtils.java @@ -364,6 +364,12 @@ public class ReadUtils { TestClassLoader loader = new TestClassLoader(); parcel.readParcelableArray(loader); }, + (parcel, provider) -> { + parcel.readParcelable(null); + }, + (parcel, provider) -> { + parcel.readParcelableArray(null); + }, // read lists (parcel, provider) -> { diff --git a/core/tests/fuzzers/java_service_fuzzer/Android.bp b/core/tests/fuzzers/java_service_fuzzer/Android.bp index 6acb19852210..97538a5035f3 100644 --- a/core/tests/fuzzers/java_service_fuzzer/Android.bp +++ b/core/tests/fuzzers/java_service_fuzzer/Android.bp @@ -42,6 +42,7 @@ java_fuzz { "smoreland@google.com", "waghpawan@google.com", ], + triage_assignee: "cobark@google.com", // TODO(b/261539788) // Adds bugs to hotlist "AIDL fuzzers bugs" on buganizer hotlists: ["4637097"], }, diff --git a/core/tests/packagemonitortests/OWNERS b/core/tests/packagemonitortests/OWNERS new file mode 100644 index 000000000000..d825dfd7cf00 --- /dev/null +++ b/core/tests/packagemonitortests/OWNERS @@ -0,0 +1 @@ +include /services/core/java/com/android/server/pm/OWNERS diff --git a/core/tests/utiltests/src/com/android/internal/util/FileRotatorTest.java b/core/tests/utiltests/src/com/android/internal/util/FileRotatorTest.java index 952721320c90..73e47e1635b4 100644 --- a/core/tests/utiltests/src/com/android/internal/util/FileRotatorTest.java +++ b/core/tests/utiltests/src/com/android/internal/util/FileRotatorTest.java @@ -366,6 +366,16 @@ public class FileRotatorTest extends AndroidTestCase { assertReadAll(rotate, "bar"); } + public void testReadSorted() throws Exception { + write("rotator.1024-2048", "2"); + write("rotator.2048-4096", "3"); + write("rotator.512-1024", "1"); + + final FileRotator rotate = new FileRotator( + mBasePath, PREFIX, SECOND_IN_MILLIS, SECOND_IN_MILLIS); + assertReadAll(rotate, "1", "2", "3"); + } + public void testFileSystemInaccessible() throws Exception { File inaccessibleDir = null; String dirPath = getContext().getFilesDir() + File.separator + "inaccessible"; @@ -422,16 +432,7 @@ public class FileRotatorTest extends AndroidTestCase { } public void assertRead(String... expected) { - assertEquals(expected.length, mActual.size()); - - final ArrayList<String> actualCopy = new ArrayList<String>(mActual); - for (String value : expected) { - if (!actualCopy.remove(value)) { - final String expectedString = Arrays.toString(expected); - final String actualString = Arrays.toString(mActual.toArray()); - fail("expected: " + expectedString + " but was: " + actualString); - } - } + assertEquals(Arrays.asList(expected), mActual); } } } diff --git a/core/xsd/vts/OWNERS b/core/xsd/vts/OWNERS new file mode 100644 index 000000000000..9af2ebaba437 --- /dev/null +++ b/core/xsd/vts/OWNERS @@ -0,0 +1,2 @@ +# Bug component: 151862 +sundongahn@google.com diff --git a/data/etc/com.android.networkstack.xml b/data/etc/com.android.networkstack.xml index 06fec1cdab1e..003ca53b03b0 100644 --- a/data/etc/com.android.networkstack.xml +++ b/data/etc/com.android.networkstack.xml @@ -25,6 +25,7 @@ <permission name="android.permission.LOCAL_MAC_ADDRESS"/> <permission name="android.permission.MANAGE_SUBSCRIPTION_PLANS"/> <permission name="android.permission.MANAGE_USB"/> + <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.NETWORK_BYPASS_PRIVATE_DNS"/> <permission name="android.permission.PACKET_KEEPALIVE_OFFLOAD"/> <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/> diff --git a/data/fonts/Android.bp b/data/fonts/Android.bp index f90a74d939f4..3dd9ba9db1d9 100644 --- a/data/fonts/Android.bp +++ b/data/fonts/Android.bp @@ -52,3 +52,8 @@ prebuilt_etc { name: "fonts.xml", src: "fonts.xml", } + +prebuilt_etc { + name: "font_fallback.xml", + src: "font_fallback.xml", +} diff --git a/data/fonts/font_fallback.xml b/data/fonts/font_fallback.xml new file mode 100644 index 000000000000..12417362ddba --- /dev/null +++ b/data/fonts/font_fallback.xml @@ -0,0 +1,1626 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + In this file, all fonts without names are added to the default list. + Fonts are chosen based on a match: full BCP-47 language tag including + script, then just language, and finally order (the first font containing + the glyph). + + Order of appearance is also the tiebreaker for weight matching. This is + the reason why the 900 weights of Roboto precede the 700 weights - we + prefer the former when an 800 weight is requested. Since bold spans + effectively add 300 to the weight, this ensures that 900 is the bold + paired with the 500 weight, ensuring adequate contrast. + + TODO(rsheeter) update comment; ordering to match 800 to 900 is no longer required +--> +<familyset version="23"> + <!-- first font is default --> + <family name="sans-serif"> + <font weight="100" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="normal">RobotoStatic-Regular.ttf</font> + <font weight="500" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="900" /> + </font> + <font weight="100" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="500" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="900" /> + </font> + </family> + + + <!-- Note that aliases must come after the fonts they reference. --> + <alias name="sans-serif-thin" to="sans-serif" weight="100" /> + <alias name="sans-serif-light" to="sans-serif" weight="300" /> + <alias name="sans-serif-medium" to="sans-serif" weight="500" /> + <alias name="sans-serif-black" to="sans-serif" weight="900" /> + <alias name="arial" to="sans-serif" /> + <alias name="helvetica" to="sans-serif" /> + <alias name="tahoma" to="sans-serif" /> + <alias name="verdana" to="sans-serif" /> + + <family name="sans-serif-condensed"> + <font weight="100" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="500" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="normal">Roboto-Regular.ttf + <axis tag="ital" stylevalue="0" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="900" /> + </font> + <font weight="100" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="500" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="italic">Roboto-Regular.ttf + <axis tag="ital" stylevalue="1" /> + <axis tag="wdth" stylevalue="75" /> + <axis tag="wght" stylevalue="900" /> + </font> + </family> + <alias name="sans-serif-condensed-light" to="sans-serif-condensed" weight="300" /> + <alias name="sans-serif-condensed-medium" to="sans-serif-condensed" weight="500" /> + + <family name="serif"> + <font weight="400" style="normal" postScriptName="NotoSerif">NotoSerif-Regular.ttf</font> + <font weight="700" style="normal">NotoSerif-Bold.ttf</font> + <font weight="400" style="italic">NotoSerif-Italic.ttf</font> + <font weight="700" style="italic">NotoSerif-BoldItalic.ttf</font> + </family> + <alias name="serif-bold" to="serif" weight="700" /> + <alias name="times" to="serif" /> + <alias name="times new roman" to="serif" /> + <alias name="palatino" to="serif" /> + <alias name="georgia" to="serif" /> + <alias name="baskerville" to="serif" /> + <alias name="goudy" to="serif" /> + <alias name="fantasy" to="serif" /> + <alias name="ITC Stone Serif" to="serif" /> + + <family name="monospace"> + <font weight="400" style="normal">DroidSansMono.ttf</font> + </family> + <alias name="sans-serif-monospace" to="monospace" /> + <alias name="monaco" to="monospace" /> + + <family name="serif-monospace"> + <font weight="400" style="normal" postScriptName="CutiveMono-Regular">CutiveMono.ttf</font> + </family> + <alias name="courier" to="serif-monospace" /> + <alias name="courier new" to="serif-monospace" /> + + <family name="casual"> + <font weight="400" style="normal" postScriptName="ComingSoon-Regular">ComingSoon.ttf</font> + </family> + + <family name="cursive"> + <font weight="400" style="normal">DancingScript-Regular.ttf + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="700" style="normal">DancingScript-Regular.ttf + <axis tag="wght" stylevalue="700" /> + </font> + </family> + + <family name="sans-serif-smallcaps"> + <font weight="400" style="normal">CarroisGothicSC-Regular.ttf</font> + </family> + + <family name="source-sans-pro"> + <font weight="400" style="normal">SourceSansPro-Regular.ttf</font> + <font weight="400" style="italic">SourceSansPro-Italic.ttf</font> + <font weight="600" style="normal">SourceSansPro-SemiBold.ttf</font> + <font weight="600" style="italic">SourceSansPro-SemiBoldItalic.ttf</font> + <font weight="700" style="normal">SourceSansPro-Bold.ttf</font> + <font weight="700" style="italic">SourceSansPro-BoldItalic.ttf</font> + </family> + <alias name="source-sans-pro-semi-bold" to="source-sans-pro" weight="600"/> + + <family name="roboto-flex"> + <font weight="100" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="500" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="900" /> + </font> + <font weight="100" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="500" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="900" /> + </font> + </family> + + <!-- fallback fonts --> + <family lang="und-Arab" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoNaskhArabic"> + NotoNaskhArabic-Regular.ttf + </font> + <font weight="700" style="normal">NotoNaskhArabic-Bold.ttf</font> + </family> + <family lang="und-Arab" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoNaskhArabicUI"> + NotoNaskhArabicUI-Regular.ttf + </font> + <font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font> + </family> + <family lang="und-Ethi"> + <font weight="400" style="normal" postScriptName="NotoSansEthiopic-Regular"> + NotoSansEthiopic-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansEthiopic-Regular"> + NotoSansEthiopic-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansEthiopic-Regular"> + NotoSansEthiopic-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansEthiopic-Regular"> + NotoSansEthiopic-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifEthiopic-Regular">NotoSerifEthiopic-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifEthiopic-Regular">NotoSerifEthiopic-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifEthiopic-Regular">NotoSerifEthiopic-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifEthiopic-Regular">NotoSerifEthiopic-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Hebr"> + <font weight="400" style="normal" postScriptName="NotoSansHebrew"> + NotoSansHebrew-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifHebrew-Regular.ttf</font> + <font weight="700" style="normal" fallbackFor="serif">NotoSerifHebrew-Bold.ttf</font> + </family> + <family lang="und-Thai" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansThai">NotoSansThai-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansThai-Bold.ttf</font> + <font weight="400" style="normal" fallbackFor="serif"> + NotoSerifThai-Regular.ttf + </font> + <font weight="700" style="normal" fallbackFor="serif">NotoSerifThai-Bold.ttf</font> + </family> + <family lang="und-Thai" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansThaiUI"> + NotoSansThaiUI-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font> + </family> + <family lang="und-Armn"> + <font weight="400" style="normal" postScriptName="NotoSansArmenian-Regular"> + NotoSansArmenian-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansArmenian-Regular"> + NotoSansArmenian-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansArmenian-Regular"> + NotoSansArmenian-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansArmenian-Regular"> + NotoSansArmenian-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifArmenian-Regular">NotoSerifArmenian-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifArmenian-Regular">NotoSerifArmenian-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifArmenian-Regular">NotoSerifArmenian-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifArmenian-Regular">NotoSerifArmenian-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Geor,und-Geok"> + <font weight="400" style="normal" postScriptName="NotoSansGeorgian-Regular"> + NotoSansGeorgian-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansGeorgian-Regular"> + NotoSansGeorgian-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansGeorgian-Regular"> + NotoSansGeorgian-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansGeorgian-Regular"> + NotoSansGeorgian-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGeorgian-Regular">NotoSerifGeorgian-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGeorgian-Regular">NotoSerifGeorgian-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGeorgian-Regular">NotoSerifGeorgian-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGeorgian-Regular">NotoSerifGeorgian-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Deva" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansDevanagari-Regular"> + NotoSansDevanagari-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansDevanagari-Regular"> + NotoSansDevanagari-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansDevanagari-Regular"> + NotoSansDevanagari-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansDevanagari-Regular"> + NotoSansDevanagari-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifDevanagari-Regular">NotoSerifDevanagari-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifDevanagari-Regular">NotoSerifDevanagari-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifDevanagari-Regular">NotoSerifDevanagari-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifDevanagari-Regular">NotoSerifDevanagari-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Deva" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansDevanagariUI-Regular"> + NotoSansDevanagariUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansDevanagariUI-Regular"> + NotoSansDevanagariUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansDevanagariUI-Regular"> + NotoSansDevanagariUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansDevanagariUI-Regular"> + NotoSansDevanagariUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + + <!-- All scripts of India should come after Devanagari, due to shared + danda characters. + --> + <family lang="und-Gujr" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansGujarati"> + NotoSansGujarati-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansGujarati-Bold.ttf</font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGujarati-Regular">NotoSerifGujarati-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGujarati-Regular">NotoSerifGujarati-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGujarati-Regular">NotoSerifGujarati-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGujarati-Regular">NotoSerifGujarati-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Gujr" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansGujaratiUI"> + NotoSansGujaratiUI-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font> + </family> + <family lang="und-Guru" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansGurmukhi-Regular"> + NotoSansGurmukhi-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansGurmukhi-Regular"> + NotoSansGurmukhi-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansGurmukhi-Regular"> + NotoSansGurmukhi-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansGurmukhi-Regular"> + NotoSansGurmukhi-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGurmukhi-Regular">NotoSerifGurmukhi-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGurmukhi-Regular">NotoSerifGurmukhi-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGurmukhi-Regular">NotoSerifGurmukhi-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifGurmukhi-Regular">NotoSerifGurmukhi-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Guru" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansGurmukhiUI-Regular"> + NotoSansGurmukhiUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansGurmukhiUI-Regular"> + NotoSansGurmukhiUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansGurmukhiUI-Regular"> + NotoSansGurmukhiUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansGurmukhiUI-Regular"> + NotoSansGurmukhiUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Taml" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansTamil-Regular"> + NotoSansTamil-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansTamil-Regular"> + NotoSansTamil-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansTamil-Regular"> + NotoSansTamil-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansTamil-Regular"> + NotoSansTamil-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTamil-Regular">NotoSerifTamil-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTamil-Regular">NotoSerifTamil-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTamil-Regular">NotoSerifTamil-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTamil-Regular">NotoSerifTamil-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Taml" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansTamilUI-Regular"> + NotoSansTamilUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansTamilUI-Regular"> + NotoSansTamilUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansTamilUI-Regular"> + NotoSansTamilUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansTamilUI-Regular"> + NotoSansTamilUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Mlym" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansMalayalam-Regular"> + NotoSansMalayalam-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansMalayalam-Regular"> + NotoSansMalayalam-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansMalayalam-Regular"> + NotoSansMalayalam-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansMalayalam-Regular"> + NotoSansMalayalam-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifMalayalam-Regular">NotoSerifMalayalam-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifMalayalam-Regular">NotoSerifMalayalam-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifMalayalam-Regular">NotoSerifMalayalam-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifMalayalam-Regular">NotoSerifMalayalam-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Mlym" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansMalayalamUI-Regular"> + NotoSansMalayalamUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansMalayalamUI-Regular"> + NotoSansMalayalamUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansMalayalamUI-Regular"> + NotoSansMalayalamUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansMalayalamUI-Regular"> + NotoSansMalayalamUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Beng" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansBengali-Regular"> + NotoSansBengali-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansBengali-Regular"> + NotoSansBengali-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansBengali-Regular"> + NotoSansBengali-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansBengali-Regular"> + NotoSansBengali-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifBengali-Regular">NotoSerifBengali-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifBengali-Regular">NotoSerifBengali-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifBengali-Regular">NotoSerifBengali-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifBengali-Regular">NotoSerifBengali-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Beng" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansBengaliUI-Regular"> + NotoSansBengaliUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansBengaliUI-Regular"> + NotoSansBengaliUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansBengaliUI-Regular"> + NotoSansBengaliUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansBengaliUI-Regular"> + NotoSansBengaliUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Telu" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansTelugu-Regular"> + NotoSansTelugu-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansTelugu-Regular"> + NotoSansTelugu-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansTelugu-Regular"> + NotoSansTelugu-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansTelugu-Regular"> + NotoSansTelugu-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTelugu-Regular">NotoSerifTelugu-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTelugu-Regular">NotoSerifTelugu-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTelugu-Regular">NotoSerifTelugu-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifTelugu-Regular">NotoSerifTelugu-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Telu" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansTeluguUI-Regular"> + NotoSansTeluguUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansTeluguUI-Regular"> + NotoSansTeluguUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansTeluguUI-Regular"> + NotoSansTeluguUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansTeluguUI-Regular"> + NotoSansTeluguUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Knda" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansKannada-Regular"> + NotoSansKannada-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansKannada-Regular"> + NotoSansKannada-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansKannada-Regular"> + NotoSansKannada-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansKannada-Regular"> + NotoSansKannada-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifKannada-Regular">NotoSerifKannada-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifKannada-Regular">NotoSerifKannada-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifKannada-Regular">NotoSerifKannada-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifKannada-Regular">NotoSerifKannada-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Knda" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansKannadaUI-Regular"> + NotoSansKannadaUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansKannadaUI-Regular"> + NotoSansKannadaUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansKannadaUI-Regular"> + NotoSansKannadaUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansKannadaUI-Regular"> + NotoSansKannadaUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Orya" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansOriya">NotoSansOriya-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansOriya-Bold.ttf</font> + </family> + <family lang="und-Orya" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansOriyaUI"> + NotoSansOriyaUI-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font> + </family> + <family lang="und-Sinh" variant="elegant"> + <font weight="400" style="normal" postScriptName="NotoSansSinhala-Regular"> + NotoSansSinhala-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansSinhala-Regular"> + NotoSansSinhala-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansSinhala-Regular"> + NotoSansSinhala-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansSinhala-Regular"> + NotoSansSinhala-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + <font weight="400" style="normal" fallbackFor="serif" + postScriptName="NotoSerifSinhala-Regular">NotoSerifSinhala-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" fallbackFor="serif" + postScriptName="NotoSerifSinhala-Regular">NotoSerifSinhala-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" fallbackFor="serif" + postScriptName="NotoSerifSinhala-Regular">NotoSerifSinhala-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" fallbackFor="serif" + postScriptName="NotoSerifSinhala-Regular">NotoSerifSinhala-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Sinh" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansSinhalaUI-Regular"> + NotoSansSinhalaUI-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansSinhalaUI-Regular"> + NotoSansSinhalaUI-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansSinhalaUI-Regular"> + NotoSansSinhalaUI-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansSinhalaUI-Regular"> + NotoSansSinhalaUI-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Khmr" variant="elegant"> + <font weight="100" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="26.0"/> + </font> + <font weight="200" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="39.0"/> + </font> + <font weight="300" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="58.0"/> + </font> + <font weight="400" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="90.0"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="108.0"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="128.0"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="151.0"/> + </font> + <font weight="800" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="169.0"/> + </font> + <font weight="900" style="normal" postScriptName="NotoSansKhmer-Regular"> + NotoSansKhmer-VF.ttf + <axis tag="wdth" stylevalue="100.0"/> + <axis tag="wght" stylevalue="190.0"/> + </font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifKhmer-Regular.otf</font> + <font weight="700" style="normal" fallbackFor="serif">NotoSerifKhmer-Bold.otf</font> + </family> + <family lang="und-Khmr" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansKhmerUI"> + NotoSansKhmerUI-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font> + </family> + <family lang="und-Laoo" variant="elegant"> + <font weight="400" style="normal">NotoSansLao-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansLao-Bold.ttf</font> + <font weight="400" style="normal" fallbackFor="serif"> + NotoSerifLao-Regular.ttf + </font> + <font weight="700" style="normal" fallbackFor="serif">NotoSerifLao-Bold.ttf</font> + </family> + <family lang="und-Laoo" variant="compact"> + <font weight="400" style="normal" postScriptName="NotoSansLaoUI">NotoSansLaoUI-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font> + </family> + <family lang="und-Mymr" variant="elegant"> + <font weight="400" style="normal">NotoSansMyanmar-Regular.otf</font> + <font weight="500" style="normal">NotoSansMyanmar-Medium.otf</font> + <font weight="700" style="normal">NotoSansMyanmar-Bold.otf</font> + <font weight="400" style="normal" fallbackFor="serif">NotoSerifMyanmar-Regular.otf</font> + <font weight="700" style="normal" fallbackFor="serif">NotoSerifMyanmar-Bold.otf</font> + </family> + <family lang="und-Mymr" variant="compact"> + <font weight="400" style="normal">NotoSansMyanmarUI-Regular.otf</font> + <font weight="500" style="normal">NotoSansMyanmarUI-Medium.otf</font> + <font weight="700" style="normal">NotoSansMyanmarUI-Bold.otf</font> + </family> + <family lang="und-Thaa"> + <font weight="400" style="normal" postScriptName="NotoSansThaana"> + NotoSansThaana-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font> + </family> + <family lang="und-Cham"> + <font weight="400" style="normal" postScriptName="NotoSansCham">NotoSansCham-Regular.ttf + </font> + <font weight="700" style="normal">NotoSansCham-Bold.ttf</font> + </family> + <family lang="und-Ahom"> + <font weight="400" style="normal">NotoSansAhom-Regular.otf</font> + </family> + <family lang="und-Adlm"> + <font weight="400" style="normal" postScriptName="NotoSansAdlam-Regular"> + NotoSansAdlam-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansAdlam-Regular"> + NotoSansAdlam-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansAdlam-Regular"> + NotoSansAdlam-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansAdlam-Regular"> + NotoSansAdlam-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Avst"> + <font weight="400" style="normal" postScriptName="NotoSansAvestan"> + NotoSansAvestan-Regular.ttf + </font> + </family> + <family lang="und-Bali"> + <font weight="400" style="normal" postScriptName="NotoSansBalinese"> + NotoSansBalinese-Regular.ttf + </font> + </family> + <family lang="und-Bamu"> + <font weight="400" style="normal" postScriptName="NotoSansBamum">NotoSansBamum-Regular.ttf + </font> + </family> + <family lang="und-Batk"> + <font weight="400" style="normal" postScriptName="NotoSansBatak">NotoSansBatak-Regular.ttf + </font> + </family> + <family lang="und-Brah"> + <font weight="400" style="normal" postScriptName="NotoSansBrahmi"> + NotoSansBrahmi-Regular.ttf + </font> + </family> + <family lang="und-Bugi"> + <font weight="400" style="normal" postScriptName="NotoSansBuginese"> + NotoSansBuginese-Regular.ttf + </font> + </family> + <family lang="und-Buhd"> + <font weight="400" style="normal" postScriptName="NotoSansBuhid">NotoSansBuhid-Regular.ttf + </font> + </family> + <family lang="und-Cans"> + <font weight="400" style="normal"> + NotoSansCanadianAboriginal-Regular.ttf + </font> + </family> + <family lang="und-Cari"> + <font weight="400" style="normal" postScriptName="NotoSansCarian"> + NotoSansCarian-Regular.ttf + </font> + </family> + <family lang="und-Cakm"> + <font weight="400" style="normal">NotoSansChakma-Regular.otf</font> + </family> + <family lang="und-Cher"> + <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font> + </family> + <family lang="und-Copt"> + <font weight="400" style="normal" postScriptName="NotoSansCoptic"> + NotoSansCoptic-Regular.ttf + </font> + </family> + <family lang="und-Xsux"> + <font weight="400" style="normal" postScriptName="NotoSansCuneiform"> + NotoSansCuneiform-Regular.ttf + </font> + </family> + <family lang="und-Cprt"> + <font weight="400" style="normal" postScriptName="NotoSansCypriot"> + NotoSansCypriot-Regular.ttf + </font> + </family> + <family lang="und-Dsrt"> + <font weight="400" style="normal" postScriptName="NotoSansDeseret"> + NotoSansDeseret-Regular.ttf + </font> + </family> + <family lang="und-Egyp"> + <font weight="400" style="normal" postScriptName="NotoSansEgyptianHieroglyphs"> + NotoSansEgyptianHieroglyphs-Regular.ttf + </font> + </family> + <family lang="und-Elba"> + <font weight="400" style="normal">NotoSansElbasan-Regular.otf</font> + </family> + <family lang="und-Glag"> + <font weight="400" style="normal" postScriptName="NotoSansGlagolitic"> + NotoSansGlagolitic-Regular.ttf + </font> + </family> + <family lang="und-Goth"> + <font weight="400" style="normal" postScriptName="NotoSansGothic"> + NotoSansGothic-Regular.ttf + </font> + </family> + <family lang="und-Hano"> + <font weight="400" style="normal" postScriptName="NotoSansHanunoo"> + NotoSansHanunoo-Regular.ttf + </font> + </family> + <family lang="und-Armi"> + <font weight="400" style="normal" postScriptName="NotoSansImperialAramaic"> + NotoSansImperialAramaic-Regular.ttf + </font> + </family> + <family lang="und-Phli"> + <font weight="400" style="normal" postScriptName="NotoSansInscriptionalPahlavi"> + NotoSansInscriptionalPahlavi-Regular.ttf + </font> + </family> + <family lang="und-Prti"> + <font weight="400" style="normal" postScriptName="NotoSansInscriptionalParthian"> + NotoSansInscriptionalParthian-Regular.ttf + </font> + </family> + <family lang="und-Java"> + <font weight="400" style="normal">NotoSansJavanese-Regular.otf</font> + </family> + <family lang="und-Kthi"> + <font weight="400" style="normal" postScriptName="NotoSansKaithi"> + NotoSansKaithi-Regular.ttf + </font> + </family> + <family lang="und-Kali"> + <font weight="400" style="normal" postScriptName="NotoSansKayahLi"> + NotoSansKayahLi-Regular.ttf + </font> + </family> + <family lang="und-Khar"> + <font weight="400" style="normal" postScriptName="NotoSansKharoshthi"> + NotoSansKharoshthi-Regular.ttf + </font> + </family> + <family lang="und-Lepc"> + <font weight="400" style="normal" postScriptName="NotoSansLepcha"> + NotoSansLepcha-Regular.ttf + </font> + </family> + <family lang="und-Limb"> + <font weight="400" style="normal" postScriptName="NotoSansLimbu">NotoSansLimbu-Regular.ttf + </font> + </family> + <family lang="und-Linb"> + <font weight="400" style="normal" postScriptName="NotoSansLinearB"> + NotoSansLinearB-Regular.ttf + </font> + </family> + <family lang="und-Lisu"> + <font weight="400" style="normal" postScriptName="NotoSansLisu">NotoSansLisu-Regular.ttf + </font> + </family> + <family lang="und-Lyci"> + <font weight="400" style="normal" postScriptName="NotoSansLycian"> + NotoSansLycian-Regular.ttf + </font> + </family> + <family lang="und-Lydi"> + <font weight="400" style="normal" postScriptName="NotoSansLydian"> + NotoSansLydian-Regular.ttf + </font> + </family> + <family lang="und-Mand"> + <font weight="400" style="normal" postScriptName="NotoSansMandaic"> + NotoSansMandaic-Regular.ttf + </font> + </family> + <family lang="und-Mtei"> + <font weight="400" style="normal" postScriptName="NotoSansMeeteiMayek"> + NotoSansMeeteiMayek-Regular.ttf + </font> + </family> + <family lang="und-Talu"> + <font weight="400" style="normal" postScriptName="NotoSansNewTaiLue"> + NotoSansNewTaiLue-Regular.ttf + </font> + </family> + <family lang="und-Nkoo"> + <font weight="400" style="normal" postScriptName="NotoSansNKo">NotoSansNKo-Regular.ttf + </font> + </family> + <family lang="und-Ogam"> + <font weight="400" style="normal" postScriptName="NotoSansOgham">NotoSansOgham-Regular.ttf + </font> + </family> + <family lang="und-Olck"> + <font weight="400" style="normal" postScriptName="NotoSansOlChiki"> + NotoSansOlChiki-Regular.ttf + </font> + </family> + <family lang="und-Ital"> + <font weight="400" style="normal" postScriptName="NotoSansOldItalic"> + NotoSansOldItalic-Regular.ttf + </font> + </family> + <family lang="und-Xpeo"> + <font weight="400" style="normal" postScriptName="NotoSansOldPersian"> + NotoSansOldPersian-Regular.ttf + </font> + </family> + <family lang="und-Sarb"> + <font weight="400" style="normal" postScriptName="NotoSansOldSouthArabian"> + NotoSansOldSouthArabian-Regular.ttf + </font> + </family> + <family lang="und-Orkh"> + <font weight="400" style="normal" postScriptName="NotoSansOldTurkic"> + NotoSansOldTurkic-Regular.ttf + </font> + </family> + <family lang="und-Osge"> + <font weight="400" style="normal">NotoSansOsage-Regular.ttf</font> + </family> + <family lang="und-Osma"> + <font weight="400" style="normal" postScriptName="NotoSansOsmanya"> + NotoSansOsmanya-Regular.ttf + </font> + </family> + <family lang="und-Phnx"> + <font weight="400" style="normal" postScriptName="NotoSansPhoenician"> + NotoSansPhoenician-Regular.ttf + </font> + </family> + <family lang="und-Rjng"> + <font weight="400" style="normal" postScriptName="NotoSansRejang"> + NotoSansRejang-Regular.ttf + </font> + </family> + <family lang="und-Runr"> + <font weight="400" style="normal" postScriptName="NotoSansRunic">NotoSansRunic-Regular.ttf + </font> + </family> + <family lang="und-Samr"> + <font weight="400" style="normal" postScriptName="NotoSansSamaritan"> + NotoSansSamaritan-Regular.ttf + </font> + </family> + <family lang="und-Saur"> + <font weight="400" style="normal" postScriptName="NotoSansSaurashtra"> + NotoSansSaurashtra-Regular.ttf + </font> + </family> + <family lang="und-Shaw"> + <font weight="400" style="normal" postScriptName="NotoSansShavian"> + NotoSansShavian-Regular.ttf + </font> + </family> + <family lang="und-Sund"> + <font weight="400" style="normal" postScriptName="NotoSansSundanese"> + NotoSansSundanese-Regular.ttf + </font> + </family> + <family lang="und-Sylo"> + <font weight="400" style="normal" postScriptName="NotoSansSylotiNagri"> + NotoSansSylotiNagri-Regular.ttf + </font> + </family> + <!-- Esrangela should precede Eastern and Western Syriac, since it's our default form. --> + <family lang="und-Syre"> + <font weight="400" style="normal" postScriptName="NotoSansSyriacEstrangela"> + NotoSansSyriacEstrangela-Regular.ttf + </font> + </family> + <family lang="und-Syrn"> + <font weight="400" style="normal" postScriptName="NotoSansSyriacEastern"> + NotoSansSyriacEastern-Regular.ttf + </font> + </family> + <family lang="und-Syrj"> + <font weight="400" style="normal" postScriptName="NotoSansSyriacWestern"> + NotoSansSyriacWestern-Regular.ttf + </font> + </family> + <family lang="und-Tglg"> + <font weight="400" style="normal" postScriptName="NotoSansTagalog"> + NotoSansTagalog-Regular.ttf + </font> + </family> + <family lang="und-Tagb"> + <font weight="400" style="normal" postScriptName="NotoSansTagbanwa"> + NotoSansTagbanwa-Regular.ttf + </font> + </family> + <family lang="und-Lana"> + <font weight="400" style="normal" postScriptName="NotoSansTaiTham"> + NotoSansTaiTham-Regular.ttf + </font> + </family> + <family lang="und-Tavt"> + <font weight="400" style="normal" postScriptName="NotoSansTaiViet"> + NotoSansTaiViet-Regular.ttf + </font> + </family> + <family lang="und-Tibt"> + <font weight="400" style="normal" postScriptName="NotoSerifTibetan-Regular"> + NotoSerifTibetan-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSerifTibetan-Regular"> + NotoSerifTibetan-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSerifTibetan-Regular"> + NotoSerifTibetan-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSerifTibetan-Regular"> + NotoSerifTibetan-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Tfng"> + <font weight="400" style="normal">NotoSansTifinagh-Regular.otf</font> + </family> + <family lang="und-Ugar"> + <font weight="400" style="normal" postScriptName="NotoSansUgaritic"> + NotoSansUgaritic-Regular.ttf + </font> + </family> + <family lang="und-Vaii"> + <font weight="400" style="normal" postScriptName="NotoSansVai">NotoSansVai-Regular.ttf + </font> + </family> + <family> + <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font> + </family> + <family lang="zh-Hans"> + <font weight="400" style="normal" index="2" postScriptName="NotoSansCJKjp-Regular"> + NotoSansCJK-Regular.ttc + </font> + <font weight="400" style="normal" index="2" fallbackFor="serif" + postScriptName="NotoSerifCJKjp-Regular">NotoSerifCJK-Regular.ttc + </font> + </family> + <family lang="zh-Hant,zh-Bopo"> + <font weight="400" style="normal" index="3" postScriptName="NotoSansCJKjp-Regular"> + NotoSansCJK-Regular.ttc + </font> + <font weight="400" style="normal" index="3" fallbackFor="serif" + postScriptName="NotoSerifCJKjp-Regular">NotoSerifCJK-Regular.ttc + </font> + </family> + <family lang="ja"> + <font weight="400" style="normal" index="0" postScriptName="NotoSansCJKjp-Regular"> + NotoSansCJK-Regular.ttc + </font> + <font weight="400" style="normal" index="0" fallbackFor="serif" + postScriptName="NotoSerifCJKjp-Regular">NotoSerifCJK-Regular.ttc + </font> + </family> + <family lang="ko"> + <font weight="400" style="normal" index="1" postScriptName="NotoSansCJKjp-Regular"> + NotoSansCJK-Regular.ttc + </font> + <font weight="400" style="normal" index="1" fallbackFor="serif" + postScriptName="NotoSerifCJKjp-Regular">NotoSerifCJK-Regular.ttc + </font> + </family> + <family lang="und-Zsye"> + <font weight="400" style="normal">NotoColorEmoji.ttf</font> + </family> + <family lang="und-Zsye"> + <font weight="400" style="normal">NotoColorEmojiFlags.ttf</font> + </family> + <family lang="und-Zsym"> + <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font> + </family> + <!-- + Tai Le, Yi, Mongolian, and Phags-pa are intentionally kept last, to make sure they don't + override the East Asian punctuation for Chinese. + --> + <family lang="und-Tale"> + <font weight="400" style="normal" postScriptName="NotoSansTaiLe">NotoSansTaiLe-Regular.ttf + </font> + </family> + <family lang="und-Yiii"> + <font weight="400" style="normal" postScriptName="NotoSansYi">NotoSansYi-Regular.ttf</font> + </family> + <family lang="und-Mong"> + <font weight="400" style="normal" postScriptName="NotoSansMongolian"> + NotoSansMongolian-Regular.ttf + </font> + </family> + <family lang="und-Phag"> + <font weight="400" style="normal" postScriptName="NotoSansPhagsPa"> + NotoSansPhagsPa-Regular.ttf + </font> + </family> + <family lang="und-Hluw"> + <font weight="400" style="normal">NotoSansAnatolianHieroglyphs-Regular.otf</font> + </family> + <family lang="und-Bass"> + <font weight="400" style="normal">NotoSansBassaVah-Regular.otf</font> + </family> + <family lang="und-Bhks"> + <font weight="400" style="normal">NotoSansBhaiksuki-Regular.otf</font> + </family> + <family lang="und-Hatr"> + <font weight="400" style="normal">NotoSansHatran-Regular.otf</font> + </family> + <family lang="und-Lina"> + <font weight="400" style="normal">NotoSansLinearA-Regular.otf</font> + </family> + <family lang="und-Mani"> + <font weight="400" style="normal">NotoSansManichaean-Regular.otf</font> + </family> + <family lang="und-Marc"> + <font weight="400" style="normal">NotoSansMarchen-Regular.otf</font> + </family> + <family lang="und-Merc"> + <font weight="400" style="normal">NotoSansMeroitic-Regular.otf</font> + </family> + <family lang="und-Plrd"> + <font weight="400" style="normal">NotoSansMiao-Regular.otf</font> + </family> + <family lang="und-Mroo"> + <font weight="400" style="normal">NotoSansMro-Regular.otf</font> + </family> + <family lang="und-Mult"> + <font weight="400" style="normal">NotoSansMultani-Regular.otf</font> + </family> + <family lang="und-Nbat"> + <font weight="400" style="normal">NotoSansNabataean-Regular.otf</font> + </family> + <family lang="und-Newa"> + <font weight="400" style="normal">NotoSansNewa-Regular.otf</font> + </family> + <family lang="und-Narb"> + <font weight="400" style="normal">NotoSansOldNorthArabian-Regular.otf</font> + </family> + <family lang="und-Perm"> + <font weight="400" style="normal">NotoSansOldPermic-Regular.otf</font> + </family> + <family lang="und-Hmng"> + <font weight="400" style="normal">NotoSansPahawhHmong-Regular.otf</font> + </family> + <family lang="und-Palm"> + <font weight="400" style="normal">NotoSansPalmyrene-Regular.otf</font> + </family> + <family lang="und-Pauc"> + <font weight="400" style="normal">NotoSansPauCinHau-Regular.otf</font> + </family> + <family lang="und-Shrd"> + <font weight="400" style="normal">NotoSansSharada-Regular.otf</font> + </family> + <family lang="und-Sora"> + <font weight="400" style="normal">NotoSansSoraSompeng-Regular.otf</font> + </family> + <family lang="und-Gong"> + <font weight="400" style="normal">NotoSansGunjalaGondi-Regular.otf</font> + </family> + <family lang="und-Rohg"> + <font weight="400" style="normal">NotoSansHanifiRohingya-Regular.otf</font> + </family> + <family lang="und-Khoj"> + <font weight="400" style="normal">NotoSansKhojki-Regular.otf</font> + </family> + <family lang="und-Gonm"> + <font weight="400" style="normal">NotoSansMasaramGondi-Regular.otf</font> + </family> + <family lang="und-Wcho"> + <font weight="400" style="normal">NotoSansWancho-Regular.otf</font> + </family> + <family lang="und-Wara"> + <font weight="400" style="normal">NotoSansWarangCiti-Regular.otf</font> + </family> + <family lang="und-Gran"> + <font weight="400" style="normal">NotoSansGrantha-Regular.ttf</font> + </family> + <family lang="und-Modi"> + <font weight="400" style="normal">NotoSansModi-Regular.ttf</font> + </family> + <family lang="und-Dogr"> + <font weight="400" style="normal">NotoSerifDogra-Regular.ttf</font> + </family> + <family lang="und-Medf"> + <font weight="400" style="normal" postScriptName="NotoSansMedefaidrin-Regular"> + NotoSansMedefaidrin-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansMedefaidrin-Regular"> + NotoSansMedefaidrin-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansMedefaidrin-Regular"> + NotoSansMedefaidrin-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansMedefaidrin-Regular"> + NotoSansMedefaidrin-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Soyo"> + <font weight="400" style="normal" postScriptName="NotoSansSoyombo-Regular"> + NotoSansSoyombo-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansSoyombo-Regular"> + NotoSansSoyombo-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansSoyombo-Regular"> + NotoSansSoyombo-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansSoyombo-Regular"> + NotoSansSoyombo-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Takr"> + <font weight="400" style="normal" postScriptName="NotoSansTakri-Regular"> + NotoSansTakri-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSansTakri-Regular"> + NotoSansTakri-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSansTakri-Regular"> + NotoSansTakri-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSansTakri-Regular"> + NotoSansTakri-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Hmnp"> + <font weight="400" style="normal" postScriptName="NotoSerifHmongNyiakeng-Regular"> + NotoSerifNyiakengPuachueHmong-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSerifHmongNyiakeng-Regular"> + NotoSerifNyiakengPuachueHmong-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSerifHmongNyiakeng-Regular"> + NotoSerifNyiakengPuachueHmong-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSerifHmongNyiakeng-Regular"> + NotoSerifNyiakengPuachueHmong-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> + <family lang="und-Yezi"> + <font weight="400" style="normal" postScriptName="NotoSerifYezidi-Regular"> + NotoSerifYezidi-VF.ttf + <axis tag="wght" stylevalue="400"/> + </font> + <font weight="500" style="normal" postScriptName="NotoSerifYezidi-Regular"> + NotoSerifYezidi-VF.ttf + <axis tag="wght" stylevalue="500"/> + </font> + <font weight="600" style="normal" postScriptName="NotoSerifYezidi-Regular"> + NotoSerifYezidi-VF.ttf + <axis tag="wght" stylevalue="600"/> + </font> + <font weight="700" style="normal" postScriptName="NotoSerifYezidi-Regular"> + NotoSerifYezidi-VF.ttf + <axis tag="wght" stylevalue="700"/> + </font> + </family> +</familyset> diff --git a/data/fonts/fonts.mk b/data/fonts/fonts.mk index e884f2fe4bbb..5d1cc666efa4 100644 --- a/data/fonts/fonts.mk +++ b/data/fonts/fonts.mk @@ -17,4 +17,5 @@ PRODUCT_PACKAGES := \ DroidSansMono.ttf \ AndroidClock.ttf \ + font_fallback.xml \ fonts.xml diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml index 0563519fe419..9320c144d2ec 100644 --- a/data/fonts/fonts.xml +++ b/data/fonts/fonts.xml @@ -1,5 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> <!-- + DEPRECATED: This XML file is no longer a source of the font files installed + in the system. + + For the device vendors: please add your font configurations to the + platform/frameworks/base/data/font_fallback.xml and also add it to this XML + file as much as possible for apps that reads this XML file. + + For the application developers: please stop reading this XML file and use + android.graphics.fonts.SystemFonts#getAvailableFonts Java API or + ASystemFontIterator_open NDK API for getting list of system installed + font files. + WARNING: Parsing of this file by third-party apps is not supported. The file, and the font files it refers to, will be renamed and/or moved out from their respective location in the next Android release, and/or the @@ -277,6 +289,99 @@ </family> <alias name="source-sans-pro-semi-bold" to="source-sans-pro" weight="600"/> + <family name="roboto-flex"> + <font weight="100" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="500" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="normal">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="0" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="900" /> + </font> + <font weight="100" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="100" /> + </font> + <font weight="200" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="200" /> + </font> + <font weight="300" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="300" /> + </font> + <font weight="400" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="400" /> + </font> + <font weight="500" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="500" /> + </font> + <font weight="600" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="600" /> + </font> + <font weight="700" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="700" /> + </font> + <font weight="800" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="800" /> + </font> + <font weight="900" style="italic">RobotoFlex-Regular.ttf + <axis tag="slnt" stylevalue="-10" /> + <axis tag="wdth" stylevalue="100" /> + <axis tag="wght" stylevalue="900" /> + </font> + </family> + <!-- fallback fonts --> <family lang="und-Arab" variant="elegant"> <font weight="400" style="normal" postScriptName="NotoNaskhArabic"> diff --git a/data/keyboards/qwerty.idc b/data/keyboards/qwerty.idc deleted file mode 100644 index 375d78576548..000000000000 --- a/data/keyboards/qwerty.idc +++ /dev/null @@ -1,28 +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. - -# -# Emulator keyboard configuration file #1. -# - -touch.deviceType = touchScreen -touch.orientationAware = 1 - -keyboard.layout = qwerty -keyboard.characterMap = qwerty -keyboard.orientationAware = 1 -keyboard.builtIn = 1 - -cursor.mode = navigation -cursor.orientationAware = 1 diff --git a/data/keyboards/qwerty.kcm b/data/keyboards/qwerty.kcm deleted file mode 100644 index f3e152418a4c..000000000000 --- a/data/keyboards/qwerty.kcm +++ /dev/null @@ -1,508 +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. - -# -# Emulator keyboard character map #1. -# -# This file is no longer used as the platform's default keyboard character map. -# Refer to Generic.kcm and Virtual.kcm instead. -# - -type ALPHA - -key A { - label: 'A' - number: '2' - base: 'a' - shift, capslock: 'A' - alt: '#' - shift+alt, capslock+alt: none -} - -key B { - label: 'B' - number: '2' - base: 'b' - shift, capslock: 'B' - alt: '<' - shift+alt, capslock+alt: none -} - -key C { - label: 'C' - number: '2' - base: 'c' - shift, capslock: 'C' - alt: '9' - shift+alt, capslock+alt: '\u00e7' -} - -key D { - label: 'D' - number: '3' - base: 'd' - shift, capslock: 'D' - alt: '5' - shift+alt, capslock+alt: none -} - -key E { - label: 'E' - number: '3' - base: 'e' - shift, capslock: 'E' - alt: '2' - shift+alt, capslock+alt: '\u0301' -} - -key F { - label: 'F' - number: '3' - base: 'f' - shift, capslock: 'F' - alt: '6' - shift+alt, capslock+alt: '\u00a5' -} - -key G { - label: 'G' - number: '4' - base: 'g' - shift, capslock: 'G' - alt: '-' - shift+alt, capslock+alt: '_' -} - -key H { - label: 'H' - number: '4' - base: 'h' - shift, capslock: 'H' - alt: '[' - shift+alt, capslock+alt: '{' -} - -key I { - label: 'I' - number: '4' - base: 'i' - shift, capslock: 'I' - alt: '$' - shift+alt, capslock+alt: '\u0302' -} - -key J { - label: 'J' - number: '5' - base: 'j' - shift, capslock: 'J' - alt: ']' - shift+alt, capslock+alt: '}' -} - -key K { - label: 'K' - number: '5' - base: 'k' - shift, capslock: 'K' - alt: '"' - shift+alt, capslock+alt: '~' -} - -key L { - label: 'L' - number: '5' - base: 'l' - shift, capslock: 'L' - alt: '\'' - shift+alt, capslock+alt: '`' -} - -key M { - label: 'M' - number: '6' - base: 'm' - shift, capslock: 'M' - alt: '!' - shift+alt, capslock+alt: none -} - -key N { - label: 'N' - number: '6' - base: 'n' - shift, capslock: 'N' - alt: '>' - shift+alt, capslock+alt: '\u0303' -} - -key O { - label: 'O' - number: '6' - base: 'o' - shift, capslock: 'O' - alt: '(' - shift+alt, capslock+alt: none -} - -key P { - label: 'P' - number: '7' - base: 'p' - shift, capslock: 'P' - alt: ')' - shift+alt, capslock+alt: none -} - -key Q { - label: 'Q' - number: '7' - base: 'q' - shift, capslock: 'Q' - alt: '*' - shift+alt, capslock+alt: '\u0300' -} - -key R { - label: 'R' - number: '7' - base: 'r' - shift, capslock: 'R' - alt: '3' - shift+alt, capslock+alt: '\u20ac' -} - -key S { - label: 'S' - number: '7' - base: 's' - shift, capslock: 'S' - alt: '4' - shift+alt, capslock+alt: '\u00df' -} - -key T { - label: 'T' - number: '8' - base: 't' - shift, capslock: 'T' - alt: '+' - shift+alt, capslock+alt: '\u00a3' -} - -key U { - label: 'U' - number: '8' - base: 'u' - shift, capslock: 'U' - alt: '&' - shift+alt, capslock+alt: '\u0308' -} - -key V { - label: 'V' - number: '8' - base: 'v' - shift, capslock: 'V' - alt: '=' - shift+alt, capslock+alt: '^' -} - -key W { - label: 'W' - number: '9' - base: 'w' - shift, capslock: 'W' - alt: '1' - shift+alt, capslock+alt: none -} - -key X { - label: 'X' - number: '9' - base: 'x' - shift, capslock: 'X' - alt: '8' - shift+alt, capslock+alt: '\uef00' -} - -key Y { - label: 'Y' - number: '9' - base: 'y' - shift, capslock: 'Y' - alt: '%' - shift+alt, capslock+alt: '\u00a1' -} - -key Z { - label: 'Z' - number: '9' - base: 'z' - shift, capslock: 'Z' - alt: '7' - shift+alt, capslock+alt: none -} - -key COMMA { - label: ',' - number: ',' - base: ',' - shift: ';' - alt: ';' - shift+alt: '|' -} - -key PERIOD { - label: '.' - number: '.' - base: '.' - shift: ':' - alt: ':' - shift+alt: '\u2026' -} - -key AT { - label: '@' - number: '0' - base: '@' - shift: '0' - alt: '0' - shift+alt: '\u2022' -} - -key SLASH { - label: '/' - number: '/' - base: '/' - shift: '?' - alt: '?' - shift+alt: '\\' -} - -key SPACE { - label: ' ' - number: ' ' - base: ' ' - shift: ' ' - alt: '\uef01' - shift+alt: '\uef01' -} - -key ENTER { - label: '\n' - number: '\n' - base: '\n' - shift: '\n' - alt: '\n' - shift+alt: '\n' -} - -key TAB { - label: '\t' - number: '\t' - base: '\t' - shift: '\t' - alt: '\t' - shift+alt: '\t' -} - -key 0 { - label: '0' - number: '0' - base: '0' - shift: ')' - alt: ')' - shift+alt: ')' -} - -key 1 { - label: '1' - number: '1' - base: '1' - shift: '!' - alt: '!' - shift+alt: '!' -} - -key 2 { - label: '2' - number: '2' - base: '2' - shift: '@' - alt: '@' - shift+alt: '@' -} - -key 3 { - label: '3' - number: '3' - base: '3' - shift: '#' - alt: '#' - shift+alt: '#' -} - -key 4 { - label: '4' - number: '4' - base: '4' - shift: '$' - alt: '$' - shift+alt: '$' -} - -key 5 { - label: '5' - number: '5' - base: '5' - shift: '%' - alt: '%' - shift+alt: '%' -} - -key 6 { - label: '6' - number: '6' - base: '6' - shift: '^' - alt: '^' - shift+alt: '^' -} - -key 7 { - label: '7' - number: '7' - base: '7' - shift: '&' - alt: '&' - shift+alt: '&' -} - -key 8 { - label: '8' - number: '8' - base: '8' - shift: '*' - alt: '*' - shift+alt: '*' -} - -key 9 { - label: '9' - number: '9' - base: '9' - shift: '(' - alt: '(' - shift+alt: '(' -} - -key GRAVE { - label: '`' - number: '`' - base: '`' - shift: '~' - alt: '`' - shift+alt: '~' -} - -key MINUS { - label: '-' - number: '-' - base: '-' - shift: '_' - alt: '-' - shift+alt: '_' -} - -key EQUALS { - label: '=' - number: '=' - base: '=' - shift: '+' - alt: '=' - shift+alt: '+' -} - -key LEFT_BRACKET { - label: '[' - number: '[' - base: '[' - shift: '{' - alt: '[' - shift+alt: '{' -} - -key RIGHT_BRACKET { - label: ']' - number: ']' - base: ']' - shift: '}' - alt: ']' - shift+alt: '}' -} - -key BACKSLASH { - label: '\\' - number: '\\' - base: '\\' - shift: '|' - alt: '\\' - shift+alt: '|' -} - -key SEMICOLON { - label: ';' - number: ';' - base: ';' - shift: ':' - alt: ';' - shift+alt: ':' -} - -key APOSTROPHE { - label: '\'' - number: '\'' - base: '\'' - shift: '"' - alt: '\'' - shift+alt: '"' -} - -key STAR { - label: '*' - number: '*' - base: '*' - shift: '*' - alt: '*' - shift+alt: '*' -} - -key POUND { - label: '#' - number: '#' - base: '#' - shift: '#' - alt: '#' - shift+alt: '#' -} - -key PLUS { - label: '+' - number: '+' - base: '+' - shift: '+' - alt: '+' - shift+alt: '+' -} diff --git a/data/keyboards/qwerty.kl b/data/keyboards/qwerty.kl deleted file mode 100644 index 2fd99abbb9fe..000000000000 --- a/data/keyboards/qwerty.kl +++ /dev/null @@ -1,131 +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. - -# -# Emulator keyboard layout #1. -# -# This file is no longer used as the platform's default keyboard layout. -# Refer to Generic.kl instead. -# - -key 399 GRAVE -key 2 1 -key 3 2 -key 4 3 -key 5 4 -key 6 5 -key 7 6 -key 8 7 -key 9 8 -key 10 9 -key 11 0 -key 158 BACK -key 230 SOFT_RIGHT -key 60 SOFT_LEFT -key 107 ENDCALL -key 62 ENDCALL -key 229 MENU -key 139 MENU -key 59 MENU -key 127 SEARCH -key 217 SEARCH -key 228 POUND -key 227 STAR -key 231 CALL -key 61 CALL -key 232 DPAD_CENTER -key 108 DPAD_DOWN -key 103 DPAD_UP -key 102 HOME -key 105 DPAD_LEFT -key 106 DPAD_RIGHT -key 115 VOLUME_UP -key 114 VOLUME_DOWN -key 116 POWER -key 212 CAMERA - -key 16 Q -key 17 W -key 18 E -key 19 R -key 20 T -key 21 Y -key 22 U -key 23 I -key 24 O -key 25 P -key 26 LEFT_BRACKET -key 27 RIGHT_BRACKET -key 43 BACKSLASH - -key 30 A -key 31 S -key 32 D -key 33 F -key 34 G -key 35 H -key 36 J -key 37 K -key 38 L -key 39 SEMICOLON -key 40 APOSTROPHE -key 14 DEL - -key 44 Z -key 45 X -key 46 C -key 47 V -key 48 B -key 49 N -key 50 M -key 51 COMMA -key 52 PERIOD -key 53 SLASH -key 28 ENTER - -key 56 ALT_LEFT -key 100 ALT_RIGHT -key 42 SHIFT_LEFT -key 54 SHIFT_RIGHT -key 15 TAB -key 57 SPACE -key 150 EXPLORER -key 155 ENVELOPE - -key 12 MINUS -key 13 EQUALS -key 215 AT - -# On an AT keyboard: ESC, F10 -key 1 BACK -key 68 MENU - -# App switch = Overview key -key 580 APP_SWITCH - -# Media control keys -key 160 MEDIA_CLOSE -key 161 MEDIA_EJECT -key 163 MEDIA_NEXT -key 164 MEDIA_PLAY_PAUSE -key 165 MEDIA_PREVIOUS -key 166 MEDIA_STOP -key 167 MEDIA_RECORD -key 168 MEDIA_REWIND - -key 142 SLEEP -key 581 STEM_PRIMARY -key 582 STEM_1 -key 583 STEM_2 -key 584 STEM_3 diff --git a/data/keyboards/qwerty2.idc b/data/keyboards/qwerty2.idc deleted file mode 100644 index 369205ea3f98..000000000000 --- a/data/keyboards/qwerty2.idc +++ /dev/null @@ -1,28 +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. - -# -# Emulator keyboard configuration file #2. -# - -touch.deviceType = touchScreen -touch.orientationAware = 1 - -keyboard.layout = qwerty -keyboard.characterMap = qwerty2 -keyboard.orientationAware = 1 -keyboard.builtIn = 1 - -cursor.mode = navigation -cursor.orientationAware = 1 diff --git a/data/keyboards/qwerty2.kcm b/data/keyboards/qwerty2.kcm deleted file mode 100644 index b981d835bdfb..000000000000 --- a/data/keyboards/qwerty2.kcm +++ /dev/null @@ -1,505 +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. - -# -# Emulator keyboard character map #2. -# - -type ALPHA - -key A { - label: 'A' - number: '2' - base: 'a' - shift, capslock: 'A' - alt: '\u00e1' - shift+alt, capslock+alt: '\u00c1' -} - -key B { - label: 'B' - number: '2' - base: 'b' - shift, capslock: 'B' - alt: 'b' - shift+alt, capslock+alt: 'B' -} - -key C { - label: 'C' - number: '2' - base: 'c' - shift, capslock: 'C' - alt: '\u00a9' - shift+alt, capslock+alt: '\u00a2' -} - -key D { - label: 'D' - number: '3' - base: 'd' - shift, capslock: 'D' - alt: '\u00f0' - shift+alt, capslock+alt: '\u00d0' -} - -key E { - label: 'E' - number: '3' - base: 'e' - shift, capslock: 'E' - alt: '\u00e9' - shift+alt, capslock+alt: '\u00c9' -} - -key F { - label: 'F' - number: '3' - base: 'f' - shift, capslock: 'F' - alt: '[' - shift+alt, capslock+alt: '[' -} - -key G { - label: 'G' - number: '4' - base: 'g' - shift, capslock: 'G' - alt: ']' - shift+alt, capslock+alt: ']' -} - -key H { - label: 'H' - number: '4' - base: 'h' - shift, capslock: 'H' - alt: '<' - shift+alt, capslock+alt: '<' -} - -key I { - label: 'I' - number: '4' - base: 'i' - shift, capslock: 'I' - alt: '\u00ed' - shift+alt, capslock+alt: '\u00cd' -} - -key J { - label: 'J' - number: '5' - base: 'j' - shift, capslock: 'J' - alt: '>' - shift+alt, capslock+alt: '>' -} - -key K { - label: 'K' - number: '5' - base: 'k' - shift, capslock: 'K' - alt: ';' - shift+alt, capslock+alt: '~' -} - -key L { - label: 'L' - number: '5' - base: 'l' - shift, capslock: 'L' - alt: '\u00f8' - shift+alt, capslock+alt: '\u00d8' -} - -key M { - label: 'M' - number: '6' - base: 'm' - shift, capslock: 'M' - alt: '\u00b5' - shift+alt, capslock+alt: none -} - -key N { - label: 'N' - number: '6' - base: 'n' - shift, capslock: 'N' - alt: '\u00f1' - shift+alt, capslock+alt: '\u00d1' -} - -key O { - label: 'O' - number: '6' - base: 'o' - shift, capslock: 'O' - alt: '\u00f3' - shift+alt, capslock+alt: '\u00d3' -} - -key P { - label: 'P' - number: '7' - base: 'p' - shift, capslock: 'P' - alt: '\u00f6' - shift+alt, capslock+alt: '\u00d6' -} - -key Q { - label: 'Q' - number: '7' - base: 'q' - shift, capslock: 'Q' - alt: '\u00e4' - shift+alt, capslock+alt: '\u00c4' -} - -key R { - label: 'R' - number: '7' - base: 'r' - shift, capslock: 'R' - alt: '\u00ae' - shift+alt, capslock+alt: 'R' -} - -key S { - label: 'S' - number: '7' - base: 's' - shift, capslock: 'S' - alt: '\u00df' - shift+alt, capslock+alt: '\u00a7' -} - -key T { - label: 'T' - number: '8' - base: 't' - shift, capslock: 'T' - alt: '\u00fe' - shift+alt, capslock+alt: '\u00de' -} - -key U { - label: 'U' - number: '8' - base: 'u' - shift, capslock: 'U' - alt: '\u00fa' - shift+alt, capslock+alt: '\u00da' -} - -key V { - label: 'V' - number: '8' - base: 'v' - shift, capslock: 'V' - alt: 'v' - shift+alt, capslock+alt: 'V' -} - -key W { - label: 'W' - number: '9' - base: 'w' - shift, capslock: 'W' - alt: '\u00e5' - shift+alt, capslock+alt: '\u00c5' -} - -key X { - label: 'X' - number: '9' - base: 'x' - shift, capslock: 'X' - alt: 'x' - shift+alt, capslock+alt: '\uef00' -} - -key Y { - label: 'Y' - number: '9' - base: 'y' - shift, capslock: 'Y' - alt: '\u00fc' - shift+alt, capslock+alt: '\u00dc' -} - -key Z { - label: 'Z' - number: '9' - base: 'z' - shift, capslock: 'Z' - alt: '\u00e6' - shift+alt, capslock+alt: '\u00c6' -} - -key COMMA { - label: ',' - number: ',' - base: ',' - shift: '<' - alt: '\u00e7' - shift+alt: '\u00c7' -} - -key PERIOD { - label: '.' - number: '.' - base: '.' - shift: '>' - alt: '.' - shift+alt: '\u2026' -} - -key AT { - label: '@' - number: '@' - base: '@' - shift: '@' - alt: '@' - shift+alt: '\u2022' -} - -key SLASH { - label: '/' - number: '/' - base: '/' - shift: '?' - alt: '\u00bf' - shift+alt: '?' -} - -key SPACE { - label: ' ' - number: ' ' - base: ' ' - shift: ' ' - alt: '\uef01' - shift+alt: '\uef01' -} - -key ENTER { - label: '\n' - number: '\n' - base: '\n' - shift: '\n' - alt: '\n' - shift+alt: '\n' -} - -key TAB { - label: '\t' - number: '\t' - base: '\t' - shift: '\t' - alt: '\t' - shift+alt: '\t' -} - -key 0 { - label: '0' - number: '0' - base: '0' - shift: ')' - alt: '\u02bc' - shift+alt: ')' -} - -key 1 { - label: '1' - number: '1' - base: '1' - shift: '!' - alt: '\u00a1' - shift+alt: '\u00b9' -} - -key 2 { - label: '2' - number: '2' - base: '2' - shift: '@' - alt: '\u00b2' - shift+alt: '@' -} - -key 3 { - label: '3' - number: '3' - base: '3' - shift: '#' - alt: '\u00b3' - shift+alt: '#' -} - -key 4 { - label: '4' - number: '4' - base: '4' - shift: '$' - alt: '\u00a4' - shift+alt: '\u00a3' -} - -key 5 { - label: '5' - number: '5' - base: '5' - shift: '%' - alt: '\u20ac' - shift+alt: '%' -} - -key 6 { - label: '6' - number: '6' - base: '6' - shift: '^' - alt: '\u00bc' - shift+alt: '\u0302' -} - -key 7 { - label: '7' - number: '7' - base: '7' - shift: '&' - alt: '\u00bd' - shift+alt: '&' -} - -key 8 { - label: '8' - number: '8' - base: '8' - shift: '*' - alt: '\u00be' - shift+alt: '*' -} - -key 9 { - label: '9' - number: '9' - base: '9' - shift: '(' - alt: '\u02bb' - shift+alt: '(' -} - -key GRAVE { - label: '`' - number: '`' - base: '`' - shift: '~' - alt: '\u0300' - shift+alt: '\u0303' -} - -key MINUS { - label: '-' - number: '-' - base: '-' - shift: '_' - alt: '\u00a5' - shift+alt: '_' -} - -key EQUALS { - label: '=' - number: '=' - base: '=' - shift: '+' - alt: '\u00d7' - shift+alt: '\u00f7' -} - -key LEFT_BRACKET { - label: '[' - number: '[' - base: '[' - shift: '{' - alt: '\u00ab' - shift+alt: '{' -} - -key RIGHT_BRACKET { - label: ']' - number: ']' - base: ']' - shift: '}' - alt: '\u00bb' - shift+alt: '}' -} - -key BACKSLASH { - label: '\\' - number: '\\' - base: '\\' - shift: '|' - alt: '\u00ac' - shift+alt: '\u00a6' -} - -key SEMICOLON { - label: ';' - number: ';' - base: ';' - shift: ':' - alt: '\u00b6' - shift+alt: '\u00b0' -} - -key APOSTROPHE { - label: '\'' - number: '\'' - base: '\'' - shift: '"' - alt: '\u0301' - shift+alt: '\u0308' -} - -key STAR { - label: '*' - number: '*' - base: '*' - shift: '*' - alt: '*' - shift+alt: '*' -} - -key POUND { - label: '#' - number: '#' - base: '#' - shift: '#' - alt: '#' - shift+alt: '#' -} - -key PLUS { - label: '+' - number: '+' - base: '+' - shift: '+' - alt: '+' - shift+alt: '+' -} diff --git a/drm/jni/android_drm_DrmManagerClient.cpp b/drm/jni/android_drm_DrmManagerClient.cpp index e2bb6a6f4d1a..14d5eafa1945 100644 --- a/drm/jni/android_drm_DrmManagerClient.cpp +++ b/drm/jni/android_drm_DrmManagerClient.cpp @@ -167,8 +167,8 @@ void JNIOnInfoListener::onInfo(const DrmInfoEvent& event) { jint uniqueId = event.getUniqueId(); jint type = event.getType(); JNIEnv *env = AndroidRuntime::getJNIEnv(); - jstring message = env->NewStringUTF(event.getMessage().string()); - ALOGV("JNIOnInfoListener::onInfo => %d | %d | %s", uniqueId, type, event.getMessage().string()); + jstring message = env->NewStringUTF(event.getMessage().c_str()); + ALOGV("JNIOnInfoListener::onInfo => %d | %d | %s", uniqueId, type, event.getMessage().c_str()); env->CallStaticVoidMethod( mClass, @@ -273,15 +273,15 @@ static jobject android_drm_DrmManagerClient_getConstraintsFromContent( const char* value = pConstraints->getAsByteArray(&key); if (NULL != value) { ScopedLocalRef<jbyteArray> dataArray(env, env->NewByteArray(strlen(value))); - ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.string())); + ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.c_str())); env->SetByteArrayRegion(dataArray.get(), 0, strlen(value), (jbyte*)value); env->CallVoidMethod(constraints, ContentValues_putByteArray, keyString.get(), dataArray.get()); } } else { String8 value = pConstraints->get(key); - ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.string())); - ScopedLocalRef<jstring> valueString(env, env->NewStringUTF(value.string())); + ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.c_str())); + ScopedLocalRef<jstring> valueString(env, env->NewStringUTF(value.c_str())); env->CallVoidMethod(constraints, ContentValues_putString, keyString.get(), valueString.get()); } @@ -320,8 +320,8 @@ static jobject android_drm_DrmManagerClient_getMetadataFromContent( // insert the entry<constraintKey, constraintValue> // to newly created java object String8 value = pMetadata->get(key); - ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.string())); - ScopedLocalRef<jstring> valueString(env, env->NewStringUTF(value.string())); + ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.c_str())); + ScopedLocalRef<jstring> valueString(env, env->NewStringUTF(value.c_str())); env->CallVoidMethod(metadata, ContentValues_putString, keyString.get(), valueString.get()); } @@ -357,19 +357,19 @@ static jobjectArray android_drm_DrmManagerClient_getAllSupportInfo( env->CallVoidMethod( drmSupportInfo, env->GetMethodID(clazz, "setDescription", "(Ljava/lang/String;)V"), - env->NewStringUTF(info.getDescription().string())); + env->NewStringUTF(info.getDescription().c_str())); DrmSupportInfo::MimeTypeIterator iterator = info.getMimeTypeIterator(); while (iterator.hasNext()) { String8 value = iterator.next(); - env->CallVoidMethod(drmSupportInfo, addMimeTypeId, env->NewStringUTF(value.string())); + env->CallVoidMethod(drmSupportInfo, addMimeTypeId, env->NewStringUTF(value.c_str())); } DrmSupportInfo::FileSuffixIterator it = info.getFileSuffixIterator(); while (it.hasNext()) { String8 value = it.next(); env->CallVoidMethod( - drmSupportInfo, addFileSuffixId, env->NewStringUTF(value.string())); + drmSupportInfo, addFileSuffixId, env->NewStringUTF(value.c_str())); } env->SetObjectArrayElement(array, i, drmSupportInfo); @@ -459,7 +459,7 @@ static jobject android_drm_DrmManagerClient_processDrmInfo( String8 keyString = Utility::getStringValue(env, key.get()); String8 valueString = Utility::getStringValue(env, valString.get()); - ALOGV("Key: %s | Value: %s", keyString.string(), valueString.string()); + ALOGV("Key: %s | Value: %s", keyString.c_str(), valueString.c_str()); drmInfo.put(keyString, valueString); } @@ -488,15 +488,15 @@ static jobject android_drm_DrmManagerClient_processDrmInfo( jmethodID constructorId = env->GetMethodID(clazz, "<init>", "([BLjava/lang/String;Ljava/lang/String;)V"); jobject processedData = env->NewObject(clazz, constructorId, dataArray, - env->NewStringUTF((drmInfo.get(DrmInfoRequest::ACCOUNT_ID)).string()), - env->NewStringUTF((drmInfo.get(DrmInfoRequest::SUBSCRIPTION_ID)).string())); + env->NewStringUTF((drmInfo.get(DrmInfoRequest::ACCOUNT_ID)).c_str()), + env->NewStringUTF((drmInfo.get(DrmInfoRequest::SUBSCRIPTION_ID)).c_str())); constructorId = env->GetMethodID(localRef, "<init>", "(IILandroid/drm/ProcessedData;Ljava/lang/String;)V"); drmInfoStatus = env->NewObject(localRef, constructorId, statusCode, infoType, - processedData, env->NewStringUTF(pDrmInfoStatus->mimeType.string())); + processedData, env->NewStringUTF(pDrmInfoStatus->mimeType.c_str())); } delete[] mData; mData = NULL; @@ -533,7 +533,7 @@ static jobject android_drm_DrmManagerClient_acquireDrmInfo( String8 keyString = Utility::getStringValue(env, key.get()); String8 valueString = Utility::getStringValue(env, value.get()); - ALOGV("Key: %s | Value: %s", keyString.string(), valueString.string()); + ALOGV("Key: %s | Value: %s", keyString.c_str(), valueString.c_str()); drmInfoReq.put(keyString, valueString); } @@ -554,7 +554,7 @@ static jobject android_drm_DrmManagerClient_acquireDrmInfo( drmInfoObject = env->NewObject(localRef, env->GetMethodID(localRef, "<init>", "(I[BLjava/lang/String;)V"), - mInfoType, dataArray, env->NewStringUTF(pDrmInfo->getMimeType().string())); + mInfoType, dataArray, env->NewStringUTF(pDrmInfo->getMimeType().c_str())); DrmInfo::KeyIterator it = pDrmInfo->keyIterator(); jmethodID putMethodId @@ -563,8 +563,8 @@ static jobject android_drm_DrmManagerClient_acquireDrmInfo( while (it.hasNext()) { String8 key = it.next(); String8 value = pDrmInfo->get(key); - ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.string())); - ScopedLocalRef<jstring> valueString(env, env->NewStringUTF(value.string())); + ScopedLocalRef<jstring> keyString(env, env->NewStringUTF(key.c_str())); + ScopedLocalRef<jstring> valueString(env, env->NewStringUTF(value.c_str())); env->CallVoidMethod(drmInfoObject, putMethodId, keyString.get(), valueString.get()); } @@ -602,7 +602,7 @@ static jstring android_drm_DrmManagerClient_getOriginalMimeType( ->getOriginalMimeType(uniqueId, Utility::getStringValue(env, path), fd); ALOGV("getOriginalMimeType Exit"); - return env->NewStringUTF(mimeType.string()); + return env->NewStringUTF(mimeType.c_str()); } static jint android_drm_DrmManagerClient_checkRightsStatus( diff --git a/graphics/java/android/graphics/fonts/SystemFonts.java b/graphics/java/android/graphics/fonts/SystemFonts.java index 8fe28ae731b8..acc4da6e1527 100644 --- a/graphics/java/android/graphics/fonts/SystemFonts.java +++ b/graphics/java/android/graphics/fonts/SystemFonts.java @@ -47,7 +47,7 @@ import java.util.Set; public final class SystemFonts { private static final String TAG = "SystemFonts"; - private static final String FONTS_XML = "/system/etc/fonts.xml"; + private static final String FONTS_XML = "/system/etc/font_fallback.xml"; /** @hide */ public static final String SYSTEM_FONT_DIR = "/system/fonts/"; private static final String OEM_XML = "/product/etc/fonts_customization.xml"; @@ -220,6 +220,19 @@ public final class SystemFonts { } /** + * Get the updated FontConfig for testing purposes. + * @hide + */ + public static @NonNull FontConfig getSystemFontConfigForTesting( + @NonNull String fontsXmlPath, + @Nullable Map<String, File> updatableFontMap, + long lastModifiedDate, + int configVersion) { + return getSystemFontConfigInternal(fontsXmlPath, SYSTEM_FONT_DIR, OEM_XML, OEM_FONT_DIR, + updatableFontMap, lastModifiedDate, configVersion); + } + + /** * Get the updated FontConfig. * * @param updatableFontMap a font mapping of updated font files. diff --git a/keystore/OWNERS b/keystore/OWNERS index 7ab9d761e236..913f65586cd6 100644 --- a/keystore/OWNERS +++ b/keystore/OWNERS @@ -1,4 +1,4 @@ +# Bug component: 189335 eranm@google.com jbires@google.com -jdanis@google.com swillden@google.com diff --git a/keystore/java/android/security/AndroidKeyStoreMaintenance.java b/keystore/java/android/security/AndroidKeyStoreMaintenance.java index 919a93b8f107..0f3488bbe8d1 100644 --- a/keystore/java/android/security/AndroidKeyStoreMaintenance.java +++ b/keystore/java/android/security/AndroidKeyStoreMaintenance.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.ServiceManager; import android.os.ServiceSpecificException; +import android.os.StrictMode; import android.security.maintenance.IKeystoreMaintenance; import android.system.keystore2.Domain; import android.system.keystore2.KeyDescriptor; @@ -51,6 +52,7 @@ public class AndroidKeyStoreMaintenance { * @hide */ public static int onUserAdded(@NonNull int userId) { + StrictMode.noteDiskWrite(); try { getService().onUserAdded(userId); return 0; @@ -71,6 +73,7 @@ public class AndroidKeyStoreMaintenance { * @hide */ public static int onUserRemoved(int userId) { + StrictMode.noteDiskWrite(); try { getService().onUserRemoved(userId); return 0; @@ -93,6 +96,7 @@ public class AndroidKeyStoreMaintenance { * @hide */ public static int onUserPasswordChanged(int userId, @Nullable byte[] password) { + StrictMode.noteDiskWrite(); try { getService().onUserPasswordChanged(userId, password); return 0; @@ -110,6 +114,7 @@ public class AndroidKeyStoreMaintenance { * be cleared. */ public static int clearNamespace(@Domain int domain, long namespace) { + StrictMode.noteDiskWrite(); try { getService().clearNamespace(domain, namespace); return 0; @@ -129,6 +134,7 @@ public class AndroidKeyStoreMaintenance { * @return UserState enum variant as integer if successful or an error */ public static int getState(int userId) { + StrictMode.noteDiskRead(); try { return getService().getState(userId); } catch (ServiceSpecificException e) { @@ -144,6 +150,7 @@ public class AndroidKeyStoreMaintenance { * Informs Keystore 2.0 that an off body event was detected. */ public static void onDeviceOffBody() { + StrictMode.noteDiskWrite(); try { getService().onDeviceOffBody(); } catch (Exception e) { @@ -172,6 +179,7 @@ public class AndroidKeyStoreMaintenance { * * SYSTEM_ERROR if an unexpected error occurred. */ public static int migrateKeyNamespace(KeyDescriptor source, KeyDescriptor destination) { + StrictMode.noteDiskWrite(); try { getService().migrateKeyNamespace(source, destination); return 0; diff --git a/keystore/java/android/security/Authorization.java b/keystore/java/android/security/Authorization.java index 00219e7f28ac..2d2dd24763c4 100644 --- a/keystore/java/android/security/Authorization.java +++ b/keystore/java/android/security/Authorization.java @@ -22,6 +22,7 @@ import android.hardware.security.keymint.HardwareAuthToken; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceSpecificException; +import android.os.StrictMode; import android.security.authorization.IKeystoreAuthorization; import android.security.authorization.LockScreenEvent; import android.system.keystore2.ResponseCode; @@ -48,6 +49,7 @@ public class Authorization { * @return 0 if successful or {@code ResponseCode.SYSTEM_ERROR}. */ public static int addAuthToken(@NonNull HardwareAuthToken authToken) { + StrictMode.noteSlowCall("addAuthToken"); try { getService().addAuthToken(authToken); return 0; @@ -81,6 +83,7 @@ public class Authorization { */ public static int onLockScreenEvent(@NonNull boolean locked, @NonNull int userId, @Nullable byte[] syntheticPassword, @Nullable long[] unlockingSids) { + StrictMode.noteDiskWrite(); try { if (locked) { getService().onLockScreenEvent(LockScreenEvent.LOCK, userId, null, unlockingSids); diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index 8811a7fec932..8045f55f6b4c 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -18,6 +18,7 @@ package android.security; import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; +import android.os.StrictMode; import android.os.UserHandle; import android.security.maintenance.UserState; @@ -126,6 +127,8 @@ public class KeyStore { * a {@code KeymasterDefs.KM_ERROR_} value or {@code KeyStore} ResponseCode. */ public int addAuthToken(byte[] authToken) { + StrictMode.noteDiskWrite(); + return Authorization.addAuthToken(authToken); } diff --git a/keystore/java/android/security/KeyStore2.java b/keystore/java/android/security/KeyStore2.java index c83f298046a5..5e16bcee1a0e 100644 --- a/keystore/java/android/security/KeyStore2.java +++ b/keystore/java/android/security/KeyStore2.java @@ -23,6 +23,7 @@ import android.os.Binder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceSpecificException; +import android.os.StrictMode; import android.security.keymaster.KeymasterDefs; import android.system.keystore2.Domain; import android.system.keystore2.IKeystoreService; @@ -148,6 +149,8 @@ public class KeyStore2 { } void delete(KeyDescriptor descriptor) throws KeyStoreException { + StrictMode.noteDiskWrite(); + handleRemoteExceptionWithRetry((service) -> { service.deleteKey(descriptor); return 0; @@ -158,6 +161,8 @@ public class KeyStore2 { * List all entries in the keystore for in the given namespace. */ public KeyDescriptor[] list(int domain, long namespace) throws KeyStoreException { + StrictMode.noteDiskRead(); + return handleRemoteExceptionWithRetry((service) -> service.listEntries(domain, namespace)); } @@ -166,6 +171,8 @@ public class KeyStore2 { */ public KeyDescriptor[] listBatch(int domain, long namespace, String startPastAlias) throws KeyStoreException { + StrictMode.noteDiskRead(); + return handleRemoteExceptionWithRetry( (service) -> service.listEntriesBatched(domain, namespace, startPastAlias)); } @@ -228,6 +235,8 @@ public class KeyStore2 { */ public KeyDescriptor grant(KeyDescriptor descriptor, int granteeUid, int accessVector) throws KeyStoreException { + StrictMode.noteDiskWrite(); + return handleRemoteExceptionWithRetry( (service) -> service.grant(descriptor, granteeUid, accessVector) ); @@ -243,6 +252,8 @@ public class KeyStore2 { */ public void ungrant(KeyDescriptor descriptor, int granteeUid) throws KeyStoreException { + StrictMode.noteDiskWrite(); + handleRemoteExceptionWithRetry((service) -> { service.ungrant(descriptor, granteeUid); return 0; @@ -259,6 +270,8 @@ public class KeyStore2 { */ public KeyEntryResponse getKeyEntry(@NonNull KeyDescriptor descriptor) throws KeyStoreException { + StrictMode.noteDiskRead(); + return handleRemoteExceptionWithRetry((service) -> service.getKeyEntry(descriptor)); } @@ -290,6 +303,8 @@ public class KeyStore2 { */ public void updateSubcomponents(@NonNull KeyDescriptor key, byte[] publicCert, byte[] publicCertChain) throws KeyStoreException { + StrictMode.noteDiskWrite(); + handleRemoteExceptionWithRetry((service) -> { service.updateSubcomponent(key, publicCert, publicCertChain); return 0; @@ -305,6 +320,8 @@ public class KeyStore2 { */ public void deleteKey(@NonNull KeyDescriptor descriptor) throws KeyStoreException { + StrictMode.noteDiskWrite(); + handleRemoteExceptionWithRetry((service) -> { service.deleteKey(descriptor); return 0; @@ -315,6 +332,8 @@ public class KeyStore2 { * Returns the number of Keystore entries for a given domain and namespace. */ public int getNumberOfEntries(int domain, long namespace) throws KeyStoreException { + StrictMode.noteDiskRead(); + return handleRemoteExceptionWithRetry((service) -> service.getNumberOfEntries(domain, namespace)); } diff --git a/keystore/java/android/security/KeyStoreException.java b/keystore/java/android/security/KeyStoreException.java index cb757794a11d..253d70465720 100644 --- a/keystore/java/android/security/KeyStoreException.java +++ b/keystore/java/android/security/KeyStoreException.java @@ -614,9 +614,23 @@ public class KeyStoreException extends Exception { KEYMINT_UNIMPLEMENTED_ERROR); sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_HARDWARE_TYPE_UNAVAILABLE, KEYMINT_UNIMPLEMENTED_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_PROOF_OF_PRESENCE_REQUIRED, + KEYMINT_INCORRECT_USAGE_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_CONCURRENT_PROOF_OF_PRESENCE_REQUESTED, + KEYMINT_INCORRECT_USAGE_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_NO_USER_CONFIRMATION, + KEYMINT_INCORRECT_USAGE_ERROR); sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_DEVICE_LOCKED, new PublicErrorInformation(IS_SYSTEM_ERROR | REQUIRES_USER_AUTHENTICATION, ERROR_USER_AUTHENTICATION_REQUIRED)); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_EARLY_BOOT_ENDED, + GENERAL_KEYMINT_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_ATTESTATION_KEYS_NOT_PROVISIONED, + GENERAL_KEYMINT_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_ATTESTATION_IDS_NOT_PROVISIONED, + GENERAL_KEYMINT_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_INVALID_OPERATION, + GENERAL_KEYMINT_ERROR); sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_STORAGE_KEY_UNSUPPORTED, KEYMINT_UNIMPLEMENTED_ERROR); sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_INCOMPATIBLE_MGF_DIGEST, @@ -627,6 +641,12 @@ public class KeyStoreException extends Exception { KEYMINT_INCORRECT_USAGE_ERROR); sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_MISSING_NOT_AFTER, KEYMINT_INCORRECT_USAGE_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_MISSING_ISSUER_SUBJECT, + KEYMINT_INCORRECT_USAGE_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_INVALID_ISSUER_SUBJECT, + KEYMINT_INCORRECT_USAGE_ERROR); + sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_BOOT_LEVEL_EXCEEDED, + KEYMINT_INCORRECT_USAGE_ERROR); // This should not be exposed to apps as it's handled by Keystore. sErrorCodeToFailureInfo.put(KeymasterDefs.KM_ERROR_HARDWARE_NOT_YET_AVAILABLE, GENERAL_KEYMINT_ERROR); diff --git a/keystore/java/android/security/KeyStoreOperation.java b/keystore/java/android/security/KeyStoreOperation.java index 737ff2b4822f..7c9b8eb06764 100644 --- a/keystore/java/android/security/KeyStoreOperation.java +++ b/keystore/java/android/security/KeyStoreOperation.java @@ -21,6 +21,7 @@ import android.hardware.security.keymint.KeyParameter; import android.os.Binder; import android.os.RemoteException; import android.os.ServiceSpecificException; +import android.os.StrictMode; import android.security.keymaster.KeymasterDefs; import android.system.keystore2.IKeystoreOperation; import android.system.keystore2.ResponseCode; @@ -97,6 +98,7 @@ public class KeyStoreOperation { * @throws KeyStoreException */ public void updateAad(@NonNull byte[] input) throws KeyStoreException { + StrictMode.noteSlowCall("updateAad"); handleExceptions(() -> { mOperation.updateAad(input); return 0; @@ -112,6 +114,7 @@ public class KeyStoreOperation { * @hide */ public byte[] update(@NonNull byte[] input) throws KeyStoreException { + StrictMode.noteSlowCall("update"); return handleExceptions(() -> mOperation.update(input)); } @@ -125,6 +128,7 @@ public class KeyStoreOperation { * @hide */ public byte[] finish(byte[] input, byte[] signature) throws KeyStoreException { + StrictMode.noteSlowCall("finish"); return handleExceptions(() -> mOperation.finish(input, signature)); } @@ -135,6 +139,7 @@ public class KeyStoreOperation { * @hide */ public void abort() throws KeyStoreException { + StrictMode.noteSlowCall("abort"); handleExceptions(() -> { mOperation.abort(); return 0; diff --git a/keystore/java/android/security/KeyStoreSecurityLevel.java b/keystore/java/android/security/KeyStoreSecurityLevel.java index 9c0b46c8e87b..6ab148a8b4ea 100644 --- a/keystore/java/android/security/KeyStoreSecurityLevel.java +++ b/keystore/java/android/security/KeyStoreSecurityLevel.java @@ -22,6 +22,7 @@ import android.hardware.security.keymint.KeyParameter; import android.os.Binder; import android.os.RemoteException; import android.os.ServiceSpecificException; +import android.os.StrictMode; import android.security.keystore.BackendBusyException; import android.security.keystore.KeyStoreConnectException; import android.system.keystore2.AuthenticatorSpec; @@ -75,6 +76,7 @@ public class KeyStoreSecurityLevel { */ public KeyStoreOperation createOperation(@NonNull KeyDescriptor keyDescriptor, Collection<KeyParameter> args) throws KeyStoreException { + StrictMode.noteDiskWrite(); while (true) { try { CreateOperationResponse createOperationResponse = @@ -142,6 +144,8 @@ public class KeyStoreSecurityLevel { public KeyMetadata generateKey(@NonNull KeyDescriptor descriptor, KeyDescriptor attestationKey, Collection<KeyParameter> args, int flags, byte[] entropy) throws KeyStoreException { + StrictMode.noteDiskWrite(); + return handleExceptions(() -> mSecurityLevel.generateKey( descriptor, attestationKey, args.toArray(new KeyParameter[args.size()]), flags, entropy)); @@ -163,6 +167,8 @@ public class KeyStoreSecurityLevel { public KeyMetadata importKey(KeyDescriptor descriptor, KeyDescriptor attestationKey, Collection<KeyParameter> args, int flags, byte[] keyData) throws KeyStoreException { + StrictMode.noteDiskWrite(); + return handleExceptions(() -> mSecurityLevel.importKey(descriptor, attestationKey, args.toArray(new KeyParameter[args.size()]), flags, keyData)); } @@ -186,6 +192,7 @@ public class KeyStoreSecurityLevel { @NonNull byte[] wrappedKey, byte[] maskingKey, Collection<KeyParameter> args, @NonNull AuthenticatorSpec[] authenticatorSpecs) throws KeyStoreException { + StrictMode.noteDiskWrite(); KeyDescriptor keyDescriptor = new KeyDescriptor(); keyDescriptor.alias = wrappedKeyDescriptor.alias; keyDescriptor.nspace = wrappedKeyDescriptor.nspace; diff --git a/keystore/java/android/security/LegacyVpnProfileStore.java b/keystore/java/android/security/LegacyVpnProfileStore.java index c85b6b1efd9a..0cc4dfab12f8 100644 --- a/keystore/java/android/security/LegacyVpnProfileStore.java +++ b/keystore/java/android/security/LegacyVpnProfileStore.java @@ -19,6 +19,7 @@ package android.security; import android.annotation.NonNull; import android.os.ServiceManager; import android.os.ServiceSpecificException; +import android.os.StrictMode; import android.security.legacykeystore.ILegacyKeystore; import android.util.Log; @@ -51,6 +52,7 @@ public class LegacyVpnProfileStore { * @hide */ public static boolean put(@NonNull String alias, @NonNull byte[] profile) { + StrictMode.noteDiskWrite(); try { getService().put(alias, ILegacyKeystore.UID_SELF, profile); return true; @@ -70,6 +72,7 @@ public class LegacyVpnProfileStore { * @hide */ public static byte[] get(@NonNull String alias) { + StrictMode.noteDiskRead(); try { return getService().get(alias, ILegacyKeystore.UID_SELF); } catch (ServiceSpecificException e) { @@ -89,6 +92,7 @@ public class LegacyVpnProfileStore { * @hide */ public static boolean remove(@NonNull String alias) { + StrictMode.noteDiskWrite(); try { getService().remove(alias, ILegacyKeystore.UID_SELF); return true; @@ -109,6 +113,7 @@ public class LegacyVpnProfileStore { * @hide */ public static @NonNull String[] list(@NonNull String prefix) { + StrictMode.noteDiskRead(); try { final String[] aliases = getService().list(prefix, ILegacyKeystore.UID_SELF); for (int i = 0; i < aliases.length; ++i) { diff --git a/keystore/java/android/security/SystemKeyStore.java b/keystore/java/android/security/SystemKeyStore.java index e07eaa2e32ed..d481a078ab00 100644 --- a/keystore/java/android/security/SystemKeyStore.java +++ b/keystore/java/android/security/SystemKeyStore.java @@ -18,6 +18,9 @@ package android.security; import android.os.Environment; import android.os.FileUtils; +import android.os.StrictMode; + +import libcore.io.IoUtils; import java.io.File; import java.io.FileOutputStream; @@ -28,8 +31,6 @@ import java.security.SecureRandom; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; -import libcore.io.IoUtils; - /** *@hide */ @@ -69,6 +70,7 @@ public class SystemKeyStore { public byte[] generateNewKey(int numBits, String algName, String keyName) throws NoSuchAlgorithmException { + StrictMode.noteDiskWrite(); // Check if key with similar name exists. If so, return null. File keyFile = getKeyFile(keyName); @@ -103,6 +105,7 @@ public class SystemKeyStore { } private File getKeyFile(String keyName) { + StrictMode.noteDiskWrite(); File sysKeystoreDir = new File(Environment.getDataDirectory(), SYSTEM_KEYSTORE_DIRECTORY); File keyFile = new File(sysKeystoreDir, keyName + KEY_FILE_EXTENSION); @@ -114,6 +117,7 @@ public class SystemKeyStore { } public byte[] retrieveKey(String keyName) throws IOException { + StrictMode.noteDiskRead(); File keyFile = getKeyFile(keyName); if (!keyFile.exists()) { return null; @@ -122,6 +126,7 @@ public class SystemKeyStore { } public void deleteKey(String keyName) { + StrictMode.noteDiskWrite(); // Get the file first. File keyFile = getKeyFile(keyName); diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java index fe5432fcd9d8..96c257b304a0 100644 --- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java @@ -16,6 +16,7 @@ package android.security.keystore; +import android.annotation.FlaggedApi; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -34,7 +35,10 @@ import java.security.KeyPairGenerator; import java.security.Signature; import java.security.cert.Certificate; import java.security.spec.AlgorithmParameterSpec; +import java.util.Collections; import java.util.Date; +import java.util.HashSet; +import java.util.Set; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; @@ -300,6 +304,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu private final Date mKeyValidityForConsumptionEnd; private final @KeyProperties.PurposeEnum int mPurposes; private final @KeyProperties.DigestEnum String[] mDigests; + private final @NonNull @KeyProperties.DigestEnum Set<String> mMgf1Digests; private final @KeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; private final @KeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; private final @KeyProperties.BlockModeEnum String[] mBlockModes; @@ -345,6 +350,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu Date keyValidityForConsumptionEnd, @KeyProperties.PurposeEnum int purposes, @KeyProperties.DigestEnum String[] digests, + @KeyProperties.DigestEnum Set<String> mgf1Digests, @KeyProperties.EncryptionPaddingEnum String[] encryptionPaddings, @KeyProperties.SignaturePaddingEnum String[] signaturePaddings, @KeyProperties.BlockModeEnum String[] blockModes, @@ -404,6 +410,9 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu mKeyValidityForConsumptionEnd = Utils.cloneIfNotNull(keyValidityForConsumptionEnd); mPurposes = purposes; mDigests = ArrayUtils.cloneIfNotEmpty(digests); + // No need to copy the input parameter because the Builder class passes in an immutable + // collection. + mMgf1Digests = mgf1Digests != null ? mgf1Digests : Collections.emptySet(); mEncryptionPaddings = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(encryptionPaddings)); mSignaturePaddings = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(signaturePaddings)); @@ -566,7 +575,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu /** * Returns the set of digest algorithms (e.g., {@code SHA-256}, {@code SHA-384} with which the - * key can be used or {@code null} if not specified. + * key can be used. * * <p>See {@link KeyProperties}.{@code DIGEST} constants. * @@ -594,6 +603,40 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu } /** + * Returns the set of digests that can be used by the MGF1 mask generation function + * (e.g., {@code SHA-256}, {@code SHA-384}) with the key. Useful with the {@code RSA-OAEP} + * scheme. + * If not explicitly specified during key generation, the default {@code SHA-1} digest is + * used and may be specified when using the key. + * + * <p>See {@link KeyProperties}.{@code DIGEST} constants. + * + * @throws IllegalStateException if this set has not been specified. + * + * @see #isMgf1DigestsSpecified() + */ + @NonNull + @FlaggedApi("MGF1_DIGEST_SETTER") + public @KeyProperties.DigestEnum Set<String> getMgf1Digests() { + if (mMgf1Digests.isEmpty()) { + throw new IllegalStateException("Mask generation function (MGF) not specified"); + } + return new HashSet(mMgf1Digests); + } + + /** + * Returns {@code true} if the set of digests for the MGF1 mask generation function, + * with which the key can be used, has been specified. Useful with the {@code RSA-OAEP} scheme. + * + * @see #getMgf1Digests() + */ + @NonNull + @FlaggedApi("MGF1_DIGEST_SETTER") + public boolean isMgf1DigestsSpecified() { + return !mMgf1Digests.isEmpty(); + } + + /** * Returns the set of padding schemes (e.g., {@code PKCS7Padding}, {@code OEAPPadding}, * {@code PKCS1Padding}, {@code NoPadding}) with which the key can be used when * encrypting/decrypting. Attempts to use the key with any other padding scheme will be @@ -913,6 +956,8 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu private Date mKeyValidityForOriginationEnd; private Date mKeyValidityForConsumptionEnd; private @KeyProperties.DigestEnum String[] mDigests; + private @NonNull @KeyProperties.DigestEnum Set<String> mMgf1Digests = + Collections.emptySet(); private @KeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; private @KeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; private @KeyProperties.BlockModeEnum String[] mBlockModes; @@ -983,6 +1028,9 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu if (sourceSpec.isDigestsSpecified()) { mDigests = sourceSpec.getDigests(); } + if (sourceSpec.isMgf1DigestsSpecified()) { + mMgf1Digests = sourceSpec.getMgf1Digests(); + } mEncryptionPaddings = sourceSpec.getEncryptionPaddings(); mSignaturePaddings = sourceSpec.getSignaturePaddings(); mBlockModes = sourceSpec.getBlockModes(); @@ -1230,6 +1278,30 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu } /** + * Sets the set of hash functions (e.g., {@code SHA-256}, {@code SHA-384}) which could be + * used by the mask generation function MGF1 (which is used for certain operations with + * the key). Attempts to use the key with any other digest for the mask generation + * function will be rejected. + * + * <p>This can only be specified for signing/verification keys and RSA encryption/decryption + * keys used with RSA OAEP padding scheme because these operations involve a mask generation + * function (MGF1) with a digest. + * The default digest for MGF1 is {@code SHA-1}, which will be specified during key creation + * time if no digests have been explicitly provided. + * When using the key, the caller may not specify any digests that were not provided during + * key creation time. The caller may specify the default digest, {@code SHA-1}, if no + * digests were explicitly provided during key creation (but it is not necessary to do so). + * + * <p>See {@link KeyProperties}.{@code DIGEST} constants. + */ + @NonNull + @FlaggedApi("MGF1_DIGEST_SETTER") + public Builder setMgf1Digests(@Nullable @KeyProperties.DigestEnum String... mgf1Digests) { + mMgf1Digests = Set.of(mgf1Digests); + return this; + } + + /** * Sets the set of padding schemes (e.g., {@code PKCS7Padding}, {@code OAEPPadding}, * {@code PKCS1Padding}, {@code NoPadding}) with which the key can be used when * encrypting/decrypting. Attempts to use the key with any other padding scheme will be @@ -1351,7 +1423,9 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu * the key, it is also irreversibly invalidated once a new biometric is enrolled or once\ * no more biometrics are enrolled, unless {@link * #setInvalidatedByBiometricEnrollment(boolean)} is used to allow validity after - * enrollment. Attempts to initialize cryptographic operations using such keys will throw + * enrollment, or {@code KeyProperties.AUTH_DEVICE_CREDENTIAL} is specified as part of + * the parameters to {@link #setUserAuthenticationParameters}. + * Attempts to initialize cryptographic operations using such keys will throw * {@link KeyPermanentlyInvalidatedException}.</li> * </ul> * @@ -1522,7 +1596,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu * key has purpose {@link android.security.keystore.KeyProperties#PURPOSE_SIGN}. If the key * does not have purpose {@link android.security.keystore.KeyProperties#PURPOSE_SIGN}, it is * not possible to use the key to sign a certificate, so the public key certificate will - * contain a dummy signature. + * contain a placeholder signature. * * <p>Symmetric keys, such as AES and HMAC keys, do not have public key certificates. If a * {@link #getAttestationChallenge()} returns non-null and the spec is used to generate a @@ -1780,6 +1854,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu mKeyValidityForConsumptionEnd, mPurposes, mDigests, + mMgf1Digests, mEncryptionPaddings, mSignaturePaddings, mBlockModes, diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java index 5ab21bc5f489..c1e3bab5d37c 100644 --- a/keystore/java/android/security/keystore/KeyProtection.java +++ b/keystore/java/android/security/keystore/KeyProtection.java @@ -16,6 +16,7 @@ package android.security.keystore; +import android.annotation.FlaggedApi; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -30,7 +31,10 @@ import java.security.Key; import java.security.KeyStore.ProtectionParameter; import java.security.Signature; import java.security.cert.Certificate; +import java.util.Collections; import java.util.Date; +import java.util.HashSet; +import java.util.Set; import javax.crypto.Cipher; import javax.crypto.Mac; @@ -223,6 +227,7 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { private final @KeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; private final @KeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; private final @KeyProperties.DigestEnum String[] mDigests; + private final @NonNull @KeyProperties.DigestEnum Set<String> mMgf1Digests; private final @KeyProperties.BlockModeEnum String[] mBlockModes; private final boolean mRandomizedEncryptionRequired; private final boolean mUserAuthenticationRequired; @@ -247,6 +252,7 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { @KeyProperties.EncryptionPaddingEnum String[] encryptionPaddings, @KeyProperties.SignaturePaddingEnum String[] signaturePaddings, @KeyProperties.DigestEnum String[] digests, + @KeyProperties.DigestEnum Set<String> mgf1Digests, @KeyProperties.BlockModeEnum String[] blockModes, boolean randomizedEncryptionRequired, boolean userAuthenticationRequired, @@ -271,6 +277,7 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { mSignaturePaddings = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(signaturePaddings)); mDigests = ArrayUtils.cloneIfNotEmpty(digests); + mMgf1Digests = mgf1Digests; mBlockModes = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(blockModes)); mRandomizedEncryptionRequired = randomizedEncryptionRequired; mUserAuthenticationRequired = userAuthenticationRequired; @@ -381,6 +388,40 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { } /** + * Returns the set of digests that can be used by the MGF1 mask generation function + * (e.g., {@code SHA-256}, {@code SHA-384}) with the key. Useful with the {@code RSA-OAEP} + * scheme. + * If not explicitly specified during key generation, the default {@code SHA-1} digest is + * used and may be specified. + * + * <p>See {@link KeyProperties}.{@code DIGEST} constants. + * + * @throws IllegalStateException if this set has not been specified. + * + * @see #isMgf1DigestsSpecified() + */ + @NonNull + @FlaggedApi("MGF1_DIGEST_SETTER") + public @KeyProperties.DigestEnum Set<String> getMgf1Digests() { + if (mMgf1Digests.isEmpty()) { + throw new IllegalStateException("Mask generation function (MGF) not specified"); + } + return new HashSet(mMgf1Digests); + } + + /** + * Returns {@code true} if the set of digests for the MGF1 mask generation function, + * with which the key can be used, has been specified. Useful with the {@code RSA-OAEP} scheme. + * + * @see #getMgf1Digests() + */ + @NonNull + @FlaggedApi("MGF1_DIGEST_SETTER") + public boolean isMgf1DigestsSpecified() { + return !mMgf1Digests.isEmpty(); + } + + /** * Gets the set of block modes (e.g., {@code GCM}, {@code CBC}) with which the key can be used * when encrypting/decrypting. Attempts to use the key with any other block modes will be * rejected. @@ -588,6 +629,8 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { private @KeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; private @KeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; private @KeyProperties.DigestEnum String[] mDigests; + private @NonNull @KeyProperties.DigestEnum Set<String> mMgf1Digests = + Collections.emptySet(); private @KeyProperties.BlockModeEnum String[] mBlockModes; private boolean mRandomizedEncryptionRequired = true; private boolean mUserAuthenticationRequired; @@ -739,6 +782,30 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { } /** + * Sets the set of hash functions (e.g., {@code SHA-256}, {@code SHA-384}) which could be + * used by the mask generation function MGF1 (which is used for certain operations with + * the key). Attempts to use the key with any other digest for the mask generation + * function will be rejected. + * + * <p>This can only be specified for signing/verification keys and RSA encryption/decryption + * keys used with RSA OAEP padding scheme because these operations involve a mask generation + * function (MGF1) with a digest. + * The default digest for MGF1 is {@code SHA-1}, which will be specified during key import + * time if no digests have been explicitly provided. + * When using the key, the caller may not specify any digests that were not provided during + * key import time. The caller may specify the default digest, {@code SHA-1}, if no + * digests were explicitly provided during key import (but it is not necessary to do so). + * + * <p>See {@link KeyProperties}.{@code DIGEST} constants. + */ + @NonNull + @FlaggedApi("MGF1_DIGEST_SETTER") + public Builder setMgf1Digests(@Nullable @KeyProperties.DigestEnum String... mgf1Digests) { + mMgf1Digests = Set.of(mgf1Digests); + return this; + } + + /** * Sets the set of block modes (e.g., {@code GCM}, {@code CBC}) with which the key can be * used when encrypting/decrypting. Attempts to use the key with any other block modes will * be rejected. @@ -1141,6 +1208,7 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { mEncryptionPaddings, mSignaturePaddings, mDigests, + mMgf1Digests, mBlockModes, mRandomizedEncryptionRequired, mUserAuthenticationRequired, diff --git a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java index 9356eb85bd8a..ceba04efa65d 100644 --- a/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/ParcelableKeyGenParameterSpec.java @@ -23,7 +23,11 @@ import java.math.BigInteger; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.ECGenParameterSpec; import java.security.spec.RSAKeyGenParameterSpec; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; +import java.util.List; +import java.util.Set; import javax.security.auth.x500.X500Principal; @@ -91,6 +95,11 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable { } else { out.writeStringArray(null); } + if (mSpec.isMgf1DigestsSpecified()) { + out.writeStringList(List.copyOf(mSpec.getMgf1Digests())); + } else { + out.writeStringList(null); + } out.writeStringArray(mSpec.getEncryptionPaddings()); out.writeStringArray(mSpec.getSignaturePaddings()); out.writeStringArray(mSpec.getBlockModes()); @@ -153,6 +162,7 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable { final Date keyValidityForOriginationEnd = readDateOrNull(in); final Date keyValidityForConsumptionEnd = readDateOrNull(in); final String[] digests = in.createStringArray(); + final ArrayList<String> mgf1Digests = in.createStringArrayList(); final String[] encryptionPaddings = in.createStringArray(); final String[] signaturePaddings = in.createStringArray(); final String[] blockModes = in.createStringArray(); @@ -191,6 +201,7 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable { keyValidityForConsumptionEnd, purposes, digests, + mgf1Digests != null ? Set.copyOf(mgf1Digests) : Collections.emptySet(), encryptionPaddings, signaturePaddings, blockModes, diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java index d12989187281..101a10e3d312 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java @@ -20,9 +20,11 @@ import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; import android.hardware.security.keymint.KeyParameter; +import android.os.StrictMode; import android.security.KeyStoreException; import android.security.KeyStoreOperation; import android.security.keymaster.KeymasterDefs; +import android.security.keystore.KeyProperties; import android.security.keystore.KeyStoreCryptoOperation; import android.system.keystore2.Authorization; @@ -70,7 +72,7 @@ import javax.crypto.spec.SecretKeySpec; */ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStoreCryptoOperation { private static final String TAG = "AndroidKeyStoreCipherSpiBase"; - public static final String DEFAULT_MGF1_DIGEST = "SHA-1"; + public static final String DEFAULT_MGF1_DIGEST = KeyProperties.DIGEST_SHA1; // Fields below are populated by Cipher.init and KeyStore.begin and should be preserved after // doFinal finishes. @@ -137,6 +139,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor if (!(key instanceof AndroidKeyStorePrivateKey) && (key instanceof PrivateKey || key instanceof PublicKey)) { try { + StrictMode.noteSlowCall("engineInit"); mCipher = Cipher.getInstance(getTransform()); String transform = getTransform(); @@ -203,6 +206,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor if (!(key instanceof AndroidKeyStorePrivateKey) && (key instanceof PrivateKey || key instanceof PublicKey)) { try { + StrictMode.noteSlowCall("engineInit"); mCipher = Cipher.getInstance(getTransform()); mCipher.init(opmode, key, params, random); return; @@ -233,6 +237,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor if (!(key instanceof AndroidKeyStorePrivateKey) && (key instanceof PrivateKey || key instanceof PublicKey)) { try { + StrictMode.noteSlowCall("engineInit"); mCipher = Cipher.getInstance(getTransform()); mCipher.init(opmode, key, params, random); return; @@ -346,6 +351,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor parameters.add(KeyStore2ParameterUtils.makeEnum(KeymasterDefs.KM_TAG_PURPOSE, purpose)); try { + StrictMode.noteDiskRead(); mOperation = mKey.getSecurityLevel().createOperation( mKey.getKeyIdDescriptor(), parameters @@ -521,6 +527,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor @Override protected final void engineUpdateAAD(byte[] input, int inputOffset, int inputLen) { if (mCipher != null) { + StrictMode.noteSlowCall("engineUpdateAAD"); mCipher.updateAAD(input, inputOffset, inputLen); return; } @@ -562,6 +569,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor @Override protected final void engineUpdateAAD(ByteBuffer src) { if (mCipher != null) { + StrictMode.noteSlowCall("engineUpdateAAD"); mCipher.updateAAD(src); return; } @@ -715,6 +723,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor throw new NullPointerException("key == null"); } byte[] encoded = null; + StrictMode.noteSlowCall("engineWrap"); if (key instanceof SecretKey) { if ("RAW".equalsIgnoreCase(key.getFormat())) { encoded = key.getEncoded(); @@ -807,6 +816,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor throw new InvalidKeyException("Failed to unwrap key", e); } + StrictMode.noteSlowCall("engineUnwrap"); switch (wrappedKeyType) { case Cipher.SECRET_KEY: { diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java index ace2053cc1a7..9d3fca86903b 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java @@ -195,7 +195,7 @@ abstract class AndroidKeyStoreECDSASignatureSpi extends AndroidKeyStoreSignature protected final void initKey(AndroidKeyStoreKey key) throws InvalidKeyException { if (!ACCEPTED_SIGNING_SCHEMES.contains(key.getAlgorithm().toLowerCase())) { throw new InvalidKeyException("Unsupported key algorithm: " + key.getAlgorithm() - + ". Only" + Arrays.toString(ACCEPTED_SIGNING_SCHEMES.stream().toArray()) + + ". Only " + Arrays.toString(ACCEPTED_SIGNING_SCHEMES.stream().toArray()) + " supported"); } diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java index 7292cd3c5fb1..66e9f71a1f7b 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java @@ -20,6 +20,7 @@ import android.hardware.security.keymint.Algorithm; import android.hardware.security.keymint.KeyParameter; import android.hardware.security.keymint.KeyPurpose; import android.hardware.security.keymint.Tag; +import android.os.StrictMode; import android.security.KeyStoreException; import android.security.KeyStoreOperation; import android.security.keystore.KeyStoreCryptoOperation; @@ -174,6 +175,7 @@ public class AndroidKeyStoreKeyAgreementSpi extends KeyAgreementSpi } byte[] otherPartyKeyEncoded = mOtherPartyKey.getEncoded(); + StrictMode.noteSlowCall("engineGenerateSecret"); try { return mOperation.finish(otherPartyKeyEncoded, null); } catch (KeyStoreException e) { @@ -245,6 +247,7 @@ public class AndroidKeyStoreKeyAgreementSpi extends KeyAgreementSpi Tag.PURPOSE, KeyPurpose.AGREE_KEY )); + StrictMode.noteDiskWrite(); try { mOperation = mKey.getSecurityLevel().createOperation(mKey.getKeyIdDescriptor(), parameters); diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java index f1681ec1f7d2..d283b05a85e1 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java @@ -18,6 +18,7 @@ package android.security.keystore2; import android.hardware.security.keymint.KeyParameter; import android.hardware.security.keymint.SecurityLevel; +import android.os.StrictMode; import android.security.KeyStore2; import android.security.KeyStoreSecurityLevel; import android.security.keymaster.KeymasterDefs; @@ -281,6 +282,7 @@ public abstract class AndroidKeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { @Override protected SecretKey engineGenerateKey() { + StrictMode.noteSlowCall("engineGenerateKey"); KeyGenParameterSpec spec = mSpec; if (spec == null) { throw new IllegalStateException("Not initialized"); diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java index 474b7ea56be9..ed4b485f3927 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -27,6 +27,7 @@ import android.hardware.security.keymint.KeyPurpose; import android.hardware.security.keymint.SecurityLevel; import android.hardware.security.keymint.Tag; import android.os.Build; +import android.os.StrictMode; import android.security.KeyPairGeneratorSpec; import android.security.KeyStore2; import android.security.KeyStoreException; @@ -187,6 +188,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato private int[] mKeymasterEncryptionPaddings; private int[] mKeymasterSignaturePaddings; private int[] mKeymasterDigests; + private int[] mKeymasterMgf1Digests; private Long mRSAPublicExponent; @@ -322,6 +324,21 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato } else { mKeymasterDigests = EmptyArray.INT; } + if (spec.isMgf1DigestsSpecified()) { + // User-specified digests: Add all of them and do _not_ add the SHA-1 + // digest by default (stick to what the user provided). + Set<String> mgfDigests = spec.getMgf1Digests(); + mKeymasterMgf1Digests = new int[mgfDigests.size()]; + int offset = 0; + for (String digest : mgfDigests) { + mKeymasterMgf1Digests[offset] = KeyProperties.Digest.toKeymaster(digest); + offset++; + } + } else { + // No user-specified digests: Add the SHA-1 default. + mKeymasterMgf1Digests = new int[]{ + KeyProperties.Digest.toKeymaster(DEFAULT_MGF1_DIGEST)}; + } // Check that user authentication related parameters are acceptable. This method // will throw an IllegalStateException if there are issues (e.g., secure lock screen @@ -543,6 +560,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato mKeymasterEncryptionPaddings = null; mKeymasterSignaturePaddings = null; mKeymasterDigests = null; + mKeymasterMgf1Digests = null; mKeySizeBits = 0; mSpec = null; mRSAPublicExponent = null; @@ -617,6 +635,7 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato @Override public KeyPair generateKeyPair() { + StrictMode.noteSlowCall("generateKeyPair"); if (mKeyStore == null || mSpec == null) { throw new IllegalStateException("Not initialized"); } @@ -829,24 +848,11 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato KeymasterDefs.KM_TAG_PADDING, padding )); if (padding == KeymasterDefs.KM_PAD_RSA_OAEP) { - final boolean[] hasDefaultMgf1DigestBeenAdded = {false}; - ArrayUtils.forEach(mKeymasterDigests, (digest) -> { + ArrayUtils.forEach(mKeymasterMgf1Digests, (mgf1Digest) -> { params.add(KeyStore2ParameterUtils.makeEnum( - KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST, digest + KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST, mgf1Digest )); - hasDefaultMgf1DigestBeenAdded[0] |= - digest.equals(KeyProperties.Digest.toKeymaster(DEFAULT_MGF1_DIGEST)); }); - /* Because of default MGF1 digest is SHA-1. It has to be added in Key - * characteristics. Otherwise, crypto operations will fail with Incompatible - * MGF1 digest. - */ - if (!hasDefaultMgf1DigestBeenAdded[0]) { - params.add(KeyStore2ParameterUtils.makeEnum( - KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST, - KeyProperties.Digest.toKeymaster(DEFAULT_MGF1_DIGEST) - )); - } } }); ArrayUtils.forEach(mKeymasterSignaturePaddings, (padding) -> { diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java index 931c2f864eba..d5fb49a5cb94 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java @@ -189,7 +189,7 @@ abstract class AndroidKeyStoreRSASignatureSpi extends AndroidKeyStoreSignatureSp protected final void initKey(AndroidKeyStoreKey key) throws InvalidKeyException { if (!KeyProperties.KEY_ALGORITHM_RSA.equalsIgnoreCase(key.getAlgorithm())) { throw new InvalidKeyException("Unsupported key algorithm: " + key.getAlgorithm() - + ". Only" + KeyProperties.KEY_ALGORITHM_RSA + " supported"); + + ". Only " + KeyProperties.KEY_ALGORITHM_RSA + " supported"); } super.initKey(key); } diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java index 25f5dec9de40..ddbd93e458fd 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java @@ -24,6 +24,7 @@ import android.hardware.security.keymint.EcCurve; import android.hardware.security.keymint.HardwareAuthenticatorType; import android.hardware.security.keymint.KeyParameter; import android.hardware.security.keymint.SecurityLevel; +import android.os.StrictMode; import android.security.GateKeeper; import android.security.KeyStore2; import android.security.KeyStoreParameter; @@ -36,6 +37,7 @@ import android.security.keystore.KeyProtection; import android.security.keystore.SecureKeyImportUnavailableException; import android.security.keystore.WrappedKeyEntry; import android.system.keystore2.AuthenticatorSpec; +import android.system.keystore2.Authorization; import android.system.keystore2.Domain; import android.system.keystore2.IKeystoreSecurityLevel; import android.system.keystore2.KeyDescriptor; @@ -163,6 +165,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { KeyDescriptor descriptor = makeKeyDescriptor(alias); try { + StrictMode.noteDiskRead(); return mKeyStore.getKeyEntry(descriptor); } catch (android.security.KeyStoreException e) { if (e.getErrorCode() != ResponseCode.KEY_NOT_FOUND) { @@ -446,6 +449,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { assertCanReplace(alias, targetDomain, mNamespace, descriptor); try { + StrictMode.noteDiskWrite(); mKeyStore.updateSubcomponents( ((AndroidKeyStorePrivateKey) key).getKeyIdDescriptor(), userCertBytes, chainBytes); @@ -522,25 +526,22 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { padding )); if (padding == KeymasterDefs.KM_PAD_RSA_OAEP) { - if (spec.isDigestsSpecified()) { - boolean hasDefaultMgf1DigestBeenAdded = false; - for (String digest : spec.getDigests()) { + if (spec.isMgf1DigestsSpecified()) { + for (String mgf1Digest : spec.getMgf1Digests()) { importArgs.add(KeyStore2ParameterUtils.makeEnum( KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST, - KeyProperties.Digest.toKeymaster(digest) + KeyProperties.Digest.toKeymaster(mgf1Digest) )); - hasDefaultMgf1DigestBeenAdded |= digest.equals(DEFAULT_MGF1_DIGEST); } + } else { /* Because of default MGF1 digest is SHA-1. It has to be added in Key * characteristics. Otherwise, crypto operations will fail with Incompatible * MGF1 digest. */ - if (!hasDefaultMgf1DigestBeenAdded) { - importArgs.add(KeyStore2ParameterUtils.makeEnum( - KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST, - KeyProperties.Digest.toKeymaster(DEFAULT_MGF1_DIGEST) - )); - } + importArgs.add(KeyStore2ParameterUtils.makeEnum( + KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST, + KeyProperties.Digest.toKeymaster(DEFAULT_MGF1_DIGEST) + )); } } } @@ -596,6 +597,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { importArgs, flags, pkcs8EncodedPrivateKeyBytes); try { + StrictMode.noteDiskWrite(); mKeyStore.updateSubcomponents(metadata.key, userCertBytes, chainBytes); } catch (android.security.KeyStoreException e) { mKeyStore.deleteKey(metadata.key); @@ -937,6 +939,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { KeyEntryResponse response = null; try { + StrictMode.noteDiskRead(); response = mKeyStore.getKeyEntry(wrappingkey); } catch (android.security.KeyStoreException e) { throw new KeyStoreException("Failed to import wrapped key. Keystore error code: " @@ -966,7 +969,34 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { authenticatorSpecs.add(authSpec); } + if (parts.length > 2) { + @KeyProperties.EncryptionPaddingEnum int padding = + KeyProperties.EncryptionPadding.toKeymaster(parts[2]); + if (padding == KeymasterDefs.KM_PAD_RSA_OAEP + && response.metadata != null + && response.metadata.authorizations != null) { + Authorization[] keyCharacteristics = response.metadata.authorizations; + + for (Authorization authorization : keyCharacteristics) { + // Add default MGF1 digest SHA-1 + // when wrapping key has KM_TAG_RSA_OAEP_MGF_DIGEST tag + if (authorization.keyParameter.tag + == KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST) { + // Default MGF1 digest is SHA-1 + // and KeyMint only supports default MGF1 digest crypto operations + // for importWrappedKey. + args.add(KeyStore2ParameterUtils.makeEnum( + KeymasterDefs.KM_TAG_RSA_OAEP_MGF_DIGEST, + KeyProperties.Digest.toKeymaster(DEFAULT_MGF1_DIGEST) + )); + break; + } + } + } + } + try { + StrictMode.noteDiskWrite(); securityLevel.importWrappedKey( wrappedKey, wrappingkey, entry.getWrappedKeyBytes(), @@ -1027,6 +1057,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { } try { + StrictMode.noteDiskWrite(); mKeyStore.updateSubcomponents(makeKeyDescriptor(alias), null /* publicCert - unused when used as pure certificate store. */, encoded); @@ -1039,6 +1070,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { public void engineDeleteEntry(String alias) throws KeyStoreException { KeyDescriptor descriptor = makeKeyDescriptor(alias); try { + StrictMode.noteDiskWrite(); mKeyStore.deleteKey(descriptor); } catch (android.security.KeyStoreException e) { if (e.getErrorCode() != ResponseCode.KEY_NOT_FOUND) { @@ -1049,6 +1081,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { private KeyDescriptor[] getAliasesBatch(String startPastAlias) { try { + StrictMode.noteDiskRead(); return mKeyStore.listBatch( getTargetDomain(), mNamespace, @@ -1076,6 +1109,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { @Override public int engineSize() { try { + StrictMode.noteDiskRead(); return mKeyStore.getNumberOfEntries( getTargetDomain(), mNamespace @@ -1139,6 +1173,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { KeyDescriptor[] keyDescriptors = null; try { + StrictMode.noteDiskRead(); keyDescriptors = mKeyStore.list( getTargetDomain(), mNamespace diff --git a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java index 54955c6b7fab..1394bd443f03 100644 --- a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java +++ b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java @@ -325,32 +325,25 @@ public abstract class KeyStore2ParameterUtils { args.add(KeyStore2ParameterUtils.makeBool( KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED)); } else { - if (spec.getUserAuthenticationValidityDurationSeconds() == 0) { - // Every use of this key needs to be authorized by the user. - addSids(args, spec); - args.add(KeyStore2ParameterUtils.makeEnum( - KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType() + addSids(args, spec); + args.add(KeyStore2ParameterUtils.makeEnum( + KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType() + )); + if (spec.getUserAuthenticationValidityDurationSeconds() != 0) { + args.add(KeyStore2ParameterUtils.makeInt( + KeymasterDefs.KM_TAG_AUTH_TIMEOUT, + spec.getUserAuthenticationValidityDurationSeconds() )); - - if (spec.isUserAuthenticationValidWhileOnBody()) { + } + if (spec.isUserAuthenticationValidWhileOnBody()) { + if (spec.getUserAuthenticationValidityDurationSeconds() == 0) { throw new ProviderException( "Key validity extension while device is on-body is not " + "supported for keys requiring fingerprint authentication"); } - } else { - addSids(args, spec); - args.add(KeyStore2ParameterUtils.makeEnum( - KeymasterDefs.KM_TAG_USER_AUTH_TYPE, spec.getUserAuthenticationType() + args.add(KeyStore2ParameterUtils.makeBool( + KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY )); - args.add(KeyStore2ParameterUtils.makeInt( - KeymasterDefs.KM_TAG_AUTH_TIMEOUT, - spec.getUserAuthenticationValidityDurationSeconds() - )); - if (spec.isUserAuthenticationValidWhileOnBody()) { - args.add(KeyStore2ParameterUtils.makeBool( - KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY - )); - } } } } diff --git a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java index 2ae61ab3b38d..d4e2dbc81509 100644 --- a/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java +++ b/keystore/tests/src/android/security/ParcelableKeyGenParameterSpecTest.java @@ -17,6 +17,7 @@ package android.security; import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; @@ -101,6 +102,7 @@ public final class ParcelableKeyGenParameterSpecTest { assertThat(spec.getKeyValidityForOriginationEnd(), is(KEY_VALIDITY_FOR_ORIG_END)); assertThat(spec.getKeyValidityForConsumptionEnd(), is(KEY_VALIDITY_FOR_CONSUMPTION_END)); assertThat(spec.getDigests(), is(new String[] {DIGEST})); + assertThat(spec.isMgf1DigestsSpecified(), is(false)); assertThat(spec.getEncryptionPaddings(), is(new String[] {ENCRYPTION_PADDING})); assertThat(spec.getSignaturePaddings(), is(new String[] {SIGNATURE_PADDING})); assertThat(spec.getBlockModes(), is(new String[] {BLOCK_MODE})); @@ -189,4 +191,19 @@ public final class ParcelableKeyGenParameterSpecTest { ECGenParameterSpec parcelSpec = (ECGenParameterSpec) fromParcel.getAlgorithmParameterSpec(); assertEquals(parcelSpec.getName(), ecSpec.getName()); } + + @Test + public void testParcelingMgf1Digests() { + String[] mgf1Digests = + new String[] {KeyProperties.DIGEST_SHA1, KeyProperties.DIGEST_SHA256}; + + ParcelableKeyGenParameterSpec spec = new ParcelableKeyGenParameterSpec( + new KeyGenParameterSpec.Builder(ALIAS, KEY_PURPOSES) + .setMgf1Digests(mgf1Digests) + .build()); + Parcel parcel = parcelForReading(spec); + KeyGenParameterSpec fromParcel = + ParcelableKeyGenParameterSpec.CREATOR.createFromParcel(parcel).getSpec(); + assertArrayEquals(fromParcel.getMgf1Digests().toArray(), mgf1Digests); + } } diff --git a/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java b/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java index ddbb1d8c097c..da5e8bf84191 100644 --- a/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java +++ b/keystore/tests/src/android/security/keystore/KeyGenParameterSpecTest.java @@ -16,9 +16,12 @@ package android.security.keystore; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertThrows; import android.security.ParcelableKeyGenParameterSpecTest; @@ -61,4 +64,54 @@ public final class KeyGenParameterSpecTest { assertEquals(copiedSpec.getAttestationChallenge(), null); } + + @Test + public void testMgf1DigestsNotSpecifiedByDefault() { + KeyGenParameterSpec spec = ParcelableKeyGenParameterSpecTest.configureDefaultSpec(); + assertThat(spec.isMgf1DigestsSpecified(), is(false)); + assertThrows(IllegalStateException.class, () -> { + spec.getMgf1Digests(); + }); + } + + @Test + public void testMgf1DigestsCanBeSpecified() { + String[] mgf1Digests = + new String[] {KeyProperties.DIGEST_SHA1, KeyProperties.DIGEST_SHA256}; + KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(ALIAS, KEY_PURPOSES) + .setMgf1Digests(mgf1Digests) + .build(); + assertThat(spec.isMgf1DigestsSpecified(), is(true)); + assertThat(spec.getMgf1Digests(), containsInAnyOrder(mgf1Digests)); + + KeyGenParameterSpec copiedSpec = new KeyGenParameterSpec.Builder(spec).build(); + assertThat(copiedSpec.isMgf1DigestsSpecified(), is(true)); + assertThat(copiedSpec.getMgf1Digests(), containsInAnyOrder(mgf1Digests)); + } + + @Test + public void testMgf1DigestsAreNotModified() { + String[] mgf1Digests = + new String[] {KeyProperties.DIGEST_SHA1, KeyProperties.DIGEST_SHA256}; + KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(ALIAS, KEY_PURPOSES) + .setMgf1Digests(mgf1Digests); + + KeyGenParameterSpec firstSpec = builder.build(); + assertArrayEquals(mgf1Digests, firstSpec.getMgf1Digests().toArray()); + + String[] otherDigests = new String[] {KeyProperties.DIGEST_SHA224}; + KeyGenParameterSpec secondSpec = builder.setMgf1Digests(otherDigests).build(); + assertThat(secondSpec.getMgf1Digests(), containsInAnyOrder(otherDigests)); + + // Now check that the first spec created hasn't changed. + assertThat(firstSpec.getMgf1Digests(), containsInAnyOrder(mgf1Digests)); + } + + @Test + public void testEmptyMgf1DigestsCanBeSet() { + KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(ALIAS, KEY_PURPOSES) + .setMgf1Digests(new String[] {}).build(); + + assertThat(spec.isMgf1DigestsSpecified(), is(false)); + } } diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index 54978bd4496d..b232555c64dd 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -112,8 +112,7 @@ genrule { name: "protolog.json.gz", srcs: [":generate-wm_shell_protolog.json"], out: ["wmshell.protolog.json.gz"], - cmd: "$(location minigzip) -c < $(in) > $(out)", - tools: ["minigzip"], + cmd: "gzip -c < $(in) > $(out)", } prebuilt_etc { @@ -155,7 +154,6 @@ android_library { "kotlinx-coroutines-android", "kotlinx-coroutines-core", "iconloader_base", - "protolog-lib", "WindowManager-Shell-proto", "dagger2", "jsr330", @@ -165,7 +163,7 @@ android_library { // *.kt sources are inside a filegroup. "kotlin-annotations", ], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], manifest: "AndroidManifest.xml", plugins: ["dagger2-compiler"], } diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index 9cb4435c82f3..14b0fd9db609 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -85,7 +85,7 @@ <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ተጨማሪ ይመልከቱ እና ያድርጉ"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ለተከፈለ ማያ ገፅ ሌላ መተግበሪያ ይጎትቱ"</string> - <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ቦታውን ለመቀየር ከመተግበሪያው ውጪ ሁለቴ መታ ያድርጉ"</string> + <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ቦታውን ለመቀየር ከመተግበሪያው ውጭ ሁለቴ መታ ያድርጉ"</string> <string name="letterbox_education_got_it" msgid="4057634570866051177">"ገባኝ"</string> <string name="letterbox_education_expand_button_description" msgid="1729796567101129834">"ለተጨማሪ መረጃ ይዘርጉ።"</string> <string name="letterbox_restart_dialog_title" msgid="8543049527871033505">"ለተሻለ ዕይታ እንደገና ይጀመር?"</string> @@ -106,7 +106,7 @@ <string name="more_button_text" msgid="3655388105592893530">"ተጨማሪ"</string> <string name="float_button_text" msgid="9221657008391364581">"ተንሳፋፊ"</string> <string name="select_text" msgid="5139083974039906583">"ምረጥ"</string> - <string name="screenshot_text" msgid="1477704010087786671">"ቅጽበታዊ ገፅ እይታ"</string> + <string name="screenshot_text" msgid="1477704010087786671">"ቅጽበታዊ ገፅ ዕይታ"</string> <string name="close_text" msgid="4986518933445178928">"ዝጋ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ምናሌ ዝጋ"</string> <string name="expand_menu_text" msgid="3847736164494181168">"ምናሌን ክፈት"</string> diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index ea44bead6766..9c5e0c48f6cb 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -79,7 +79,7 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Burbuja"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbuja cerrada."</string> - <string name="restart_button_description" msgid="6712141648865547958">"Toca para reiniciar esta aplicación y obtener una mejor vista."</string> + <string name="restart_button_description" msgid="6712141648865547958">"Toca para reiniciar esta aplicación y verlo mejor."</string> <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Problemas con la cámara?\nToca para reajustar"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string> diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index 025646cbb9cd..191fbe85bd01 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -79,7 +79,7 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"Fumetto"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestisci"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Fumetto ignorato."</string> - <string name="restart_button_description" msgid="6712141648865547958">"Tocca per riavviare quest\'app per una migliore visualizzazione."</string> + <string name="restart_button_description" msgid="6712141648865547958">"Tocca per riavviare l\'app e migliorare la visualizzazione"</string> <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi con la fotocamera?\nTocca per risolverli"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string> diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index 39d717dd461a..55697ca23a86 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -79,7 +79,7 @@ <string name="notification_bubble_title" msgid="6082910224488253378">"버블"</string> <string name="manage_bubbles_text" msgid="7730624269650594419">"관리"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"대화창을 닫았습니다."</string> - <string name="restart_button_description" msgid="6712141648865547958">"보기를 개선하려면 탭하여 앱을 다시 시작합니다."</string> + <string name="restart_button_description" msgid="6712141648865547958">"더 편하게 보기를 원하면 탭하여 앱을 다시 시작하세요."</string> <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"카메라 문제가 있나요?\n해결하려면 탭하세요."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string> diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index 04ee54046439..a3d6ce5a4c5a 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -24,7 +24,7 @@ <string name="pip_menu_title" msgid="5393619322111827096">"Menu"</string> <string name="pip_menu_accessibility_title" msgid="8129016817688656249">"Menu de ecrã no ecrã"</string> <string name="pip_notification_title" msgid="1347104727641353453">"A app <xliff:g id="NAME">%s</xliff:g> está no modo de ecrã no ecrã"</string> - <string name="pip_notification_message" msgid="8854051911700302620">"Se não pretende que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string> + <string name="pip_notification_message" msgid="8854051911700302620">"Se não quer que a app <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string> <string name="pip_play" msgid="3496151081459417097">"Reproduzir"</string> <string name="pip_pause" msgid="690688849510295232">"Pausar"</string> <string name="pip_skip_to_next" msgid="8403429188794867653">"Mudar para o seguinte"</string> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java index 0fdfbb8c0c61..f235cd7e8a6e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java @@ -336,16 +336,20 @@ public class BubbleController implements ConfigurationChangeListener, new OneHandedTransitionCallback() { @Override public void onStartFinished(Rect bounds) { - if (mStackView != null) { - mStackView.onVerticalOffsetChanged(bounds.top); - } + mMainExecutor.execute(() -> { + if (mStackView != null) { + mStackView.onVerticalOffsetChanged(bounds.top); + } + }); } @Override public void onStopFinished(Rect bounds) { - if (mStackView != null) { - mStackView.onVerticalOffsetChanged(bounds.top); - } + mMainExecutor.execute(() -> { + if (mStackView != null) { + mStackView.onVerticalOffsetChanged(bounds.top); + } + }); } }); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ManageEducationView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ManageEducationView.kt index e95e8e5cdaea..1b41f793311d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ManageEducationView.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/ManageEducationView.kt @@ -41,9 +41,9 @@ class ManageEducationView constructor(context: Context, positioner: BubblePositi private val ANIMATE_DURATION: Long = 200 private val positioner: BubblePositioner = positioner - private val manageView by lazy { findViewById<ViewGroup>(R.id.manage_education_view) } - private val manageButton by lazy { findViewById<Button>(R.id.manage_button) } - private val gotItButton by lazy { findViewById<Button>(R.id.got_it) } + private val manageView by lazy { requireViewById<ViewGroup>(R.id.manage_education_view) } + private val manageButton by lazy { requireViewById<Button>(R.id.manage_button) } + private val gotItButton by lazy { requireViewById<Button>(R.id.got_it) } private var isHiding = false private var realManageButtonRect = Rect() @@ -122,7 +122,7 @@ class ManageEducationView constructor(context: Context, positioner: BubblePositi manageButton .setOnClickListener { hide() - expandedView.findViewById<View>(R.id.manage_button).performClick() + expandedView.requireViewById<View>(R.id.manage_button).performClick() } gotItButton.setOnClickListener { hide() } setOnClickListener { hide() } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/StackEducationView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/StackEducationView.kt index d0598cd28582..5e3a077a3716 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/StackEducationView.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/StackEducationView.kt @@ -48,9 +48,9 @@ class StackEducationView constructor( private val positioner: BubblePositioner = positioner private val controller: BubbleController = controller - private val view by lazy { findViewById<View>(R.id.stack_education_layout) } - private val titleTextView by lazy { findViewById<TextView>(R.id.stack_education_title) } - private val descTextView by lazy { findViewById<TextView>(R.id.stack_education_description) } + private val view by lazy { requireViewById<View>(R.id.stack_education_layout) } + private val titleTextView by lazy { requireViewById<TextView>(R.id.stack_education_title) } + private val descTextView by lazy { requireViewById<TextView>(R.id.stack_education_description) } var isHiding = false private set diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/FloatingContentCoordinator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/FloatingContentCoordinator.kt index d5d072a8d449..122dcbb3c2ce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/FloatingContentCoordinator.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/FloatingContentCoordinator.kt @@ -94,7 +94,6 @@ class FloatingContentCoordinator constructor() { * non-overlapping. * @return The new bounds for this content. */ - @JvmDefault fun calculateNewBoundsOnOverlap( overlappingContentBounds: Rect, otherContentBounds: List<Rect> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt index 3ab175d3b68a..a7a1991c94d6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt @@ -318,7 +318,6 @@ class DesktopModeTaskRepository { /** * Called when the active tasks change in desktop mode. */ - @JvmDefault fun onActiveTasksChanged(displayId: Int) {} } @@ -329,7 +328,6 @@ class DesktopModeTaskRepository { /** * Called when the desktop starts or stops showing freeform tasks. */ - @JvmDefault fun onVisibilityChanged(displayId: Int, hasVisibleFreeformTasks: Boolean) {} } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 91bb155d9d01..8d1433595223 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -398,17 +398,18 @@ class DesktopTasksController( request: TransitionRequestInfo ): WindowContainerTransaction? { // Check if we should skip handling this transition + val triggerTask = request.triggerTask val shouldHandleRequest = when { // Only handle open or to front transitions request.type != TRANSIT_OPEN && request.type != TRANSIT_TO_FRONT -> false // Only handle when it is a task transition - request.triggerTask == null -> false + triggerTask == null -> false // Only handle standard type tasks - request.triggerTask.activityType != ACTIVITY_TYPE_STANDARD -> false + triggerTask.activityType != ACTIVITY_TYPE_STANDARD -> false // Only handle fullscreen or freeform tasks - request.triggerTask.windowingMode != WINDOWING_MODE_FULLSCREEN && - request.triggerTask.windowingMode != WINDOWING_MODE_FREEFORM -> false + triggerTask.windowingMode != WINDOWING_MODE_FULLSCREEN && + triggerTask.windowingMode != WINDOWING_MODE_FREEFORM -> false // Otherwise process it else -> true } @@ -417,27 +418,30 @@ class DesktopTasksController( return null } - val task: RunningTaskInfo = request.triggerTask - val activeTasks = desktopModeTaskRepository.getActiveTasks(task.displayId) + if (triggerTask == null) { + return null + } + + val activeTasks = desktopModeTaskRepository.getActiveTasks(triggerTask.displayId) // Check if we should switch a fullscreen task to freeform - if (task.windowingMode == WINDOWING_MODE_FULLSCREEN) { + if (triggerTask.windowingMode == WINDOWING_MODE_FULLSCREEN) { // If there are any visible desktop tasks, switch the task to freeform if (activeTasks.any { desktopModeTaskRepository.isVisibleTask(it) }) { KtProtoLog.d( WM_SHELL_DESKTOP_MODE, "DesktopTasksController: switch fullscreen task to freeform on transition" + " taskId=%d", - task.taskId + triggerTask.taskId ) return WindowContainerTransaction().also { wct -> - addMoveToDesktopChanges(wct, task.token) + addMoveToDesktopChanges(wct, triggerTask.token) } } } // CHeck if we should switch a freeform task to fullscreen - if (task.windowingMode == WINDOWING_MODE_FREEFORM) { + if (triggerTask.windowingMode == WINDOWING_MODE_FREEFORM) { // If no visible desktop tasks, switch this task to freeform as the transition came // outside of this controller if (activeTasks.none { desktopModeTaskRepository.isVisibleTask(it) }) { @@ -445,10 +449,10 @@ class DesktopTasksController( WM_SHELL_DESKTOP_MODE, "DesktopTasksController: switch freeform task to fullscreen oon transition" + " taskId=%d", - task.taskId + triggerTask.taskId ) return WindowContainerTransaction().also { wct -> - addMoveToFullscreenChanges(wct, task.token) + addMoveToFullscreenChanges(wct, triggerTask.token) } } } @@ -471,7 +475,7 @@ class DesktopTasksController( token: WindowContainerToken ) { wct.setWindowingMode(token, WINDOWING_MODE_FULLSCREEN) - wct.setBounds(token, null) + wct.setBounds(token, Rect()) if (isDesktopDensityOverrideSet()) { wct.setDensityDpi(token, getFullscreenDensityDpi()) } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java index 2c4f76b1f34b..500094335258 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java @@ -591,6 +591,13 @@ public class PipTouchHandler { return true; } + // Ignore the motion event When the entry animation is waiting to be started + if (!mTouchState.isUserInteracting() && mPipTaskOrganizer.isEntryScheduled()) { + ProtoLog.wtf(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Waiting to start the entry animation, skip the motion event.", TAG); + return true; + } + // Update the touch state mTouchState.onTouchEvent(ev); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt index b67acd5c15bb..1aacb4dd739c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeAppControlsWindowDecorationViewHolder.kt @@ -23,13 +23,13 @@ internal class DesktopModeAppControlsWindowDecorationViewHolder( appIcon: Drawable ) : DesktopModeWindowDecorationViewHolder(rootView) { - private val captionView: View = rootView.findViewById(R.id.desktop_mode_caption) - private val captionHandle: View = rootView.findViewById(R.id.caption_handle) - private val openMenuButton: View = rootView.findViewById(R.id.open_menu_button) - private val closeWindowButton: ImageButton = rootView.findViewById(R.id.close_window) - private val expandMenuButton: ImageButton = rootView.findViewById(R.id.expand_menu_button) - private val appNameTextView: TextView = rootView.findViewById(R.id.application_name) - private val appIconImageView: ImageView = rootView.findViewById(R.id.application_icon) + private val captionView: View = rootView.requireViewById(R.id.desktop_mode_caption) + private val captionHandle: View = rootView.requireViewById(R.id.caption_handle) + private val openMenuButton: View = rootView.requireViewById(R.id.open_menu_button) + private val closeWindowButton: ImageButton = rootView.requireViewById(R.id.close_window) + private val expandMenuButton: ImageButton = rootView.requireViewById(R.id.expand_menu_button) + private val appNameTextView: TextView = rootView.requireViewById(R.id.application_name) + private val appIconImageView: ImageView = rootView.requireViewById(R.id.application_icon) init { captionView.setOnTouchListener(onCaptionTouchListener) @@ -45,7 +45,9 @@ internal class DesktopModeAppControlsWindowDecorationViewHolder( override fun bindData(taskInfo: RunningTaskInfo) { val captionDrawable = captionView.background as GradientDrawable - captionDrawable.setColor(taskInfo.taskDescription.statusBarColor) + taskInfo.taskDescription?.statusBarColor?.let { + captionDrawable.setColor(it) + } closeWindowButton.imageTintList = ColorStateList.valueOf( getCaptionCloseButtonColor(taskInfo)) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeFocusedWindowDecorationViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeFocusedWindowDecorationViewHolder.kt index 47a12a0cb71c..9374ac95e83d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeFocusedWindowDecorationViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeFocusedWindowDecorationViewHolder.kt @@ -17,8 +17,8 @@ internal class DesktopModeFocusedWindowDecorationViewHolder( onCaptionButtonClickListener: View.OnClickListener ) : DesktopModeWindowDecorationViewHolder(rootView) { - private val captionView: View = rootView.findViewById(R.id.desktop_mode_caption) - private val captionHandle: ImageButton = rootView.findViewById(R.id.caption_handle) + private val captionView: View = rootView.requireViewById(R.id.desktop_mode_caption) + private val captionHandle: ImageButton = rootView.requireViewById(R.id.caption_handle) init { captionView.setOnTouchListener(onCaptionTouchListener) @@ -27,9 +27,10 @@ internal class DesktopModeFocusedWindowDecorationViewHolder( } override fun bindData(taskInfo: RunningTaskInfo) { - val captionColor = taskInfo.taskDescription.statusBarColor - val captionDrawable = captionView.background as GradientDrawable - captionDrawable.setColor(captionColor) + taskInfo.taskDescription?.statusBarColor?.let { captionColor -> + val captionDrawable = captionView.background as GradientDrawable + captionDrawable.setColor(captionColor) + } captionHandle.imageTintList = ColorStateList.valueOf(getCaptionHandleBarColor(taskInfo)) } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeWindowDecorationViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeWindowDecorationViewHolder.kt index 514ea52cb8ae..b4ecbf5f3e32 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeWindowDecorationViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/DesktopModeWindowDecorationViewHolder.kt @@ -23,6 +23,9 @@ internal abstract class DesktopModeWindowDecorationViewHolder(rootView: View) { * with the caption background color. */ protected fun shouldUseLightCaptionColors(taskInfo: RunningTaskInfo): Boolean { - return Color.valueOf(taskInfo.taskDescription.statusBarColor).luminance() < 0.5 + return taskInfo.taskDescription + ?.let { taskDescription -> + Color.valueOf(taskDescription.statusBarColor).luminance() < 0.5 + } ?: false } } diff --git a/libs/WindowManager/Shell/tests/unittest/Android.bp b/libs/WindowManager/Shell/tests/unittest/Android.bp index ad4d97f6fe40..38e9f390835c 100644 --- a/libs/WindowManager/Shell/tests/unittest/Android.bp +++ b/libs/WindowManager/Shell/tests/unittest/Android.bp @@ -61,7 +61,7 @@ android_test { "libstaticjvmtiagent", ], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], plugins: ["dagger2-compiler"], diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp index 28bda72bccdd..4fb80ac13bbf 100644 --- a/libs/androidfw/Android.bp +++ b/libs/androidfw/Android.bp @@ -85,7 +85,10 @@ cc_library { export_include_dirs: ["include"], export_shared_lib_headers: ["libz"], static_libs: ["libincfs-utils"], - whole_static_libs: ["libincfs-utils"], + whole_static_libs: [ + "libandroidfw_pathutils", + "libincfs-utils", + ], export_static_lib_headers: ["libincfs-utils"], target: { android: { @@ -137,6 +140,28 @@ cc_library { }, } +cc_library_static { + name: "libandroidfw_pathutils", + defaults: ["libandroidfw_defaults"], + host_supported: true, + export_include_dirs: ["include_pathutils"], + srcs: [ + "PathUtils.cpp", + ], + shared_libs: [ + "libutils", + ], + target: { + windows: { + enabled: true, + }, + }, + visibility: [ + ":__subpackages__", + "//frameworks/base/tools/aapt", + ], +} + common_test_libs = [ "libandroidfw", "libbase", diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index fb2b57193b83..68befffecf2f 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -26,6 +26,7 @@ #include <androidfw/AssetDir.h> #include <androidfw/AssetManager.h> #include <androidfw/misc.h> +#include <androidfw/PathUtils.h> #include <androidfw/ResourceTypes.h> #include <androidfw/ZipFileRO.h> #include <cutils/atomic.h> @@ -88,10 +89,10 @@ String8 idmapPathForPackagePath(const String8& pkgPath) { const char* root = getenv("ANDROID_DATA"); LOG_ALWAYS_FATAL_IF(root == NULL, "ANDROID_DATA not set"); String8 path(root); - path.appendPath(kResourceCache); + appendPath(path, kResourceCache); char buf[256]; // 256 chars should be enough for anyone... - strncpy(buf, pkgPath.string(), 255); + strncpy(buf, pkgPath.c_str(), 255); buf[255] = '\0'; char* filename = buf; while (*filename && *filename == '/') { @@ -104,7 +105,7 @@ String8 idmapPathForPackagePath(const String8& pkgPath) { } ++p; } - path.appendPath(filename); + appendPath(path, filename); path.append("@idmap"); return path; @@ -181,17 +182,17 @@ bool AssetManager::addAssetPath( String8 realPath(path); if (kAppZipName) { - realPath.appendPath(kAppZipName); + appendPath(realPath, kAppZipName); } - ap.type = ::getFileType(realPath.string()); + ap.type = ::getFileType(realPath.c_str()); if (ap.type == kFileTypeRegular) { ap.path = realPath; } else { ap.path = path; - ap.type = ::getFileType(path.string()); + ap.type = ::getFileType(path.c_str()); if (ap.type != kFileTypeDirectory && ap.type != kFileTypeRegular) { ALOGW("Asset path %s is neither a directory nor file (type=%d).", - path.string(), (int)ap.type); + path.c_str(), (int)ap.type); return false; } } @@ -207,7 +208,7 @@ bool AssetManager::addAssetPath( } ALOGV("In %p Asset %s path: %s", this, - ap.type == kFileTypeDirectory ? "dir" : "zip", ap.path.string()); + ap.type == kFileTypeDirectory ? "dir" : "zip", ap.path.c_str()); ap.isSystemAsset = isSystemAsset; ssize_t apPos = mAssetPaths.add(ap); @@ -248,7 +249,7 @@ bool AssetManager::addOverlayPath(const String8& packagePath, int32_t* cookie) Asset* idmap = NULL; if ((idmap = openAssetFromFileLocked(idmapPath, Asset::ACCESS_BUFFER)) == NULL) { - ALOGW("failed to open idmap file %s\n", idmapPath.string()); + ALOGW("failed to open idmap file %s\n", idmapPath.c_str()); return false; } @@ -256,7 +257,7 @@ bool AssetManager::addOverlayPath(const String8& packagePath, int32_t* cookie) String8 overlayPath; if (!ResTable::getIdmapInfo(idmap->getBuffer(false), idmap->getLength(), NULL, NULL, NULL, &targetPath, &overlayPath)) { - ALOGW("failed to read idmap file %s\n", idmapPath.string()); + ALOGW("failed to read idmap file %s\n", idmapPath.c_str()); delete idmap; return false; } @@ -264,29 +265,29 @@ bool AssetManager::addOverlayPath(const String8& packagePath, int32_t* cookie) if (overlayPath != packagePath) { ALOGW("idmap file %s inconcistent: expected path %s does not match actual path %s\n", - idmapPath.string(), packagePath.string(), overlayPath.string()); + idmapPath.c_str(), packagePath.c_str(), overlayPath.c_str()); return false; } - if (access(targetPath.string(), R_OK) != 0) { - ALOGW("failed to access file %s: %s\n", targetPath.string(), strerror(errno)); + if (access(targetPath.c_str(), R_OK) != 0) { + ALOGW("failed to access file %s: %s\n", targetPath.c_str(), strerror(errno)); return false; } - if (access(idmapPath.string(), R_OK) != 0) { - ALOGW("failed to access file %s: %s\n", idmapPath.string(), strerror(errno)); + if (access(idmapPath.c_str(), R_OK) != 0) { + ALOGW("failed to access file %s: %s\n", idmapPath.c_str(), strerror(errno)); return false; } - if (access(overlayPath.string(), R_OK) != 0) { - ALOGW("failed to access file %s: %s\n", overlayPath.string(), strerror(errno)); + if (access(overlayPath.c_str(), R_OK) != 0) { + ALOGW("failed to access file %s: %s\n", overlayPath.c_str(), strerror(errno)); return false; } asset_path oap; oap.path = overlayPath; - oap.type = ::getFileType(overlayPath.string()); + oap.type = ::getFileType(overlayPath.c_str()); oap.idmap = idmapPath; #if 0 ALOGD("Overlay added: targetPath=%s overlayPath=%s idmapPath=%s\n", - targetPath.string(), overlayPath.string(), idmapPath.string()); + targetPath.c_str(), overlayPath.c_str(), idmapPath.c_str()); #endif mAssetPaths.add(oap); *cookie = static_cast<int32_t>(mAssetPaths.size()); @@ -310,7 +311,7 @@ bool AssetManager::addAssetFd( ap.type = kFileTypeRegular; ap.assumeOwnership = assume_ownership; - ALOGV("In %p Asset fd %d name: %s", this, fd, ap.path.string()); + ALOGV("In %p Asset fd %d name: %s", this, fd, ap.path.c_str()); ssize_t apPos = mAssetPaths.add(ap); @@ -343,11 +344,11 @@ bool AssetManager::createIdmap(const char* targetApkPath, const char* overlayApk assets[i] = openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, ap); if (assets[i] == NULL) { - ALOGW("failed to find resources.arsc in %s\n", ap.path.string()); + ALOGW("failed to find resources.arsc in %s\n", ap.path.c_str()); goto exit; } if (tables[i].add(assets[i]) != NO_ERROR) { - ALOGW("failed to add %s to resource table", paths[i].string()); + ALOGW("failed to add %s to resource table", paths[i].c_str()); goto exit; } } @@ -367,7 +368,7 @@ bool AssetManager::addDefaultAssets() LOG_ALWAYS_FATAL_IF(root == NULL, "ANDROID_ROOT not set"); String8 path(root); - path.appendPath(kSystemAssets); + appendPath(path, kSystemAssets); return addAssetPath(path, NULL, false /* appAsLib */, true /* isSystemAsset */); } @@ -439,7 +440,7 @@ Asset* AssetManager::open(const char* fileName, AccessMode mode) LOG_FATAL_IF(mAssetPaths.size() == 0, "No assets added to AssetManager"); String8 assetName(kAssetsRoot); - assetName.appendPath(fileName); + appendPath(assetName, fileName); /* * For each top-level asset path, search for the asset. @@ -449,8 +450,8 @@ Asset* AssetManager::open(const char* fileName, AccessMode mode) while (i > 0) { i--; ALOGV("Looking for asset '%s' in '%s'\n", - assetName.string(), mAssetPaths.itemAt(i).path.string()); - Asset* pAsset = openNonAssetInPathLocked(assetName.string(), mode, + assetName.c_str(), mAssetPaths.itemAt(i).path.c_str()); + Asset* pAsset = openNonAssetInPathLocked(assetName.c_str(), mode, mAssetPaths.editItemAt(i)); if (pAsset != NULL) { return pAsset != kExcludedAsset ? pAsset : NULL; @@ -478,7 +479,7 @@ Asset* AssetManager::openNonAsset(const char* fileName, AccessMode mode, int32_t size_t i = mAssetPaths.size(); while (i > 0) { i--; - ALOGV("Looking for non-asset '%s' in '%s'\n", fileName, mAssetPaths.itemAt(i).path.string()); + ALOGV("Looking for non-asset '%s' in '%s'\n", fileName, mAssetPaths.itemAt(i).path.c_str()); Asset* pAsset = openNonAssetInPathLocked( fileName, mode, mAssetPaths.editItemAt(i)); if (pAsset != NULL) { @@ -500,7 +501,7 @@ Asset* AssetManager::openNonAsset(const int32_t cookie, const char* fileName, Ac if (which < mAssetPaths.size()) { ALOGV("Looking for non-asset '%s' in '%s'\n", fileName, - mAssetPaths.itemAt(which).path.string()); + mAssetPaths.itemAt(which).path.c_str()); Asset* pAsset = openNonAssetInPathLocked( fileName, mode, mAssetPaths.editItemAt(which)); if (pAsset != NULL) { @@ -546,10 +547,10 @@ bool AssetManager::appendPathToResTable(asset_path& ap, bool appAsLib) const { ResTable* sharedRes = NULL; bool shared = true; bool onlyEmptyResources = true; - ATRACE_NAME(ap.path.string()); + ATRACE_NAME(ap.path.c_str()); Asset* idmap = openIdmapLocked(ap); size_t nextEntryIdx = mResources->getTableCount(); - ALOGV("Looking for resource asset in '%s'\n", ap.path.string()); + ALOGV("Looking for resource asset in '%s'\n", ap.path.c_str()); if (ap.type != kFileTypeDirectory && ap.rawFd < 0) { if (nextEntryIdx == 0) { // The first item is typically the framework resources, @@ -565,7 +566,7 @@ bool AssetManager::appendPathToResTable(asset_path& ap, bool appAsLib) const { ass = const_cast<AssetManager*>(this)-> mZipSet.getZipResourceTableAsset(ap.path); if (ass == NULL) { - ALOGV("loading resource table %s\n", ap.path.string()); + ALOGV("loading resource table %s\n", ap.path.c_str()); ass = const_cast<AssetManager*>(this)-> openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, @@ -580,23 +581,23 @@ bool AssetManager::appendPathToResTable(asset_path& ap, bool appAsLib) const { // If this is the first resource table in the asset // manager, then we are going to cache it so that we // can quickly copy it out for others. - ALOGV("Creating shared resources for %s", ap.path.string()); + ALOGV("Creating shared resources for %s", ap.path.c_str()); sharedRes = new ResTable(); sharedRes->add(ass, idmap, nextEntryIdx + 1, false); #ifdef __ANDROID__ const char* data = getenv("ANDROID_DATA"); LOG_ALWAYS_FATAL_IF(data == NULL, "ANDROID_DATA not set"); String8 overlaysListPath(data); - overlaysListPath.appendPath(kResourceCache); - overlaysListPath.appendPath("overlays.list"); - addSystemOverlays(overlaysListPath.string(), ap.path, sharedRes, nextEntryIdx); + appendPath(overlaysListPath, kResourceCache); + appendPath(overlaysListPath, "overlays.list"); + addSystemOverlays(overlaysListPath.c_str(), ap.path, sharedRes, nextEntryIdx); #endif sharedRes = const_cast<AssetManager*>(this)-> mZipSet.setZipResourceTable(ap.path, sharedRes); } } } else { - ALOGV("loading resource table %s\n", ap.path.string()); + ALOGV("loading resource table %s\n", ap.path.c_str()); ass = const_cast<AssetManager*>(this)-> openNonAssetInPathLocked("resources.arsc", Asset::ACCESS_BUFFER, @@ -607,10 +608,10 @@ bool AssetManager::appendPathToResTable(asset_path& ap, bool appAsLib) const { if ((ass != NULL || sharedRes != NULL) && ass != kExcludedAsset) { ALOGV("Installing resource asset %p in to table %p\n", ass, mResources); if (sharedRes != NULL) { - ALOGV("Copying existing resources for %s", ap.path.string()); + ALOGV("Copying existing resources for %s", ap.path.c_str()); mResources->add(sharedRes, ap.isSystemAsset); } else { - ALOGV("Parsing resources for %s", ap.path.string()); + ALOGV("Parsing resources for %s", ap.path.c_str()); mResources->add(ass, idmap, nextEntryIdx + 1, !shared, appAsLib, ap.isSystemAsset); } onlyEmptyResources = false; @@ -692,9 +693,9 @@ Asset* AssetManager::openIdmapLocked(const struct asset_path& ap) const ass = const_cast<AssetManager*>(this)-> openAssetFromFileLocked(ap.idmap, Asset::ACCESS_BUFFER); if (ass) { - ALOGV("loading idmap %s\n", ap.idmap.string()); + ALOGV("loading idmap %s\n", ap.idmap.c_str()); } else { - ALOGW("failed to load idmap %s\n", ap.idmap.string()); + ALOGW("failed to load idmap %s\n", ap.idmap.c_str()); } } return ass; @@ -789,7 +790,7 @@ Asset* AssetManager::openNonAssetInPathLocked(const char* fileName, AccessMode m /* look at the filesystem on disk */ if (ap.type == kFileTypeDirectory) { String8 path(ap.path); - path.appendPath(fileName); + appendPath(path, fileName); pAsset = openAssetFromFileLocked(path, mode); @@ -811,10 +812,10 @@ Asset* AssetManager::openNonAssetInPathLocked(const char* fileName, AccessMode m /* check the appropriate Zip file */ ZipFileRO* pZip = getZipFileLocked(ap); if (pZip != NULL) { - ALOGV("GOT zip, checking NA '%s'", (const char*) path); - ZipEntryRO entry = pZip->findEntryByName(path.string()); + ALOGV("GOT zip, checking NA '%s'", path.c_str()); + ZipEntryRO entry = pZip->findEntryByName(path.c_str()); if (entry != NULL) { - ALOGV("FOUND NA in Zip file for %s", (const char*) path); + ALOGV("FOUND NA in Zip file for %s", path.c_str()); pAsset = openAssetFromZipLocked(pZip, entry, mode, path); pZip->releaseEntry(entry); } @@ -823,7 +824,7 @@ Asset* AssetManager::openNonAssetInPathLocked(const char* fileName, AccessMode m if (pAsset != NULL) { /* create a "source" name, for debug/display */ pAsset->setAssetSource( - createZipSourceNameLocked(ZipSet::getPathName(ap.path.string()), String8(""), + createZipSourceNameLocked(ZipSet::getPathName(ap.path.c_str()), String8(""), String8(fileName))); } } @@ -841,9 +842,9 @@ String8 AssetManager::createZipSourceNameLocked(const String8& zipFileName, sourceName.append(zipFileName); sourceName.append(":"); if (dirName.length() > 0) { - sourceName.appendPath(dirName); + appendPath(sourceName, dirName); } - sourceName.appendPath(fileName); + appendPath(sourceName, fileName); return sourceName; } @@ -853,7 +854,7 @@ String8 AssetManager::createZipSourceNameLocked(const String8& zipFileName, String8 AssetManager::createPathNameLocked(const asset_path& ap, const char* rootDir) { String8 path(ap.path); - if (rootDir != NULL) path.appendPath(rootDir); + if (rootDir != NULL) appendPath(path, rootDir); return path; } @@ -870,7 +871,7 @@ ZipFileRO* AssetManager::getZipFileLocked(asset_path& ap) } if (ap.rawFd < 0) { - ALOGV("getZipFileLocked: Creating new zip from path %s", ap.path.string()); + ALOGV("getZipFileLocked: Creating new zip from path %s", ap.path.c_str()); ap.zip = mZipSet.getSharedZip(ap.path); } else { ALOGV("getZipFileLocked: Creating new zip from fd %d", ap.rawFd); @@ -897,12 +898,12 @@ Asset* AssetManager::openAssetFromFileLocked(const String8& pathName, { Asset* pAsset = NULL; - if (strcasecmp(pathName.getPathExtension().string(), ".gz") == 0) { + if (strcasecmp(getPathExtension(pathName).c_str(), ".gz") == 0) { //printf("TRYING '%s'\n", (const char*) pathName); - pAsset = Asset::createFromCompressedFile(pathName.string(), mode); + pAsset = Asset::createFromCompressedFile(pathName.c_str(), mode); } else { //printf("TRYING '%s'\n", (const char*) pathName); - pAsset = Asset::createFromFile(pathName.string(), mode); + pAsset = Asset::createFromFile(pathName.c_str(), mode); } return pAsset; @@ -940,12 +941,12 @@ Asset* AssetManager::openAssetFromZipLocked(const ZipFileRO* pZipFile, if (method == ZipFileRO::kCompressStored) { pAsset = Asset::createFromUncompressedMap(std::move(*dataMap), mode); - ALOGV("Opened uncompressed entry %s in zip %s mode %d: %p", entryName.string(), + ALOGV("Opened uncompressed entry %s in zip %s mode %d: %p", entryName.c_str(), dataMap->file_name(), mode, pAsset.get()); } else { pAsset = Asset::createFromCompressedMap(std::move(*dataMap), static_cast<size_t>(uncompressedLen), mode); - ALOGV("Opened compressed entry %s in zip %s mode %d: %p", entryName.string(), + ALOGV("Opened compressed entry %s in zip %s mode %d: %p", entryName.c_str(), dataMap->file_name(), mode, pAsset.get()); } if (pAsset == NULL) { @@ -993,10 +994,10 @@ AssetDir* AssetManager::openDir(const char* dirName) i--; const asset_path& ap = mAssetPaths.itemAt(i); if (ap.type == kFileTypeRegular) { - ALOGV("Adding directory %s from zip %s", dirName, ap.path.string()); + ALOGV("Adding directory %s from zip %s", dirName, ap.path.c_str()); scanAndMergeZipLocked(pMergedInfo, ap, kAssetsRoot, dirName); } else { - ALOGV("Adding directory %s from dir %s", dirName, ap.path.string()); + ALOGV("Adding directory %s from dir %s", dirName, ap.path.c_str()); scanAndMergeDirLocked(pMergedInfo, ap, kAssetsRoot, dirName); } } @@ -1042,10 +1043,10 @@ AssetDir* AssetManager::openNonAssetDir(const int32_t cookie, const char* dirNam if (which < mAssetPaths.size()) { const asset_path& ap = mAssetPaths.itemAt(which); if (ap.type == kFileTypeRegular) { - ALOGV("Adding directory %s from zip %s", dirName, ap.path.string()); + ALOGV("Adding directory %s from zip %s", dirName, ap.path.c_str()); scanAndMergeZipLocked(pMergedInfo, ap, NULL, dirName); } else { - ALOGV("Adding directory %s from dir %s", dirName, ap.path.string()); + ALOGV("Adding directory %s from dir %s", dirName, ap.path.c_str()); scanAndMergeDirLocked(pMergedInfo, ap, NULL, dirName); } } @@ -1075,11 +1076,10 @@ bool AssetManager::scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMerg { assert(pMergedInfo != NULL); - //printf("scanAndMergeDir: %s %s %s\n", ap.path.string(), rootDir, dirName); + //printf("scanAndMergeDir: %s %s %s\n", ap.path.c_str(), rootDir, dirName); String8 path = createPathNameLocked(ap, rootDir); - if (dirName[0] != '\0') - path.appendPath(dirName); + if (dirName[0] != '\0') appendPath(path, dirName); SortedVector<AssetDir::FileInfo>* pContents = scanDirLocked(path); if (pContents == NULL) @@ -1100,7 +1100,7 @@ bool AssetManager::scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMerg const char* name; int nameLen; - name = pContents->itemAt(i).getFileName().string(); + name = pContents->itemAt(i).getFileName().c_str(); nameLen = strlen(name); if (nameLen > exclExtLen && strcmp(name + (nameLen - exclExtLen), kExcludeExtension) == 0) @@ -1111,8 +1111,8 @@ bool AssetManager::scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMerg matchIdx = AssetDir::FileInfo::findEntry(pMergedInfo, match); if (matchIdx > 0) { ALOGV("Excluding '%s' [%s]\n", - pMergedInfo->itemAt(matchIdx).getFileName().string(), - pMergedInfo->itemAt(matchIdx).getSourceName().string()); + pMergedInfo->itemAt(matchIdx).getFileName().c_str(), + pMergedInfo->itemAt(matchIdx).getSourceName().c_str()); pMergedInfo->removeAt(matchIdx); } else { //printf("+++ no match on '%s'\n", (const char*) match); @@ -1150,9 +1150,9 @@ SortedVector<AssetDir::FileInfo>* AssetManager::scanDirLocked(const String8& pat struct dirent* entry; FileType fileType; - ALOGV("Scanning dir '%s'\n", path.string()); + ALOGV("Scanning dir '%s'\n", path.c_str()); - dir = opendir(path.string()); + dir = opendir(path.c_str()); if (dir == NULL) return NULL; @@ -1176,7 +1176,7 @@ SortedVector<AssetDir::FileInfo>* AssetManager::scanDirLocked(const String8& pat fileType = kFileTypeUnknown; #else // stat the file - fileType = ::getFileType(path.appendPathCopy(entry->d_name).string()); + fileType = ::getFileType(appendPathCopy(path, entry->d_name).c_str()); #endif if (fileType != kFileTypeRegular && fileType != kFileTypeDirectory) @@ -1184,9 +1184,9 @@ SortedVector<AssetDir::FileInfo>* AssetManager::scanDirLocked(const String8& pat AssetDir::FileInfo info; info.set(String8(entry->d_name), fileType); - if (strcasecmp(info.getFileName().getPathExtension().string(), ".gz") == 0) - info.setFileName(info.getFileName().getBasePath()); - info.setSourceName(path.appendPathCopy(info.getFileName())); + if (strcasecmp(getPathExtension(info.getFileName()).c_str(), ".gz") == 0) + info.setFileName(getBasePath(info.getFileName())); + info.setSourceName(appendPathCopy(path, info.getFileName())); pContents->add(info); } @@ -1212,15 +1212,15 @@ bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMerg pZip = mZipSet.getZip(ap.path); if (pZip == NULL) { - ALOGW("Failure opening zip %s\n", ap.path.string()); + ALOGW("Failure opening zip %s\n", ap.path.c_str()); return false; } - zipName = ZipSet::getPathName(ap.path.string()); + zipName = ZipSet::getPathName(ap.path.c_str()); /* convert "sounds" to "rootDir/sounds" */ if (rootDir != NULL) dirName = rootDir; - dirName.appendPath(baseDirName); + appendPath(dirName, baseDirName); /* * Scan through the list of files, looking for a match. The files in @@ -1240,7 +1240,7 @@ bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMerg */ int dirNameLen = dirName.length(); void *iterationCookie; - if (!pZip->startIteration(&iterationCookie, dirName.string(), NULL)) { + if (!pZip->startIteration(&iterationCookie, dirName.c_str(), NULL)) { ALOGW("ZipFileRO::startIteration returned false"); return false; } @@ -1254,7 +1254,7 @@ bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMerg ALOGE("ARGH: name too long?\n"); continue; } - //printf("Comparing %s in %s?\n", nameBuf, dirName.string()); + //printf("Comparing %s in %s?\n", nameBuf, dirName.c_str()); if (dirNameLen == 0 || nameBuf[dirNameLen] == '/') { const char* cp; @@ -1269,13 +1269,13 @@ bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMerg if (nextSlash == NULL) { /* this is a file in the requested directory */ - info.set(String8(nameBuf).getPathLeaf(), kFileTypeRegular); + info.set(getPathLeaf(String8(nameBuf)), kFileTypeRegular); info.setSourceName( createZipSourceNameLocked(zipName, dirName, info.getFileName())); contents.add(info); - //printf("FOUND: file '%s'\n", info.getFileName().string()); + //printf("FOUND: file '%s'\n", info.getFileName().c_str()); } else { /* this is a subdir; add it if we don't already have it*/ String8 subdirName(cp, nextSlash - cp); @@ -1291,7 +1291,7 @@ bool AssetManager::scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMerg dirs.add(subdirName); } - //printf("FOUND: dir '%s'\n", subdirName.string()); + //printf("FOUND: dir '%s'\n", subdirName.c_str()); } } } @@ -1425,12 +1425,12 @@ AssetManager::SharedZip::SharedZip(const String8& path, time_t modWhen) mResourceTableAsset(NULL), mResourceTable(NULL) { if (kIsDebug) { - ALOGI("Creating SharedZip %p %s\n", this, (const char*)mPath); + ALOGI("Creating SharedZip %p %s\n", this, mPath.c_str()); } - ALOGV("+++ opening zip '%s'\n", mPath.string()); - mZipFile = ZipFileRO::open(mPath.string()); + ALOGV("+++ opening zip '%s'\n", mPath.c_str()); + mZipFile = ZipFileRO::open(mPath.c_str()); if (mZipFile == NULL) { - ALOGD("failed to open Zip archive '%s'\n", mPath.string()); + ALOGD("failed to open Zip archive '%s'\n", mPath.c_str()); } } @@ -1439,13 +1439,13 @@ AssetManager::SharedZip::SharedZip(int fd, const String8& path) mResourceTableAsset(NULL), mResourceTable(NULL) { if (kIsDebug) { - ALOGI("Creating SharedZip %p fd=%d %s\n", this, fd, (const char*)mPath); + ALOGI("Creating SharedZip %p fd=%d %s\n", this, fd, mPath.c_str()); } - ALOGV("+++ opening zip fd=%d '%s'\n", fd, mPath.string()); - mZipFile = ZipFileRO::openFd(fd, mPath.string()); + ALOGV("+++ opening zip fd=%d '%s'\n", fd, mPath.c_str()); + mZipFile = ZipFileRO::openFd(fd, mPath.c_str()); if (mZipFile == NULL) { ::close(fd); - ALOGD("failed to open Zip archive fd=%d '%s'\n", fd, mPath.string()); + ALOGD("failed to open Zip archive fd=%d '%s'\n", fd, mPath.c_str()); } } @@ -1453,7 +1453,7 @@ sp<AssetManager::SharedZip> AssetManager::SharedZip::get(const String8& path, bool createIfNotPresent) { AutoMutex _l(gLock); - time_t modWhen = getFileModDate(path); + time_t modWhen = getFileModDate(path.c_str()); sp<SharedZip> zip = gOpen.valueFor(path).promote(); if (zip != NULL && zip->mModWhen == modWhen) { return zip; @@ -1520,7 +1520,7 @@ ResTable* AssetManager::SharedZip::setResourceTable(ResTable* res) bool AssetManager::SharedZip::isUpToDate() { - time_t modWhen = getFileModDate(mPath.string()); + time_t modWhen = getFileModDate(mPath.c_str()); return mModWhen == modWhen; } @@ -1541,7 +1541,7 @@ bool AssetManager::SharedZip::getOverlay(size_t idx, asset_path* out) const AssetManager::SharedZip::~SharedZip() { if (kIsDebug) { - ALOGI("Destroying SharedZip %p %s\n", this, (const char*)mPath); + ALOGI("Destroying SharedZip %p %s\n", this, mPath.c_str()); } if (mResourceTable != NULL) { delete mResourceTable; @@ -1551,7 +1551,7 @@ AssetManager::SharedZip::~SharedZip() } if (mZipFile != NULL) { delete mZipFile; - ALOGV("Closed '%s'\n", mPath.string()); + ALOGV("Closed '%s'\n", mPath.c_str()); } } diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp index 68f5e4a88c7e..c712d01fe1c2 100644 --- a/libs/androidfw/AssetManager2.cpp +++ b/libs/androidfw/AssetManager2.cpp @@ -91,6 +91,12 @@ struct FindEntryResult { StringPoolRef entry_string_ref; }; +struct Theme::Entry { + ApkAssetsCookie cookie; + uint32_t type_spec_flags; + Res_value value; +}; + AssetManager2::AssetManager2() { memset(&configuration_, 0, sizeof(configuration_)); } @@ -900,14 +906,14 @@ std::string AssetManager2::GetLastResourceResolution() const { } log_stream << "\n\t" << prefix->second << ": " << apk_assets_[step.cookie]->GetDebugName(); - if (!step.config_name.isEmpty()) { + if (!step.config_name.empty()) { log_stream << " - " << step.config_name; } } log_stream << "\nBest matching is from " - << (last_resolution_.best_config_name.isEmpty() ? "default" - : last_resolution_.best_config_name) + << (last_resolution_.best_config_name.empty() ? "default" + : last_resolution_.best_config_name.c_str()) << " configuration of " << last_resolution_.best_package_name; return log_stream.str(); } @@ -1434,12 +1440,6 @@ Theme::Theme(AssetManager2* asset_manager) : asset_manager_(asset_manager) { Theme::~Theme() = default; -struct Theme::Entry { - ApkAssetsCookie cookie; - uint32_t type_spec_flags; - Res_value value; -}; - base::expected<std::monostate, NullOrIOError> Theme::ApplyStyle(uint32_t resid, bool force) { ATRACE_NAME("Theme::ApplyStyle"); diff --git a/libs/androidfw/BackupData.cpp b/libs/androidfw/BackupData.cpp index 76a430ee9f0e..fec0e772674d 100644 --- a/libs/androidfw/BackupData.cpp +++ b/libs/androidfw/BackupData.cpp @@ -106,8 +106,8 @@ BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize) k = key; } if (kIsDebug) { - ALOGD("Writing header: prefix='%s' key='%s' dataSize=%zu", m_keyPrefix.string(), - key.string(), dataSize); + ALOGD("Writing header: prefix='%s' key='%s' dataSize=%zu", m_keyPrefix.c_str(), + key.c_str(), dataSize); } entity_header_v1 header; @@ -128,7 +128,7 @@ BackupDataWriter::WriteEntityHeader(const String8& key, size_t dataSize) m_pos += amt; if (kIsDebug) ALOGI("writing entity header key, %zd bytes", keyLen+1); - amt = write(m_fd, k.string(), keyLen+1); + amt = write(m_fd, k.c_str(), keyLen+1); if (amt != keyLen+1) { m_status = errno; return m_status; diff --git a/libs/androidfw/BackupHelpers.cpp b/libs/androidfw/BackupHelpers.cpp index e80e9486c8b2..1a6a952492f6 100644 --- a/libs/androidfw/BackupHelpers.cpp +++ b/libs/androidfw/BackupHelpers.cpp @@ -30,6 +30,7 @@ #include <utime.h> #include <zlib.h> +#include <androidfw/PathUtils.h> #include <log/log.h> #include <utils/ByteOrder.h> #include <utils/KeyedVector.h> @@ -179,7 +180,7 @@ write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot) } // filename is not NULL terminated, but it is padded - amt = write(fd, name.string(), nameLen); + amt = write(fd, name.c_str(), nameLen); if (amt != nameLen) { ALOGW("write_snapshot_file error writing filename %s", strerror(errno)); return 1; @@ -203,7 +204,7 @@ write_snapshot_file(int fd, const KeyedVector<String8,FileRec>& snapshot) static int write_delete_file(BackupDataWriter* dataStream, const String8& key) { - LOGP("write_delete_file %s\n", key.string()); + LOGP("write_delete_file %s\n", key.c_str()); return dataStream->WriteEntityHeader(key, -1); } @@ -211,7 +212,7 @@ static int write_update_file(BackupDataWriter* dataStream, int fd, int mode, const String8& key, char const* realFilename) { - LOGP("write_update_file %s (%s) : mode 0%o\n", realFilename, key.string(), mode); + LOGP("write_update_file %s (%s) : mode 0%o\n", realFilename, key.c_str(), mode); const int bufsize = 4*1024; int err; @@ -365,7 +366,7 @@ back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD r.s.size = st.st_size; if (newSnapshot.indexOfKey(key) >= 0) { - LOGP("back_up_files key already in use '%s'", key.string()); + LOGP("back_up_files key already in use '%s'", key.c_str()); return -1; } @@ -390,30 +391,30 @@ back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD int cmp = p.compare(q); if (cmp < 0) { // file present in oldSnapshot, but not present in newSnapshot - LOGP("file removed: %s", p.string()); + LOGP("file removed: %s", p.c_str()); write_delete_file(dataStream, p); n++; } else if (cmp > 0) { // file added - LOGP("file added: %s crc=0x%08x", g.file.string(), g.s.crc32); - write_update_file(dataStream, q, g.file.string()); + LOGP("file added: %s crc=0x%08x", g.file.c_str(), g.s.crc32); + write_update_file(dataStream, q, g.file.c_str()); m++; } else { // same file exists in both old and new; check whether to update const FileState& f = oldSnapshot.valueAt(n); - LOGP("%s", q.string()); + LOGP("%s", q.c_str()); LOGP(" old: modTime=%d,%d mode=%04o size=%-3d crc32=0x%08x", f.modTime_sec, f.modTime_nsec, f.mode, f.size, f.crc32); LOGP(" new: modTime=%d,%d mode=%04o size=%-3d crc32=0x%08x", g.s.modTime_sec, g.s.modTime_nsec, g.s.mode, g.s.size, g.s.crc32); if (f.modTime_sec != g.s.modTime_sec || f.modTime_nsec != g.s.modTime_nsec || f.mode != g.s.mode || f.size != g.s.size || f.crc32 != g.s.crc32) { - int fd = open(g.file.string(), O_RDONLY); + int fd = open(g.file.c_str(), O_RDONLY); if (fd < 0) { - ALOGE("Unable to read file for backup: %s", g.file.string()); + ALOGE("Unable to read file for backup: %s", g.file.c_str()); } else { - write_update_file(dataStream, fd, g.s.mode, p, g.file.string()); + write_update_file(dataStream, fd, g.s.mode, p, g.file.c_str()); close(fd); } } @@ -432,7 +433,7 @@ back_up_files(int oldSnapshotFD, BackupDataWriter* dataStream, int newSnapshotFD while (m<M) { const String8& q = newSnapshot.keyAt(m); FileRec& g = newSnapshot.editValueAt(m); - write_update_file(dataStream, q, g.file.string()); + write_update_file(dataStream, q, g.file.c_str()); m++; } @@ -483,7 +484,7 @@ int write_tarfile(const String8& packageName, const String8& domain, BackupDataWriter* writer) { // In the output stream everything is stored relative to the root - const char* relstart = filepath.string() + rootpath.length(); + const char* relstart = filepath.c_str() + rootpath.length(); if (*relstart == '/') relstart++; // won't be true when path == rootpath String8 relpath(relstart); @@ -514,9 +515,9 @@ int write_tarfile(const String8& packageName, const String8& domain, int err = 0; struct stat64 s; - if (lstat64(filepath.string(), &s) != 0) { + if (lstat64(filepath.c_str(), &s) != 0) { err = errno; - ALOGE("Error %d (%s) from lstat64(%s)", err, strerror(err), filepath.string()); + ALOGE("Error %d (%s) from lstat64(%s)", err, strerror(err), filepath.c_str()); return err; } @@ -541,10 +542,10 @@ int write_tarfile(const String8& packageName, const String8& domain, // !!! TODO: use mmap when possible to avoid churning the buffer cache // !!! TODO: this will break with symlinks; need to use readlink(2) - int fd = open(filepath.string(), O_RDONLY); + int fd = open(filepath.c_str(), O_RDONLY); if (fd < 0) { err = errno; - ALOGE("Error %d (%s) from open(%s)", err, strerror(err), filepath.string()); + ALOGE("Error %d (%s) from open(%s)", err, strerror(err), filepath.c_str()); return err; } @@ -592,7 +593,7 @@ int write_tarfile(const String8& packageName, const String8& domain, } else if (S_ISREG(s.st_mode)) { type = '0'; // tar magic: '0' == normal file } else { - ALOGW("Error: unknown file mode 0%o [%s]", s.st_mode, filepath.string()); + ALOGW("Error: unknown file mode 0%o [%s]", s.st_mode, filepath.c_str()); goto cleanup; } buf[156] = type; @@ -606,30 +607,30 @@ int write_tarfile(const String8& packageName, const String8& domain, prefix += packageName; } if (domain.length() > 0) { - prefix.appendPath(domain); + appendPath(prefix, domain); } // pax extended means we don't put in a prefix field, and put a different // string in the basic name field. We can also construct the full path name // out of the substrings we've now built. fullname = prefix; - fullname.appendPath(relpath); + appendPath(fullname, relpath); // ustar: // [ 0 : 100 ]; file name/path // [ 345 : 155 ] filename path prefix // We only use the prefix area if fullname won't fit in the path if (fullname.length() > 100) { - strncpy(buf, relpath.string(), 100); - strncpy(buf + 345, prefix.string(), 155); + strncpy(buf, relpath.c_str(), 100); + strncpy(buf + 345, prefix.c_str(), 155); } else { - strncpy(buf, fullname.string(), 100); + strncpy(buf, fullname.c_str(), 100); } } // [ 329 : 8 ] and [ 337 : 8 ] devmajor/devminor, not used - ALOGI(" Name: %s", fullname.string()); + ALOGI(" Name: %s", fullname.c_str()); // If we're using a pax extended header, build & write that here; lengths are // already preflighted @@ -647,18 +648,18 @@ int write_tarfile(const String8& packageName, const String8& domain, // fullname was generated above with the ustar paths paxLen += write_pax_header_entry(paxData + paxLen, PAXDATA_SIZE - paxLen, - "path", fullname.string()); + "path", fullname.c_str()); // Now we know how big the pax data is // Now build the pax *header* templated on the ustar header memcpy(paxHeader, buf, 512); - String8 leaf = fullname.getPathLeaf(); + String8 leaf = getPathLeaf(fullname); memset(paxHeader, 0, 100); // rewrite the name area - snprintf(paxHeader, 100, "PaxHeader/%s", leaf.string()); + snprintf(paxHeader, 100, "PaxHeader/%s", leaf.c_str()); memset(paxHeader + 345, 0, 155); // rewrite the prefix area - strncpy(paxHeader + 345, prefix.string(), 155); + strncpy(paxHeader + 345, prefix.c_str(), 155); paxHeader[156] = 'x'; // mark it as a pax extended header @@ -691,12 +692,12 @@ int write_tarfile(const String8& packageName, const String8& domain, ssize_t nRead = read(fd, buf, toRead); if (nRead < 0) { err = errno; - ALOGE("Unable to read file [%s], err=%d (%s)", filepath.string(), + ALOGE("Unable to read file [%s], err=%d (%s)", filepath.c_str(), err, strerror(err)); break; } else if (nRead == 0) { ALOGE("EOF but expect %lld more bytes in [%s]", (long long) toWrite, - filepath.string()); + filepath.c_str()); err = EIO; break; } @@ -762,7 +763,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in) file_metadata_v1 metadata; amt = in->ReadEntityData(&metadata, sizeof(metadata)); if (amt != sizeof(metadata)) { - ALOGW("Could not read metadata for %s -- %ld / %s", filename.string(), + ALOGW("Could not read metadata for %s -- %ld / %s", filename.c_str(), (long)amt, strerror(errno)); return EIO; } @@ -779,9 +780,9 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in) // Write the file and compute the crc crc = crc32(0L, Z_NULL, 0); - fd = open(filename.string(), O_CREAT|O_RDWR|O_TRUNC, mode); + fd = open(filename.c_str(), O_CREAT|O_RDWR|O_TRUNC, mode); if (fd == -1) { - ALOGW("Could not open file %s -- %s", filename.string(), strerror(errno)); + ALOGW("Could not open file %s -- %s", filename.c_str(), strerror(errno)); return errno; } @@ -789,7 +790,7 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in) err = write(fd, buf, amt); if (err != amt) { close(fd); - ALOGW("Error '%s' writing '%s'", strerror(errno), filename.string()); + ALOGW("Error '%s' writing '%s'", strerror(errno), filename.c_str()); return errno; } crc = crc32(crc, (Bytef*)buf, amt); @@ -798,9 +799,9 @@ RestoreHelperBase::WriteFile(const String8& filename, BackupDataReader* in) close(fd); // Record for the snapshot - err = stat(filename.string(), &st); + err = stat(filename.c_str(), &st); if (err != 0) { - ALOGW("Error stating file that we just created %s", filename.string()); + ALOGW("Error stating file that we just created %s", filename.c_str()); return errno; } @@ -1104,9 +1105,9 @@ backup_helper_test_four() fprintf(stderr, "state %zu expected={%d/%d, %04o, 0x%08x, 0x%08x, %3zu} '%s'\n" " actual={%d/%d, %04o, 0x%08x, 0x%08x, %3d} '%s'\n", i, states[i].modTime_sec, states[i].modTime_nsec, states[i].mode, states[i].size, - states[i].crc32, name.length(), filenames[i].string(), + states[i].crc32, name.length(), filenames[i].c_str(), state.modTime_sec, state.modTime_nsec, state.mode, state.size, state.crc32, - state.nameLen, name.string()); + state.nameLen, name.c_str()); matched = false; } } @@ -1152,9 +1153,9 @@ test_write_header_and_entity(BackupDataWriter& writer, const char* str) return err; } - err = writer.WriteEntityData(text.string(), text.length()+1); + err = writer.WriteEntityData(text.c_str(), text.length()+1); if (err != 0) { - fprintf(stderr, "write failed for data '%s'\n", text.string()); + fprintf(stderr, "write failed for data '%s'\n", text.c_str()); return errno; } @@ -1230,7 +1231,7 @@ test_read_header_and_entity(BackupDataReader& reader, const char* str) goto finished; } if (string != str) { - fprintf(stderr, "ReadEntityHeader expected key '%s' got '%s'\n", str, string.string()); + fprintf(stderr, "ReadEntityHeader expected key '%s' got '%s'\n", str, string.c_str()); err = EINVAL; goto finished; } diff --git a/libs/androidfw/ConfigDescription.cpp b/libs/androidfw/ConfigDescription.cpp index cf2fd6f59b87..e08030c4cca5 100644 --- a/libs/androidfw/ConfigDescription.cpp +++ b/libs/androidfw/ConfigDescription.cpp @@ -905,7 +905,7 @@ std::string ConfigDescription::GetBcp47LanguageTag(bool canonicalize) const { std::string ConfigDescription::to_string() const { const String8 str = toString(); - return std::string(str.string(), str.size()); + return std::string(str.c_str(), str.size()); } bool ConfigDescription::Dominates(const ConfigDescription& o) const { diff --git a/libs/androidfw/CursorWindow.cpp b/libs/androidfw/CursorWindow.cpp index 2a6dc7b95c07..5e645cceea2d 100644 --- a/libs/androidfw/CursorWindow.cpp +++ b/libs/androidfw/CursorWindow.cpp @@ -84,7 +84,7 @@ status_t CursorWindow::maybeInflate() { String8 ashmemName("CursorWindow: "); ashmemName.append(mName); - ashmemFd = ashmem_create_region(ashmemName.string(), mInflatedSize); + ashmemFd = ashmem_create_region(ashmemName.c_str(), mInflatedSize); if (ashmemFd < 0) { PLOG(ERROR) << "Failed ashmem_create_region"; goto fail_silent; diff --git a/libs/androidfw/OWNERS b/libs/androidfw/OWNERS index 17f5164cf417..ef4cc46cb1c8 100644 --- a/libs/androidfw/OWNERS +++ b/libs/androidfw/OWNERS @@ -1,7 +1,6 @@ set noparent -toddke@google.com zyy@google.com patb@google.com per-file CursorWindow.cpp=omakoto@google.com -per-file LocaleDataTables.cpp=vichang@google.com,ngeoffray@google.com,nikitai@google.com +per-file LocaleDataTables.cpp=vichang@google.com,ngeoffray@google.com diff --git a/libs/androidfw/ObbFile.cpp b/libs/androidfw/ObbFile.cpp index 95332a35eb7d..c6a9632ee7b7 100644 --- a/libs/androidfw/ObbFile.cpp +++ b/libs/androidfw/ObbFile.cpp @@ -217,7 +217,7 @@ bool ObbFile::parseObbFile(int fd) free(scanBuf); #ifdef DEBUG - ALOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.string(), mVersion); + ALOGI("Obb scan succeeded: packageName=%s, version=%d\n", mPackageName.c_str(), mVersion); #endif return true; @@ -288,7 +288,7 @@ bool ObbFile::writeTo(int fd) return false; } - if (write(fd, mPackageName.string(), packageNameLen) != (ssize_t)packageNameLen) { + if (write(fd, mPackageName.c_str(), packageNameLen) != (ssize_t)packageNameLen) { ALOGW("couldn't write package name: %s\n", strerror(errno)); return false; } diff --git a/libs/androidfw/PathUtils.cpp b/libs/androidfw/PathUtils.cpp new file mode 100644 index 000000000000..df7a9f06781b --- /dev/null +++ b/libs/androidfw/PathUtils.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 <androidfw/PathUtils.h> + +#include <utils/Compat.h> + +namespace android { + +String8 getPathLeaf(const String8& str) { + const char* cp; + const char*const buf = str.c_str(); + + cp = strrchr(buf, OS_PATH_SEPARATOR); + if (cp == nullptr) + return str; + else + return String8(cp+1); +} + +String8 getPathDir(const String8& str8) { + const char* cp; + const char*const str = str8.c_str(); + + cp = strrchr(str, OS_PATH_SEPARATOR); + if (cp == nullptr) + return String8(); + else + return String8(str, cp - str); +} + +static char* findExtension(const String8& str8) { + const char* lastSlash; + const char* lastDot; + const char* const str = str8.c_str(); + + // only look at the filename + lastSlash = strrchr(str, OS_PATH_SEPARATOR); + if (lastSlash == nullptr) + lastSlash = str; + else + lastSlash++; + + // find the last dot + lastDot = strrchr(lastSlash, '.'); + if (lastDot == nullptr) + return nullptr; + + // looks good, ship it + return const_cast<char*>(lastDot); +} + +String8 getPathExtension(const String8& str) { + char* ext; + + ext = findExtension(str); + if (ext != nullptr) + return String8(ext); + else + return String8(); +} + +String8 getBasePath(const String8& str8) { + char* ext; + const char* const str = str8.c_str(); + + ext = findExtension(str8); + if (ext == nullptr) + return str8; + else + return String8(str, ext - str); +} + +static void setPathName(String8& s, const char* name) { + size_t len = strlen(name); + char* buf = s.lockBuffer(len); + + memcpy(buf, name, len); + + // remove trailing path separator, if present + if (len > 0 && buf[len - 1] == OS_PATH_SEPARATOR) len--; + buf[len] = '\0'; + + s.unlockBuffer(len); +} + +String8& appendPath(String8& str, const char* name) { + // TODO: The test below will fail for Win32 paths. Fix later or ignore. + if (name[0] != OS_PATH_SEPARATOR) { + if (*name == '\0') { + // nothing to do + return str; + } + + size_t len = str.length(); + if (len == 0) { + // no existing filename, just use the new one + setPathName(str, name); + return str; + } + + // make room for oldPath + '/' + newPath + int newlen = strlen(name); + + char* buf = str.lockBuffer(len+1+newlen); + + // insert a '/' if needed + if (buf[len-1] != OS_PATH_SEPARATOR) + buf[len++] = OS_PATH_SEPARATOR; + + memcpy(buf+len, name, newlen+1); + len += newlen; + + str.unlockBuffer(len); + return str; + } else { + setPathName(str, name); + return str; + } +} + +} // namespace android diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 29d33da6b2f7..c13827fe29c3 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -1042,7 +1042,7 @@ base::expected<size_t, NullOrIOError> ResStringPool::indexOfString(const char16_ if ((mHeader->flags&ResStringPool_header::UTF8_FLAG) != 0) { if (kDebugStringPoolNoisy) { - ALOGI("indexOfString UTF-8: %s", String8(str, strLen).string()); + ALOGI("indexOfString UTF-8: %s", String8(str, strLen).c_str()); } // The string pool contains UTF 8 strings; we don't want to cause @@ -1103,7 +1103,7 @@ base::expected<size_t, NullOrIOError> ResStringPool::indexOfString(const char16_ ALOGI("Looking at %s, i=%d\n", s->data(), i); } if (str8Len == s->size() - && memcmp(s->data(), str8.string(), str8Len) == 0) { + && memcmp(s->data(), str8.c_str(), str8Len) == 0) { if (kDebugStringPoolNoisy) { ALOGI("MATCH!"); } @@ -1115,7 +1115,7 @@ base::expected<size_t, NullOrIOError> ResStringPool::indexOfString(const char16_ } else { if (kDebugStringPoolNoisy) { - ALOGI("indexOfString UTF-16: %s", String8(str, strLen).string()); + ALOGI("indexOfString UTF-16: %s", String8(str, strLen).c_str()); } if (mHeader->flags&ResStringPool_header::SORTED_FLAG) { @@ -1133,7 +1133,7 @@ base::expected<size_t, NullOrIOError> ResStringPool::indexOfString(const char16_ int c = s.has_value() ? strzcmp16(s->data(), s->size(), str, strLen) : -1; if (kDebugStringPoolNoisy) { ALOGI("Looking at %s, cmp=%d, l/mid/h=%d/%d/%d\n", - String8(s->data(), s->size()).string(), c, (int)l, (int)mid, (int)h); + String8(s->data(), s->size()).c_str(), c, (int)l, (int)mid, (int)h); } if (c == 0) { if (kDebugStringPoolNoisy) { @@ -1157,7 +1157,7 @@ base::expected<size_t, NullOrIOError> ResStringPool::indexOfString(const char16_ return base::unexpected(s.error()); } if (kDebugStringPoolNoisy) { - ALOGI("Looking at %s, i=%d\n", String8(s->data(), s->size()).string(), i); + ALOGI("Looking at %s, i=%d\n", String8(s->data(), s->size()).c_str(), i); } if (s.has_value() && strLen == s->size() && strzcmp16(s->data(), s->size(), str, strLen) == 0) { @@ -1525,8 +1525,8 @@ ssize_t ResXMLParser::indexOfAttribute(const char* ns, const char* attr) const { String16 nsStr(ns != NULL ? ns : ""); String16 attrStr(attr); - return indexOfAttribute(ns ? nsStr.string() : NULL, ns ? nsStr.size() : 0, - attrStr.string(), attrStr.size()); + return indexOfAttribute(ns ? nsStr.c_str() : NULL, ns ? nsStr.size() : 0, + attrStr.c_str(), attrStr.size()); } ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, @@ -1544,8 +1544,8 @@ ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, } attr8 = String8(attr, attrLen); if (kDebugStringPoolNoisy) { - ALOGI("indexOfAttribute UTF8 %s (%zu) / %s (%zu)", ns8.string(), nsLen, - attr8.string(), attrLen); + ALOGI("indexOfAttribute UTF8 %s (%zu) / %s (%zu)", ns8.c_str(), nsLen, + attr8.c_str(), attrLen); } for (size_t i=0; i<N; i++) { size_t curNsLen = 0, curAttrLen = 0; @@ -1555,7 +1555,7 @@ ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, ALOGI(" curNs=%s (%zu), curAttr=%s (%zu)", curNs, curNsLen, curAttr, curAttrLen); } if (curAttr != NULL && curNsLen == nsLen && curAttrLen == attrLen - && memcmp(attr8.string(), curAttr, attrLen) == 0) { + && memcmp(attr8.c_str(), curAttr, attrLen) == 0) { if (ns == NULL) { if (curNs == NULL) { if (kDebugStringPoolNoisy) { @@ -1565,8 +1565,8 @@ ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, } } else if (curNs != NULL) { //printf(" --> ns=%s, curNs=%s\n", - // String8(ns).string(), String8(curNs).string()); - if (memcmp(ns8.string(), curNs, nsLen) == 0) { + // String8(ns).c_str(), String8(curNs).c_str()); + if (memcmp(ns8.c_str(), curNs, nsLen) == 0) { if (kDebugStringPoolNoisy) { ALOGI(" FOUND!"); } @@ -1578,8 +1578,8 @@ ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, } else { if (kDebugStringPoolNoisy) { ALOGI("indexOfAttribute UTF16 %s (%zu) / %s (%zu)", - String8(ns, nsLen).string(), nsLen, - String8(attr, attrLen).string(), attrLen); + String8(ns, nsLen).c_str(), nsLen, + String8(attr, attrLen).c_str(), attrLen); } for (size_t i=0; i<N; i++) { size_t curNsLen = 0, curAttrLen = 0; @@ -1587,8 +1587,8 @@ ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, const char16_t* curAttr = getAttributeName(i, &curAttrLen); if (kDebugStringPoolNoisy) { ALOGI(" curNs=%s (%zu), curAttr=%s (%zu)", - String8(curNs, curNsLen).string(), curNsLen, - String8(curAttr, curAttrLen).string(), curAttrLen); + String8(curNs, curNsLen).c_str(), curNsLen, + String8(curAttr, curAttrLen).c_str(), curAttrLen); } if (curAttr != NULL && curNsLen == nsLen && curAttrLen == attrLen && (memcmp(attr, curAttr, attrLen*sizeof(char16_t)) == 0)) { @@ -1601,7 +1601,7 @@ ssize_t ResXMLParser::indexOfAttribute(const char16_t* ns, size_t nsLen, } } else if (curNs != NULL) { //printf(" --> ns=%s, curNs=%s\n", - // String8(ns).string(), String8(curNs).string()); + // String8(ns).c_str(), String8(curNs).c_str()); if (memcmp(ns, curNs, nsLen*sizeof(char16_t)) == 0) { if (kDebugStringPoolNoisy) { ALOGI(" FOUND!"); @@ -4458,7 +4458,7 @@ bool ResTable::getResourceName(uint32_t resID, bool allowUtf8, resource_name* ou return false; } - outName->package = grp->name.string(); + outName->package = grp->name.c_str(); outName->packageLen = grp->name.size(); if (allowUtf8) { outName->type8 = UnpackOptionalString(entry.typeStr.string8(), &outName->typeLen); @@ -4558,7 +4558,7 @@ ssize_t ResTable::getResource(uint32_t resID, Res_value* outValue, bool mayBeBag outValue->dataType, outValue->dataType == Res_value::TYPE_STRING ? String8(UnpackOptionalString( - entry.package->header->values.stringAt(outValue->data), &len)).string() : + entry.package->header->values.stringAt(outValue->data), &len)).c_str() : "", outValue->data); } @@ -4927,7 +4927,7 @@ void ResTable::setParameters(const ResTable_config* params) AutoMutex _lock2(mFilteredConfigLock); if (kDebugTableGetEntry) { - ALOGI("Setting parameters: %s\n", params->toString().string()); + ALOGI("Setting parameters: %s\n", params->toString().c_str()); } mParams = *params; for (size_t p = 0; p < mPackageGroups.size(); p++) { @@ -5038,7 +5038,7 @@ nope: if (name[1] == 'i' && name[2] == 'n' && name[3] == 'd' && name[4] == 'e' && name[5] == 'x' && name[6] == '_') { - int index = atoi(String8(name + 7, nameLen - 7).string()); + int index = atoi(String8(name + 7, nameLen - 7).c_str()); if (Res_CHECKID(index)) { ALOGW("Array resource index: %d is too large.", index); @@ -5104,9 +5104,9 @@ nope: if (kDebugTableNoisy) { printf("Looking for identifier: type=%s, name=%s, package=%s\n", - String8(type, typeLen).string(), - String8(name, nameLen).string(), - String8(package, packageLen).string()); + String8(type, typeLen).c_str(), + String8(name, nameLen).c_str(), + String8(package, packageLen).c_str()); } const String16 attr("attr"); @@ -5117,9 +5117,9 @@ nope: const PackageGroup* group = mPackageGroups[ig]; if (strzcmp16(package, packageLen, - group->name.string(), group->name.size())) { + group->name.c_str(), group->name.size())) { if (kDebugTableNoisy) { - printf("Skipping package group: %s\n", String8(group->name).string()); + printf("Skipping package group: %s\n", String8(group->name).c_str()); } continue; } @@ -5144,8 +5144,8 @@ nope: } return identifier; } - } while (strzcmp16(attr.string(), attr.size(), targetType, targetTypeLen) == 0 - && (targetType = attrPrivate.string()) + } while (strzcmp16(attr.c_str(), attr.size(), targetType, targetTypeLen) == 0 + && (targetType = attrPrivate.c_str()) && (targetTypeLen = attrPrivate.size()) ); } @@ -5253,19 +5253,19 @@ bool ResTable::expandResourceRef(const char16_t* refStr, size_t refLen, *outType = *defType; } *outName = String16(p, end-p); - if(**outPackage == 0) { + if(outPackage->empty()) { if(outErrorMsg) { *outErrorMsg = "Resource package cannot be an empty string"; } return false; } - if(**outType == 0) { + if(outType->empty()) { if(outErrorMsg) { *outErrorMsg = "Resource type cannot be an empty string"; } return false; } - if(**outName == 0) { + if(outName->empty()) { if(outErrorMsg) { *outErrorMsg = "Resource id cannot be an empty string"; } @@ -5564,7 +5564,7 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, } } - //printf("Value for: %s\n", String8(s, len).string()); + //printf("Value for: %s\n", String8(s, len).c_str()); uint32_t l10nReq = ResTable_map::L10N_NOT_REQUIRED; uint32_t attrMin = 0x80000000, attrMax = 0x7fffffff; @@ -5619,7 +5619,7 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, // be to any other type; we just need to count on the client making // sure the referenced type is correct. - //printf("Looking up ref: %s\n", String8(s, len).string()); + //printf("Looking up ref: %s\n", String8(s, len).c_str()); // It's a reference! if (len == 5 && s[1]=='n' && s[2]=='u' && s[3]=='l' && s[4]=='l') { @@ -5659,8 +5659,8 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, } uint32_t specFlags = 0; - uint32_t rid = identifierForName(name.string(), name.size(), type.string(), - type.size(), package.string(), package.size(), &specFlags); + uint32_t rid = identifierForName(name.c_str(), name.size(), type.c_str(), + type.size(), package.c_str(), package.size(), &specFlags); if (rid != 0) { if (enforcePrivate) { if (accessor == NULL || accessor->getAssetsPackage() != package) { @@ -5679,8 +5679,8 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, Res_GETTYPE(rid), Res_GETENTRY(rid)); if (kDebugTableNoisy) { ALOGI("Incl %s:%s/%s: 0x%08x\n", - String8(package).string(), String8(type).string(), - String8(name).string(), rid); + String8(package).c_str(), String8(type).c_str(), + String8(name).c_str(), rid); } } @@ -5698,8 +5698,8 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, if (rid != 0) { if (kDebugTableNoisy) { ALOGI("Pckg %s:%s/%s: 0x%08x\n", - String8(package).string(), String8(type).string(), - String8(name).string(), rid); + String8(package).c_str(), String8(type).c_str(), + String8(name).c_str(), rid); } uint32_t packageId = Res_GETPACKAGE(rid) + 1; if (packageId == 0x00) { @@ -5788,7 +5788,7 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, } } else { outValue->data = color; - //printf("Color input=%s, output=0x%x\n", String8(s, len).string(), color); + //printf("Color input=%s, output=0x%x\n", String8(s, len).c_str(), color); return true; } } else { @@ -5800,8 +5800,8 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, #if 0 fprintf(stderr, "%s: Color ID %s value %s is not valid\n", "Resource File", //(const char*)in->getPrintableSource(), - String8(*curTag).string(), - String8(s, len).string()); + String8(*curTag).c_str(), + String8(s, len).c_str()); #endif return false; } @@ -5815,7 +5815,7 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, // be to any other type; we just need to count on the client making // sure the referenced type is correct. - //printf("Looking up attr: %s\n", String8(s, len).string()); + //printf("Looking up attr: %s\n", String8(s, len).c_str()); static const String16 attr16("attr"); String16 package, type, name; @@ -5828,13 +5828,13 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, } //printf("Pkg: %s, Type: %s, Name: %s\n", - // String8(package).string(), String8(type).string(), - // String8(name).string()); + // String8(package).c_str(), String8(type).c_str(), + // String8(name).c_str()); uint32_t specFlags = 0; uint32_t rid = - identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size(), &specFlags); + identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size(), &specFlags); if (rid != 0) { if (enforcePrivate) { if ((specFlags&ResTable_typeSpec::SPEC_PUBLIC) == 0) { @@ -5992,8 +5992,8 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, if (getResourceName(bag->map.name.ident, false, &rname)) { #if 0 printf("Matching %s against %s (0x%08x)\n", - String8(s, len).string(), - String8(rname.name, rname.nameLen).string(), + String8(s, len).c_str(), + String8(rname.name, rname.nameLen).c_str(), bag->map.name.ident); #endif if (strzcmp16(s, len, rname.name, rname.nameLen) == 0) { @@ -6036,7 +6036,7 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, while (pos < end && *pos != '|') { pos++; } - //printf("Looking for: %s\n", String8(start, pos-start).string()); + //printf("Looking for: %s\n", String8(start, pos-start).c_str()); const bag_entry* bagi = bag; ssize_t i; for (i=0; i<cnt; i++, bagi++) { @@ -6045,8 +6045,8 @@ bool ResTable::stringToValue(Res_value* outValue, String16* outString, if (getResourceName(bagi->map.name.ident, false, &rname)) { #if 0 printf("Matching %s against %s (0x%08x)\n", - String8(start,pos-start).string(), - String8(rname.name, rname.nameLen).string(), + String8(start,pos-start).c_str(), + String8(rname.name, rname.nameLen).c_str(), bagi->map.name.ident); #endif if (strzcmp16(start, pos-start, rname.name, rname.nameLen) == 0) { @@ -6229,13 +6229,13 @@ bool ResTable::collectString(String16* outString, if (append) { outString->append(tmp); } else { - outString->setTo(tmp); + *outString = tmp; } } else { if (append) { outString->append(String16(s, len)); } else { - outString->setTo(s, len); + *outString = String16(s, len); } } @@ -6373,7 +6373,7 @@ void ResTable::getConfigurations(Vector<ResTable_config>* configs, bool ignoreMi } static bool compareString8AndCString(const String8& str, const char* cStr) { - return strcmp(str.string(), cStr) < 0; + return strcmp(str.c_str(), cStr) < 0; } void ResTable::getLocales(Vector<String8>* locales, bool includeSystemLocales, @@ -6387,7 +6387,7 @@ void ResTable::getLocales(Vector<String8>* locales, bool includeSystemLocales, const auto endIter = locales->end(); auto iter = std::lower_bound(beginIter, endIter, locale, compareString8AndCString); - if (iter == endIter || strcmp(iter->string(), locale) != 0) { + if (iter == endIter || strcmp(iter->c_str(), locale) != 0) { locales->insertAt(String8(locale), std::distance(beginIter, iter)); } }); @@ -6984,7 +6984,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, ResTable_config thisConfig; thisConfig.copyFromDtoH(type->config); ALOGI("Adding config to type %d: %s\n", type->id, - thisConfig.toString().string()); + thisConfig.toString().c_str()); } } } else { @@ -7061,7 +7061,7 @@ status_t DynamicRefTable::load(const ResTable_lib_header* const header) char16_t tmpName[sizeof(entry->packageName) / sizeof(char16_t)]; strcpy16_dtoh(tmpName, entry->packageName, sizeof(entry->packageName) / sizeof(char16_t)); if (kDebugLibNoisy) { - ALOGV("Found lib entry %s with id %d\n", String8(tmpName).string(), + ALOGV("Found lib entry %s with id %d\n", String8(tmpName).c_str(), dtohl(entry->packageId)); } if (packageId >= 256) { @@ -7340,7 +7340,7 @@ status_t ResTable::createIdmap(const ResTable& targetResTable, current_res.nameLen, current_res.type, current_res.typeLen, - targetPackageName.string(), + targetPackageName.c_str(), targetPackageName.size(), &typeSpecFlags); @@ -7438,16 +7438,16 @@ bool ResTable::getIdmapInfo(const void* idmap, size_t sizeBytes, *pOverlayCrc = dtohl(map[3]); } if (pTargetPath) { - pTargetPath->setTo(reinterpret_cast<const char*>(map + 4)); + *pTargetPath = reinterpret_cast<const char*>(map + 4); } if (pOverlayPath) { - pOverlayPath->setTo(reinterpret_cast<const char*>(map + 4 + 256 / sizeof(uint32_t))); + *pOverlayPath = reinterpret_cast<const char*>(map + 4 + 256 / sizeof(uint32_t)); } return true; } -#define CHAR16_TO_CSTR(c16, len) (String8(String16(c16,len)).string()) +#define CHAR16_TO_CSTR(c16, len) (String8(String16(c16,len)).c_str()) #define CHAR16_ARRAY_EQ(constant, var, len) \ (((len) == (sizeof(constant)/sizeof((constant)[0]))) && (0 == memcmp((var), (constant), (len)))) @@ -7542,13 +7542,13 @@ void ResTable::print_value(const Package* pkg, const Res_value& value) const const char* str8 = UnpackOptionalString(pkg->header->values.string8At( value.data), &len); if (str8 != NULL) { - printf("(string8) \"%s\"\n", normalizeForOutput(str8).string()); + printf("(string8) \"%s\"\n", normalizeForOutput(str8).c_str()); } else { const char16_t* str16 = UnpackOptionalString(pkg->header->values.stringAt( value.data), &len); if (str16 != NULL) { printf("(string16) \"%s\"\n", - normalizeForOutput(String8(str16, len).string()).string()); + normalizeForOutput(String8(str16, len).c_str()).c_str()); } else { printf("(string) null\n"); } @@ -7589,7 +7589,7 @@ void ResTable::print(bool inclValues) const const PackageGroup* pg = mPackageGroups[pgIndex]; printf("Package Group %d id=0x%02x packageCount=%d name=%s\n", (int)pgIndex, pg->id, (int)pg->packages.size(), - String8(pg->name).string()); + String8(pg->name).c_str()); const KeyedVector<String16, uint8_t>& refEntries = pg->dynamicRefTable.entries(); const size_t refEntryCount = refEntries.size(); @@ -7598,7 +7598,7 @@ void ResTable::print(bool inclValues) const for (size_t refIndex = 0; refIndex < refEntryCount; refIndex++) { printf(" 0x%02x -> %s\n", refEntries.valueAt(refIndex), - String8(refEntries.keyAt(refIndex)).string()); + String8(refEntries.keyAt(refIndex)).c_str()); } printf("\n"); } @@ -7624,7 +7624,7 @@ void ResTable::print(bool inclValues) const strcpy16_dtoh(tmpName, pkg->package->name, sizeof(pkg->package->name)/sizeof(pkg->package->name[0])); printf(" Package %d id=0x%02x name=%s\n", (int)pkgIndex, - pkg->package->id, String8(tmpName).string()); + pkg->package->id, String8(tmpName).c_str()); } for (size_t typeIndex = 0; typeIndex < pg->types.size(); typeIndex++) { @@ -7666,7 +7666,7 @@ void ResTable::print(bool inclValues) const printf(" spec resource 0x%08x %s:%s/%s: flags=0x%08x\n", resID, CHAR16_TO_CSTR(resName.package, resName.packageLen), - type8.string(), name8.string(), + type8.c_str(), name8.c_str(), dtohl(typeConfigs->typeSpecFlags[entryIndex])); } else { printf(" INVALID TYPE CONFIG FOR RESOURCE 0x%08x\n", resID); @@ -7687,7 +7687,7 @@ void ResTable::print(bool inclValues) const String8 configStr = thisConfig.toString(); printf(" config %s", configStr.size() > 0 - ? configStr.string() : "(default)"); + ? configStr.c_str() : "(default)"); if (type->flags != 0u) { printf(" flags=0x%02x", type->flags); if (type->flags & ResTable_type::FLAG_SPARSE) { @@ -7761,7 +7761,7 @@ void ResTable::print(bool inclValues) const } printf(" resource 0x%08x %s:%s/%s: ", resID, CHAR16_TO_CSTR(resName.package, resName.packageLen), - type8.string(), name8.string()); + type8.c_str(), name8.c_str()); } else { printf(" INVALID RESOURCE 0x%08x: ", resID); } diff --git a/libs/androidfw/include/androidfw/Asset.h b/libs/androidfw/include/androidfw/Asset.h index 19febcdee77e..f3776b5401f3 100644 --- a/libs/androidfw/include/androidfw/Asset.h +++ b/libs/androidfw/include/androidfw/Asset.h @@ -135,7 +135,7 @@ public: * This is NOT intended to be used for anything except debug output. * DO NOT try to parse this or use it to open a file. */ - const char* getAssetSource(void) const { return mAssetSource.string(); } + const char* getAssetSource(void) const { return mAssetSource.c_str(); } /* * Create the asset from a file descriptor. diff --git a/libs/androidfw/include/androidfw/ConfigDescription.h b/libs/androidfw/include/androidfw/ConfigDescription.h index 7fbd7c08ea69..83a80ced855b 100644 --- a/libs/androidfw/include/androidfw/ConfigDescription.h +++ b/libs/androidfw/include/androidfw/ConfigDescription.h @@ -213,7 +213,7 @@ inline bool ConfigDescription::operator>(const ConfigDescription& o) const { inline ::std::ostream& operator<<(::std::ostream& out, const ConfigDescription& o) { - return out << o.toString().string(); + return out << o.toString().c_str(); } } // namespace android diff --git a/libs/androidfw/include/androidfw/ObbFile.h b/libs/androidfw/include/androidfw/ObbFile.h index 3dbf997dc367..38ece5c1546f 100644 --- a/libs/androidfw/include/androidfw/ObbFile.h +++ b/libs/androidfw/include/androidfw/ObbFile.h @@ -43,10 +43,6 @@ public: bool removeFrom(const char* filename); bool removeFrom(int fd); - const char* getFileName() const { - return mFileName; - } - const String8 getPackageName() const { return mPackageName; } @@ -127,8 +123,6 @@ private: /* The encryption salt. */ unsigned char mSalt[8]; - const char* mFileName; - size_t mFooterStart; bool parseObbFile(int fd); diff --git a/libs/androidfw/include_pathutils/androidfw/PathUtils.h b/libs/androidfw/include_pathutils/androidfw/PathUtils.h new file mode 100644 index 000000000000..4debe8d8da6d --- /dev/null +++ b/libs/androidfw/include_pathutils/androidfw/PathUtils.h @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <utils/String8.h> + +/* This library contains path manipulation functions that are used only by androidfw and aapt. + * When it's possible, migrate all uses to std::filesystem::path. + */ + +namespace android { + +/** + * Get just the filename component. + * + * DEPRECATED: use std::filesystem::path::filename + * + * "/tmp/foo/bar.c" --> "bar.c" + */ +String8 getPathLeaf(const String8& str); + +/** + * Remove the last (file name) component, leaving just the directory + * name. + * + * DEPRECATED: use std::filesystem::path::parent_path + * + * "/tmp/foo/bar.c" --> "/tmp/foo" + * "/tmp" --> "" // ????? shouldn't this be "/" ???? XXX + * "bar.c" --> "" + */ +String8 getPathDir(const String8& str); + +/** + * Return the filename extension. This is the last '.' and any number + * of characters that follow it. The '.' is included in case we + * decide to expand our definition of what constitutes an extension. + * + * DEPRECATED: use std::filesystem::path::extension + * + * "/tmp/foo/bar.c" --> ".c" + * "/tmp" --> "" + * "/tmp/foo.bar/baz" --> "" + * "foo.jpeg" --> ".jpeg" + * "foo." --> "" + */ +String8 getPathExtension(const String8& str); + +/** + * Return the path without the extension. Rules for what constitutes + * an extension are described in the comment for getPathExtension(). + * + * DEPRECATED: use std::filesystem::path::stem and std::filesystem::path::parent_path + * + * "/tmp/foo/bar.c" --> "/tmp/foo/bar" + */ +String8 getBasePath(const String8& str); + +/** + * Add a component to the pathname. We guarantee that there is + * exactly one path separator between the old path and the new. + * If there is no existing name, we just copy the new name in. + * + * DEPRECATED: use std::filesystem::path::operator/= + * + * If leaf is a fully qualified path (i.e. starts with '/', it + * replaces whatever was there before. + */ +String8& appendPath(String8& str, const char* leaf); +inline String8& appendPath(String8& str, const String8& leaf) { + return appendPath(str, leaf.c_str()); +} + +/** + * Like appendPath(), but does not affect this string. Returns a new one instead. + * + * DEPRECATED: use std::filesystem::operator/ + */ +inline String8 appendPathCopy(String8 str, const char* leaf) { return appendPath(str, leaf); } +inline String8 appendPathCopy(String8 str, const String8& leaf) { + return appendPath(str, leaf.c_str()); +} + +} // namespace android diff --git a/libs/androidfw/tests/BackupData_test.cpp b/libs/androidfw/tests/BackupData_test.cpp index e25b616dcbd9..7d3a3411d81d 100644 --- a/libs/androidfw/tests/BackupData_test.cpp +++ b/libs/androidfw/tests/BackupData_test.cpp @@ -56,10 +56,10 @@ protected: mFilename.append(m_external_storage); mFilename.append(TEST_FILENAME); - ::unlink(mFilename.string()); - int fd = ::open(mFilename.string(), O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + ::unlink(mFilename.c_str()); + int fd = ::open(mFilename.c_str(), O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (fd < 0) { - FAIL() << "Couldn't create " << mFilename.string() << " for writing"; + FAIL() << "Couldn't create " << mFilename.c_str() << " for writing"; } mKey1 = String8(KEY1); mKey2 = String8(KEY2); @@ -72,7 +72,7 @@ protected: }; TEST_F(BackupDataTest, WriteAndReadSingle) { - int fd = ::open(mFilename.string(), O_WRONLY); + int fd = ::open(mFilename.c_str(), O_WRONLY); BackupDataWriter* writer = new BackupDataWriter(fd); EXPECT_EQ(NO_ERROR, writer->WriteEntityHeader(mKey1, sizeof(DATA1))) @@ -81,7 +81,7 @@ TEST_F(BackupDataTest, WriteAndReadSingle) { << "WriteEntityData returned an error"; ::close(fd); - fd = ::open(mFilename.string(), O_RDONLY); + fd = ::open(mFilename.c_str(), O_RDONLY); BackupDataReader* reader = new BackupDataReader(fd); EXPECT_EQ(NO_ERROR, reader->Status()) << "Reader ctor failed"; @@ -114,7 +114,7 @@ TEST_F(BackupDataTest, WriteAndReadSingle) { } TEST_F(BackupDataTest, WriteAndReadMultiple) { - int fd = ::open(mFilename.string(), O_WRONLY); + int fd = ::open(mFilename.c_str(), O_WRONLY); BackupDataWriter* writer = new BackupDataWriter(fd); writer->WriteEntityHeader(mKey1, sizeof(DATA1)); writer->WriteEntityData(DATA1, sizeof(DATA1)); @@ -122,7 +122,7 @@ TEST_F(BackupDataTest, WriteAndReadMultiple) { writer->WriteEntityData(DATA2, sizeof(DATA2)); ::close(fd); - fd = ::open(mFilename.string(), O_RDONLY); + fd = ::open(mFilename.c_str(), O_RDONLY); BackupDataReader* reader = new BackupDataReader(fd); bool done; @@ -162,7 +162,7 @@ TEST_F(BackupDataTest, WriteAndReadMultiple) { } TEST_F(BackupDataTest, SkipEntity) { - int fd = ::open(mFilename.string(), O_WRONLY); + int fd = ::open(mFilename.c_str(), O_WRONLY); BackupDataWriter* writer = new BackupDataWriter(fd); writer->WriteEntityHeader(mKey1, sizeof(DATA1)); writer->WriteEntityData(DATA1, sizeof(DATA1)); @@ -172,7 +172,7 @@ TEST_F(BackupDataTest, SkipEntity) { writer->WriteEntityData(DATA3, sizeof(DATA3)); ::close(fd); - fd = ::open(mFilename.string(), O_RDONLY); + fd = ::open(mFilename.c_str(), O_RDONLY); BackupDataReader* reader = new BackupDataReader(fd); bool done; @@ -217,14 +217,14 @@ TEST_F(BackupDataTest, SkipEntity) { } TEST_F(BackupDataTest, DeleteEntity) { - int fd = ::open(mFilename.string(), O_WRONLY); + int fd = ::open(mFilename.c_str(), O_WRONLY); BackupDataWriter* writer = new BackupDataWriter(fd); writer->WriteEntityHeader(mKey1, sizeof(DATA1)); writer->WriteEntityData(DATA1, sizeof(DATA1)); writer->WriteEntityHeader(mKey2, -1); ::close(fd); - fd = ::open(mFilename.string(), O_RDONLY); + fd = ::open(mFilename.c_str(), O_RDONLY); BackupDataReader* reader = new BackupDataReader(fd); bool done; @@ -256,7 +256,7 @@ TEST_F(BackupDataTest, DeleteEntity) { } TEST_F(BackupDataTest, EneityAfterDelete) { - int fd = ::open(mFilename.string(), O_WRONLY); + int fd = ::open(mFilename.c_str(), O_WRONLY); BackupDataWriter* writer = new BackupDataWriter(fd); writer->WriteEntityHeader(mKey1, sizeof(DATA1)); writer->WriteEntityData(DATA1, sizeof(DATA1)); @@ -265,7 +265,7 @@ TEST_F(BackupDataTest, EneityAfterDelete) { writer->WriteEntityData(DATA3, sizeof(DATA3)); ::close(fd); - fd = ::open(mFilename.string(), O_RDONLY); + fd = ::open(mFilename.c_str(), O_RDONLY); BackupDataReader* reader = new BackupDataReader(fd); bool done; @@ -317,7 +317,7 @@ TEST_F(BackupDataTest, EneityAfterDelete) { } TEST_F(BackupDataTest, OnlyDeleteEntities) { - int fd = ::open(mFilename.string(), O_WRONLY); + int fd = ::open(mFilename.c_str(), O_WRONLY); BackupDataWriter* writer = new BackupDataWriter(fd); writer->WriteEntityHeader(mKey1, -1); writer->WriteEntityHeader(mKey2, -1); @@ -325,7 +325,7 @@ TEST_F(BackupDataTest, OnlyDeleteEntities) { writer->WriteEntityHeader(mKey4, -1); ::close(fd); - fd = ::open(mFilename.string(), O_RDONLY); + fd = ::open(mFilename.c_str(), O_RDONLY); BackupDataReader* reader = new BackupDataReader(fd); bool done; @@ -385,13 +385,13 @@ TEST_F(BackupDataTest, OnlyDeleteEntities) { } TEST_F(BackupDataTest, ReadDeletedEntityData) { - int fd = ::open(mFilename.string(), O_WRONLY); + int fd = ::open(mFilename.c_str(), O_WRONLY); BackupDataWriter* writer = new BackupDataWriter(fd); writer->WriteEntityHeader(mKey1, -1); writer->WriteEntityHeader(mKey2, -1); ::close(fd); - fd = ::open(mFilename.string(), O_RDONLY); + fd = ::open(mFilename.c_str(), O_RDONLY); BackupDataReader* reader = new BackupDataReader(fd); bool done; diff --git a/libs/androidfw/tests/CommonHelpers.cpp b/libs/androidfw/tests/CommonHelpers.cpp index 3396729536a4..10138de0843c 100644 --- a/libs/androidfw/tests/CommonHelpers.cpp +++ b/libs/androidfw/tests/CommonHelpers.cpp @@ -60,7 +60,7 @@ const std::string& GetTestDataPath() { std::string GetStringFromPool(const ResStringPool* pool, uint32_t idx) { auto str = pool->string8ObjectAt(idx); CHECK(str.has_value()) << "failed to find string entry"; - return std::string(str->string(), str->length()); + return std::string(str->c_str(), str->length()); } } // namespace android diff --git a/libs/androidfw/tests/ConfigDescription_test.cpp b/libs/androidfw/tests/ConfigDescription_test.cpp index f5c01e5d9b68..07bd17568993 100644 --- a/libs/androidfw/tests/ConfigDescription_test.cpp +++ b/libs/androidfw/tests/ConfigDescription_test.cpp @@ -50,10 +50,10 @@ TEST(ConfigDescriptionTest, ParseFailWhenQualifiersHaveTrailingDash) { TEST(ConfigDescriptionTest, ParseBasicQualifiers) { ConfigDescription config; EXPECT_TRUE(TestParse("", &config)); - EXPECT_EQ(std::string(""), config.toString().string()); + EXPECT_EQ(std::string(""), config.toString().c_str()); EXPECT_TRUE(TestParse("fr-land", &config)); - EXPECT_EQ(std::string("fr-land"), config.toString().string()); + EXPECT_EQ(std::string("fr-land"), config.toString().c_str()); EXPECT_TRUE( TestParse("mcc310-pl-sw720dp-normal-long-port-night-" @@ -61,22 +61,22 @@ TEST(ConfigDescriptionTest, ParseBasicQualifiers) { &config)); EXPECT_EQ(std::string("mcc310-pl-sw720dp-normal-long-port-night-" "xhdpi-keyssoft-qwerty-navexposed-nonav-v13"), - config.toString().string()); + config.toString().c_str()); } TEST(ConfigDescriptionTest, ParseLocales) { ConfigDescription config; EXPECT_TRUE(TestParse("en-rUS", &config)); - EXPECT_EQ(std::string("en-rUS"), config.toString().string()); + EXPECT_EQ(std::string("en-rUS"), config.toString().c_str()); } TEST(ConfigDescriptionTest, ParseQualifierAddedInApi13) { ConfigDescription config; EXPECT_TRUE(TestParse("sw600dp", &config)); - EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string()); + EXPECT_EQ(std::string("sw600dp-v13"), config.toString().c_str()); EXPECT_TRUE(TestParse("sw600dp-v8", &config)); - EXPECT_EQ(std::string("sw600dp-v13"), config.toString().string()); + EXPECT_EQ(std::string("sw600dp-v13"), config.toString().c_str()); } TEST(ConfigDescriptionTest, ParseCarAttribute) { @@ -91,13 +91,13 @@ TEST(ConfigDescriptionTest, TestParsingRoundQualifier) { EXPECT_EQ(android::ResTable_config::SCREENROUND_YES, config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND); EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion); - EXPECT_EQ(std::string("round-v23"), config.toString().string()); + EXPECT_EQ(std::string("round-v23"), config.toString().c_str()); EXPECT_TRUE(TestParse("notround", &config)); EXPECT_EQ(android::ResTable_config::SCREENROUND_NO, config.screenLayout2 & android::ResTable_config::MASK_SCREENROUND); EXPECT_EQ(SDK_MARSHMALLOW, config.sdkVersion); - EXPECT_EQ(std::string("notround-v23"), config.toString().string()); + EXPECT_EQ(std::string("notround-v23"), config.toString().c_str()); } TEST(ConfigDescriptionTest, TestWideColorGamutQualifier) { @@ -106,13 +106,13 @@ TEST(ConfigDescriptionTest, TestWideColorGamutQualifier) { EXPECT_EQ(android::ResTable_config::WIDE_COLOR_GAMUT_YES, config.colorMode & android::ResTable_config::MASK_WIDE_COLOR_GAMUT); EXPECT_EQ(SDK_O, config.sdkVersion); - EXPECT_EQ(std::string("widecg-v26"), config.toString().string()); + EXPECT_EQ(std::string("widecg-v26"), config.toString().c_str()); EXPECT_TRUE(TestParse("nowidecg", &config)); EXPECT_EQ(android::ResTable_config::WIDE_COLOR_GAMUT_NO, config.colorMode & android::ResTable_config::MASK_WIDE_COLOR_GAMUT); EXPECT_EQ(SDK_O, config.sdkVersion); - EXPECT_EQ(std::string("nowidecg-v26"), config.toString().string()); + EXPECT_EQ(std::string("nowidecg-v26"), config.toString().c_str()); } TEST(ConfigDescriptionTest, TestHdrQualifier) { @@ -121,13 +121,13 @@ TEST(ConfigDescriptionTest, TestHdrQualifier) { EXPECT_EQ(android::ResTable_config::HDR_YES, config.colorMode & android::ResTable_config::MASK_HDR); EXPECT_EQ(SDK_O, config.sdkVersion); - EXPECT_EQ(std::string("highdr-v26"), config.toString().string()); + EXPECT_EQ(std::string("highdr-v26"), config.toString().c_str()); EXPECT_TRUE(TestParse("lowdr", &config)); EXPECT_EQ(android::ResTable_config::HDR_NO, config.colorMode & android::ResTable_config::MASK_HDR); EXPECT_EQ(SDK_O, config.sdkVersion); - EXPECT_EQ(std::string("lowdr-v26"), config.toString().string()); + EXPECT_EQ(std::string("lowdr-v26"), config.toString().c_str()); } TEST(ConfigDescriptionTest, ParseVrAttribute) { @@ -135,7 +135,7 @@ TEST(ConfigDescriptionTest, ParseVrAttribute) { EXPECT_TRUE(TestParse("vrheadset", &config)); EXPECT_EQ(android::ResTable_config::UI_MODE_TYPE_VR_HEADSET, config.uiMode); EXPECT_EQ(SDK_O, config.sdkVersion); - EXPECT_EQ(std::string("vrheadset-v26"), config.toString().string()); + EXPECT_EQ(std::string("vrheadset-v26"), config.toString().c_str()); } static inline ConfigDescription ParseConfigOrDie(android::StringPiece str) { @@ -159,17 +159,17 @@ TEST(ConfigDescriptionTest, TestGrammaticalGenderQualifier) { EXPECT_TRUE(TestParse("feminine", &config)); EXPECT_EQ(android::ResTable_config::GRAMMATICAL_GENDER_FEMININE, config.grammaticalInflection); EXPECT_EQ(SDK_U, config.sdkVersion); - EXPECT_EQ(std::string("feminine-v34"), config.toString().string()); + EXPECT_EQ(std::string("feminine-v34"), config.toString().c_str()); EXPECT_TRUE(TestParse("masculine", &config)); EXPECT_EQ(android::ResTable_config::GRAMMATICAL_GENDER_MASCULINE, config.grammaticalInflection); EXPECT_EQ(SDK_U, config.sdkVersion); - EXPECT_EQ(std::string("masculine-v34"), config.toString().string()); + EXPECT_EQ(std::string("masculine-v34"), config.toString().c_str()); EXPECT_TRUE(TestParse("neuter", &config)); EXPECT_EQ(android::ResTable_config::GRAMMATICAL_GENDER_NEUTER, config.grammaticalInflection); EXPECT_EQ(SDK_U, config.sdkVersion); - EXPECT_EQ(std::string("neuter-v34"), config.toString().string()); + EXPECT_EQ(std::string("neuter-v34"), config.toString().c_str()); } } // namespace android diff --git a/libs/androidfw/tests/ObbFile_test.cpp b/libs/androidfw/tests/ObbFile_test.cpp index 115112128636..ba818c4d7645 100644 --- a/libs/androidfw/tests/ObbFile_test.cpp +++ b/libs/androidfw/tests/ObbFile_test.cpp @@ -43,9 +43,9 @@ protected: mFileName.append(externalStorage); mFileName.append(TEST_FILENAME); - int fd = ::open(mFileName.string(), O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); + int fd = ::open(mFileName.c_str(), O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); if (fd < 0) { - FAIL() << "Couldn't create " << mFileName.string() << " for tests"; + FAIL() << "Couldn't create " << mFileName.c_str() << " for tests"; } } @@ -69,17 +69,17 @@ TEST_F(ObbFileTest, WriteThenRead) { EXPECT_TRUE(mObbFile->setSalt(salt, SALT_SIZE)) << "Salt should be successfully set"; - EXPECT_TRUE(mObbFile->writeTo(mFileName.string())) + EXPECT_TRUE(mObbFile->writeTo(mFileName.c_str())) << "couldn't write to fake .obb file"; mObbFile = new ObbFile(); - EXPECT_TRUE(mObbFile->readFrom(mFileName.string())) + EXPECT_TRUE(mObbFile->readFrom(mFileName.c_str())) << "couldn't read from fake .obb file"; EXPECT_EQ(versionNum, mObbFile->getVersion()) << "version didn't come out the same as it went in"; - const char* currentPackageName = mObbFile->getPackageName().string(); + const char* currentPackageName = mObbFile->getPackageName().c_str(); EXPECT_STREQ(packageName, currentPackageName) << "package name didn't come out the same as it went in"; diff --git a/libs/androidfw/tests/ResTable_test.cpp b/libs/androidfw/tests/ResTable_test.cpp index fbf70981f2de..faac51403203 100644 --- a/libs/androidfw/tests/ResTable_test.cpp +++ b/libs/androidfw/tests/ResTable_test.cpp @@ -64,8 +64,8 @@ TEST(ResTableTest, ResourceNameIsResolved) { String16 defPackage("com.android.basic"); String16 testName("@string/test1"); uint32_t resID = - table.identifierForName(testName.string(), testName.size(), 0, 0, - defPackage.string(), defPackage.size()); + table.identifierForName(testName.c_str(), testName.size(), 0, 0, + defPackage.c_str(), defPackage.size()); ASSERT_NE(uint32_t(0x00000000), resID); ASSERT_EQ(basic::R::string::test1, resID); } @@ -468,7 +468,7 @@ TEST_P(ResTableParameterizedTest, ShouldLoadSparseEntriesSuccessfully) { String16 name(u"com.android.sparse:integer/foo_9"); uint32_t flags; uint32_t resid = - table.identifierForName(name.string(), name.size(), nullptr, 0, nullptr, 0, &flags); + table.identifierForName(name.c_str(), name.size(), nullptr, 0, nullptr, 0, &flags); ASSERT_NE(0u, resid); Res_value val; diff --git a/libs/androidfw/tests/Split_test.cpp b/libs/androidfw/tests/Split_test.cpp index 2c242dbd3e28..3d88577c078f 100644 --- a/libs/androidfw/tests/Split_test.cpp +++ b/libs/androidfw/tests/Split_test.cpp @@ -261,8 +261,8 @@ TEST_F(SplitTest, TestNewResourceIsAccessibleByName) { const String16 package("com.android.basic"); ASSERT_EQ( R::string::test3, - table.identifierForName(name.string(), name.size(), type.string(), - type.size(), package.string(), package.size())); + table.identifierForName(name.c_str(), name.size(), type.c_str(), + type.size(), package.c_str(), package.size())); } } // namespace diff --git a/libs/androidfw/tests/TestHelpers.cpp b/libs/androidfw/tests/TestHelpers.cpp index 10c0a4fc8316..c6f657c5d9a8 100644 --- a/libs/androidfw/tests/TestHelpers.cpp +++ b/libs/androidfw/tests/TestHelpers.cpp @@ -79,9 +79,9 @@ AssertionResult IsStringEqual(const ResTable& table, uint32_t resource_id, } if (String8(expected_str) != *actual_str) { - return AssertionFailure() << actual_str->string(); + return AssertionFailure() << actual_str->c_str(); } - return AssertionSuccess() << actual_str->string(); + return AssertionSuccess() << actual_str->c_str(); } } // namespace android diff --git a/libs/hwui/OWNERS b/libs/hwui/OWNERS index bb93e66968be..6ca991d8b294 100644 --- a/libs/hwui/OWNERS +++ b/libs/hwui/OWNERS @@ -1,3 +1,5 @@ +# Bug component: 1075005 + alecmouri@google.com djsollen@google.com jreck@google.com diff --git a/libs/hwui/RenderNode.h b/libs/hwui/RenderNode.h index d1e04adcb642..572635a9bd45 100644 --- a/libs/hwui/RenderNode.h +++ b/libs/hwui/RenderNode.h @@ -114,15 +114,15 @@ public: return mDisplayList.containsProjectionReceiver(); } - const char* getName() const { return mName.string(); } + const char* getName() const { return mName.c_str(); } void setName(const char* name) { if (name) { const char* lastPeriod = strrchr(name, '.'); if (lastPeriod) { - mName.setTo(lastPeriod + 1); + mName = (lastPeriod + 1); } else { - mName.setTo(name); + mName = name; } } } diff --git a/libs/hwui/jni/FontFamily.cpp b/libs/hwui/jni/FontFamily.cpp index 28e71d74e5b9..69774cc6e133 100644 --- a/libs/hwui/jni/FontFamily.cpp +++ b/libs/hwui/jni/FontFamily.cpp @@ -45,6 +45,7 @@ namespace android { +namespace { struct NativeFamilyBuilder { NativeFamilyBuilder(uint32_t langId, int variant) : langId(langId), variant(static_cast<minikin::FamilyVariant>(variant)) {} @@ -53,6 +54,7 @@ struct NativeFamilyBuilder { std::vector<std::shared_ptr<minikin::Font>> fonts; std::vector<minikin::FontVariation> axes; }; +} // namespace static inline NativeFamilyBuilder* toNativeBuilder(jlong ptr) { return reinterpret_cast<NativeFamilyBuilder*>(ptr); diff --git a/libs/hwui/jni/fonts/FontFamily.cpp b/libs/hwui/jni/fonts/FontFamily.cpp index 897c4d71c0d5..ee158ee4e316 100644 --- a/libs/hwui/jni/fonts/FontFamily.cpp +++ b/libs/hwui/jni/fonts/FontFamily.cpp @@ -29,9 +29,11 @@ namespace android { +namespace { struct NativeFamilyBuilder { std::vector<std::shared_ptr<minikin::Font>> fonts; }; +} // namespace static inline NativeFamilyBuilder* toBuilder(jlong ptr) { return reinterpret_cast<NativeFamilyBuilder*>(ptr); diff --git a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp index c4d3f5cedfa8..cf31173d266e 100644 --- a/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaOpenGLPipeline.cpp @@ -68,12 +68,15 @@ MakeCurrentResult SkiaOpenGLPipeline::makeCurrent() { return MakeCurrentResult::AlreadyCurrent; } - // Make sure read/draw buffer state of default framebuffer is GL_BACK. Vendor implementations + EGLint majorVersion = 0; + eglQueryContext(eglGetCurrentDisplay(), eglGetCurrentContext(), EGL_CONTEXT_CLIENT_VERSION, &majorVersion); + + // Make sure read/draw buffer state of default framebuffer is GL_BACK for ES 3.X. Vendor implementations // disagree on the draw/read buffer state if the default framebuffer transitions from a surface // to EGL_NO_SURFACE and vice-versa. There was a related discussion within Khronos on this topic. // See https://cvs.khronos.org/bugzilla/show_bug.cgi?id=13534. // The discussion was not resolved with a clear consensus - if (error == 0 && wasSurfaceless && mEglSurface != EGL_NO_SURFACE) { + if (error == 0 && (majorVersion > 2) && wasSurfaceless && mEglSurface != EGL_NO_SURFACE) { GLint curReadFB = 0; GLint curDrawFB = 0; glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &curReadFB); diff --git a/libs/hwui/pipeline/skia/SkiaPipeline.cpp b/libs/hwui/pipeline/skia/SkiaPipeline.cpp index b020e966e05a..cb23bcc166c8 100644 --- a/libs/hwui/pipeline/skia/SkiaPipeline.cpp +++ b/libs/hwui/pipeline/skia/SkiaPipeline.cpp @@ -200,7 +200,7 @@ bool SkiaPipeline::createOrUpdateLayer(RenderNode* node, const DamageAccumulator String8 cachesOutput; mRenderThread.cacheManager().dumpMemoryUsage(cachesOutput, &mRenderThread.renderState()); - ALOGE("%s", cachesOutput.string()); + ALOGE("%s", cachesOutput.c_str()); if (errorHandler) { std::ostringstream err; err << "Unable to create layer for " << node->getName(); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index eb28c080c056..0dea941c91f9 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -357,7 +357,7 @@ void RenderThread::dumpGraphicsMemory(int fd, bool includeProfileData) { String8 cachesOutput; mCacheManager->dumpMemoryUsage(cachesOutput, mRenderState); - dprintf(fd, "\nPipeline=%s\n%s\n", pipelineToString(), cachesOutput.string()); + dprintf(fd, "\nPipeline=%s\n%s\n", pipelineToString(), cachesOutput.c_str()); } void RenderThread::getMemoryUsage(size_t* cpuUsage, size_t* gpuUsage) { diff --git a/libs/hwui/utils/LinearAllocator.cpp b/libs/hwui/utils/LinearAllocator.cpp index 8baa4b770f85..eab888ef4d1a 100644 --- a/libs/hwui/utils/LinearAllocator.cpp +++ b/libs/hwui/utils/LinearAllocator.cpp @@ -31,15 +31,11 @@ #include <utils/Log.h> #include <utils/Macros.h> -// The ideal size of a page allocation (these need to be multiples of 8) -#define INITIAL_PAGE_SIZE ((size_t)512) // 512b -#define MAX_PAGE_SIZE ((size_t)131072) // 128kb - // The maximum amount of wasted space we can have per page // Allocations exceeding this will have their own dedicated page // If this is too low, we will malloc too much // Too high, and we may waste too much space -// Must be smaller than INITIAL_PAGE_SIZE +// Must be smaller than kInitialPageSize #define MAX_WASTE_RATIO (0.5f) #if LOG_NDEBUG @@ -75,6 +71,10 @@ static void _addAllocation(int count) { namespace android { namespace uirenderer { +// The ideal size of a page allocation (these need to be multiples of 8) +static constexpr size_t kInitialPageSize = 512; // 512b +static constexpr size_t kMaxPageSize = 131072; // 128kb + class LinearAllocator::Page { public: Page* next() { return mNextPage; } @@ -94,8 +94,8 @@ private: }; LinearAllocator::LinearAllocator() - : mPageSize(INITIAL_PAGE_SIZE) - , mMaxAllocSize(INITIAL_PAGE_SIZE * MAX_WASTE_RATIO) + : mPageSize(kInitialPageSize) + , mMaxAllocSize(kInitialPageSize * MAX_WASTE_RATIO) , mNext(0) , mCurrentPage(0) , mPages(0) @@ -135,8 +135,8 @@ bool LinearAllocator::fitsInCurrentPage(size_t size) { void LinearAllocator::ensureNext(size_t size) { if (fitsInCurrentPage(size)) return; - if (mCurrentPage && mPageSize < MAX_PAGE_SIZE) { - mPageSize = min(MAX_PAGE_SIZE, mPageSize * 2); + if (mCurrentPage && mPageSize < kMaxPageSize) { + mPageSize = min(kMaxPageSize, mPageSize * 2); mMaxAllocSize = mPageSize * MAX_WASTE_RATIO; mPageSize = ALIGN(mPageSize); } diff --git a/libs/incident/src/IncidentReportArgs.cpp b/libs/incident/src/IncidentReportArgs.cpp index db495cfbf7e1..858813ff4276 100644 --- a/libs/incident/src/IncidentReportArgs.cpp +++ b/libs/incident/src/IncidentReportArgs.cpp @@ -133,13 +133,12 @@ IncidentReportArgs::readFromParcel(const Parcel* in) mSections.insert(section); } - int32_t headerCount; - err = in->readInt32(&headerCount); + err = in->resizeOutVector<vector<uint8_t>>(&mHeaders); if (err != NO_ERROR) { return err; } - mHeaders.resize(headerCount); - for (int i=0; i<headerCount; i++) { + + for (int i=0; i<mHeaders.size(); i++) { err = in->readByteVector(&mHeaders[i]); if (err != NO_ERROR) { return err; @@ -153,8 +152,8 @@ IncidentReportArgs::readFromParcel(const Parcel* in) } mPrivacyPolicy = privacyPolicy; - mReceiverPkg = String8(in->readString16()).string(); - mReceiverCls = String8(in->readString16()).string(); + mReceiverPkg = String8(in->readString16()).c_str(); + mReceiverCls = String8(in->readString16()).c_str(); int32_t gzip; err = in->readInt32(&gzip); diff --git a/libs/input/OWNERS b/libs/input/OWNERS index d701f23cb9b8..4c20c4dc9d35 100644 --- a/libs/input/OWNERS +++ b/libs/input/OWNERS @@ -1 +1 @@ -include /core/java/android/hardware/input/OWNERS +include /INPUT_OWNERS diff --git a/libs/protoutil/Android.bp b/libs/protoutil/Android.bp index 128be3c33ac5..28856c87f7c6 100644 --- a/libs/protoutil/Android.bp +++ b/libs/protoutil/Android.bp @@ -80,6 +80,10 @@ cc_test { "libgmock", ], + test_suites: [ + "general-tests", + ], + proto: { type: "full", }, diff --git a/libs/protoutil/AndroidTest.xml b/libs/protoutil/AndroidTest.xml deleted file mode 100644 index 46d418e1bb0a..000000000000 --- a/libs/protoutil/AndroidTest.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2018 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> -<configuration description="Config for libprotoutil_test"> - <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"> - <option name="cleanup" value="true" /> - <option name="push" value="libprotoutil_test->/data/nativetest/libprotoutil_test" /> - </target_preparer> - <option name="test-suite-tag" value="apct" /> - <test class="com.android.tradefed.testtype.GTest" > - <option name="native-test-device-path" value="/data/nativetest" /> - <option name="module-name" value="libprotoutil_test" /> - </test> -</configuration> diff --git a/libs/protoutil/TEST_MAPPING b/libs/protoutil/TEST_MAPPING new file mode 100644 index 000000000000..b10dd9b067b6 --- /dev/null +++ b/libs/protoutil/TEST_MAPPING @@ -0,0 +1,12 @@ +{ + "presubmit": [ + { + "name": "libprotoutil_test" + } + ], + "hwasan-postsubmit": [ + { + "name": "libprotoutil_test" + } + ] +} diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h index f4a358de1c41..1bfb874729d7 100644 --- a/libs/protoutil/include/android/util/ProtoOutputStream.h +++ b/libs/protoutil/include/android/util/ProtoOutputStream.h @@ -102,7 +102,7 @@ public: bool write(uint64_t fieldId, long val); bool write(uint64_t fieldId, long long val); bool write(uint64_t fieldId, bool val); - bool write(uint64_t fieldId, std::string val); + bool write(uint64_t fieldId, std::string_view val); bool write(uint64_t fieldId, const char* val, size_t size); /** diff --git a/libs/protoutil/src/EncodedBuffer.cpp b/libs/protoutil/src/EncodedBuffer.cpp index 96b54c63a836..afb54a6c49b6 100644 --- a/libs/protoutil/src/EncodedBuffer.cpp +++ b/libs/protoutil/src/EncodedBuffer.cpp @@ -17,6 +17,7 @@ #include <stdlib.h> #include <sys/mman.h> +#include <unistd.h> #include <android/util/EncodedBuffer.h> #include <android/util/protobuf.h> @@ -25,7 +26,8 @@ namespace android { namespace util { -const size_t BUFFER_SIZE = 8 * 1024; // 8 KB +constexpr size_t BUFFER_SIZE = 8 * 1024; // 8 KB +const size_t kPageSize = getpagesize(); EncodedBuffer::Pointer::Pointer() : Pointer(BUFFER_SIZE) { @@ -92,7 +94,7 @@ EncodedBuffer::EncodedBuffer(size_t chunkSize) { // Align chunkSize to memory page size chunkSize = chunkSize == 0 ? BUFFER_SIZE : chunkSize; - mChunkSize = (chunkSize / PAGE_SIZE + ((chunkSize % PAGE_SIZE == 0) ? 0 : 1)) * PAGE_SIZE; + mChunkSize = (chunkSize + (kPageSize - 1)) & ~(kPageSize - 1); mWp = Pointer(mChunkSize); mEp = Pointer(mChunkSize); } diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp index fcf82eed4eb1..a44a1b210924 100644 --- a/libs/protoutil/src/ProtoOutputStream.cpp +++ b/libs/protoutil/src/ProtoOutputStream.cpp @@ -170,13 +170,13 @@ ProtoOutputStream::write(uint64_t fieldId, bool val) } bool -ProtoOutputStream::write(uint64_t fieldId, std::string val) +ProtoOutputStream::write(uint64_t fieldId, std::string_view val) { if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { case FIELD_TYPE_STRING: - writeUtf8StringImpl(id, val.c_str(), val.size()); + writeUtf8StringImpl(id, val.data(), val.size()); return true; default: ALOGW("Field type %" PRIu64 " is not supported when writing string val.", diff --git a/libs/protoutil/tests/EncodedBuffer_test.cpp b/libs/protoutil/tests/EncodedBuffer_test.cpp index f895154c4983..a09558544c26 100644 --- a/libs/protoutil/tests/EncodedBuffer_test.cpp +++ b/libs/protoutil/tests/EncodedBuffer_test.cpp @@ -15,12 +15,16 @@ #include <gmock/gmock.h> #include <gtest/gtest.h> +#include <unistd.h> + using namespace android::util; using android::sp; -constexpr size_t TEST_CHUNK_SIZE = 16UL; -constexpr size_t TEST_CHUNK_HALF_SIZE = TEST_CHUNK_SIZE / 2; -constexpr size_t TEST_CHUNK_3X_SIZE = 3 * TEST_CHUNK_SIZE; +constexpr size_t __TEST_CHUNK_SIZE = 16UL; +const size_t kPageSize = getpagesize(); +const size_t TEST_CHUNK_SIZE = (__TEST_CHUNK_SIZE + (kPageSize - 1)) & ~(kPageSize - 1); +const size_t TEST_CHUNK_HALF_SIZE = TEST_CHUNK_SIZE / 2; +const size_t TEST_CHUNK_3X_SIZE = 3 * TEST_CHUNK_SIZE; static void expectPointer(EncodedBuffer::Pointer* p, size_t pos) { EXPECT_EQ(p->pos(), pos); @@ -34,13 +38,13 @@ TEST(EncodedBufferTest, WriteSimple) { expectPointer(buffer->wp(), 0); EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_SIZE); for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) { - buffer->writeRawByte(50 + i); + buffer->writeRawByte(static_cast<uint8_t>(50 + i)); } EXPECT_EQ(buffer->size(), TEST_CHUNK_HALF_SIZE); expectPointer(buffer->wp(), TEST_CHUNK_HALF_SIZE); EXPECT_EQ(buffer->currentToWrite(), TEST_CHUNK_HALF_SIZE); for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) { - buffer->writeRawByte(80 + i); + buffer->writeRawByte(static_cast<uint8_t>(80 + i)); } EXPECT_EQ(buffer->size(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE); expectPointer(buffer->wp(), TEST_CHUNK_SIZE + TEST_CHUNK_HALF_SIZE); @@ -49,10 +53,10 @@ TEST(EncodedBufferTest, WriteSimple) { // verifies the buffer's data expectPointer(buffer->ep(), 0); for (size_t i = 0; i < TEST_CHUNK_HALF_SIZE; i++) { - EXPECT_EQ(buffer->readRawByte(), 50 + i); + EXPECT_EQ(buffer->readRawByte(), static_cast<uint8_t>(50 + i)); } for (size_t i = 0; i < TEST_CHUNK_SIZE; i++) { - EXPECT_EQ(buffer->readRawByte(), 80 + i); + EXPECT_EQ(buffer->readRawByte(), static_cast<uint8_t>(80 + i)); } // clears the buffer diff --git a/libs/services/Android.bp b/libs/services/Android.bp index f656ebfc3b77..0b7e7d37718d 100644 --- a/libs/services/Android.bp +++ b/libs/services/Android.bp @@ -26,8 +26,6 @@ package { cc_library_shared { name: "libservices", srcs: [ - ":IDropBoxManagerService.aidl", - ":ILogcatManagerService_aidl", "src/content/ComponentName.cpp", "src/os/DropBoxManager.cpp", ], @@ -42,7 +40,10 @@ cc_library_shared { "libbase_headers", ], aidl: { - include_dirs: ["frameworks/base/core/java/"], + libs: [ + "ILogcatManagerService_aidl", + "IDropBoxManagerService_aidl", + ], }, export_include_dirs: ["include"], diff --git a/libs/services/src/os/DropBoxManager.cpp b/libs/services/src/os/DropBoxManager.cpp index 3716e019f69a..60bb00ab7309 100644 --- a/libs/services/src/os/DropBoxManager.cpp +++ b/libs/services/src/os/DropBoxManager.cpp @@ -196,7 +196,7 @@ DropBoxManager::addData(const String16& tag, uint8_t const* data, vector<uint8_t> dataArg; dataArg.assign(data, data + size); Status status = service->addData(tag, dataArg, flags); - ALOGD("service->add returned %s", status.toString8().string()); + ALOGD("service->add returned %s", status.toString8().c_str()); return status; } @@ -230,7 +230,7 @@ DropBoxManager::addFile(const String16& tag, int fd, int flags) android::base::unique_fd uniqueFd(fd); android::os::ParcelFileDescriptor parcelFd(std::move(uniqueFd)); Status status = service->addFile(tag, parcelFd, flags); - ALOGD("service->add returned %s", status.toString8().string()); + ALOGD("service->add returned %s", status.toString8().c_str()); return status; } diff --git a/location/Android.bp b/location/Android.bp new file mode 100644 index 000000000000..ead46e9b28d9 --- /dev/null +++ b/location/Android.bp @@ -0,0 +1,24 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +//location sources that will populate the new module +filegroup { + name: "framework-location-nonupdatable-sources", + srcs: [ + "placeholder_java/android/location/Placeholder.java", + ], +} + +java_library { + name: "framework-location.stubs.module_lib", + srcs: [ + ":framework-location-nonupdatable-sources", + ], + sdk_version: "core_platform", +} diff --git a/location/java/android/location/GnssRequest.java b/location/java/android/location/GnssRequest.java index 9c9766fd02d6..f3a40cc3af40 100644 --- a/location/java/android/location/GnssRequest.java +++ b/location/java/android/location/GnssRequest.java @@ -41,7 +41,7 @@ public final class GnssRequest implements Parcelable { * * <p>If true, GNSS chipset switches off duty cycling. In such a mode, no clock * discontinuities are expected, and when supported, carrier phase should be continuous in - * good signal conditions. All non-blacklisted, healthy constellations, satellites and + * good signal conditions. All non-denylisted, healthy constellations, satellites and * frequency bands that the chipset supports must be reported in this mode. The GNSS chipset * is allowed to consume more power in this mode. If false, GNSS chipset optimizes power via * duty cycling, constellations and frequency limits, etc. @@ -138,7 +138,7 @@ public final class GnssRequest implements Parcelable { * * <p>If true, GNSS chipset switches off duty cycling. In such a mode, no clock * discontinuities are expected, and when supported, carrier phase should be continuous in - * good signal conditions. All non-blacklisted, healthy constellations, satellites and + * good signal conditions. All non-denylisted, healthy constellations, satellites and * frequency bands that the chipset supports must be reported in this mode. The GNSS chipset * is allowed to consume more power in this mode. If false, GNSS chipset optimizes power via * duty cycling, constellations and frequency limits, etc. diff --git a/location/placeholder_java/android/location/Placeholder.java b/location/placeholder_java/android/location/Placeholder.java new file mode 100644 index 000000000000..f0dbce829174 --- /dev/null +++ b/location/placeholder_java/android/location/Placeholder.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.location; + +/** + * Placeholder class so new frameworks-location module isn't empty, will be removed once module is + * populated. + * + * @hide + * + */ +public class Placeholder { +} diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index ceb3858eb0b3..a311296dd90c 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -1284,7 +1284,8 @@ public final class AudioFormat implements Parcelable { * {@link AudioFormat#CHANNEL_OUT_SIDE_RIGHT}. * <p> For a valid {@link AudioTrack} channel position mask, * the following conditions apply: - * <br> (1) at most eight channel positions may be used; + * <br> (1) at most {@link AudioSystem#OUT_CHANNEL_COUNT_MAX} channel positions may be + * used; * <br> (2) right/left pairs should be matched. * <p> For input or {@link AudioRecord}, the mask should be * {@link AudioFormat#CHANNEL_IN_MONO} or diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 4759689335e9..ab2a22bd8857 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -4854,7 +4854,9 @@ public class AudioManager { synchronized (this) { while (!mQuit) { final long timeToWait = timeOutTime - java.lang.System.currentTimeMillis(); - if (timeToWait < 0) { break; } + if (timeToWait <= 0) { + break; + } this.wait(timeToWait); } } diff --git a/media/java/android/media/Cea708CaptionRenderer.java b/media/java/android/media/Cea708CaptionRenderer.java index 88912fef4501..efaf3d22f489 100644 --- a/media/java/android/media/Cea708CaptionRenderer.java +++ b/media/java/android/media/Cea708CaptionRenderer.java @@ -194,7 +194,7 @@ class Cea708CCParser { private final StringBuffer mBuffer = new StringBuffer(); private int mCommand = 0; - // Assign a dummy listener in order to avoid null checks. + // Assign a placeholder listener in order to avoid null checks. private DisplayListener mListener = new DisplayListener() { @Override public void emitEvent(CaptionEvent event) { diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java index ea261852bb9f..1de08810307e 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -1155,7 +1155,7 @@ public class MediaMetadataRetriever implements AutoCloseable { public static final int OPTION_CLOSEST = 0x03; /** @hide */ - @IntDef(flag = true, prefix = { "OPTION_" }, value = { + @IntDef(flag = false, prefix = { "OPTION_" }, value = { OPTION_PREVIOUS_SYNC, OPTION_NEXT_SYNC, OPTION_CLOSEST_SYNC, diff --git a/media/java/android/media/OWNERS b/media/java/android/media/OWNERS index 1f9a51d0aa07..bbe5e06bb282 100644 --- a/media/java/android/media/OWNERS +++ b/media/java/android/media/OWNERS @@ -8,4 +8,10 @@ jmtrivi@google.com # go/android-fwk-media-solutions for info on areas of ownership. include platform/frameworks/av:/media/janitors/media_solutions_OWNERS -per-file *Image* = file:/graphics/java/android/graphics/OWNERS
\ No newline at end of file +per-file *Image* = file:/graphics/java/android/graphics/OWNERS + +per-file ExifInterface.java,ExifInterfaceUtils.java,IMediaHTTPConnection.aidl,IMediaHTTPService.aidl,JetPlayer.java,MediaDataSource.java,MediaExtractor.java,MediaHTTPConnection.java,MediaHTTPService.java,MediaPlayer.java=set noparent +per-file ExifInterface.java,ExifInterfaceUtils.java,IMediaHTTPConnection.aidl,IMediaHTTPService.aidl,JetPlayer.java,MediaDataSource.java,MediaExtractor.java,MediaHTTPConnection.java,MediaHTTPService.java,MediaPlayer.java=file:platform/frameworks/av:/media/janitors/media_solutions_OWNERS + +# Haptics team also works on Ringtone +per-file *Ringtone* = file:/services/core/java/com/android/server/vibrator/OWNERS diff --git a/media/java/android/media/musicrecognition/OWNERS b/media/java/android/media/musicrecognition/OWNERS index 58f5d40dd8c3..037b04831260 100644 --- a/media/java/android/media/musicrecognition/OWNERS +++ b/media/java/android/media/musicrecognition/OWNERS @@ -1,6 +1,5 @@ # Bug component: 830636 -joannechung@google.com oni@google.com volnov@google.com diff --git a/media/java/android/media/projection/OWNERS b/media/java/android/media/projection/OWNERS index 2273f816ac60..cc9be9c5126a 100644 --- a/media/java/android/media/projection/OWNERS +++ b/media/java/android/media/projection/OWNERS @@ -1,3 +1,5 @@ +# Bug component: 1345447 + michaelwr@google.com santoscordon@google.com chaviw@google.com diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 5a569456b4a7..460fa0a40a77 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -452,6 +452,12 @@ public class Tuner implements AutoCloseable { acquireTRMSLock("shareFrontendFromTuner()"); mFrontendLock.lock(); try { + if (mFeOwnerTuner != null) { + // unregister self from the Frontend callback + mFeOwnerTuner.unregisterFrontendCallbackListener(this); + mFeOwnerTuner = null; + nativeUnshareFrontend(); + } mTunerResourceManager.shareFrontend(mClientId, tuner.mClientId); mFeOwnerTuner = tuner; mFeOwnerTuner.registerFrontendCallbackListener(this); diff --git a/media/java/android/media/voice/KeyphraseModelManager.java b/media/java/android/media/voice/KeyphraseModelManager.java index 5a690a57dbb2..b4bf428d6e7e 100644 --- a/media/java/android/media/voice/KeyphraseModelManager.java +++ b/media/java/android/media/voice/KeyphraseModelManager.java @@ -37,7 +37,7 @@ import java.util.Objects; * This class provides management of voice based sound recognition models. Usage of this class is * restricted to system or signature applications only. This allows OEMs to write apps that can * manage voice based sound trigger models. - * Callers of this class are expected to have whitelist manifest permission MANAGE_VOICE_KEYPHRASES. + * Callers of this class are expected to have allowlist manifest permission MANAGE_VOICE_KEYPHRASES. * Callers of this class are expected to be the designated voice interaction service via * {@link Settings.Secure.VOICE_INTERACTION_SERVICE} or a bundled voice model enrollment application * detected by {@link android.hardware.soundtrigger.KeyphraseEnrollmentInfo}. diff --git a/media/java/android/mtp/OWNERS b/media/java/android/mtp/OWNERS index 1928ba811e7e..6b5336e83bdc 100644 --- a/media/java/android/mtp/OWNERS +++ b/media/java/android/mtp/OWNERS @@ -1,6 +1,9 @@ set noparent -marcone@google.com +aprasath@google.com +anothermark@google.com +kumarashishg@google.com +sarup@google.com jsharkey@android.com jameswei@google.com rmojumder@google.com diff --git a/media/jni/OWNERS b/media/jni/OWNERS index 445672b7ca13..e12d828733fa 100644 --- a/media/jni/OWNERS +++ b/media/jni/OWNERS @@ -1,5 +1,8 @@ # extra for MTP related files -per-file android_mtp_*.cpp=marcone@google.com,jsharkey@android.com,jameswei@google.com,rmojumder@google.com +per-file android_mtp_*.cpp=aprasath@google.com,anothermark@google.com,kumarashishg@google.com,sarup@google.com,jsharkey@android.com,jameswei@google.com,rmojumder@google.com # extra for TV related files per-file android_media_tv_*=hgchen@google.com,quxiangfang@google.com + +per-file android_media_JetPlayer.cpp,android_media_MediaDataSource.cpp,android_media_MediaDataSource.h,android_media_MediaPlayer.java=set noparent +per-file android_media_JetPlayer.cpp,android_media_MediaDataSource.cpp,android_media_MediaDataSource.h,android_media_MediaPlayer.java=file:platform/frameworks/av:/media/janitors/media_solutions_OWNERS diff --git a/media/jni/android_media_ImageReader.cpp b/media/jni/android_media_ImageReader.cpp index da2e56f5b6fa..382e65dd4ba1 100644 --- a/media/jni/android_media_ImageReader.cpp +++ b/media/jni/android_media_ImageReader.cpp @@ -617,7 +617,7 @@ static jint ImageReader_imageSetup(JNIEnv* env, jobject thiz, jobject image) { "match the ImageReader's configured buffer format 0x%x.", bufferFormat, ctx->getBufferFormat()); jniThrowException(env, "java/lang/UnsupportedOperationException", - msg.string()); + msg.c_str()); return -1; } } @@ -795,7 +795,7 @@ static jobjectArray ImageReader_createImagePlanes(JNIEnv* env, jobject /*thiz*/, String8 msg; msg.appendFormat("Format 0x%x is opaque, thus not writable, the number of planes (%d)" " must be 0", halReaderFormat, numPlanes); - jniThrowException(env, "java/lang/IllegalArgumentException", msg.string()); + jniThrowException(env, "java/lang/IllegalArgumentException", msg.c_str()); return NULL; } @@ -860,7 +860,7 @@ static jobjectArray Image_createSurfacePlanes(JNIEnv* env, jobject thiz, String8 msg; msg.appendFormat("Format 0x%x is opaque, thus not writable, the number of planes (%d)" " must be 0", halReaderFormat, numPlanes); - jniThrowException(env, "java/lang/IllegalArgumentException", msg.string()); + jniThrowException(env, "java/lang/IllegalArgumentException", msg.c_str()); return NULL; } diff --git a/media/jni/android_media_ImageWriter.cpp b/media/jni/android_media_ImageWriter.cpp index 1927b6c5ca68..f64233fb9c79 100644 --- a/media/jni/android_media_ImageWriter.cpp +++ b/media/jni/android_media_ImageWriter.cpp @@ -1068,7 +1068,7 @@ static jobjectArray Image_createSurfacePlanes(JNIEnv* env, jobject thiz, String8 msg; msg.appendFormat("Format 0x%x is opaque, thus not writable, the number of planes (%d)" " must be 0", writerFormat, numPlanes); - jniThrowException(env, "java/lang/IllegalArgumentException", msg.string()); + jniThrowException(env, "java/lang/IllegalArgumentException", msg.c_str()); return NULL; } diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index dea7f03d369a..ef90bf993437 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -1043,7 +1043,7 @@ static jthrowable createCodecException( CHECK(ctor != NULL); ScopedLocalRef<jstring> msgObj( - env, env->NewStringUTF(msg != NULL ? msg : String8::format("Error %#x", err))); + env, env->NewStringUTF(msg != NULL ? msg : String8::format("Error %#x", err).c_str())); // translate action code to Java equivalent switch (actionCode) { @@ -2615,7 +2615,7 @@ static void android_media_MediaCodec_native_queueLinearBlock( return; } auto cryptoInfo = - cryptoInfoObj ? NativeCryptoInfo{size} : NativeCryptoInfo{env, cryptoInfoObj}; + cryptoInfoObj ? NativeCryptoInfo{env, cryptoInfoObj} : NativeCryptoInfo{size}; if (env->ExceptionCheck()) { // Creation of cryptoInfo failed. Let the exception bubble up. return; @@ -3036,7 +3036,7 @@ static void android_media_MediaCodec_setVideoScalingMode( if (mode != NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW && mode != NATIVE_WINDOW_SCALING_MODE_SCALE_CROP) { jniThrowException(env, "java/lang/IllegalArgumentException", - String8::format("Unrecognized mode: %d", mode)); + String8::format("Unrecognized mode: %d", mode).c_str()); return; } @@ -3450,7 +3450,8 @@ static void android_media_MediaCodec_native_setup( JNIEnv *env, jobject thiz, jstring name, jboolean nameIsType, jboolean encoder, int pid, int uid) { if (name == NULL) { - jniThrowException(env, "java/lang/NullPointerException", NULL); + jniThrowException(env, "java/lang/NullPointerException", + "No codec name specified"); return; } @@ -3466,27 +3467,27 @@ static void android_media_MediaCodec_native_setup( if (err == NAME_NOT_FOUND) { // fail and do not try again. jniThrowException(env, "java/lang/IllegalArgumentException", - String8::format("Failed to initialize %s, error %#x (NAME_NOT_FOUND)", tmp, err)); + String8::format("Failed to initialize %s, error %#x (NAME_NOT_FOUND)", tmp, err).c_str()); env->ReleaseStringUTFChars(name, tmp); return; } if (err == NO_MEMORY) { throwCodecException(env, err, ACTION_CODE_TRANSIENT, - String8::format("Failed to initialize %s, error %#x (NO_MEMORY)", tmp, err)); + String8::format("Failed to initialize %s, error %#x (NO_MEMORY)", tmp, err).c_str()); env->ReleaseStringUTFChars(name, tmp); return; } if (err == PERMISSION_DENIED) { jniThrowException(env, "java/lang/SecurityException", String8::format("Failed to initialize %s, error %#x (PERMISSION_DENIED)", tmp, - err)); + err).c_str()); env->ReleaseStringUTFChars(name, tmp); return; } if (err != OK) { // believed possible to try again jniThrowException(env, "java/io/IOException", - String8::format("Failed to find matching codec %s, error %#x (?)", tmp, err)); + String8::format("Failed to find matching codec %s, error %#x (?)", tmp, err).c_str()); env->ReleaseStringUTFChars(name, tmp); return; } diff --git a/media/jni/android_media_MediaCrypto.cpp b/media/jni/android_media_MediaCrypto.cpp index f491be884b2f..5506f6149fa5 100644 --- a/media/jni/android_media_MediaCrypto.cpp +++ b/media/jni/android_media_MediaCrypto.cpp @@ -299,7 +299,7 @@ static void android_media_MediaCrypto_setMediaDrmSession( std::string strerr(StrCryptoError(err)); msg.appendFormat(": general failure (%s)", strerr.c_str()); } - jniThrowException(env, "android/media/MediaCryptoException", msg.string()); + jniThrowException(env, "android/media/MediaCryptoException", msg.c_str()); } } diff --git a/media/jni/android_media_MediaDescrambler.cpp b/media/jni/android_media_MediaDescrambler.cpp index c61365a448d3..37111c28c242 100644 --- a/media/jni/android_media_MediaDescrambler.cpp +++ b/media/jni/android_media_MediaDescrambler.cpp @@ -368,7 +368,7 @@ static jthrowable createServiceSpecificException( ScopedLocalRef<jstring> msgObj( env, env->NewStringUTF(msg != NULL ? - msg : String8::format("Error %#x", serviceSpecificError))); + msg : String8::format("Error %#x", serviceSpecificError).c_str())); return (jthrowable)env->NewObject( clazz.get(), ctor, serviceSpecificError, msgObj.get()); diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index b70818d1e1b0..c616b84fa6fb 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -708,8 +708,8 @@ static jobject KeyedVectorToHashMap (JNIEnv *env, KeyedVector<String8, String8> jclass clazz = gFields.hashmapClassId; jobject hashMap = env->NewObject(clazz, gFields.hashmap.init); for (size_t i = 0; i < map.size(); ++i) { - jstring jkey = env->NewStringUTF(map.keyAt(i).string()); - jstring jvalue = env->NewStringUTF(map.valueAt(i).string()); + jstring jkey = env->NewStringUTF(map.keyAt(i).c_str()); + jstring jvalue = env->NewStringUTF(map.valueAt(i).c_str()); env->CallObjectMethod(hashMap, gFields.hashmap.put, jkey, jvalue); env->DeleteLocalRef(jkey); env->DeleteLocalRef(jvalue); @@ -1169,7 +1169,7 @@ static jobject android_media_MediaDrm_getKeyRequest( jbyteArray jrequest = VectorToJByteArray(env, request); env->SetObjectField(keyObj, gFields.keyRequest.data, jrequest); - jstring jdefaultUrl = env->NewStringUTF(defaultUrl.string()); + jstring jdefaultUrl = env->NewStringUTF(defaultUrl.c_str()); env->SetObjectField(keyObj, gFields.keyRequest.defaultUrl, jdefaultUrl); switch (keyRequestType) { @@ -1332,7 +1332,7 @@ static jobject android_media_MediaDrm_getProvisionRequestNative( jbyteArray jrequest = VectorToJByteArray(env, request); env->SetObjectField(provisionObj, gFields.provisionRequest.data, jrequest); - jstring jdefaultUrl = env->NewStringUTF(defaultUrl.string()); + jstring jdefaultUrl = env->NewStringUTF(defaultUrl.c_str()); env->SetObjectField(provisionObj, gFields.provisionRequest.defaultUrl, jdefaultUrl); } @@ -1686,7 +1686,7 @@ static jstring android_media_MediaDrm_getPropertyString( return NULL; } - return env->NewStringUTF(value.string()); + return env->NewStringUTF(value.c_str()); } static jbyteArray android_media_MediaDrm_getPropertyByteArray( diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index ddc51cdb861c..14587589372b 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -126,7 +126,7 @@ android_media_MediaMetadataRetriever_setDataSourceAndHeaders( tmp = NULL; // Don't let somebody trick us in to reading some random block of memory - if (strncmp("mem://", pathStr.string(), 6) == 0) { + if (strncmp("mem://", pathStr.c_str(), 6) == 0) { jniThrowException( env, "java/lang/IllegalArgumentException", "Invalid pathname"); return; @@ -149,7 +149,7 @@ android_media_MediaMetadataRetriever_setDataSourceAndHeaders( env, retriever->setDataSource( httpService, - pathStr.string(), + pathStr.c_str(), headersVector.size() > 0 ? &headersVector : NULL), "java/lang/RuntimeException", diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 44aff6408f5b..d05ee551c172 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -260,7 +260,7 @@ android_media_MediaPlayer_setDataSourceAndHeaders( status_t opStatus = mp->setDataSource( httpService, - pathStr, + pathStr.c_str(), headersVector.size() > 0? &headersVector : NULL); process_media_player_call( @@ -1234,7 +1234,7 @@ static bool throwDrmExceptionAsNecessary(JNIEnv *env, status_t err, const char * String8 vendorMessage; if (err >= ERROR_DRM_VENDOR_MIN && err <= ERROR_DRM_VENDOR_MAX) { vendorMessage = String8::format("DRM vendor-defined error: %d", err); - drmMessage = vendorMessage.string(); + drmMessage = vendorMessage.c_str(); } if (err == BAD_VALUE) { @@ -1260,7 +1260,7 @@ static bool throwDrmExceptionAsNecessary(JNIEnv *env, status_t err, const char * msg = drmMessage; } else { errbuf = String8::format("%s: %s", msg, drmMessage); - msg = errbuf.string(); + msg = errbuf.c_str(); } } throwDrmStateException(env, msg, err); diff --git a/media/jni/android_media_Streams.cpp b/media/jni/android_media_Streams.cpp index 4fd515323181..dffeb890a840 100644 --- a/media/jni/android_media_Streams.cpp +++ b/media/jni/android_media_Streams.cpp @@ -38,7 +38,7 @@ FileStream::FileStream(const int fd) FileStream::FileStream(const String8 filename) : mPosition(0) { - mFile = fopen(filename.string(), "r"); + mFile = fopen(filename.c_str(), "r"); if (mFile == NULL) { return; } @@ -86,7 +86,7 @@ bool GetExifFromRawImage( if (!piex::IsRaw(stream)) { // Format not supported. - ALOGV("Format not supported: %s", filename.string()); + ALOGV("Format not supported: %s", filename.c_str()); return false; } @@ -94,7 +94,7 @@ bool GetExifFromRawImage( if (err != piex::Error::kOk) { // The input data seems to be broken. - ALOGV("Raw image not detected: %s (piex error code: %d)", filename.string(), (int32_t)err); + ALOGV("Raw image not detected: %s (piex error code: %d)", filename.c_str(), (int32_t)err); return false; } diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 1b04f18e38c7..feb914fe3161 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1468,6 +1468,10 @@ int JTuner::shareFrontend(int feId) { return (int)Result::INVALID_STATE; } + if (mDemuxClient != NULL) { + mDemuxClient->setFrontendDataSourceById(feId); + } + mSharedFeId = feId; return (int)Result::SUCCESS; } diff --git a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java index 4193ffad5a0a..3d448a80aa5a 100644 --- a/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java +++ b/media/tests/MediaRouter/src/com/android/mediaroutertest/MediaRouter2ManagerTest.java @@ -918,7 +918,7 @@ public class MediaRouter2ManagerTest { CountDownLatch addedLatch = new CountDownLatch(1); CountDownLatch preferenceLatch = new CountDownLatch(1); - // A dummy callback is required to send route feature info. + // A placeholder callback is required to send route feature info. RouteCallback routeCallback = new RouteCallback() {}; MediaRouter2Manager.Callback managerCallback = new MediaRouter2Manager.Callback() { diff --git a/media/tests/MtpTests/OWNERS b/media/tests/MtpTests/OWNERS index 1928ba811e7e..6b5336e83bdc 100644 --- a/media/tests/MtpTests/OWNERS +++ b/media/tests/MtpTests/OWNERS @@ -1,6 +1,9 @@ set noparent -marcone@google.com +aprasath@google.com +anothermark@google.com +kumarashishg@google.com +sarup@google.com jsharkey@android.com jameswei@google.com rmojumder@google.com diff --git a/mime/Android.bp b/mime/Android.bp index a3ea65cb2efe..757862b998b4 100644 --- a/mime/Android.bp +++ b/mime/Android.bp @@ -12,7 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. - package { // See: http://go/android-license-faq // A large-scale-change added 'default_applicable_licenses' to import @@ -125,6 +124,6 @@ java_genrule { srcs: [ "java-res/vendor.mime.types", ], - // strip comments normalize whitepace drop empty lines prepend ? to fields that are missing it - cmd: "awk '{gsub(/#.*$$/,\"\"); $$1=$$1; print;}' $(in) | grep ' ' | awk '{for(i=1;i<=NF;i++) { sub(/^\\??/, \"?\", $$i); }; print}' > $(out)", + // strip comments normalize whitepace drop empty lines prepend ? to fields that are missing it + cmd: "awk '{gsub(/#.*$$/,\"\"); $$1=$$1; print;}' $(in) | (grep ' ' || echo -n '') | awk '{for(i=1;i<=NF;i++) { sub(/^\\??/, \"?\", $$i); }; print}' > $(out)", } diff --git a/native/android/OWNERS b/native/android/OWNERS index d41652f2ad17..0b86909929b0 100644 --- a/native/android/OWNERS +++ b/native/android/OWNERS @@ -26,3 +26,6 @@ per-file surface_texture.cpp = file:/graphics/java/android/graphics/OWNERS # Input per-file input.cpp = file:/INPUT_OWNERS + +# PerformanceHint +per-file performance_hint.cpp = file:/ADPF_OWNERS diff --git a/native/android/asset_manager.cpp b/native/android/asset_manager.cpp index 69cf80477dde..1878716da3cd 100644 --- a/native/android/asset_manager.cpp +++ b/native/android/asset_manager.cpp @@ -118,7 +118,7 @@ const char* AAssetDir_getNextFileName(AAssetDir* assetDir) // the string to return and advance the iterator for next time. if (index < max) { assetDir->mCachedFileName = assetDir->mAssetDir->getFileName(index); - returnName = assetDir->mCachedFileName.string(); + returnName = assetDir->mCachedFileName.c_str(); index++; } @@ -134,7 +134,7 @@ void AAssetDir_rewind(AAssetDir* assetDir) const char* AAssetDir_getFileName(AAssetDir* assetDir, int index) { assetDir->mCachedFileName = assetDir->mAssetDir->getFileName(index); - return assetDir->mCachedFileName.string(); + return assetDir->mCachedFileName.c_str(); } void AAssetDir_close(AAssetDir* assetDir) diff --git a/native/android/obb.cpp b/native/android/obb.cpp index e9900249b289..a14fa7e58fa8 100644 --- a/native/android/obb.cpp +++ b/native/android/obb.cpp @@ -42,7 +42,7 @@ void AObbInfo_delete(AObbInfo* obbInfo) { } const char* AObbInfo_getPackageName(AObbInfo* obbInfo) { - return obbInfo->getPackageName(); + return obbInfo->getPackageName().c_str(); } int32_t AObbInfo_getVersion(AObbInfo* obbInfo) { diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp index 968de34f5d69..bb8708bd1e5e 100644 --- a/native/android/sensor.cpp +++ b/native/android/sensor.cpp @@ -304,12 +304,12 @@ int ASensorEventQueue_requestAdditionalInfoEvents(ASensorEventQueue* queue, bool const char* ASensor_getName(ASensor const* sensor) { RETURN_IF_SENSOR_IS_NULL(nullptr); - return static_cast<Sensor const*>(sensor)->getName().string(); + return static_cast<Sensor const*>(sensor)->getName().c_str(); } const char* ASensor_getVendor(ASensor const* sensor) { RETURN_IF_SENSOR_IS_NULL(nullptr); - return static_cast<Sensor const*>(sensor)->getVendor().string(); + return static_cast<Sensor const*>(sensor)->getVendor().c_str(); } int ASensor_getType(ASensor const* sensor) { @@ -339,7 +339,7 @@ int ASensor_getFifoReservedEventCount(ASensor const* sensor) { const char* ASensor_getStringType(ASensor const* sensor) { RETURN_IF_SENSOR_IS_NULL(nullptr); - return static_cast<Sensor const*>(sensor)->getStringType().string(); + return static_cast<Sensor const*>(sensor)->getStringType().c_str(); } int ASensor_getReportingMode(ASensor const* sensor) { diff --git a/native/android/storage_manager.cpp b/native/android/storage_manager.cpp index 9e0a6eb476d3..6db87dfdd565 100644 --- a/native/android/storage_manager.cpp +++ b/native/android/storage_manager.cpp @@ -86,7 +86,7 @@ protected: return nullptr; } - String16 fileName(obbFile->getFileName()); + String16 fileName(canonicalPath); String16 packageName(obbFile->getPackageName()); size_t length; const unsigned char* salt = obbFile->getSalt(&length); @@ -175,7 +175,7 @@ public: String16 filename16(filename); String16 path16; if (mMountService->getMountedObbPath(filename16, path16)) { - return String8(path16).string(); + return String8(path16).c_str(); } else { return NULL; } @@ -183,7 +183,7 @@ public: }; void ObbActionListener::onObbResult(const android::String16& filename, const int32_t nonce, const int32_t state) { - mStorageManager->fireCallback(String8(filename).string(), nonce, state); + mStorageManager->fireCallback(String8(filename).c_str(), nonce, state); } diff --git a/native/android/tests/performance_hint/OWNERS b/native/android/tests/performance_hint/OWNERS new file mode 100644 index 000000000000..e3bbee92057d --- /dev/null +++ b/native/android/tests/performance_hint/OWNERS @@ -0,0 +1 @@ +include /ADPF_OWNERS diff --git a/native/webview/OWNERS b/native/webview/OWNERS index 580bb0fe8273..7e27dc8831a6 100644 --- a/native/webview/OWNERS +++ b/native/webview/OWNERS @@ -1,4 +1,4 @@ +# Bug component: 76427 boliu@google.com -changwan@google.com -tobiasjs@google.com +ntfschr@google.com torne@google.com diff --git a/packages/CompanionDeviceManager/res/values-th/strings.xml b/packages/CompanionDeviceManager/res/values-th/strings.xml index 46e631cecb88..b5895977859e 100644 --- a/packages/CompanionDeviceManager/res/values-th/strings.xml +++ b/packages/CompanionDeviceManager/res/values-th/strings.xml @@ -27,7 +27,7 @@ <string name="summary_glasses_multi_device" msgid="615259525961937348">"ต้องใช้แอปนี้ในการจัดการ<xliff:g id="DEVICE_NAME">%1$s</xliff:g> <xliff:g id="APP_NAME">%2$s</xliff:g> จะได้รับอนุญาตให้โต้ตอบกับการแจ้งเตือนและมีสิทธิ์เข้าถึงโทรศัพท์, SMS, รายชื่อติดต่อ, ไมโครโฟน และอุปกรณ์ที่อยู่ใกล้เคียง"</string> <string name="summary_glasses_single_device" msgid="3000909894067413398">"แอปนี้จะได้รับสิทธิ์ดังต่อไปนี้ใน<xliff:g id="DEVICE_TYPE">%1$s</xliff:g>ของคุณ"</string> <string name="title_app_streaming" msgid="2270331024626446950">"อนุญาตให้ <strong><xliff:g id="APP_NAME">%1$s</xliff:g></strong> เข้าถึงข้อมูลนี้จากโทรศัพท์ของคุณ"</string> - <string name="helper_title_app_streaming" msgid="4151687003439969765">"บริการหลายอุปกรณ์"</string> + <string name="helper_title_app_streaming" msgid="4151687003439969765">"บริการข้ามอุปกรณ์"</string> <string name="helper_summary_app_streaming" msgid="2396773196949578425">"<xliff:g id="APP_NAME">%1$s</xliff:g> กำลังขอสิทธิ์ในนามของ <xliff:g id="DISPLAY_NAME">%2$s</xliff:g> เพื่อสตรีมแอประหว่างอุปกรณ์ต่างๆ ของคุณ"</string> <string name="title_automotive_projection" msgid="3296005598978412847"></string> <string name="summary_automotive_projection" msgid="8683801274662496164"></string> diff --git a/packages/CredentialManager/Android.bp b/packages/CredentialManager/Android.bp index 28b9bc04a249..fe26dc3d7feb 100644 --- a/packages/CredentialManager/Android.bp +++ b/packages/CredentialManager/Android.bp @@ -44,7 +44,7 @@ android_app { platform_apis: true, privileged: true, - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], optimize: { proguard_compatibility: false, diff --git a/packages/CredentialManager/horologist/OWNERS b/packages/CredentialManager/horologist/OWNERS new file mode 100644 index 000000000000..b67932835b4a --- /dev/null +++ b/packages/CredentialManager/horologist/OWNERS @@ -0,0 +1,4 @@ +include /core/java/android/credentials/OWNERS + +shuanghao@google.com +gustavopagani@google.com diff --git a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml index 89e48f96d27b..780274cc0a5b 100644 --- a/packages/CredentialManager/res/values-b+sr+Latn/strings.xml +++ b/packages/CredentialManager/res/values-b+sr+Latn/strings.xml @@ -49,7 +49,7 @@ <string name="sign_ins" msgid="4710739369149469208">"prijavljivanja"</string> <string name="sign_in_info" msgid="2627704710674232328">"podaci za prijavljivanje"</string> <string name="save_credential_to_title" msgid="3172811692275634301">"Sačuvaj <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> u"</string> - <string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"Želite da napravite pristupni kôd na drugom uređaju?"</string> + <string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"Želite da napravite pristupni ključ na drugom uređaju?"</string> <string name="save_password_on_other_device_title" msgid="5829084591948321207">"Želite da sačuvate lozinku na drugom uređaju?"</string> <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"Želite da sačuvate akreditive za prijavu na drugom uređaju?"</string> <string name="use_provider_for_all_title" msgid="4201020195058980757">"Želite da za sva prijavljivanja koristite: <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g>?"</string> @@ -72,7 +72,7 @@ <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Želite da koristite sačuvanu lozinku za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Želite li da koristite svoje podatke za prijavljivanje za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Želite da otključate opcije prijavljivanja za: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> - <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Izaberite sačuvan pristupni kôd za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Izaberite sačuvan pristupni ključ za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Izaberite sačuvanu lozinku za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="get_dialog_title_choose_saved_sign_in_for" msgid="2420298653461652728">"Izaberite sačuvane podatke za prijavljivanje za: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="get_dialog_title_choose_sign_in_for" msgid="3048870756117876514">"Odaberite podatke za prijavljivanje za aplikaciju <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> diff --git a/packages/CredentialManager/res/values-el/strings.xml b/packages/CredentialManager/res/values-el/strings.xml index 4d97803f4dbb..8d06765099a9 100644 --- a/packages/CredentialManager/res/values-el/strings.xml +++ b/packages/CredentialManager/res/values-el/strings.xml @@ -53,7 +53,7 @@ <string name="save_password_on_other_device_title" msgid="5829084591948321207">"Θέλετε να αποθηκεύσετε τον κωδικό πρόσβασης σε κάποια άλλη συσκευή;"</string> <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"Θέλετε να αποθηκεύσετε τα στοιχεία σύνδεσης σε κάποια άλλη συσκευή;"</string> <string name="use_provider_for_all_title" msgid="4201020195058980757">"Να χρησιμοποιηθεί το <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> για όλες τις συνδέσεις σας;"</string> - <string name="use_provider_for_all_description" msgid="1998772715863958997">"Αυτός ο διαχειριστής κωδικών πρόσβασης για τον χρήστη <xliff:g id="USERNAME">%1$s</xliff:g> θα αποθηκεύει τους κωδικούς πρόσβασης και τα κλειδιά πρόσβασης, για πιο εύκολη πρόσβαση"</string> + <string name="use_provider_for_all_description" msgid="1998772715863958997">"Αυτός ο διαχειριστής κωδικών πρόσβασης για τον χρήστη <xliff:g id="USERNAME">%1$s</xliff:g> θα αποθηκεύει τους κωδικούς και τα κλειδιά πρόσβασης, για πιο εύκολη σύνδεση"</string> <string name="set_as_default" msgid="4415328591568654603">"Ορισμός ως προεπιλογής"</string> <string name="settings" msgid="6536394145760913145">"Ρυθμίσεις"</string> <string name="use_once" msgid="9027366575315399714">"Χρήση μία φορά"</string> diff --git a/packages/CredentialManager/res/values-fa/strings.xml b/packages/CredentialManager/res/values-fa/strings.xml index 8e4113d70447..a6e0d3d11eee 100644 --- a/packages/CredentialManager/res/values-fa/strings.xml +++ b/packages/CredentialManager/res/values-fa/strings.xml @@ -56,7 +56,7 @@ <string name="use_provider_for_all_description" msgid="1998772715863958997">"این مدیر گذرواژه برای <xliff:g id="USERNAME">%1$s</xliff:g> گذرکلیدها و گذرواژههای شما را ذخیره میکند تا بهراحتی بتوانید به سیستم وارد شوید"</string> <string name="set_as_default" msgid="4415328591568654603">"تنظیم بهعنوان پیشفرض"</string> <string name="settings" msgid="6536394145760913145">"تنظیمات"</string> - <string name="use_once" msgid="9027366575315399714">"یکبار استفاده"</string> + <string name="use_once" msgid="9027366575315399714">"این بار استفاده شود"</string> <string name="more_options_usage_passwords_passkeys" msgid="3470113942332934279">"<xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> گذرواژه • <xliff:g id="PASSKEYSNUMBER">%2$s</xliff:g> گذرکلید"</string> <string name="more_options_usage_passwords" msgid="1632047277723187813">"<xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> گذرواژه"</string> <string name="more_options_usage_passkeys" msgid="5390320437243042237">"<xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g> گذرکلید"</string> @@ -78,7 +78,7 @@ <string name="get_dialog_title_choose_sign_in_for" msgid="3048870756117876514">"انتخاب روش ورود به سیستم برای <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="get_dialog_title_choose_option_for" msgid="4976380044745029107">"گزینهای را برای <xliff:g id="APP_NAME">%1$s</xliff:g> انتخاب کنید؟"</string> <string name="get_dialog_title_use_info_on" msgid="8863708099535435146">"از این اطلاعات در <xliff:g id="APP_NAME">%1$s</xliff:g> استفاده شود؟"</string> - <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ورود به سیستم به روشی دیگر"</string> + <string name="get_dialog_use_saved_passkey_for" msgid="4618100798664888512">"ورود به سیستم به یک روش دیگر"</string> <string name="snackbar_action" msgid="37373514216505085">"مشاهده گزینهها"</string> <string name="get_dialog_button_label_continue" msgid="6446201694794283870">"ادامه"</string> <string name="get_dialog_title_sign_in_options" msgid="2092876443114893618">"گزینههای ورود به سیستم"</string> diff --git a/packages/CredentialManager/res/values-hi/strings.xml b/packages/CredentialManager/res/values-hi/strings.xml index d986a935fad4..05d21e013d27 100644 --- a/packages/CredentialManager/res/values-hi/strings.xml +++ b/packages/CredentialManager/res/values-hi/strings.xml @@ -56,7 +56,7 @@ <string name="use_provider_for_all_description" msgid="1998772715863958997">"<xliff:g id="USERNAME">%1$s</xliff:g> के लिए यह पासवर्ड मैनेजर, आपके पासवर्ड और पासकी सेव करेगा, ताकि आपको साइन इन करने में आसानी हो"</string> <string name="set_as_default" msgid="4415328591568654603">"डिफ़ॉल्ट के तौर पर सेट करें"</string> <string name="settings" msgid="6536394145760913145">"सेटिंग"</string> - <string name="use_once" msgid="9027366575315399714">"इसका इस्तेमाल एक बार किया जा सकता है"</string> + <string name="use_once" msgid="9027366575315399714">"एक बार इस्तेमाल करें"</string> <string name="more_options_usage_passwords_passkeys" msgid="3470113942332934279">"<xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> पासवर्ड • <xliff:g id="PASSKEYSNUMBER">%2$s</xliff:g> पासकी"</string> <string name="more_options_usage_passwords" msgid="1632047277723187813">"<xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> पासवर्ड"</string> <string name="more_options_usage_passkeys" msgid="5390320437243042237">"<xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g> पासकी"</string> diff --git a/packages/CredentialManager/res/values-in/strings.xml b/packages/CredentialManager/res/values-in/strings.xml index e47cf7b2c75e..d6bf9463158f 100644 --- a/packages/CredentialManager/res/values-in/strings.xml +++ b/packages/CredentialManager/res/values-in/strings.xml @@ -54,7 +54,7 @@ <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"Simpan info login di perangkat lain?"</string> <string name="use_provider_for_all_title" msgid="4201020195058980757">"Gunakan <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> untuk semua info login Anda?"</string> <string name="use_provider_for_all_description" msgid="1998772715863958997">"Pengelola sandi untuk <xliff:g id="USERNAME">%1$s</xliff:g> ini akan menyimpan sandi dan kunci sandi guna membantu Anda login dengan mudah"</string> - <string name="set_as_default" msgid="4415328591568654603">"Setel sebagai default"</string> + <string name="set_as_default" msgid="4415328591568654603">"Jadikan default"</string> <string name="settings" msgid="6536394145760913145">"Setelan"</string> <string name="use_once" msgid="9027366575315399714">"Gunakan sekali"</string> <string name="more_options_usage_passwords_passkeys" msgid="3470113942332934279">"<xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> sandi • <xliff:g id="PASSKEYSNUMBER">%2$s</xliff:g> kunci sandi"</string> diff --git a/packages/CredentialManager/res/values-ka/strings.xml b/packages/CredentialManager/res/values-ka/strings.xml index b597a9a227eb..ed42f3afcfe0 100644 --- a/packages/CredentialManager/res/values-ka/strings.xml +++ b/packages/CredentialManager/res/values-ka/strings.xml @@ -52,7 +52,7 @@ <string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"გსურთ სხვა მოწყობილობაზე წვდომის გასაღებების შექმნა?"</string> <string name="save_password_on_other_device_title" msgid="5829084591948321207">"გსურთ სხვა მოწყობილობაზე პაროლის შენახვა?"</string> <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"გსურთ სხვა მოწყობილობაზე ავტორიზაციის მონაცემების შენახვა?"</string> - <string name="use_provider_for_all_title" msgid="4201020195058980757">"გსურთ, გამოიყენოთ<xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> სისტემაში ყველა შესვლისთვის?"</string> + <string name="use_provider_for_all_title" msgid="4201020195058980757">"გსურთ, გამოიყენოთ <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> სისტემაში ყველა შესვლისთვის?"</string> <string name="use_provider_for_all_description" msgid="1998772715863958997">"მოცემული პაროლების მმართველი <xliff:g id="USERNAME">%1$s</xliff:g>-ისთვის შეინახავს თქვენს პაროლებს და წვდომის გასაღებს, რომლებიც დაგეხმარებათ სისტემაში მარტივად შესვლაში"</string> <string name="set_as_default" msgid="4415328591568654603">"ნაგულისხმევად დაყენება"</string> <string name="settings" msgid="6536394145760913145">"პარამეტრები"</string> diff --git a/packages/CredentialManager/res/values-kn/strings.xml b/packages/CredentialManager/res/values-kn/strings.xml index ae680a068933..7447ab629f72 100644 --- a/packages/CredentialManager/res/values-kn/strings.xml +++ b/packages/CredentialManager/res/values-kn/strings.xml @@ -52,7 +52,7 @@ <string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"ಇನ್ನೊಂದು ಸಾಧನದಲ್ಲಿ ಪಾಸ್ಕೀ ಅನ್ನು ರಚಿಸಬೇಕೆ?"</string> <string name="save_password_on_other_device_title" msgid="5829084591948321207">"ಇನ್ನೊಂದು ಸಾಧನದಲ್ಲಿ ಪಾಸ್ವರ್ಡ್ ಉಳಿಸಬೇಕೆ?"</string> <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"ಮತ್ತೊಂದು ಸಾಧನದಲ್ಲಿ ಸೈನ್-ಇನ್ ಅನ್ನು ಉಳಿಸಬೇಕೆ?"</string> - <string name="use_provider_for_all_title" msgid="4201020195058980757">"ನಿಮ್ಮ ಎಲ್ಲಾ ಸೈನ್-ಇನ್ಗಳಿಗಾಗಿ <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> ಅನ್ನು ಬಳಸುವುದೇ?"</string> + <string name="use_provider_for_all_title" msgid="4201020195058980757">"ನಿಮ್ಮ ಎಲ್ಲಾ ಸೈನ್-ಇನ್ಗಳಿಗಾಗಿ <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> ಅನ್ನು ಬಳಸಬೇಕೇ?"</string> <string name="use_provider_for_all_description" msgid="1998772715863958997">"<xliff:g id="USERNAME">%1$s</xliff:g> ಗಾಗಿ ಈ ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕವು ನಿಮಗೆ ಸುಲಭವಾಗಿ ಸೈನ್ ಇನ್ ಮಾಡುವುದಕ್ಕೆ ಸಹಾಯ ಮಾಡಲು ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಪಾಸ್ಕೀಗಳನ್ನು ಸಂಗ್ರಹಿಸುತ್ತದೆ"</string> <string name="set_as_default" msgid="4415328591568654603">"ಡೀಫಾಲ್ಟ್ ಆಗಿ ಸೆಟ್ ಮಾಡಿ"</string> <string name="settings" msgid="6536394145760913145">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> diff --git a/packages/CredentialManager/res/values-lt/strings.xml b/packages/CredentialManager/res/values-lt/strings.xml index d5f5f7f10578..c3b941bfa10e 100644 --- a/packages/CredentialManager/res/values-lt/strings.xml +++ b/packages/CredentialManager/res/values-lt/strings.xml @@ -52,7 +52,7 @@ <string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"Sukurti „passkey“ kitame įrenginyje?"</string> <string name="save_password_on_other_device_title" msgid="5829084591948321207">"Išsaugoti slaptažodį kitame įrenginyje?"</string> <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"Išsaugoti prisijungimo duomenis kitame įrenginyje?"</string> - <string name="use_provider_for_all_title" msgid="4201020195058980757">"Naudoti <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g> visada prisijungiant?"</string> + <string name="use_provider_for_all_title" msgid="4201020195058980757">"Naudoti „<xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g>“ visada prisijungiant?"</string> <string name="use_provider_for_all_description" msgid="1998772715863958997">"Šioje <xliff:g id="USERNAME">%1$s</xliff:g> Slaptažodžių tvarkyklėje bus saugomi jūsų slaptažodžiai ir prieigos raktai, kad galėtumėte lengvai prisijungti"</string> <string name="set_as_default" msgid="4415328591568654603">"Nustatyti kaip numatytąjį"</string> <string name="settings" msgid="6536394145760913145">"Nustatymai"</string> diff --git a/packages/CredentialManager/res/values-mk/strings.xml b/packages/CredentialManager/res/values-mk/strings.xml index 0755c9cdfa48..1f456bfd392f 100644 --- a/packages/CredentialManager/res/values-mk/strings.xml +++ b/packages/CredentialManager/res/values-mk/strings.xml @@ -56,7 +56,7 @@ <string name="use_provider_for_all_description" msgid="1998772715863958997">"Овој управник со лозинки за <xliff:g id="USERNAME">%1$s</xliff:g> ќе ги складира вашите лозинки и криптографски клучеви за да ви помогне лесно да се најавите"</string> <string name="set_as_default" msgid="4415328591568654603">"Постави како стандардна опција"</string> <string name="settings" msgid="6536394145760913145">"Поставки"</string> - <string name="use_once" msgid="9027366575315399714">"Употребете еднаш"</string> + <string name="use_once" msgid="9027366575315399714">"Употреби го еднаш"</string> <string name="more_options_usage_passwords_passkeys" msgid="3470113942332934279">"Лозинки: <xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> • Криптографски клучеви: <xliff:g id="PASSKEYSNUMBER">%2$s</xliff:g>"</string> <string name="more_options_usage_passwords" msgid="1632047277723187813">"<xliff:g id="PASSWORDSNUMBER">%1$s</xliff:g> лозинки"</string> <string name="more_options_usage_passkeys" msgid="5390320437243042237">"Криптографски клучеви: <xliff:g id="PASSKEYSNUMBER">%1$s</xliff:g>"</string> diff --git a/packages/CredentialManager/res/values-sk/strings.xml b/packages/CredentialManager/res/values-sk/strings.xml index 8168b5178f80..90805a40e002 100644 --- a/packages/CredentialManager/res/values-sk/strings.xml +++ b/packages/CredentialManager/res/values-sk/strings.xml @@ -53,7 +53,7 @@ <string name="save_password_on_other_device_title" msgid="5829084591948321207">"Chcete uložiť heslo v inom zariadení?"</string> <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"Chcete uložiť prihlasovacie údaje v inom zariadení?"</string> <string name="use_provider_for_all_title" msgid="4201020195058980757">"Chcete pre všetky svoje prihlasovacie údaje použiť <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g>?"</string> - <string name="use_provider_for_all_description" msgid="1998772715863958997">"Tento správca hesiel poskytovateľa <xliff:g id="USERNAME">%1$s</xliff:g> uchová vaše heslá a prístupové kľúče, aby vám pomohol ľahšie sa prihlasovať"</string> + <string name="use_provider_for_all_description" msgid="1998772715863958997">"Tento správca hesiel pre účet <xliff:g id="USERNAME">%1$s</xliff:g> bude uchovávať vaše heslá a prístupové kľúče, aby ste sa mohli ľahšie prihlasovať"</string> <string name="set_as_default" msgid="4415328591568654603">"Nastaviť ako predvolené"</string> <string name="settings" msgid="6536394145760913145">"Nastavenia"</string> <string name="use_once" msgid="9027366575315399714">"Použiť raz"</string> diff --git a/packages/CredentialManager/res/values-sr/strings.xml b/packages/CredentialManager/res/values-sr/strings.xml index f5a29a212a61..b83c69816341 100644 --- a/packages/CredentialManager/res/values-sr/strings.xml +++ b/packages/CredentialManager/res/values-sr/strings.xml @@ -49,7 +49,7 @@ <string name="sign_ins" msgid="4710739369149469208">"пријављивања"</string> <string name="sign_in_info" msgid="2627704710674232328">"подаци за пријављивање"</string> <string name="save_credential_to_title" msgid="3172811692275634301">"Сачувај <xliff:g id="CREDENTIALTYPES">%1$s</xliff:g> у"</string> - <string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"Желите да направите приступни кôд на другом уређају?"</string> + <string name="create_passkey_in_other_device_title" msgid="2360053098931886245">"Желите да направите приступни кључ на другом уређају?"</string> <string name="save_password_on_other_device_title" msgid="5829084591948321207">"Желите да сачувате лозинку на другом уређају?"</string> <string name="save_sign_in_on_other_device_title" msgid="2827990118560134692">"Желите да сачувате акредитиве за пријаву на другом уређају?"</string> <string name="use_provider_for_all_title" msgid="4201020195058980757">"Желите да за сва пријављивања користите: <xliff:g id="PROVIDERINFODISPLAYNAME">%1$s</xliff:g>?"</string> @@ -72,7 +72,7 @@ <string name="get_dialog_title_use_password_for" msgid="625828023234318484">"Желите да користите сачувану лозинку за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="get_dialog_title_use_sign_in_for" msgid="790049858275131785">"Желите ли да користите своје податке за пријављивање за апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> <string name="get_dialog_title_unlock_options_for" msgid="7605568190597632433">"Желите да откључате опције пријављивања за: <xliff:g id="APP_NAME">%1$s</xliff:g>?"</string> - <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Изаберите сачуван приступни кôд за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="get_dialog_title_choose_passkey_for" msgid="9175997688078538490">"Изаберите сачуван приступни кључ за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="get_dialog_title_choose_password_for" msgid="1724435823820819221">"Изаберите сачувану лозинку за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="get_dialog_title_choose_saved_sign_in_for" msgid="2420298653461652728">"Изаберите сачуване податке за пријављивање за: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="get_dialog_title_choose_sign_in_for" msgid="3048870756117876514">"Одаберите податке за пријављивање за апликацију <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> diff --git a/packages/CredentialManager/res/values-zh-rCN/strings.xml b/packages/CredentialManager/res/values-zh-rCN/strings.xml index 42eaf00a5a07..15a668a73d1f 100644 --- a/packages/CredentialManager/res/values-zh-rCN/strings.xml +++ b/packages/CredentialManager/res/values-zh-rCN/strings.xml @@ -33,7 +33,7 @@ <string name="passwordless_technology_detail" msgid="6853928846532955882">"借助通行密钥,您不必依赖密码就能登录。您只需使用指纹、人脸识别功能、PIN 码或滑动图案便可验证您的身份并创建通行密钥。"</string> <string name="public_key_cryptography_title" msgid="6751970819265298039">"公钥加密"</string> <string name="public_key_cryptography_detail" msgid="6937631710280562213">"根据 FIDO 联盟(成员包括 Google、Apple、Microsoft 等)和 W3C 的标准,通行密钥使用加密密钥对。不同于“用户名+密码字符串”的传统登录凭据,采用通行密钥时,系统会为应用或网站创建一个私钥-公钥对。私钥会安全地存储在您的设备上或密码管理工具中,用于证实您的身份。公钥会被共享给应用或网站服务器。您只要使用相应密钥,就能瞬间注册并登录。"</string> - <string name="improved_account_security_title" msgid="1069841917893513424">"提升了帐号安全性"</string> + <string name="improved_account_security_title" msgid="1069841917893513424">"提升了账号安全性"</string> <string name="improved_account_security_detail" msgid="9123750251551844860">"每个密钥都是专为特定应用或网站创建的,且仅与各自对应的网站或应用关联,因此您绝不会错误地登录任何欺诈性应用或网站。另外,由于服务器只保留公钥,黑客入侵的难度会大大增加。"</string> <string name="seamless_transition_title" msgid="5335622196351371961">"无缝转换"</string> <string name="seamless_transition_detail" msgid="4475509237171739843">"在我们向无密码未来迈进的过程中,密码仍会与通行密钥并行使用。"</string> diff --git a/packages/CredentialManager/shared/OWNERS b/packages/CredentialManager/shared/OWNERS new file mode 100644 index 000000000000..b67932835b4a --- /dev/null +++ b/packages/CredentialManager/shared/OWNERS @@ -0,0 +1,4 @@ +include /core/java/android/credentials/OWNERS + +shuanghao@google.com +gustavopagani@google.com diff --git a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt index b86eec04d542..8361877744cf 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/DataConverter.kt @@ -68,11 +68,12 @@ fun getAppLabel( ): String? { return try { val pkgInfo = pm.getPackageInfo(appPackageName, PackageManager.PackageInfoFlags.of(0)) - pkgInfo.applicationInfo.loadSafeLabel( + val applicationInfo = checkNotNull(pkgInfo.applicationInfo) + applicationInfo.loadSafeLabel( pm, 0f, TextUtils.SAFE_STRING_FLAG_FIRST_LINE or TextUtils.SAFE_STRING_FLAG_TRIM ).toString() - } catch (e: PackageManager.NameNotFoundException) { + } catch (e: Exception) { Log.e(Constants.LOG_TAG, "Caller app not found", e) null } @@ -93,13 +94,14 @@ private fun getServiceLabelAndIcon( providerFlattenedComponentName, PackageManager.PackageInfoFlags.of(0) ) + val applicationInfo = checkNotNull(pkgInfo.applicationInfo) providerLabel = - pkgInfo.applicationInfo.loadSafeLabel( + applicationInfo.loadSafeLabel( pm, 0f, TextUtils.SAFE_STRING_FLAG_FIRST_LINE or TextUtils.SAFE_STRING_FLAG_TRIM ).toString() - providerIcon = pkgInfo.applicationInfo.loadIcon(pm) - } catch (e: PackageManager.NameNotFoundException) { + providerIcon = applicationInfo.loadIcon(pm) + } catch (e: Exception) { Log.e(Constants.LOG_TAG, "Provider package info not found", e) } } else { @@ -119,13 +121,14 @@ private fun getServiceLabelAndIcon( component.packageName, PackageManager.PackageInfoFlags.of(0) ) + val applicationInfo = checkNotNull(pkgInfo.applicationInfo) providerLabel = - pkgInfo.applicationInfo.loadSafeLabel( + applicationInfo.loadSafeLabel( pm, 0f, TextUtils.SAFE_STRING_FLAG_FIRST_LINE or TextUtils.SAFE_STRING_FLAG_TRIM ).toString() - providerIcon = pkgInfo.applicationInfo.loadIcon(pm) - } catch (e: PackageManager.NameNotFoundException) { + providerIcon = applicationInfo.loadIcon(pm) + } catch (e: Exception) { Log.e(Constants.LOG_TAG, "Provider package info not found", e) } } diff --git a/packages/CredentialManager/wear/OWNERS b/packages/CredentialManager/wear/OWNERS new file mode 100644 index 000000000000..b67932835b4a --- /dev/null +++ b/packages/CredentialManager/wear/OWNERS @@ -0,0 +1,4 @@ +include /core/java/android/credentials/OWNERS + +shuanghao@google.com +gustavopagani@google.com diff --git a/packages/CtsShim/build/Android.bp b/packages/CtsShim/build/Android.bp index d778febe9faf..d6b7ecf5819d 100644 --- a/packages/CtsShim/build/Android.bp +++ b/packages/CtsShim/build/Android.bp @@ -208,3 +208,22 @@ android_app { ], min_sdk_version: "24", } + +//########################################################## +// Variant: Add apk to an apex +android_app { + name: "CtsShimAddApkToApex", + sdk_version: "current", + srcs: ["shim_add_apk_to_apex/src/android/addapktoapex/app/AddApkToApexDeviceActivity.java"], + optimize: { + enabled: false, + }, + dex_preopt: { + enabled: false, + }, + manifest: "shim_add_apk_to_apex/AndroidManifestAddApkToApex.xml", + apex_available: [ + "//apex_available:platform", + "com.android.apex.cts.shim.v2_add_apk_to_apex", + ], +} diff --git a/packages/CtsShim/build/shim_add_apk_to_apex/AndroidManifestAddApkToApex.xml b/packages/CtsShim/build/shim_add_apk_to_apex/AndroidManifestAddApkToApex.xml new file mode 100644 index 000000000000..0e620b062ed6 --- /dev/null +++ b/packages/CtsShim/build/shim_add_apk_to_apex/AndroidManifestAddApkToApex.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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="android.addapktoapex.app"> + + <application> + <activity android:name=".AddApkToApexDeviceActivity" + android:exported="true"> + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="android.intent.category.LAUNCHER"/> + </intent-filter> + </activity> + </application> + +</manifest>
\ No newline at end of file diff --git a/packages/CtsShim/build/shim_add_apk_to_apex/src/android/addapktoapex/app/AddApkToApexDeviceActivity.java b/packages/CtsShim/build/shim_add_apk_to_apex/src/android/addapktoapex/app/AddApkToApexDeviceActivity.java new file mode 100644 index 000000000000..c68904b30d6a --- /dev/null +++ b/packages/CtsShim/build/shim_add_apk_to_apex/src/android/addapktoapex/app/AddApkToApexDeviceActivity.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.addapktoapex.app; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; + +/** + * A simple activity which logs to Logcat. + */ +public class AddApkToApexDeviceActivity extends Activity { + + private static final String TAG = AddApkToApexDeviceActivity.class.getSimpleName(); + + /** + * The test string to log. + */ + private static final String TEST_STRING = "AddApkToApexTestString"; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + // Log the test string to Logcat. + Log.i(TAG, TEST_STRING); + } + +} diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java index b265a425d2e7..25ac3c9d9074 100644 --- a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java +++ b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/DynamicSystemInstallationService.java @@ -16,11 +16,10 @@ package com.android.dynsystem; -import static android.os.AsyncTask.Status.FINISHED; -import static android.os.AsyncTask.Status.PENDING; import static android.os.AsyncTask.Status.RUNNING; import static android.os.image.DynamicSystemClient.ACTION_HIDE_NOTIFICATION; import static android.os.image.DynamicSystemClient.ACTION_NOTIFY_IF_IN_USE; +import static android.os.image.DynamicSystemClient.ACTION_NOTIFY_KEYGUARD_DISMISSED; import static android.os.image.DynamicSystemClient.ACTION_START_INSTALL; import static android.os.image.DynamicSystemClient.CAUSE_ERROR_EXCEPTION; import static android.os.image.DynamicSystemClient.CAUSE_ERROR_INVALID_URL; @@ -234,6 +233,8 @@ public class DynamicSystemInstallationService extends Service executeNotifyIfInUseCommand(); } else if (ACTION_HIDE_NOTIFICATION.equals(action)) { executeHideNotificationCommand(); + } else if (ACTION_NOTIFY_KEYGUARD_DISMISSED.equals(action)) { + executeNotifyKeyguardDismissed(); } return Service.START_NOT_STICKY; @@ -418,12 +419,23 @@ public class DynamicSystemInstallationService extends Service mDynSystem.remove(); } + private boolean isDsuSlotLocked() { + // Slot names ending with ".lock" are a customized installation. + // We expect the client app to provide custom UI to enter/exit DSU mode. + // We will ignore the ACTION_REBOOT_TO_NORMAL command and will not show + // notifications in this case. + return mDynSystem.getActiveDsuSlot().endsWith(".lock"); + } + private void executeRebootToNormalCommand() { if (!isInDynamicSystem()) { Log.e(TAG, "It's already running in normal system."); return; } - + if (isDsuSlotLocked()) { + Log.e(TAG, "Ignore the reboot intent for a locked DSU slot"); + return; + } if (!mDynSystem.setEnable(/* enable = */ false, /* oneShot = */ false)) { Log.e(TAG, "Failed to disable DynamicSystem."); @@ -445,13 +457,13 @@ public class DynamicSystemInstallationService extends Service private void executeNotifyIfInUseCommand() { switch (getStatus()) { case STATUS_IN_USE: - if (!mHideNotification) { + if (!mHideNotification && !isDsuSlotLocked()) { startForeground(NOTIFICATION_ID, buildNotification(STATUS_IN_USE, CAUSE_NOT_SPECIFIED)); } break; case STATUS_READY: - if (!mHideNotification) { + if (!mHideNotification && !isDsuSlotLocked()) { startForeground(NOTIFICATION_ID, buildNotification(STATUS_READY, CAUSE_NOT_SPECIFIED)); } @@ -474,6 +486,10 @@ public class DynamicSystemInstallationService extends Service } } + private void executeNotifyKeyguardDismissed() { + postStatus(STATUS_NOT_STARTED, CAUSE_INSTALL_CANCELLED, null); + } + private void resetTaskAndStop() { resetTaskAndStop(/* removeNotification= */ false); } diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/VerificationActivity.java b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/VerificationActivity.java index b52272961e4b..7401691cd59e 100644 --- a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/VerificationActivity.java +++ b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/VerificationActivity.java @@ -16,6 +16,7 @@ package com.android.dynsystem; +import static android.os.image.DynamicSystemClient.ACTION_NOTIFY_KEYGUARD_DISMISSED; import static android.os.image.DynamicSystemClient.KEY_KEYGUARD_USE_DEFAULT_STRINGS; import android.app.Activity; @@ -83,11 +84,19 @@ public class VerificationActivity extends Activity { protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { startInstallationService(); + } else { + notifyKeyguardDismissed(); } finish(); } + private void notifyKeyguardDismissed() { + Intent intent = new Intent(this, DynamicSystemInstallationService.class); + intent.setAction(ACTION_NOTIFY_KEYGUARD_DISMISSED); + startServiceAsUser(intent, UserHandle.SYSTEM); + } + private void startInstallationService() { // retrieve data from calling intent Intent callingIntent = getIntent(); diff --git a/packages/EasterEgg/Android.bp b/packages/EasterEgg/Android.bp index 8699f59e4fba..0caf505c2177 100644 --- a/packages/EasterEgg/Android.bp +++ b/packages/EasterEgg/Android.bp @@ -70,5 +70,5 @@ android_app { manifest: "AndroidManifest.xml", - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], } diff --git a/packages/EasterEgg/src/com/android/egg/quares/Quare.kt b/packages/EasterEgg/src/com/android/egg/quares/Quare.kt index eb77362a0be2..f0cc2a1eac93 100644 --- a/packages/EasterEgg/src/com/android/egg/quares/Quare.kt +++ b/packages/EasterEgg/src/com/android/egg/quares/Quare.kt @@ -137,14 +137,12 @@ class Quare(val width: Int, val height: Int, val depth: Int) : Parcelable { return 0 } - override fun writeToParcel(p: Parcel?, flags: Int) { - p?.let { - p.writeInt(width) - p.writeInt(height) - p.writeInt(depth) - p.writeIntArray(data) - p.writeIntArray(user) - } + override fun writeToParcel(p: Parcel, flags: Int) { + p.writeInt(width) + p.writeInt(height) + p.writeInt(depth) + p.writeIntArray(data) + p.writeIntArray(user) } companion object CREATOR : Parcelable.Creator<Quare> { diff --git a/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt b/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt index 578de01a0c30..562f7be5ae1e 100644 --- a/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt +++ b/packages/EasterEgg/src/com/android/egg/quares/QuaresActivity.kt @@ -60,8 +60,8 @@ class QuaresActivity : Activity() { setContentView(R.layout.activity_quares) - grid = findViewById(R.id.grid) - label = findViewById(R.id.label) + grid = requireViewById(R.id.grid) + label = requireViewById(R.id.label) if (savedInstanceState != null) { Log.v(TAG, "restoring puzzle from state") @@ -135,7 +135,7 @@ class QuaresActivity : Activity() { if (q.check()) { val dp = resources.displayMetrics.density - val label: Button = findViewById(R.id.label) + val label: Button = requireViewById(R.id.label) label.text = resName.replace(Regex("^.*/"), "") val drawable = icon?.loadDrawable(this)?.also { it.setBounds(0, 0, (32 * dp).toInt(), (32 * dp).toInt()) @@ -293,7 +293,7 @@ class ClueView(context: Context) : View(context) { return correct } - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) if (!showText) return canvas?.let { diff --git a/packages/EncryptedLocalTransport/Android.bp b/packages/EncryptedLocalTransport/Android.bp index 09e563076c95..9ae6d9648979 100644 --- a/packages/EncryptedLocalTransport/Android.bp +++ b/packages/EncryptedLocalTransport/Android.bp @@ -27,9 +27,6 @@ android_app { name: "EncryptedLocalTransport", defaults: ["platform_app_defaults"], srcs: ["src/**/*.java"], - optimize: { - proguard_flags_files: ["proguard.flags"], - }, static_libs: ["LocalTransport"], platform_apis: true, certificate: "platform", diff --git a/packages/EncryptedLocalTransport/proguard.flags b/packages/EncryptedLocalTransport/proguard.flags deleted file mode 100644 index e4ce3c524e35..000000000000 --- a/packages/EncryptedLocalTransport/proguard.flags +++ /dev/null @@ -1,2 +0,0 @@ --keep class com.android.localTransport.EncryptedLocalTransport --keep class com.android.localTransport.EncryptedLocalTransportService diff --git a/packages/InputDevices/res/values-bs/strings.xml b/packages/InputDevices/res/values-bs/strings.xml index df58464eefda..c6cacbc93552 100644 --- a/packages/InputDevices/res/values-bs/strings.xml +++ b/packages/InputDevices/res/values-bs/strings.xml @@ -34,7 +34,7 @@ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"brazilski"</string> <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"portugalski"</string> <string name="keyboard_layout_slovak" msgid="2469379934672837296">"slovački"</string> - <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovenački"</string> + <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"slovenski"</string> <string name="keyboard_layout_turkish" msgid="7736163250907964898">"turski"</string> <string name="keyboard_layout_turkish_f" msgid="9130320856010776018">"turski F"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ukrajinski"</string> diff --git a/packages/InputDevices/res/values-hi/strings.xml b/packages/InputDevices/res/values-hi/strings.xml index 892fbc5440ff..2562854378d1 100644 --- a/packages/InputDevices/res/values-hi/strings.xml +++ b/packages/InputDevices/res/values-hi/strings.xml @@ -28,7 +28,7 @@ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"क्रोएशियन"</string> <string name="keyboard_layout_czech" msgid="1349256901452975343">"चेक"</string> <string name="keyboard_layout_czech_qwerty" msgid="3331402534128515501">"चेक QWERTY स्टाइल"</string> - <string name="keyboard_layout_estonian" msgid="8775830985185665274">"एस्टोनियाई"</string> + <string name="keyboard_layout_estonian" msgid="8775830985185665274">"एस्टोनियन"</string> <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"हंगेरियाई"</string> <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"आइसलैंडिक"</string> <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ब्राज़ीलियाई"</string> diff --git a/packages/InputDevices/res/values-sv/strings.xml b/packages/InputDevices/res/values-sv/strings.xml index a08a74b99786..3d0b945b7f79 100644 --- a/packages/InputDevices/res/values-sv/strings.xml +++ b/packages/InputDevices/res/values-sv/strings.xml @@ -12,13 +12,13 @@ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"Tyskt"</string> <string name="keyboard_layout_french_label" msgid="813450119589383723">"Franskt"</string> <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"Franskt (Kanada)"</string> - <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"Ryskt"</string> + <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ryska"</string> <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"Ryskt, Mac"</string> <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"Spanskt"</string> <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"Franskt (Schweiz)"</string> <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"Tyskt (Schweiz)"</string> <string name="keyboard_layout_belgian" msgid="2011984572838651558">"Belgiskt"</string> - <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"Bulgariskt"</string> + <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"bulgariska"</string> <string name="keyboard_layout_bulgarian_phonetic" msgid="7568914730360106653">"Bulgariska (fonetiskt)"</string> <string name="keyboard_layout_italian" msgid="6497079660449781213">"Italienskt"</string> <string name="keyboard_layout_danish" msgid="8036432066627127851">"Danskt"</string> @@ -38,9 +38,9 @@ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"Turkiskt"</string> <string name="keyboard_layout_turkish_f" msgid="9130320856010776018">"turkiska, F"</string> <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"Ukrainskt"</string> - <string name="keyboard_layout_arabic" msgid="5671970465174968712">"Arabiska"</string> - <string name="keyboard_layout_greek" msgid="7289253560162386040">"Grekiska"</string> - <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"Hebreiska"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"arabiska"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"grekiska"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"hebreiska"</string> <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"Litauiska"</string> <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"Spanska (latinamerikansk)"</string> <string name="keyboard_layout_latvian" msgid="4405417142306250595">"lettiska"</string> diff --git a/packages/Keyguard/proguard.flags b/packages/Keyguard/proguard.flags deleted file mode 100644 index fb74b64cb92b..000000000000 --- a/packages/Keyguard/proguard.flags +++ /dev/null @@ -1,27 +0,0 @@ --keep public class * { - public void setBackgroundAlpha(float); - public float getBackgroundAlpha(); - public void setContentAlpha(float); - public float getContentAlpha(); - public void setAlpha(float); - public float getAlpha(); - public void setAlpha(int); - public int getAlpha(); - public void setRotationX(float); - public float getRotationX(); - public void setRotationY(float); - public float getRotationY(); - public void setPivotX(float); - public float getPivotX(); - public void setPivotY(float); - public float getPivotY(); - public void setScaleX(float); - public float getScaleX(); - public void setScaleY(float); - public float getScaleY(); - public void setTranslationX(float); - public float getTranslationX(); - public void setTranslationY(float); - public float getTranslationY(); -} - diff --git a/packages/LocalTransport/Android.bp b/packages/LocalTransport/Android.bp index d4fa1915a140..e7a273b83a7d 100644 --- a/packages/LocalTransport/Android.bp +++ b/packages/LocalTransport/Android.bp @@ -27,9 +27,7 @@ android_app { name: "LocalTransport", defaults: ["platform_app_defaults"], srcs: ["src/**/*.java"], - optimize: { - proguard_flags_files: ["proguard.flags"], - }, + libs: ["keepanno-annotations"], platform_apis: true, certificate: "platform", privileged: true, diff --git a/packages/LocalTransport/proguard.flags b/packages/LocalTransport/proguard.flags deleted file mode 100644 index c1f51b892d40..000000000000 --- a/packages/LocalTransport/proguard.flags +++ /dev/null @@ -1,5 +0,0 @@ --keep class com.android.localTransport.LocalTransport --keep class com.android.localTransport.LocalTransportParameters --keep class com.android.localTransport.LocalTransportService - - diff --git a/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java b/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java index 73f87302dd05..933be11bfaf1 100644 --- a/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java +++ b/packages/LocalTransport/src/com/android/localtransport/LocalTransport.java @@ -38,6 +38,9 @@ import android.util.ArrayMap; import android.util.Base64; import android.util.Log; +import com.android.tools.r8.keepanno.annotations.KeepTarget; +import com.android.tools.r8.keepanno.annotations.UsesReflection; + import libcore.io.IoUtils; import java.io.BufferedOutputStream; @@ -127,6 +130,13 @@ public class LocalTransport extends BackupTransport { return mParameters; } + + @UsesReflection({ + // As the runtime class name is used to generate the returned name, and the returned + // name may be used used with reflection, generate the necessary keep rules. + @KeepTarget(classConstant = LocalTransport.class), + @KeepTarget(extendsClassConstant = LocalTransport.class) + }) @Override public String name() { return new ComponentName(mContext, this.getClass()).flattenToShortString(); diff --git a/packages/PackageInstaller/Android.bp b/packages/PackageInstaller/Android.bp index 6ecd3280a0e7..8283ec99bcd8 100644 --- a/packages/PackageInstaller/Android.bp +++ b/packages/PackageInstaller/Android.bp @@ -46,6 +46,10 @@ android_app { "androidx.leanback_leanback", "androidx.annotation_annotation", ], + + lint: { + error_checks: ["Recycle"], + }, } android_app { @@ -65,6 +69,10 @@ android_app { "androidx.leanback_leanback", ], aaptflags: ["--product tablet"], + + lint: { + error_checks: ["Recycle"], + }, } android_app { @@ -85,4 +93,8 @@ android_app { "androidx.annotation_annotation", ], aaptflags: ["--product tv"], + + lint: { + error_checks: ["Recycle"], + }, } diff --git a/packages/PackageInstaller/res/values-ca/strings.xml b/packages/PackageInstaller/res/values-ca/strings.xml index 8b0d1a8c9e61..081d3311b877 100644 --- a/packages/PackageInstaller/res/values-ca/strings.xml +++ b/packages/PackageInstaller/res/values-ca/strings.xml @@ -80,7 +80,7 @@ <string name="uninstall_blocked_profile_owner" msgid="6373897407002404848">"Aquesta aplicació és necessària per al teu perfil i no es pot desinstal·lar."</string> <string name="uninstall_blocked_device_owner" msgid="6724602931761073901">"L\'administrador del dispositiu necessita l\'aplicació i no la pots desinstal·lar."</string> <string name="manage_device_administrators" msgid="3092696419363842816">"Gestiona aplicacions d\'administració del dispositiu"</string> - <string name="manage_users" msgid="1243995386982560813">"Gestiona usuaris"</string> + <string name="manage_users" msgid="1243995386982560813">"Gestiona els usuaris"</string> <string name="uninstall_failed_msg" msgid="2176744834786696012">"No s\'ha pogut desinstal·lar <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="Parse_error_dlg_text" msgid="1661404001063076789">"Hi ha hagut un problema en analitzar el paquet."</string> <string name="wear_not_allowed_dlg_title" msgid="8664785993465117517">"Android Wear"</string> diff --git a/packages/PackageInstaller/res/values-it/strings.xml b/packages/PackageInstaller/res/values-it/strings.xml index 323db1da8845..8dd1ad327356 100644 --- a/packages/PackageInstaller/res/values-it/strings.xml +++ b/packages/PackageInstaller/res/values-it/strings.xml @@ -48,7 +48,7 @@ <string name="out_of_space_dlg_text" msgid="8727714096031856231">"Impossibile installare <xliff:g id="APP_NAME">%1$s</xliff:g>. Libera dello spazio e riprova."</string> <string name="app_not_found_dlg_title" msgid="5107924008597470285">"App non trovata"</string> <string name="app_not_found_dlg_text" msgid="5219983779377811611">"Impossibile trovare l\'applicazione nell\'elenco di applicazioni installate."</string> - <string name="user_is_not_allowed_dlg_title" msgid="6915293433252210232">"Non autorizzate"</string> + <string name="user_is_not_allowed_dlg_title" msgid="6915293433252210232">"Non autorizzata"</string> <string name="user_is_not_allowed_dlg_text" msgid="3468447791330611681">"L\'utente corrente non è autorizzato a eseguire questa disinstallazione."</string> <string name="generic_error_dlg_title" msgid="5863195085927067752">"Errore"</string> <string name="generic_error_dlg_text" msgid="5287861443265795232">"Impossibile disinstallare l\'app."</string> diff --git a/packages/PackageInstaller/res/values-pt-rPT/strings.xml b/packages/PackageInstaller/res/values-pt-rPT/strings.xml index de85f662f0a9..ebe57508de92 100644 --- a/packages/PackageInstaller/res/values-pt-rPT/strings.xml +++ b/packages/PackageInstaller/res/values-pt-rPT/strings.xml @@ -25,7 +25,7 @@ <string name="installing_app" msgid="1165095864863849422">"A instalar <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g>…"</string> <string name="install_done" msgid="5987363587661783896">"App instalada."</string> <string name="install_confirm_question" msgid="7663733664476363311">"Instalar esta app?"</string> - <string name="install_confirm_question_update" msgid="3348888852318388584">"Pretende atualizar esta app?"</string> + <string name="install_confirm_question_update" msgid="3348888852318388584">"Quer atualizar esta app?"</string> <string name="install_confirm_question_update_owner_reminder" msgid="3750986542284587290">"Atualizar esta app a partir de <xliff:g id="NEW_UPDATE_OWNER">%1$s</xliff:g>?\n\nNormalmente, esta app recebe atualizações de <xliff:g id="EXISTING_UPDATE_OWNER">%2$s</xliff:g>. Se atualizar a partir de uma fonte diferente, poderá receber futuras atualizações de qualquer fonte no seu telemóvel. A funcionalidade da app pode sofrer alterações."</string> <string name="install_failed" msgid="5777824004474125469">"Aplicação não instalada."</string> <string name="install_failed_blocked" msgid="8512284352994752094">"Foi bloqueada a instalação do pacote."</string> @@ -56,11 +56,11 @@ <string name="uninstall_update_title" msgid="824411791011583031">"Desinstalar atualização"</string> <string name="uninstall_activity_text" msgid="1928194674397770771">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> faz parte da seguinte app:"</string> <string name="uninstall_application_text" msgid="3816830743706143980">"Desinstalar esta app?"</string> - <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Pretende desinstalar esta app para "<b>"todos"</b>" os utilizadores? A app e os respetivos dados serão removidos de "<b>"todos"</b>" os utilizadores do dispositivo."</string> - <string name="uninstall_application_text_user" msgid="498072714173920526">"Pretende desinstalar esta app para o utilizador <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> + <string name="uninstall_application_text_all_users" msgid="575491774380227119">"Quer desinstalar esta app para "<b>"todos"</b>" os utilizadores? A app e os respetivos dados serão removidos de "<b>"todos"</b>" os utilizadores do dispositivo."</string> + <string name="uninstall_application_text_user" msgid="498072714173920526">"Quer desinstalar esta app para o utilizador <xliff:g id="USERNAME">%1$s</xliff:g>?"</string> <string name="uninstall_application_text_current_user_work_profile" msgid="8788387739022366193">"Quer desinstalar esta app do seu perfil de trabalho?"</string> - <string name="uninstall_update_text" msgid="863648314632448705">"Pretende substituir esta app pela versão de fábrica? Todos os dados são removidos."</string> - <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Pretende substituir esta app pela versão de fábrica? Todos os dados são removidos. Esta ação afeta todos os utilizadores deste dispositivo, incluindo os que têm perfis de trabalho."</string> + <string name="uninstall_update_text" msgid="863648314632448705">"Quer substituir esta app pela versão de fábrica? Todos os dados são removidos."</string> + <string name="uninstall_update_text_multiuser" msgid="8992883151333057227">"Quer substituir esta app pela versão de fábrica? Todos os dados são removidos. Esta ação afeta todos os utilizadores deste dispositivo, incluindo os que têm perfis de trabalho."</string> <string name="uninstall_keep_data" msgid="7002379587465487550">"Manter <xliff:g id="SIZE">%1$s</xliff:g> de dados da app."</string> <string name="uninstall_application_text_current_user_clone_profile" msgid="835170400160011636">"Quer apagar esta app?"</string> <string name="uninstall_application_text_with_clone_instance" msgid="6944473334273349036">"Quer desinstalar esta app? O clone de <xliff:g id="PACKAGE_LABEL">%1$s</xliff:g> também vai ser apagado."</string> diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java index d1541569bc55..38d5d3a15914 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -429,7 +429,7 @@ public class PackageInstallerActivity extends AlertActivity { if (mLocalLOGV) Log.i(TAG, "onResume(): mAppSnippet=" + mAppSnippet); if (mAppSnippet != null) { - // load dummy layout with OK button disabled until we override this layout in + // load placeholder layout with OK button disabled until we override this layout in // startInstallConfirm bindUi(); checkIfAllowedAndInitiateInstall(); diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index d5dc97a094b1..a830653eb44a 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -31,8 +31,8 @@ <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">"ለምሳሌ፦ 1–5,8,11–13"</string> - <string name="print_preview" msgid="8010217796057763343">"የህትመት ቅድመ እይታ"</string> - <string name="install_for_print_preview" msgid="6366303997385509332">"ለቅድመ-እይታ የፒ ዲ ኤፍ መመልከቻ ይጫኑ"</string> + <string name="print_preview" msgid="8010217796057763343">"የህትመት ቅድመ ዕይታ"</string> + <string name="install_for_print_preview" msgid="6366303997385509332">"ለቅድመ-ዕይታ የፒ ዲ ኤፍ መመልከቻ ይጫኑ"</string> <string name="printing_app_crashed" msgid="854477616686566398">"የአታሚ መተግበሪያ ተበላሽቷል"</string> <string name="generating_print_job" msgid="3119608742651698916">"የህትመት ስራን በማመንጨት ላይ"</string> <string name="save_as_pdf" msgid="5718454119847596853">"እንደ PDF አስቀምጥ"</string> diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index c9a52a87f9a6..a1a7a3b72f20 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -89,7 +89,7 @@ <string name="restart" msgid="2472034227037808749">"Reiniciar"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Sem ligação à impressora"</string> <string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string> - <string name="print_service_security_warning_title" msgid="2160752291246775320">"Pretende utilizar o <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> + <string name="print_service_security_warning_title" msgid="2160752291246775320">"Quer utilizar o <xliff:g id="SERVICE">%1$s</xliff:g>?"</string> <string name="print_service_security_warning_summary" msgid="1427434625361692006">"O seu documento pode passar por um ou mais servidores no respetivo caminho para a impressora."</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Preto e branco"</item> diff --git a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml index 4de6c617dc4c..3b3f01912656 100644 --- a/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml +++ b/packages/SettingsLib/ProfileSelector/res/values-am/strings.xml @@ -18,5 +18,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="settingslib_category_personal" msgid="1142302328104700620">"የግል"</string> - <string name="settingslib_category_work" msgid="4867750733682444676">"ስራ"</string> + <string name="settingslib_category_work" msgid="4867750733682444676">"ሥራ"</string> </resources> diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt index 2b38b4cefe3e..657c391da7c2 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppListRepository.kt @@ -75,6 +75,7 @@ internal class AppListRepositoryImpl(private val context: Context) : AppListRepo packageManager.getInstalledModules(0) .filter { it.isHidden } .map { it.packageName } + .filterNotNull() .toSet() } val hideWhenDisabledPackagesDeferred = async { diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt index 69c6131679a9..92fd0cd07777 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/PackageManagers.kt @@ -82,7 +82,8 @@ internal class PackageManagersImpl( val packageInfo = getPackageInfoAsUser(packageName, PackageManager.GET_PERMISSIONS, userId) val index = packageInfo?.requestedPermissions?.indexOf(permission) ?: return false return index >= 0 && - packageInfo.requestedPermissionsFlags[index].hasFlag(REQUESTED_PERMISSION_GRANTED) + checkNotNull(packageInfo.requestedPermissionsFlags)[index] + .hasFlag(REQUESTED_PERMISSION_GRANTED) } override suspend fun getAppOpPermissionPackages(userId: Int, permission: String): Set<String> = diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/EnterpriseRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/EnterpriseRepository.kt index fab3ae8e510b..20beec73c958 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/EnterpriseRepository.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/EnterpriseRepository.kt @@ -28,7 +28,7 @@ class EnterpriseRepository(private val context: Context) { } fun getEnterpriseString(updatableStringId: String, resId: Int): String = - resources.getString(updatableStringId) { context.getString(resId) } + checkNotNull(resources.getString(updatableStringId) { context.getString(resId) }) fun getProfileTitle(isManagedProfile: Boolean): String = if (isManagedProfile) { getEnterpriseString(WORK_CATEGORY_HEADER, R.string.category_work) diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt index ae362c894e6d..481555651398 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt @@ -22,7 +22,6 @@ import android.os.UserHandle import android.os.UserManager import androidx.compose.runtime.Composable import androidx.compose.runtime.State -import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.settingslib.RestrictedLockUtils import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin @@ -86,7 +85,6 @@ internal class RestrictionsProviderImpl( emit(getRestrictedMode()) }.flowOn(Dispatchers.IO) - @OptIn(ExperimentalLifecycleComposeApi::class) @Composable override fun restrictedModeState() = restrictedMode.collectAsStateWithLifecycle(initialValue = null) diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt index a0ff216875a2..55a438f1f1fd 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppInfo.kt @@ -55,7 +55,7 @@ class AppInfoProvider(private val packageInfo: PackageInfo) { .semantics(mergeDescendants = true) {}, horizontalAlignment = Alignment.CenterHorizontally, ) { - val app = packageInfo.applicationInfo + val app = checkNotNull(packageInfo.applicationInfo) Box(modifier = Modifier.padding(SettingsDimension.itemPaddingAround)) { AppIcon(app = app, size = SettingsDimension.appIconInfoSize) } diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt index 7c689c62427e..1a627409632e 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt @@ -144,7 +144,7 @@ internal fun TogglePermissionAppListModel<out AppRecord>.TogglePermissionAppInfo footerContent = footerContent(), packageManagers = packageManagers, ) { - val model = createSwitchModel(applicationInfo) + val model = createSwitchModel(checkNotNull(applicationInfo)) val restrictions = Restrictions(userId, switchRestrictionKeys) RestrictedSwitchPreference(model, restrictions, restrictionsProviderFactory) } diff --git a/packages/SettingsLib/res/values-am/arrays.xml b/packages/SettingsLib/res/values-am/arrays.xml index 5f7aec2abc00..63a9ea775502 100644 --- a/packages/SettingsLib/res/values-am/arrays.xml +++ b/packages/SettingsLib/res/values-am/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4ኬ (የተጠበቀ)"</item> <item msgid="7322156123728520872">"4ኬ (ከፍ ተድርጎ የተመጣጠነ)"</item> <item msgid="7735692090314849188">"4ኬ (ከፍ ተድርጎ የተመጣጠነ፣ የተጠበቀ)"</item> - <item msgid="7346816300608639624">"720ፒ፣ 1080ፒ (ሁለትዮሽ ማያ ገፅ)"</item> + <item msgid="7346816300608639624">"720ፒ፣ 1080ፒ (dual screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"ምንም"</item> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index b8b1b69b8054..a05df6459d74 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -214,7 +214,7 @@ </string-array> <string name="choose_profile" msgid="343803890897657450">"መገለጫ ይምረጡ"</string> <string name="category_personal" msgid="6236798763159385225">"የግል"</string> - <string name="category_work" msgid="4014193632325996115">"ስራ"</string> + <string name="category_work" msgid="4014193632325996115">"ሥራ"</string> <string name="category_clone" msgid="1554511758987195974">"አባዛ"</string> <string name="development_settings_title" msgid="140296922921597393">"የገንቢዎች አማራጮች"</string> <string name="development_settings_enable" msgid="4285094651288242183">"የገንቢዎች አማራጮችን አንቃ"</string> @@ -373,7 +373,7 @@ <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"የቀኝ-ወደ-ግራ አቀማመጥ አቅጣጫ አስገድድ"</string> <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"ለሁሉም አካባቢዎች የማያ ገፅ አቀማመጥ ከቀኝ-ወደ-ግራ እንዲሆን አስገድድ"</string> <string name="transparent_navigation_bar" msgid="1933192171384678484">"የግልፅነት የአሰሳ አሞሌ"</string> - <string name="transparent_navigation_bar_summary" msgid="5454359021817330722">"የአሰሳ አሞሌ የዳራ ቀለምን በነባሪ ግልጽ አድርግ"</string> + <string name="transparent_navigation_bar_summary" msgid="5454359021817330722">"የአሰሳ አሞሌ የዳራ ቀለምን በነባሪ ግልፅ አድርግ"</string> <string name="window_blurs" msgid="6831008984828425106">"የመስኮት ደረጃ ብዥታዎችን ፍቀድ"</string> <string name="force_msaa" msgid="4081288296137775550">"4x MSAA አስገድድ"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"4x MSAA በ OpenGL ES 2.0 መተግበሪያዎች ውስጥ ያንቁ"</string> @@ -386,7 +386,7 @@ <string name="window_animation_scale_title" msgid="5236381298376812508">"የ Window እነማ ልኬት ለውጥ"</string> <string name="transition_animation_scale_title" msgid="1278477690695439337">"የእነማ ልኬት ለውጥ ሽግግር"</string> <string name="animator_duration_scale_title" msgid="7082913931326085176">"እነማ አድራጊ ቆይታ መለኪያ"</string> - <string name="overlay_display_devices_title" msgid="5411894622334469607">"ሁለተኛ ማሳያዎችን አስመስለህ ስራ"</string> + <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> @@ -545,7 +545,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"ልክ አሁን"</string> <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"ይህ ስልክ"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"ይህ ጡባዊ"</string> - <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"የመትከያ ድምጽ ማውጫ"</string> + <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"የመትከያ ድምፅ ማውጫ"</string> <string name="media_transfer_external_device_name" msgid="2588672258721846418">"የውጭ መሣሪያ"</string> <string name="media_transfer_default_device_name" msgid="4315604017399871828">"የተገናኘ መሣሪያ"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"ይህ ስልክ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 18dc07f92b52..39cb7d7e9f8e 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -670,7 +670,7 @@ <string name="accessibility_no_calling" msgid="3540827068323895748">"لا يتم الاتصال."</string> <string name="avatar_picker_title" msgid="8492884172713170652">"اختيار صورة الملف الشخصي"</string> <string name="default_user_icon_description" msgid="6554047177298972638">"رمز المستخدم التلقائي"</string> - <string name="physical_keyboard_title" msgid="4811935435315835220">"لوحة مفاتيح خارجية"</string> + <string name="physical_keyboard_title" msgid="4811935435315835220">"لوحة المفاتيح الخارجية"</string> <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"اختيار تنسيق لوحة مفاتيح"</string> <string name="keyboard_layout_default_label" msgid="1997292217218546957">"التنسيق التلقائي"</string> <string name="turn_screen_on_title" msgid="3266937298097573424">"تشغيل الشاشة"</string> diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml index 7e43ab322e60..ff88f0c64712 100644 --- a/packages/SettingsLib/res/values-as/arrays.xml +++ b/packages/SettingsLib/res/values-as/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"৪কে. (সুৰক্ষিত)"</item> <item msgid="7322156123728520872">"৪কে. (বৰ্ধিত)"</item> <item msgid="7735692090314849188">"৪কে. (বৰ্ধিত, সুৰক্ষিত)"</item> - <item msgid="7346816300608639624">"৭২০পি., ১০৮০পি. (দ্বৈত স্ক্ৰীন)"</item> + <item msgid="7346816300608639624">"৭২০পি., ১০৮০পি. (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"নাই"</item> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 91ca8a66a9e1..1896e3cac5c6 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -141,7 +141,7 @@ <string name="bluetooth_pairing_decline" msgid="6483118841204885890">"Otkaži"</string> <string name="bluetooth_pairing_will_share_phonebook" msgid="3064334458659165176">"Uparivanje omogućava pristup kontaktima i istoriji poziva nakon povezivanja."</string> <string name="bluetooth_pairing_error_message" msgid="6626399020672335565">"Uparivanje sa uređajem <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije moguće."</string> - <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Uparivanje sa <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije moguće zbog netačnog PIN-a ili pristupnog koda."</string> + <string name="bluetooth_pairing_pin_error_message" msgid="264422127613704940">"Uparivanje sa <xliff:g id="DEVICE_NAME">%1$s</xliff:g> nije moguće zbog netačnog PIN-a ili pristupnog ključa."</string> <string name="bluetooth_pairing_device_down_error_message" msgid="2554424863101358857">"Nije moguće komunicirati sa uređajem <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> je odbio/la uparivanje"</string> <string name="bluetooth_talkback_computer" msgid="3736623135703893773">"Računar"</string> diff --git a/packages/SettingsLib/res/values-be/arrays.xml b/packages/SettingsLib/res/values-be/arrays.xml index 3f5da1119b4d..e3196c03a030 100644 --- a/packages/SettingsLib/res/values-be/arrays.xml +++ b/packages/SettingsLib/res/values-be/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (бяспечны)"</item> <item msgid="7322156123728520872">"4K (шырокамаштабны)"</item> <item msgid="7735692090314849188">"4K (шырокамаштабны, бяспечны)"</item> - <item msgid="7346816300608639624">"720p, 1080p (два экраны)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Няма"</item> diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml index b80b5eb76423..d946e5c46b6b 100644 --- a/packages/SettingsLib/res/values-bg/arrays.xml +++ b/packages/SettingsLib/res/values-bg/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (сигурно)"</item> <item msgid="7322156123728520872">"4K (с увеличен мащаб)"</item> <item msgid="7735692090314849188">"4K (с увеличен мащаб, сигурно)"</item> - <item msgid="7346816300608639624">"720p, 1080p (двоен екран)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Без"</item> diff --git a/packages/SettingsLib/res/values-bn/arrays.xml b/packages/SettingsLib/res/values-bn/arrays.xml index 71228c74a402..84d3ce2ba13d 100644 --- a/packages/SettingsLib/res/values-bn/arrays.xml +++ b/packages/SettingsLib/res/values-bn/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (নিরাপদ)"</item> <item msgid="7322156123728520872">"4K (সম্পন্ন)"</item> <item msgid="7735692090314849188">"4K (সম্পন্ন, নিরাপদ)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ডুয়েল স্ক্রিন)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"কোনো কিছুই নয়"</item> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 68283ca69234..65a290ebd785 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -174,7 +174,7 @@ <string name="launch_defaults_some" msgid="3631650616557252926">"কিছু ডিফল্ট সেট করা রয়েছে"</string> <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_settings_title" msgid="7602210956640483039">"টেক্সট-টু-স্পিচ আউটপুট"</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> @@ -673,7 +673,7 @@ <string name="physical_keyboard_title" msgid="4811935435315835220">"ফিজিক্যাল কীবোর্ড"</string> <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"কীবোর্ড লেআউট বেছে নিন"</string> <string name="keyboard_layout_default_label" msgid="1997292217218546957">"ডিফল্ট"</string> - <string name="turn_screen_on_title" msgid="3266937298097573424">"স্ক্রিন চালু করুন"</string> + <string name="turn_screen_on_title" msgid="3266937298097573424">"স্ক্রিন চালু করা"</string> <string name="allow_turn_screen_on" msgid="6194845766392742639">"স্ক্রিন চালু করার অনুমতি দিন"</string> <string name="allow_turn_screen_on_description" msgid="43834403291575164">"অ্যাপকে স্ক্রিন চালু করার অনুমতি দিন। অনুমতি দেওয়া হলে, অ্যাপ আপনার এক্সপ্লিসিট ইনটেন্ট ছাড়াই যেকোনও সময় স্ক্রিন চালু করতে পারবে।"</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g> সম্প্রচার বন্ধ করবেন?"</string> diff --git a/packages/SettingsLib/res/values-bs/arrays.xml b/packages/SettingsLib/res/values-bs/arrays.xml index f664618483d4..15e5611e515e 100644 --- a/packages/SettingsLib/res/values-bs/arrays.xml +++ b/packages/SettingsLib/res/values-bs/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (sigurno)"</item> <item msgid="7322156123728520872">"4K (povećava rezoluciju)"</item> <item msgid="7735692090314849188">"4K (povećava rezoluciju, osiguran)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dupli ekran)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Ništa"</item> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index f22b489b839b..fdfb1bcadee8 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -306,7 +306,7 @@ <string name="wifi_non_persistent_mac_randomization_summary" msgid="2159794543105053930">"Quan aquest mode està activat, és possible que l’adreça MAC d\'aquest dispositiu canviï cada vegada que es connecti a una xarxa amb l\'aleatorització d\'adreces MAC activada"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"D\'ús mesurat"</string> <string name="wifi_unmetered_label" msgid="6174142840934095093">"D\'ús no mesurat"</string> - <string name="select_logd_size_title" msgid="1604578195914595173">"Mides de la memòria intermèdia del registrador"</string> + <string name="select_logd_size_title" msgid="1604578195914595173">"Mides de la memòria intermèdia del registre"</string> <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Selecciona la mida de la memòria intermèdia del registre"</string> <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Vols esborrar l\'emmagatzematge persistent del registrador?"</string> <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Quan deixem de supervisar amb el registrador persistent, hem d\'esborrar les dades del registrador que hi ha al teu dispositiu."</string> diff --git a/packages/SettingsLib/res/values-cs/arrays.xml b/packages/SettingsLib/res/values-cs/arrays.xml index c0b939543329..ba3e713dee26 100644 --- a/packages/SettingsLib/res/values-cs/arrays.xml +++ b/packages/SettingsLib/res/values-cs/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (zabezpečeno)"</item> <item msgid="7322156123728520872">"4K (přepočteno)"</item> <item msgid="7735692090314849188">"4K (přepočteno, zabezpečeno)"</item> - <item msgid="7346816300608639624">"720p, 1080p (duální obrazovka)"</item> + <item msgid="7346816300608639624">"720p, 1080p (funkce Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Žádné"</item> diff --git a/packages/SettingsLib/res/values-da/arrays.xml b/packages/SettingsLib/res/values-da/arrays.xml index 163ee53535c1..02ad7c619246 100644 --- a/packages/SettingsLib/res/values-da/arrays.xml +++ b/packages/SettingsLib/res/values-da/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (sikker)"</item> <item msgid="7322156123728520872">"4K (opskaleret)"</item> <item msgid="7735692090314849188">"4K (opskaleret, sikker)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dobbelt skærm)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Ingen"</item> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 1df4deeeddd2..52d7040fc4c2 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -439,7 +439,7 @@ <string name="daltonizer_mode_disabled" msgid="403424372812399228">"Deaktiveret"</string> <string name="daltonizer_mode_monochromacy" msgid="362060873835885014">"Monokromasi"</string> <string name="daltonizer_mode_deuteranomaly" msgid="3507284319584683963">"Deuteranopi (rød-grøn)"</string> - <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanopi (rød-grøn)"</string> + <string name="daltonizer_mode_protanomaly" msgid="7805583306666608440">"Protanomali (rød-grøn)"</string> <string name="daltonizer_mode_tritanomaly" msgid="7135266249220732267">"Tritanopi (blå-gul)"</string> <string name="accessibility_display_daltonizer_preference_title" msgid="1810693571332381974">"Farvekorrigering"</string> <string name="accessibility_display_daltonizer_preference_subtitle" msgid="1522101114585266455">"Farvekorrigering kan være en nyttig funktion, når du vil:<br/> <ol> <li>&nbsp;Se farver mere nøjagtigt</li> <li>&nbsp;Fjerne farver, så du nemmere kan fokusere</li> </ol>"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index ac5d152d60ef..bf5a8b71f258 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -116,7 +116,7 @@ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="2477639096903834374">"HD-Audio"</string> <string name="bluetooth_profile_hearing_aid" msgid="58154575573984914">"Hörgeräte"</string> <string name="bluetooth_profile_le_audio" msgid="1725521360076451751">"LE Audio"</string> - <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"Mit Hörhilfen verbunden"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="8191273236809964030">"Mit Hörgeräten verbunden"</string> <string name="bluetooth_le_audio_profile_summary_connected" msgid="6916226974453480650">"Mit LE Audio verbunden"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="7422607970115444153">"Verbunden mit Medien-Audio"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="2420981566026949688">"Verbunden mit Telefon-Audio"</string> @@ -134,7 +134,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="808970643123744170">"Für Telefon-Audio verwenden"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="461981154387015457">"Für Dateiübertragung verwenden"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="4289460627406490952">"Für Eingabe verwenden"</string> - <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Für Hörhilfen verwenden"</string> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="7689393730163320483">"Für Hörgeräte verwenden"</string> <string name="bluetooth_le_audio_profile_summary_use_for" msgid="2778318636027348572">"Für LE_AUDIO verwenden"</string> <string name="bluetooth_pairing_accept" msgid="2054232610815498004">"Koppeln"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="2734383073450506220">"KOPPELN"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 8f7518012def..abae2ad4b329 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -668,7 +668,7 @@ <string name="accessibility_ethernet_disconnected" msgid="2832501530856497489">"Το Ethernet αποσυνδέθηκε."</string> <string name="accessibility_ethernet_connected" msgid="6175942685957461563">"Ethernet."</string> <string name="accessibility_no_calling" msgid="3540827068323895748">"Χωρίς κλήσεις."</string> - <string name="avatar_picker_title" msgid="8492884172713170652">"Επιλογή φωτογραφU+00ADίας προφίλ"</string> + <string name="avatar_picker_title" msgid="8492884172713170652">"Επιλογή φωτογραφίας προφίλ"</string> <string name="default_user_icon_description" msgid="6554047177298972638">"Προεπιλεγμένο εικονίδιο χρήστη"</string> <string name="physical_keyboard_title" msgid="4811935435315835220">"Φυσικό πληκτρολόγιο"</string> <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Επιλέξτε διάταξη πληκτρολογίου"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/arrays.xml b/packages/SettingsLib/res/values-en-rAU/arrays.xml index fa637be68f1e..8644ebe489b0 100644 --- a/packages/SettingsLib/res/values-en-rAU/arrays.xml +++ b/packages/SettingsLib/res/values-en-rAU/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (secure)"</item> <item msgid="7322156123728520872">"4K (upscaled)"</item> <item msgid="7735692090314849188">"4K (upscaled, secure)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dual screen)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"None"</item> diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 9ee30e11a404..b5aca9a89780 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -578,10 +578,10 @@ <string name="user_add_user_item_title" msgid="2394272381086965029">"User"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"Restricted profile"</string> <string name="user_add_user_title" msgid="5457079143694924885">"Add new user?"</string> - <string name="user_add_user_message_long" msgid="1527434966294733380">"You can share this device with other people by creating additional users. Each user has their own space, which they can customize with apps, wallpaper, and so on. Users can also adjust device settings like Wi‑Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users. Accessibility settings and services may not transfer to the new user."</string> + <string name="user_add_user_message_long" msgid="1527434966294733380">"You can share this device with other people by creating additional users. Each user has their own space, which they can customize with apps, wallpaper and so on. Users can also adjust device settings like Wi‑Fi that affect everyone.\n\nWhen you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users. Accessibility settings and services may not transfer to the new user."</string> <string name="user_add_user_message_short" msgid="3295959985795716166">"When you add a new user, that person needs to set up their space.\n\nAny user can update apps for all other users."</string> <string name="user_grant_admin_title" msgid="5157031020083343984">"Make this user an admin?"</string> - <string name="user_grant_admin_message" msgid="1673791931033486709">"Admins have special privileges that other users dont. An admin can manage all users, update or reset this device, modify settings, see all installed apps, and grant or revoke admin privileges for others."</string> + <string name="user_grant_admin_message" msgid="1673791931033486709">"Admins have special privileges that other users don\'t. An admin can manage all users, update or reset this device, modify settings, see all installed apps and grant or revoke admin privileges for others."</string> <string name="user_grant_admin_button" msgid="5441486731331725756">"Make admin"</string> <string name="user_setup_dialog_title" msgid="8037342066381939995">"Set up user now?"</string> <string name="user_setup_dialog_message" msgid="269931619868102841">"Make sure the person is available to take the device and set up their space"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/arrays.xml b/packages/SettingsLib/res/values-en-rGB/arrays.xml index fa637be68f1e..8644ebe489b0 100644 --- a/packages/SettingsLib/res/values-en-rGB/arrays.xml +++ b/packages/SettingsLib/res/values-en-rGB/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (secure)"</item> <item msgid="7322156123728520872">"4K (upscaled)"</item> <item msgid="7735692090314849188">"4K (upscaled, secure)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dual screen)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"None"</item> diff --git a/packages/SettingsLib/res/values-en-rIN/arrays.xml b/packages/SettingsLib/res/values-en-rIN/arrays.xml index fa637be68f1e..8644ebe489b0 100644 --- a/packages/SettingsLib/res/values-en-rIN/arrays.xml +++ b/packages/SettingsLib/res/values-en-rIN/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (secure)"</item> <item msgid="7322156123728520872">"4K (upscaled)"</item> <item msgid="7735692090314849188">"4K (upscaled, secure)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dual screen)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"None"</item> diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml index 27cdeeb6bd42..187a67acf7f5 100644 --- a/packages/SettingsLib/res/values-es-rUS/arrays.xml +++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4 K (seguro)"</item> <item msgid="7322156123728520872">"4 K (mejorado)"</item> <item msgid="7735692090314849188">"4 K (mejorado, seguro)"</item> - <item msgid="7346816300608639624">"720 píxeles y 1080 píxeles (pantalla doble)"</item> + <item msgid="7346816300608639624">"720 y 1080 píxeles (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Ninguna"</item> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 434e7d712cdc..21bd0aa17c4c 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -584,7 +584,7 @@ <string name="user_grant_admin_message" msgid="1673791931033486709">"Administraatoritel on eriõigused, mida teistel kasutajatel pole. Administraator saab hallata kõiki kasutajaid, värskendada või lähtestada seda seadet, muuta seadeid, vaadata kõiki installitud rakendusi ja anda teistele kasutajatele administraatoriõigused või need eemaldada."</string> <string name="user_grant_admin_button" msgid="5441486731331725756">"Määra administraatoriks"</string> <string name="user_setup_dialog_title" msgid="8037342066381939995">"Kas seadistada kasutaja kohe?"</string> - <string name="user_setup_dialog_message" msgid="269931619868102841">"Veenduge, et isik saaks seadet kasutada ja oma ruumi seadistada"</string> + <string name="user_setup_dialog_message" msgid="269931619868102841">"Veenduge, et isik saaks seadet kasutada ja oma ruumi seadistada."</string> <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"Kas soovite kohe profiili seadistada?"</string> <string name="user_setup_button_setup_now" msgid="1708269547187760639">"Seadista kohe"</string> <string name="user_setup_button_setup_later" msgid="8712980133555493516">"Mitte praegu"</string> diff --git a/packages/SettingsLib/res/values-eu/arrays.xml b/packages/SettingsLib/res/values-eu/arrays.xml index 3b980c5a5770..f971d3cd7cb0 100644 --- a/packages/SettingsLib/res/values-eu/arrays.xml +++ b/packages/SettingsLib/res/values-eu/arrays.xml @@ -208,7 +208,7 @@ <item msgid="2675263395797191850">"Animazioa desaktibatuta"</item> <item msgid="5790132543372767872">"Animazio-eskala: 0,5x"</item> <item msgid="2529692189302148746">"Animazio-eskala: 1×"</item> - <item msgid="8072785072237082286">"Animazio-eskala: 1,5x"</item> + <item msgid="8072785072237082286">"Animazio-eskala: 1,5×"</item> <item msgid="3531560925718232560">"Animazio-eskala 2x"</item> <item msgid="4542853094898215187">"Animazio-eskala: 5x"</item> <item msgid="5643881346223901195">"Animazio-eskala: 10x"</item> @@ -217,7 +217,7 @@ <item msgid="3376676813923486384">"Animazioa desaktibatuta"</item> <item msgid="753422683600269114">"Animazio-eskala: 0,5x"</item> <item msgid="3695427132155563489">"Animazio-eskala: 1×"</item> - <item msgid="9032615844198098981">"Animazio-eskala: 1,5x"</item> + <item msgid="9032615844198098981">"Animazio-eskala: 1,5×"</item> <item msgid="8473868962499332073">"Animazio-eskala: 2x"</item> <item msgid="4403482320438668316">"Animazio-eskala: 5x"</item> <item msgid="169579387974966641">"Animazio-eskala: 10x"</item> @@ -226,7 +226,7 @@ <item msgid="6416998593844817378">"Animazioa desaktibatuta"</item> <item msgid="875345630014338616">"Animazio-eskala: 0,5x"</item> <item msgid="2753729231187104962">"Animazio-eskala: 1×"</item> - <item msgid="1368370459723665338">"Animazio-eskala: 1,5x"</item> + <item msgid="1368370459723665338">"Animazio-eskala: 1,5×"</item> <item msgid="5768005350534383389">"Animazio-eskala: 2x"</item> <item msgid="3728265127284005444">"Animazio-eskala: 5x"</item> <item msgid="2464080977843960236">"Animazio-eskala: 10x"</item> @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (segurua)"</item> <item msgid="7322156123728520872">"4K (hobetua)"</item> <item msgid="7735692090314849188">"4K (hobetua, segurua)"</item> - <item msgid="7346816300608639624">"720p, 1080p (bi pantaila)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Bat ere ez"</item> diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml index 0eb381f90f45..93d183ee0df0 100644 --- a/packages/SettingsLib/res/values-fa/arrays.xml +++ b/packages/SettingsLib/res/values-fa/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (ایمن)"</item> <item msgid="7322156123728520872">"4K (ارتقا یافته)"</item> <item msgid="7735692090314849188">"4K (ارتقا یافته، ایمن)"</item> - <item msgid="7346816300608639624">"720p، 1080p (صفحهنمایش دوتایی)"</item> + <item msgid="7346816300608639624">"720p، 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"خالی"</item> diff --git a/packages/SettingsLib/res/values-fr-rCA/arrays.xml b/packages/SettingsLib/res/values-fr-rCA/arrays.xml index 3fb18334638d..032768a7fea7 100644 --- a/packages/SettingsLib/res/values-fr-rCA/arrays.xml +++ b/packages/SettingsLib/res/values-fr-rCA/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (sécurisé)"</item> <item msgid="7322156123728520872">"4K (adapté à la haute résolution)"</item> <item msgid="7735692090314849188">"4K (adapté haute rés., sécurisé)"</item> - <item msgid="7346816300608639624">"720p, 1080p (double écran)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Aucun"</item> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index 8d3eae4003ab..930a37327623 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -553,7 +553,7 @@ <string name="media_output_status_require_premium" msgid="8411255800047014822">"Mettez à jour le compte pour passer à la version payante"</string> <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Lecture des téléchargements impossible ici"</string> <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Réessayez après l\'annonce"</string> - <string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activer l\'appareil pour faire jouer le contenu ici"</string> + <string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activez l\'appareil pour faire jouer le contenu ici"</string> <string name="media_output_status_unauthorized" msgid="5880222828273853838">"L\'appareil n\'est pas autorisé à faire jouer le contenu"</string> <string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Impossible de faire jouer ce contenu multimédia ici"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteingez et rallumez l\'appareil"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index a4e43c7cb0ef..56afbec94bfd 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -553,7 +553,7 @@ <string name="media_output_status_require_premium" msgid="8411255800047014822">"Mettez à niveau le compte pour changer"</string> <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Impossible de lire les téléchargements ici"</string> <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Réessayez après l\'annonce"</string> - <string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activez l\'appareil pour lire du contenu ici"</string> + <string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Activez l\'appareil pour y lire du contenu"</string> <string name="media_output_status_unauthorized" msgid="5880222828273853838">"Appareil non autorisé à lire du contenu"</string> <string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Impossible de lire ce contenu multimédia ici"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Problème de connexion. Éteignez l\'appareil, puis rallumez-le"</string> diff --git a/packages/SettingsLib/res/values-gl/arrays.xml b/packages/SettingsLib/res/values-gl/arrays.xml index bd88e8351d2c..659c137a7f11 100644 --- a/packages/SettingsLib/res/values-gl/arrays.xml +++ b/packages/SettingsLib/res/values-gl/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (seguro)"</item> <item msgid="7322156123728520872">"4K (mellorado)"</item> <item msgid="7735692090314849188">"4K (mellorado e seguro)"</item> - <item msgid="7346816300608639624">"720p, 1080p (pantalla dual)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Ningún"</item> diff --git a/packages/SettingsLib/res/values-gu/arrays.xml b/packages/SettingsLib/res/values-gu/arrays.xml index e33c7592cbcc..9e58b9046d3f 100644 --- a/packages/SettingsLib/res/values-gu/arrays.xml +++ b/packages/SettingsLib/res/values-gu/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (સુરક્ષિત)"</item> <item msgid="7322156123728520872">"4K (ઉચ્ચ સ્તરીય)"</item> <item msgid="7735692090314849188">"4K (ઉચ્ચ સ્તરીય, સુરક્ષિત)"</item> - <item msgid="7346816300608639624">"720p, 1080p (દ્વિ સ્ક્રીન)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"કોઈ નહીં"</item> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index ee44c0aa4a53..9e490273887e 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -174,7 +174,7 @@ <string name="launch_defaults_some" msgid="3631650616557252926">"કેટલાંક ડિફોલ્ટ્સ સેટ કરેલ છે"</string> <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_settings_title" msgid="7602210956640483039">"ટેક્સ્ટ ટૂ સ્પીચ આઉટપુટ"</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> diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 2403848229bd..ee0cebdd25eb 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (सुरक्षित)"</item> <item msgid="7322156123728520872">"4K (बेहतर)"</item> <item msgid="7735692090314849188">"4K (बेहतर, सुरक्षित)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ड्यूअल स्क्रीन)"</item> + <item msgid="7346816300608639624">"720p, 1080p (dual screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"कोई नहीं"</item> diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml index 3cb64abeb9b9..3e49639e965e 100644 --- a/packages/SettingsLib/res/values-hr/arrays.xml +++ b/packages/SettingsLib/res/values-hr/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4000 (sigurno)"</item> <item msgid="7322156123728520872">"4000 (povećanje razlučivosti)"</item> <item msgid="7735692090314849188">"4000 (poveć. razlučiv., sigurno)"</item> - <item msgid="7346816300608639624">"720 p, 1080 p (dvojni zaslon)"</item> + <item msgid="7346816300608639624">"720 p, 1080 p (dvostruki zaslon)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Ništa"</item> diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml index f4c11762035d..79447e5a4cb7 100644 --- a/packages/SettingsLib/res/values-hu/arrays.xml +++ b/packages/SettingsLib/res/values-hu/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (biztonságos)"</item> <item msgid="7322156123728520872">"4K (felskálázott)"</item> <item msgid="7735692090314849188">"4K (felskálázott, biztonságos)"</item> - <item msgid="7346816300608639624">"720p, 1080p (két képernyő)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Semelyik"</item> diff --git a/packages/SettingsLib/res/values-in/arrays.xml b/packages/SettingsLib/res/values-in/arrays.xml index 95aeee75d267..edd8f29d6aee 100644 --- a/packages/SettingsLib/res/values-in/arrays.xml +++ b/packages/SettingsLib/res/values-in/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (aman)"</item> <item msgid="7322156123728520872">"4K (ditingkatkan)"</item> <item msgid="7735692090314849188">"4K (ditingkatkan, aman)"</item> - <item msgid="7346816300608639624">"720p, 1080p (layar ganda)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Tidak ada"</item> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index c5e69126b0b3..a8208e0fe0b7 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -597,7 +597,7 @@ <string name="user_set_lock_button" msgid="1427128184982594856">"Setel kunci"</string> <string name="user_switch_to_user" msgid="6975428297154968543">"Beralih ke <xliff:g id="USER_NAME">%s</xliff:g>"</string> <string name="creating_new_user_dialog_message" msgid="7232880257538970375">"Membuat pengguna baru …"</string> - <string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"Membuat tamu baru …"</string> + <string name="creating_new_guest_dialog_message" msgid="1114905602181350690">"Membuat tamu baru…"</string> <string name="add_user_failed" msgid="4809887794313944872">"Gagal membuat pengguna baru"</string> <string name="add_guest_failed" msgid="8074548434469843443">"Gagal membuat tamu baru"</string> <string name="user_nickname" msgid="262624187455825083">"Nama panggilan"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 85d4985cc50e..8fe33d46e5d1 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -543,12 +543,12 @@ <string name="zen_mode_duration_always_prompt_title" msgid="3212996860498119555">"Chiedi ogni volta"</string> <string name="zen_mode_forever" msgid="3339224497605461291">"Fino alla disattivazione"</string> <string name="time_unit_just_now" msgid="3006134267292728099">"Adesso"</string> - <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Questo telefono"</string> + <string name="media_transfer_this_device_name" product="default" msgid="2357329267148436433">"Questo smartphone"</string> <string name="media_transfer_this_device_name" product="tablet" msgid="3714653244000242800">"Questo tablet"</string> <string name="media_transfer_dock_speaker_device_name" msgid="2856219597113881950">"Base con altoparlante"</string> <string name="media_transfer_external_device_name" msgid="2588672258721846418">"Dispositivo esterno"</string> <string name="media_transfer_default_device_name" msgid="4315604017399871828">"Dispositivo connesso"</string> - <string name="media_transfer_this_phone" msgid="7194341457812151531">"Questo telefono"</string> + <string name="media_transfer_this_phone" msgid="7194341457812151531">"Questo smartphone"</string> <string name="media_output_status_unknown_error" msgid="5098565887497902222">"Impossibile riprodurre su questo dispositivo"</string> <string name="media_output_status_require_premium" msgid="8411255800047014822">"Esegui l\'upgrade dell\'account per cambiare"</string> <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Qui non è possibile riprodurre i download"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index af56031e7901..86ca7a1b6896 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -316,7 +316,7 @@ <string name="select_usb_configuration_dialog_title" msgid="3579567144722589237">"יש לבחור תצורת USB"</string> <string name="allow_mock_location" msgid="2102650981552527884">"אפשרות של מיקומים מדומים"</string> <string name="allow_mock_location_summary" msgid="179780881081354579">"אפשרות של מיקומים מדומים"</string> - <string name="debug_view_attributes" msgid="3539609843984208216">"לאפשר בדיקת תכונת תצוגה"</string> + <string name="debug_view_attributes" msgid="3539609843984208216">"לאפשר את הבדיקה של מאפיינים של ה-View"</string> <string name="mobile_data_always_on_summary" msgid="1112156365594371019">"השארת חבילת הגלישה פעילה תמיד, גם כש-Wi‑Fi פעיל (למעבר מהיר בין רשתות)."</string> <string name="tethering_hardware_offload_summary" msgid="7801345335142803029">"אם השירות זמין, יש להשתמש בשיפור מהירות באמצעות חומרה לצורך שיתוף אינטרנט בין ניידים"</string> <string name="adb_warning_title" msgid="7708653449506485728">"לאפשר ניפוי באגים של USB?"</string> @@ -343,7 +343,7 @@ <string name="select_application" msgid="2543228890535466325">"בחירת אפליקציה"</string> <string name="no_application" msgid="9038334538870247690">"אף אחת"</string> <string name="wait_for_debugger" msgid="7461199843335409809">"יש להמתין לכלי לניפוי באגים"</string> - <string name="wait_for_debugger_summary" msgid="6846330006113363286">"אפליקציה שנוקו בה הבאגים ממתינה למנקה הבאגים לצירוף לפני ביצוע"</string> + <string name="wait_for_debugger_summary" msgid="6846330006113363286">"האפליקציה שמתבצע בה ניקוי באגים ממתינה שהכלי לניפוי באגים יתחבר אליה לפני הריצה"</string> <string name="debug_input_category" msgid="7349460906970849771">"קלט"</string> <string name="debug_drawing_category" msgid="5066171112313666619">"שרטוט"</string> <string name="debug_hw_drawing_category" msgid="5830815169336975162">"עיבוד מואץ של חומרה"</string> diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml index b3267fe3aa25..935654e5fd24 100644 --- a/packages/SettingsLib/res/values-ja/arrays.xml +++ b/packages/SettingsLib/res/values-ja/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K(セキュア)"</item> <item msgid="7322156123728520872">"4K(アップスケール)"</item> <item msgid="7735692090314849188">"4K(アップスケール、セキュア)"</item> - <item msgid="7346816300608639624">"720p、1080p(デュアルスクリーン)"</item> + <item msgid="7346816300608639624">"720p、1080p(デュアル スクリーン)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"なし"</item> diff --git a/packages/SettingsLib/res/values-kn/arrays.xml b/packages/SettingsLib/res/values-kn/arrays.xml index 00e8049d02c5..60ecaebef29b 100644 --- a/packages/SettingsLib/res/values-kn/arrays.xml +++ b/packages/SettingsLib/res/values-kn/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (ಸುರಕ್ಷಿತ)"</item> <item msgid="7322156123728520872">"4K (ಮಾಪನ ಮಾಡದ)"</item> <item msgid="7735692090314849188">"4K (ಮಾಪನ ಮಾಡದ, ಸುರಕ್ಷಿತ)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ಡ್ಯುಯಲ್ ಸ್ಕ್ರೀನ್)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"ಯಾವುದೂ ಇಲ್ಲ"</item> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 134f59149d86..ddc444ba18e4 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -522,7 +522,7 @@ <string name="cancel" msgid="5665114069455378395">"ರದ್ದುಮಾಡಿ"</string> <string name="next" msgid="2699398661093607009">"ಮುಂದಿನದು"</string> <string name="back" msgid="5554327870352703710">"ಹಿಂದಕ್ಕೆ"</string> - <string name="save" msgid="3745809743277153149">"ಉಳಿಸಿ"</string> + <string name="save" msgid="3745809743277153149">"ಸೇವ್ ಮಾಡಿ"</string> <string name="okay" msgid="949938843324579502">"ಸರಿ"</string> <string name="done" msgid="381184316122520313">"ಆಯಿತು"</string> <string name="alarms_and_reminders_label" msgid="6918395649731424294">"ಅಲಾರಾಮ್ಗಳು ಮತ್ತು ರಿಮೈಂಡರ್ಗಳು"</string> @@ -578,7 +578,7 @@ <string name="user_add_user_item_title" msgid="2394272381086965029">"ಬಳಕೆದಾರ"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"ನಿರ್ಬಂಧಿಸಿದ ಪ್ರೊಫೈಲ್"</string> <string name="user_add_user_title" msgid="5457079143694924885">"ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಬೇಕೆ?"</string> - <string name="user_add_user_message_long" msgid="1527434966294733380">"ನೀವು ಹೆಚ್ಚುವರಿ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವ ಮೂಲಕ ಇತರ ಜನರ ಜೊತೆಗೆ ಈ ಸಾಧನವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಪ್ರತಿ ಬಳಕೆದಾರರು ತಮ್ಮದೇ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುತ್ತಾರೆ, ಇದರಲ್ಲಿ ಅವರು ತಮ್ಮದೇ ಅಪ್ಲಿಕೇಶನ್ಗಳು, ವಾಲ್ಪೇಪರ್ ಮತ್ತು ಮುಂತಾದವುಗಳ ಮೂಲಕ ಕಸ್ಟಮೈಸ್ ಮಾಡಿಕೊಳ್ಳಬಹುದು. ಎಲ್ಲರ ಮೇಲೂ ಪರಿಣಾಮ ಬೀರುವಂತೆ ವೈ-ಫೈ ರೀತಿಯ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಕೆದಾರರು ಸರಿಹೊಂದಿಸಬಹುದು.\n\nನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ತಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗೆ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಹೊಸ ಬಳಕೆದಾರರಿಗೆ ವರ್ಗಾವಣೆ ಆಗದಿರಬಹುದು."</string> + <string name="user_add_user_message_long" msgid="1527434966294733380">"ನೀವು ಹೆಚ್ಚುವರಿ ಬಳಕೆದಾರರನ್ನು ರಚಿಸುವ ಮೂಲಕ ಇತರ ಜನರ ಜೊತೆಗೆ ಈ ಸಾಧನವನ್ನು ಹಂಚಿಕೊಳ್ಳಬಹುದು. ಪ್ರತಿ ಬಳಕೆದಾರರು ತಮ್ಮದೇ ಸ್ಥಳವನ್ನು ಹೊಂದಿರುತ್ತಾರೆ, ಇದರಲ್ಲಿ ಅವರು ತಮ್ಮದೇ ಆ್ಯಪ್ಗಳು, ವಾಲ್ಪೇಪರ್ ಮತ್ತು ಮುಂತಾದವುಗಳ ಮೂಲಕ ಕಸ್ಟಮೈಸ್ ಮಾಡಿಕೊಳ್ಳಬಹುದು. ಎಲ್ಲರ ಮೇಲೂ ಪರಿಣಾಮ ಬೀರುವಂತೆ ವೈ-ಫೈ ರೀತಿಯ ಸಾಧನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬಳಕೆದಾರರು ಸರಿಹೊಂದಿಸಬಹುದು.\n\nನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ತಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗೆ ಆ್ಯಪ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು. ಆ್ಯಕ್ಸೆಸಿಬಿಲಿಟಿ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಸೇವೆಗಳು ಹೊಸ ಬಳಕೆದಾರರಿಗೆ ವರ್ಗಾವಣೆ ಆಗದಿರಬಹುದು."</string> <string name="user_add_user_message_short" msgid="3295959985795716166">"ನೀವು ಒಬ್ಬ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿದಾಗ, ಆ ವ್ಯಕ್ತಿಯು ತಮ್ಮ ಸ್ಥಳವನ್ನು ಸೆಟಪ್ ಮಾಡಬೇಕಾಗುತ್ತದೆ.\n\nಯಾವುದೇ ಬಳಕೆದಾರರು ಎಲ್ಲಾ ಇತರೆ ಬಳಕೆದಾರರಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು."</string> <string name="user_grant_admin_title" msgid="5157031020083343984">"ಈ ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಾಹಕರನ್ನಾಗಿ ಮಾಡಬೇಕೆ?"</string> <string name="user_grant_admin_message" msgid="1673791931033486709">"ನಿರ್ವಾಹಕರು ಇತರ ಬಳಕೆದಾರರಿಗೆ ಇಲ್ಲದ ವಿಶೇಷ ಸೌಲಭ್ಯಗಳನ್ನು ಹೊಂದಿದ್ದಾರೆ. ನಿರ್ವಾಹಕರು ಎಲ್ಲಾ ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಬಹುದು, ಈ ಸಾಧನವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಬಹುದು ಅಥವಾ ರೀಸೆಟ್ ಮಾಡಬಹುದು, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಹೊಂದಿಸಬಹುದು, ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲಾದ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳನ್ನು ವೀಕ್ಷಿಸಬಹುದು ಮತ್ತು ಇತರರಿಗೆ ನಿರ್ವಾಹಕರಿಗೆ ನೀಡಿರುವ ಸೌಲಭ್ಯಗಳನ್ನು ನೀಡಬಹುದು ಅಥವಾ ಹಿಂತೆಗೆದುಕೊಳ್ಳಬಹುದು."</string> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index 85a0a4ad98b1..bb05754afcee 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K(보안)"</item> <item msgid="7322156123728520872">"4K(업스케일됨)"</item> <item msgid="7735692090314849188">"4K(업스케일됨, 보안)"</item> - <item msgid="7346816300608639624">"720p, 1080p(듀얼 화면)"</item> + <item msgid="7346816300608639624">"720p, 1080p(Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"없음"</item> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index ffa05cc91bd1..2c17f93c72cc 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -579,7 +579,7 @@ <string name="user_add_profile_item_title" msgid="3111051717414643029">"제한된 프로필"</string> <string name="user_add_user_title" msgid="5457079143694924885">"신규 사용자를 추가할까요?"</string> <string name="user_add_user_message_long" msgid="1527434966294733380">"추가 사용자를 만들어 다른 사용자와 기기를 공유할 수 있습니다. 각 사용자는 앱, 배경화면 등으로 맞춤설정할 수 있는 자신만의 공간을 갖게 됩니다. 또한 모든 사용자에게 영향을 미치는 Wi‑Fi와 같은 기기 설정도 조정할 수 있습니다.\n\n추가된 신규 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자가 앱을 업데이트할 수 있으며, 업데이트는 다른 사용자에게도 적용됩니다. 접근성 설정 및 서비스는 신규 사용자에게 이전되지 않을 수도 있습니다."</string> - <string name="user_add_user_message_short" msgid="3295959985795716166">"추가된 새로운 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자는 다른 사용자들을 위하여 앱을 업데이트할 수 있습니다."</string> + <string name="user_add_user_message_short" msgid="3295959985795716166">"추가된 신규 사용자는 자신의 공간을 설정해야 합니다.\n\n모든 사용자가 앱을 업데이트할 수 있으며, 업데이트는 다른 사용자에게도 적용됩니다."</string> <string name="user_grant_admin_title" msgid="5157031020083343984">"이 사용자에게 관리자 권한을 부여하시겠습니까?"</string> <string name="user_grant_admin_message" msgid="1673791931033486709">"관리자는 다른 사용자가 가지지 못한 특별한 권한을 보유합니다. 관리자는 모든 사용자를 관리하고, 기기를 업데이트하거나 재설정하고, 설정을 변경하고, 설치된 모든 앱을 확인하고, 다른 사용자에게 관리자 권한을 부여하거나 취소할 수 있습니다."</string> <string name="user_grant_admin_button" msgid="5441486731331725756">"관리자 권한 부여"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 7e7d3820f88b..6233abcdeb45 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -351,10 +351,10 @@ <string name="debug_monitoring_category" msgid="1597387133765424994">"Мониторинг"</string> <string name="strict_mode" msgid="889864762140862437">"Катаал режим иштетилди"</string> <string name="strict_mode_summary" msgid="1838248687233554654">"Узак операцияларда экран күйүп-өчүп турат"</string> - <string name="pointer_location" msgid="7516929526199520173">"Көрсөткүчтүн жайгшкн жери"</string> + <string name="pointer_location" msgid="7516929526199520173">"Көрсөткүчтүн турган жери"</string> <string name="pointer_location_summary" msgid="957120116989798464">"Басылган жерлер жана жаңсоолор экранда көрүнүп турат"</string> <string name="show_touches" msgid="8437666942161289025">"Басылган жерлерди көрсөтүү"</string> - <string name="show_touches_summary" msgid="3692861665994502193">"Экранда басылган жерлер көрүнүп турат"</string> + <string name="show_touches_summary" msgid="3692861665994502193">"Экрандын басылган жерлери көрүнүп турат"</string> <string name="show_screen_updates" msgid="2078782895825535494">"Экран жаңыруусун көрсөтүү"</string> <string name="show_screen_updates_summary" msgid="2126932969682087406">"Экран жаңырганда анын үстү жарык болот"</string> <string name="show_hw_screen_updates" msgid="2021286231267747506">"Жаңыртууларды көрсөтүү"</string> diff --git a/packages/SettingsLib/res/values-lo/arrays.xml b/packages/SettingsLib/res/values-lo/arrays.xml index ccb777b19464..f5fd2af00357 100644 --- a/packages/SettingsLib/res/values-lo/arrays.xml +++ b/packages/SettingsLib/res/values-lo/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (ປອດໄພ)"</item> <item msgid="7322156123728520872">"4K (ເພີ່ມຂຶ້ນແລ້ວ)"</item> <item msgid="7735692090314849188">"4K (ເພີ່ມຂຶ້ນແລ້ວ, ປອດໄພ)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ໜ້າຈໍຄູ່)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"ບໍ່ມີ"</item> diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml index 010b3b49c9fb..293ea31bb861 100644 --- a/packages/SettingsLib/res/values-lt/arrays.xml +++ b/packages/SettingsLib/res/values-lt/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (saugus)"</item> <item msgid="7322156123728520872">"4K (didesnio mastelio)"</item> <item msgid="7735692090314849188">"4K (didesnio mastelio, saugus)"</item> - <item msgid="7346816300608639624">"720 piks., 1 080 piks. (dvig. ekr.)"</item> + <item msgid="7346816300608639624">"720 piks. 1 080 piks. (dual screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Nėra"</item> diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml index 2c7ac9846bb4..bd3043d581a7 100644 --- a/packages/SettingsLib/res/values-lv/arrays.xml +++ b/packages/SettingsLib/res/values-lv/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4 KB (drošs)"</item> <item msgid="7322156123728520872">"4 KB (mērogots)"</item> <item msgid="7735692090314849188">"4 KB (mērogots, drošs)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dubults ekrāns)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Nav"</item> diff --git a/packages/SettingsLib/res/values-mk/arrays.xml b/packages/SettingsLib/res/values-mk/arrays.xml index a276eb3a8200..71b5a7f54e4a 100644 --- a/packages/SettingsLib/res/values-mk/arrays.xml +++ b/packages/SettingsLib/res/values-mk/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4 илјади (безбедно)"</item> <item msgid="7322156123728520872">"4 илјади (подобрено)"</item> <item msgid="7735692090314849188">"4 илјади (подобрено, безбедно)"</item> - <item msgid="7346816300608639624">"720p, 1080p (двоен екран)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Ниедна"</item> diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml index 925c827d9bf3..a7d11dfe13ec 100644 --- a/packages/SettingsLib/res/values-mn/arrays.xml +++ b/packages/SettingsLib/res/values-mn/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4К (найдвартай)"</item> <item msgid="7322156123728520872">"4К (өндөр чанартай)"</item> <item msgid="7735692090314849188">"4К (өндөр чанартай, найдвартай)"</item> - <item msgid="7346816300608639624">"720пиксель, 1080пиксель (хос дэлгэц)"</item> + <item msgid="7346816300608639624">"720пиксель, 1080пиксель (dual screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Алийг нь ч биш"</item> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 040f2c82c212..ae12e2bbfd80 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -674,7 +674,7 @@ <string name="keyboard_layout_dialog_title" msgid="3927180147005616290">"Гарын бүдүүвчийг сонгох"</string> <string name="keyboard_layout_default_label" msgid="1997292217218546957">"Өгөгдмөл"</string> <string name="turn_screen_on_title" msgid="3266937298097573424">"Дэлгэцийг асаах"</string> - <string name="allow_turn_screen_on" msgid="6194845766392742639">"Дэлгэцийг асаахыг зөвшөөрнө үү"</string> + <string name="allow_turn_screen_on" msgid="6194845766392742639">"Дэлгэцийг асаахыг зөвшөөрөх"</string> <string name="allow_turn_screen_on_description" msgid="43834403291575164">"Аппад дэлгэцийг асаахыг зөвшөөрнө үү. Зөвшөөрсөн тохиолдолд тухайн апп таны тодорхой оролцоогүйгээр ямар ч үед дэлгэцийг асааж болно."</string> <string name="bt_le_audio_broadcast_dialog_title" msgid="5392738488989777074">"<xliff:g id="APP_NAME">%1$s</xliff:g>-г нэвтрүүлэхээ зогсоох уу?"</string> <string name="bt_le_audio_broadcast_dialog_sub_title" msgid="268234802198852753">"Хэрэв та <xliff:g id="SWITCHAPP">%1$s</xliff:g>-г нэвтрүүлсэн эсвэл гаралтыг өөрчилсөн бол таны одоогийн нэвтрүүлэлтийг зогсооно"</string> diff --git a/packages/SettingsLib/res/values-nb/arrays.xml b/packages/SettingsLib/res/values-nb/arrays.xml index c364c58d2013..470f0c0828ec 100644 --- a/packages/SettingsLib/res/values-nb/arrays.xml +++ b/packages/SettingsLib/res/values-nb/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (sikker)"</item> <item msgid="7322156123728520872">"4K (oppskalert)"</item> <item msgid="7735692090314849188">"4K (oppskalert, sikker)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dobbel skjerm)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Ingen"</item> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index a082be68feac..12a7264c5606 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -554,7 +554,7 @@ <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"Kan ikke spille av nedlastinger her"</string> <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"Prøv igjen etter annonsen"</string> <string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"Vekk enheten for å spille her"</string> - <string name="media_output_status_unauthorized" msgid="5880222828273853838">"Enheten er ikke godkjent"</string> + <string name="media_output_status_unauthorized" msgid="5880222828273853838">"Enheten er ikke godkjent til å spille av"</string> <string name="media_output_status_track_unsupported" msgid="5576313219317709664">"Kan ikke spille av dette her"</string> <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Tilkoblingsproblemer. Slå enheten av og på igjen"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Lydenhet med kabel"</string> diff --git a/packages/SettingsLib/res/values-ne/arrays.xml b/packages/SettingsLib/res/values-ne/arrays.xml index eaea3ba41bc2..94b1232fdde1 100644 --- a/packages/SettingsLib/res/values-ne/arrays.xml +++ b/packages/SettingsLib/res/values-ne/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"४ हजार (सुरक्षित)"</item> <item msgid="7322156123728520872">"४ हजार (upscaled)"</item> <item msgid="7735692090314849188">"४ हजार (upscaled, सुरक्षित)"</item> - <item msgid="7346816300608639624">"७२० पिक्सेल, १०८० पिक्सेल (दोहरो स्क्रिन)"</item> + <item msgid="7346816300608639624">"७२० पिक्सेल, १०८० पिक्सेल (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"कुनै पनि होइन"</item> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 349b9d3c4d4d..ea2572bbdfa8 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -58,10 +58,10 @@ <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" msgid="7665725527352893558">"%1$s मार्फत् अटो कनेक्ट गरिएको"</string> <string name="connected_via_network_scorer_default" msgid="7973529709744526285">"नेटवर्क मूल्याङ्कनकर्ता मार्फत स्वत: जडान गरिएको"</string> <string name="connected_via_app" msgid="3532267661404276584">"<xliff:g id="NAME">%1$s</xliff:g> मार्फत जडान गरिएको"</string> <string name="tap_to_sign_up" msgid="5356397741063740395">"साइन अप गर्न ट्याप गर्नुहोस्"</string> @@ -579,12 +579,12 @@ <string name="user_add_profile_item_title" msgid="3111051717414643029">"प्रतिबन्धित प्रोफाइल"</string> <string name="user_add_user_title" msgid="5457079143694924885">"नयाँ प्रयोगकर्ता हाल्ने हो?"</string> <string name="user_add_user_message_long" msgid="1527434966294733380">"तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर ती प्रयोगकर्तालाई यो डिभाइस प्रयोग गर्न दिन सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ। उनीहरू यो ठाउँमा आफ्नै एप, वालपेपर आदिका लागि प्रयोग गर्न सक्छन्। उनीहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता डिभाइसका सेटिङहरू पनि परिवर्तन गर्न सक्छन्।\n\nतपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ता अन्य सबै प्रयोगकर्ताले प्रयोग गर्ने एपहरू अद्यावधिक गर्न सक्छन्। तपाईं थप प्रयोगकर्ताहरू सिर्जना गरेर ती प्रयोगकर्तालाई यो डिभाइस प्रयोग गर्न दिन सक्नुहुन्छ। हरेक प्रयोगकर्ताको आफ्नै ठाउँ हुन्छ। उनीहरू यो ठाउँमा आफ्नै एप, वालपेपर आदिका लागि प्रयोग गर्न सक्छन्। उनीहरू सबैजनालाई असर पार्ने Wi-Fi जस्ता डिभाइसका सेटिङहरू पनि परिवर्तन गर्न सक्छन्।BREAK_0BREAK_1तपाईंले नयाँ प्रयोगकर्ता थप्दा उक्त व्यक्तिले आफ्नो ठाउँ सेटअप गर्नु पर्ने हुन्छ।BREAK_2BREAK_3सबै प्रयोगकर्ता अन्य सबै प्रयोगकर्ताले प्रयोग गर्ने एपहरू अद्यावधिक गर्न सक्छन्। तर पहुँचसम्बन्धी सेटिङ तथा सेवाहरू नयाँ प्रयोगकर्तामा नसर्न सक्छन्।"</string> - <string name="user_add_user_message_short" msgid="3295959985795716166">"तपाईंले नयाँ प्रयोगकर्ता थप्नुभयो भने ती प्रयोगकर्ताले आफ्नो स्पेस सेट गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ताले अरू प्रयोगकर्ताका एपहरू अपडेट गर्न सक्छन्।"</string> + <string name="user_add_user_message_short" msgid="3295959985795716166">"तपाईंले नयाँ प्रयोगकर्ता हाल्नुभयो भने ती प्रयोगकर्ताले आफ्नो स्पेस सेट गर्नु पर्ने हुन्छ।\n\nसबै प्रयोगकर्ताले अरू प्रयोगकर्ताका एपहरू अपडेट गर्न सक्छन्।"</string> <string name="user_grant_admin_title" msgid="5157031020083343984">"यी प्रयोगकर्तालाई एड्मिन बनाउने हो?"</string> <string name="user_grant_admin_message" msgid="1673791931033486709">"एड्मिनहरूसँग अन्य प्रयोगकर्तासँग नभएका विशेषाधिकारहरू हुन्छन्। एड्मिन सबै प्रयोगकर्ताहरूलाई व्यवस्थापन गर्न, यो डिभाइस अपडेट वा रिसेट गर्न, सेटिङ परिमार्जन गर्न, इन्स्टल गरिएका सबै एपहरू हेर्न र अरूलाई एड्मिनका विशेषाधिकारहरू दिन वा अरूलाई दिइएका एड्मिनका विशेषाधिकारहरू खारेज गर्न सक्नुहुन्छ।"</string> <string name="user_grant_admin_button" msgid="5441486731331725756">"एड्मिन बनाउनुहोस्"</string> <string name="user_setup_dialog_title" msgid="8037342066381939995">"अहिले प्रयोगकर्ता सेटअप गर्ने हो?"</string> - <string name="user_setup_dialog_message" msgid="269931619868102841">"यी व्यक्ति यन्त्र यो डिभाइस चलाउन र आफ्नो ठाउँ सेट गर्न उपलब्ध छन् भन्ने कुरा सुनिश्चित गर्नुहोस्"</string> + <string name="user_setup_dialog_message" msgid="269931619868102841">"यी व्यक्ति यो डिभाइस चलाउन र आफ्नो ठाउँ सेट गर्न उपलब्ध छन् भन्ने कुरा सुनिश्चित गर्नुहोस्"</string> <string name="user_setup_profile_dialog_message" msgid="4788197052296962620">"अहिले प्रोफाइल सेटअप गर्ने हो?"</string> <string name="user_setup_button_setup_now" msgid="1708269547187760639">"अब सेटअप गर्नुहोस्"</string> <string name="user_setup_button_setup_later" msgid="8712980133555493516">"अहिले होइन"</string> diff --git a/packages/SettingsLib/res/values-nl/arrays.xml b/packages/SettingsLib/res/values-nl/arrays.xml index b8e945ff7982..818347ef3eb2 100644 --- a/packages/SettingsLib/res/values-nl/arrays.xml +++ b/packages/SettingsLib/res/values-nl/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (veilig)"</item> <item msgid="7322156123728520872">"4K (opgeschaald)"</item> <item msgid="7735692090314849188">"4K (opgeschaald, veilig)"</item> - <item msgid="7346816300608639624">"720p, 1080p (dubbel scherm)"</item> + <item msgid="7346816300608639624">"720p, 1080p (dual screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Geen"</item> diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml index d649907966f6..fb54da6f7db7 100644 --- a/packages/SettingsLib/res/values-or/arrays.xml +++ b/packages/SettingsLib/res/values-or/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (ସୁରକ୍ଷିତ)"</item> <item msgid="7322156123728520872">"4K (ଅପ୍ସ୍କେଲ୍ କରାଯାଇଛି)"</item> <item msgid="7735692090314849188">"4K (ଉତ୍ତମ, ସୁରକ୍ଷିତ)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ଡୁଆଲ୍ ସ୍କ୍ରୀନ୍)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"କିଛିନାହିଁ"</item> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index 164f24d4e36e..048db0e0e1c7 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -310,7 +310,7 @@ <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> + <string name="select_logpersist_title" msgid="447071974007104196">"ଡିଭାଇସରେ ନିରନ୍ତର ଲଗର ଡାଟା ଷ୍ଟୋର କରନ୍ତୁ"</string> <string name="select_logpersist_dialog_title" msgid="7745193591195485594">"ଡିଭାଇସ୍ରେ ଲଗାତର ଷ୍ଟୋର୍ କରିବାକୁ ଲଗ୍ ବଫର୍ ଚୟନ କରନ୍ତୁ"</string> <string name="select_usb_configuration_title" msgid="6339801314922294586">"USB କନଫିଗ୍ୟୁରେସନ୍ ଚୟନ କରନ୍ତୁ"</string> <string name="select_usb_configuration_dialog_title" msgid="3579567144722589237">"USB କନଫିଗ୍ୟୁରେସନ୍ ଚୟନ କରନ୍ତୁ"</string> diff --git a/packages/SettingsLib/res/values-pa/arrays.xml b/packages/SettingsLib/res/values-pa/arrays.xml index 4f58a3c7f150..3c4ab2093301 100644 --- a/packages/SettingsLib/res/values-pa/arrays.xml +++ b/packages/SettingsLib/res/values-pa/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (ਸੁਰੱਖਿਅਤ)"</item> <item msgid="7322156123728520872">"4K (ਪੂਰਾ ਕੀਤਾ)"</item> <item msgid="7735692090314849188">"4K (ਪੂਰਾ ਕੀਤਾ, ਸੁਰੱਖਿਅਤ)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ਦੂਹਰੀ ਸਕ੍ਰੀਨ)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"ਕੋਈ ਨਹੀਂ"</item> diff --git a/packages/SettingsLib/res/values-pt-rPT/arrays.xml b/packages/SettingsLib/res/values-pt-rPT/arrays.xml index ba302806de8a..af34bda4aed0 100644 --- a/packages/SettingsLib/res/values-pt-rPT/arrays.xml +++ b/packages/SettingsLib/res/values-pt-rPT/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (seguro)"</item> <item msgid="7322156123728520872">"4K (redimensionado)"</item> <item msgid="7735692090314849188">"4K (redimensionado, seguro)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ecrã duplo)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Nada"</item> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 847bfb5634e7..b13ea55cfd44 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -308,7 +308,7 @@ <string name="wifi_unmetered_label" msgid="6174142840934095093">"Acesso ilimitado"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tamanhos da memória intermédia do registo"</string> <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Selec. tam. reg. p/ mem. int. reg."</string> - <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Pretende limpar o armazenamento persistente do registo?"</string> + <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Quer limpar o armazenamento persistente do registo?"</string> <string name="dev_logpersist_clear_warning_message" msgid="6447590867594287413">"Quando deixamos de monitorizar com o registo persistente, é necessário apagar os dados de registo que se encontram no seu dispositivo."</string> <string name="select_logpersist_title" msgid="447071974007104196">"Guardar dados de registo consistentemente"</string> <string name="select_logpersist_dialog_title" msgid="7745193591195485594">"Selecionar buffers de registo para armazenamento persistente no dispositivo"</string> @@ -380,7 +380,7 @@ <string name="show_non_rect_clip" msgid="7499758654867881817">"Depurar operações de clipe não retangulares"</string> <string name="track_frame_time" msgid="522674651937771106">"Renderização HWUI do perfil"</string> <string name="enable_gpu_debug_layers" msgid="4986675516188740397">"Ativar cam. depuração GPU"</string> - <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permitir carregamento de camadas de depuração de GPU p/ apps de depuração"</string> + <string name="enable_gpu_debug_layers_summary" msgid="4921521407377170481">"Permite carregamento de camadas de depuração de GPU para apps de depuração"</string> <string name="enable_verbose_vendor_logging" msgid="1196698788267682072">"Ativ. registo do fornecedor"</string> <string name="enable_verbose_vendor_logging_summary" msgid="5426292185780393708">"Inclua registos adicionais de fornecedores específicos de dispositivos em relatórios de erros, que podem conter informações privadas, utilizar mais bateria e/ou utilizar mais armazenamento."</string> <string name="window_animation_scale_title" msgid="5236381298376812508">"Escala de animação de transição"</string> @@ -567,12 +567,12 @@ <string name="blob_id_text" msgid="8680078988996308061">"ID de dados partilhados: <xliff:g id="BLOB_ID">%d</xliff:g>"</string> <string name="blob_expires_text" msgid="7882727111491739331">"Expira a <xliff:g id="DATE">%s</xliff:g>"</string> <string name="shared_data_delete_failure_text" msgid="3842701391009628947">"Ocorreu um erro ao eliminar os dados partilhados."</string> - <string name="shared_data_no_accessors_dialog_text" msgid="8903738462570715315">"Não existem alocações adquiridas para estes dados partilhados. Pretende eliminá-los?"</string> + <string name="shared_data_no_accessors_dialog_text" msgid="8903738462570715315">"Não existem alocações adquiridas para estes dados partilhados. Quer eliminá-los?"</string> <string name="accessor_info_title" msgid="8289823651512477787">"Apps a partilhar dados"</string> <string name="accessor_no_description_text" msgid="7510967452505591456">"Nenhuma descrição fornecida pela app."</string> <string name="accessor_expires_text" msgid="4625619273236786252">"A alocação expira a <xliff:g id="DATE">%s</xliff:g>"</string> <string name="delete_blob_text" msgid="2819192607255625697">"Eliminar dados partilhados"</string> - <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"Tem a certeza de que pretende eliminar estes dados partilhados?"</string> + <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"Tem a certeza de que quer eliminar estes dados partilhados?"</string> <string name="user_add_user_item_summary" msgid="5748424612724703400">"Os utilizadores têm as suas próprias aplicações e conteúdos"</string> <string name="user_add_profile_item_summary" msgid="5418602404308968028">"Pode restringir o acesso às aplicações e conteúdos da sua conta"</string> <string name="user_add_user_item_title" msgid="2394272381086965029">"Utilizador"</string> @@ -605,7 +605,7 @@ <string name="guest_new_guest" msgid="3482026122932643557">"Adicionar convidado"</string> <string name="guest_exit_guest" msgid="5908239569510734136">"Remover convidado"</string> <string name="guest_reset_guest" msgid="6110013010356013758">"Repor convidado"</string> - <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Pretende repor o convidado?"</string> + <string name="guest_reset_guest_dialog_title" msgid="8047270010895437534">"Quer repor o convidado?"</string> <string name="guest_remove_guest_dialog_title" msgid="4548511006624088072">"Remover o convidado?"</string> <string name="guest_reset_guest_confirm_button" msgid="2989915693215617237">"Repor"</string> <string name="guest_remove_guest_confirm_button" msgid="7858123434954143879">"Remover"</string> diff --git a/packages/SettingsLib/res/values-ru/arrays.xml b/packages/SettingsLib/res/values-ru/arrays.xml index c1bb31ee8d40..9f60cd7dc500 100644 --- a/packages/SettingsLib/res/values-ru/arrays.xml +++ b/packages/SettingsLib/res/values-ru/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (защита)"</item> <item msgid="7322156123728520872">"4K (масштабирование)"</item> <item msgid="7735692090314849188">"4K (масштабирование, защита)"</item> - <item msgid="7346816300608639624">"720p, 1080p (два экрана)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Нет"</item> diff --git a/packages/SettingsLib/res/values-si/arrays.xml b/packages/SettingsLib/res/values-si/arrays.xml index 0fa107448db4..4d538c57152e 100644 --- a/packages/SettingsLib/res/values-si/arrays.xml +++ b/packages/SettingsLib/res/values-si/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (ආරක්ෂිත)"</item> <item msgid="7322156123728520872">"4K (පරිමාණය වැඩි කළ)"</item> <item msgid="7735692090314849188">"4K (පරිමාණය වැඩි කළ, ආරක්ෂිත)"</item> - <item msgid="7346816300608639624">"720p, 1080p (ද්විත්ව තිරය)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"කිසිවක් නැත"</item> diff --git a/packages/SettingsLib/res/values-sq/arrays.xml b/packages/SettingsLib/res/values-sq/arrays.xml index d92ee582ed82..e1bb89468b48 100644 --- a/packages/SettingsLib/res/values-sq/arrays.xml +++ b/packages/SettingsLib/res/values-sq/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (i sigurt)"</item> <item msgid="7322156123728520872">"4K (i përshkallëzuar)"</item> <item msgid="7735692090314849188">"4K (i përshkallëzuar, i sigurt)"</item> - <item msgid="7346816300608639624">"720p, 1080p (në dy ekrane)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Asnjë"</item> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 86675cf6f9ba..391058f9a3e6 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -141,7 +141,7 @@ <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_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-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml index daaa1386492b..e6cb1d6b0490 100644 --- a/packages/SettingsLib/res/values-sv/arrays.xml +++ b/packages/SettingsLib/res/values-sv/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (säkert)"</item> <item msgid="7322156123728520872">"4K (uppskalat)"</item> <item msgid="7735692090314849188">"4K (uppskalat, säkert)"</item> - <item msgid="7346816300608639624">"720 p, 1080 p (dubbla skärmar)"</item> + <item msgid="7346816300608639624">"720 p, 1080 p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Inga"</item> diff --git a/packages/SettingsLib/res/values-te/arrays.xml b/packages/SettingsLib/res/values-te/arrays.xml index 2a31c0dad2d0..5559e3bb62fd 100644 --- a/packages/SettingsLib/res/values-te/arrays.xml +++ b/packages/SettingsLib/res/values-te/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (సురక్షితం)"</item> <item msgid="7322156123728520872">"4K (రిజల్యూషన్ పెంచబడింది)"</item> <item msgid="7735692090314849188">"4K (రిజల్యూ. పెంచబడింది, సురక్షితం)"</item> - <item msgid="7346816300608639624">"720p, 1080p (డ్యూయల్ స్క్రీన్)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"ఏదీ వద్దు"</item> diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml index b66fe5c8e635..6d4d3a95981a 100644 --- a/packages/SettingsLib/res/values-th/arrays.xml +++ b/packages/SettingsLib/res/values-th/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (ปลอดภัย)"</item> <item msgid="7322156123728520872">"4K (เพิ่มความละเอียด)"</item> <item msgid="7735692090314849188">"4K (เพิ่มความละเอียด ปลอดภัย)"</item> - <item msgid="7346816300608639624">"720p, 1080p (หน้าจอคู่)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"ไม่มี"</item> diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml index e22ad902e3a6..e8b26df28226 100644 --- a/packages/SettingsLib/res/values-tr/arrays.xml +++ b/packages/SettingsLib/res/values-tr/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (güvenli)"</item> <item msgid="7322156123728520872">"4K (yukarı ölçeklenmiş)"</item> <item msgid="7735692090314849188">"4K (yukarı ölçeklenmiş, güvenli)"</item> - <item msgid="7346816300608639624">"720p, 1080p (çift ekran)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Hiçbiri"</item> diff --git a/packages/SettingsLib/res/values-uk/arrays.xml b/packages/SettingsLib/res/values-uk/arrays.xml index dc02eebc218c..cc64acc3632d 100644 --- a/packages/SettingsLib/res/values-uk/arrays.xml +++ b/packages/SettingsLib/res/values-uk/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K (захист)"</item> <item msgid="7322156123728520872">"4K (масштабування)"</item> <item msgid="7735692090314849188">"4K (масштабування, захист)"</item> - <item msgid="7346816300608639624">"720p, 1080p (два екрани)"</item> + <item msgid="7346816300608639624">"720p, 1080p (Dual Screen)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"Нічого"</item> diff --git a/packages/SettingsLib/res/values-zh-rCN/arrays.xml b/packages/SettingsLib/res/values-zh-rCN/arrays.xml index 679098a8411e..9312b2ec122f 100644 --- a/packages/SettingsLib/res/values-zh-rCN/arrays.xml +++ b/packages/SettingsLib/res/values-zh-rCN/arrays.xml @@ -243,7 +243,7 @@ <item msgid="8612549335720461635">"4K(安全)"</item> <item msgid="7322156123728520872">"4K(画质提升)"</item> <item msgid="7735692090314849188">"4K(画质提升、安全)"</item> - <item msgid="7346816300608639624">"720p,1080p(双屏)"</item> + <item msgid="7346816300608639624">"720p、1080p(双屏幕)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"无"</item> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 6787f324b9e5..3dfb2f598fdc 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -550,7 +550,7 @@ <string name="media_transfer_default_device_name" msgid="4315604017399871828">"连接的设备"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"这部手机"</string> <string name="media_output_status_unknown_error" msgid="5098565887497902222">"无法在此设备上播放"</string> - <string name="media_output_status_require_premium" msgid="8411255800047014822">"升级帐号后才能切换"</string> + <string name="media_output_status_require_premium" msgid="8411255800047014822">"升级账号后才能切换"</string> <string name="media_output_status_not_support_downloads" msgid="4523828729240373315">"无法在此设备上播放下载的内容"</string> <string name="media_output_status_try_after_ad" msgid="8312579066856015441">"广告之后重试"</string> <string name="media_output_status_device_in_low_power_mode" msgid="8184631698321758451">"若要在此设备上播放,请唤醒设备"</string> @@ -559,7 +559,7 @@ <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"连接时遇到问题。请关闭并重新开启设备"</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"有线音频设备"</string> <string name="help_label" msgid="3528360748637781274">"帮助和反馈"</string> - <string name="storage_category" msgid="2287342585424631813">"存储"</string> + <string name="storage_category" msgid="2287342585424631813">"存储空间"</string> <string name="shared_data_title" msgid="1017034836800864953">"共享数据"</string> <string name="shared_data_summary" msgid="5516326713822885652">"查看和修改共享数据"</string> <string name="shared_data_no_blobs_text" msgid="3108114670341737434">"此用户没有共享数据。"</string> @@ -574,7 +574,7 @@ <string name="delete_blob_text" msgid="2819192607255625697">"删除共享数据"</string> <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"确定要删除这些共享数据吗?"</string> <string name="user_add_user_item_summary" msgid="5748424612724703400">"用户拥有个人专属的应用和内容"</string> - <string name="user_add_profile_item_summary" msgid="5418602404308968028">"您可以限制其他人使用来自您的帐号的应用和内容"</string> + <string name="user_add_profile_item_summary" msgid="5418602404308968028">"您可以限制其他人使用来自您的账号的应用和内容"</string> <string name="user_add_user_item_title" msgid="2394272381086965029">"用户"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"受限个人资料"</string> <string name="user_add_user_title" msgid="5457079143694924885">"要添加新用户吗?"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java index f12aa26f6778..755d971e28a6 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java @@ -307,8 +307,8 @@ public class BluetoothUtils { */ public static boolean isDeviceClassMatched(@NonNull BluetoothDevice bluetoothDevice, int device) { - return bluetoothDevice.getBluetoothClass() != null - && bluetoothDevice.getBluetoothClass().getDeviceClass() == device; + final BluetoothClass bluetoothClass = bluetoothDevice.getBluetoothClass(); + return bluetoothClass != null && bluetoothClass.getDeviceClass() == device; } private static boolean isAdvancedHeaderEnabled() { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/OWNERS b/packages/SettingsLib/src/com/android/settingslib/bluetooth/OWNERS index 5e6697289d5a..7669e79b42be 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/OWNERS +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/OWNERS @@ -3,7 +3,10 @@ siyuanh@google.com hughchen@google.com timhypeng@google.com robertluo@google.com -changbetty@google.com songferngwang@google.com +yqian@google.com +chelseahao@google.com +yiyishen@google.com +hahong@google.com # Emergency approvers in case the above are not available diff --git a/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS b/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS index c88ed8e96f99..9f15c1bb5081 100644 --- a/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS +++ b/packages/SettingsLib/src/com/android/settingslib/connectivity/OWNERS @@ -2,7 +2,6 @@ andychou@google.com arcwang@google.com changbetty@google.com -goldmanj@google.com qal@google.com wengsu@google.com diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt index a03acc3a078c..73f6db6d464b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt +++ b/packages/SettingsLib/src/com/android/settingslib/graph/ThemedBatteryDrawable.kt @@ -325,7 +325,7 @@ open class ThemedBatteryDrawable(private val context: Context, frameColor: Int) return batteryLevel } - override fun onBoundsChange(bounds: Rect?) { + override fun onBoundsChange(bounds: Rect) { super.onBoundsChange(bounds) updateSize() } diff --git a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java index fb3f382af192..e91d697d4b86 100644 --- a/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java +++ b/packages/SettingsLib/src/com/android/settingslib/license/LicenseHtmlGeneratorFromXml.java @@ -324,6 +324,7 @@ class LicenseHtmlGeneratorFromXml { if (!TextUtils.isEmpty(noticeHeader)) { writer.println(noticeHeader); + writer.println("<br/>"); } int count = 0; diff --git a/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS b/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS index 61c73fb733a9..372eb81fdee2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS +++ b/packages/SettingsLib/src/com/android/settingslib/qrcode/OWNERS @@ -1,7 +1,6 @@ # Default reviewers for this and subdirectories. bonianchen@google.com changbetty@google.com -goldmanj@google.com wengsu@google.com zoeychen@google.com diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java index fd986e5d13fd..21eb35abe32c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java @@ -87,7 +87,13 @@ public class AccessPointPreference extends Preference { // Fallback for platforms that do not need friction icon resources. frictionSld = null; } - return frictionSld != null ? (StateListDrawable) frictionSld.getDrawable(0) : null; + if (frictionSld != null) { + StateListDrawable val = (StateListDrawable) frictionSld.getDrawable(0); + frictionSld.recycle(); + return val; + } else { + return null; + } } // Used for fake pref. diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/OWNERS b/packages/SettingsLib/src/com/android/settingslib/wifi/OWNERS index f3b600c8e9c1..b9449acc6f7d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/OWNERS +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/OWNERS @@ -3,7 +3,6 @@ andychou@google.com arcwang@google.com asapperstein@google.com changbetty@google.com -goldmanj@google.com qal@google.com wengsu@google.com diff --git a/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java b/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java index 41ce58eb7b4e..294df72a067b 100644 --- a/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java +++ b/packages/SettingsProvider/src/android/provider/settings/backup/GlobalSettings.java @@ -24,7 +24,7 @@ public class GlobalSettings { /** * These keys may be mentioned in the SETTINGS_TO_BACKUP arrays in SystemSettings * and SecureSettings as well. This is because those tables drive both backup and - * restore, and restore needs to properly whitelist keys that used to live + * restore, and restore needs to properly allowlist keys that used to live * in those namespaces. * * NOTE: Settings are backed up and restored in the order they appear diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index 11154d165109..b404465a8cce 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -884,7 +884,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { @VisibleForTesting SettingsBackupWhitelist getBackupWhitelist(Uri contentUri) { // Figure out the white list and redirects to the global table. We restore anything - // in either the backup whitelist or the legacy-restore whitelist for this table. + // in either the backup allowlist or the legacy-restore allowlist for this table. String[] whitelist; Map<String, Validator> validators = null; if (contentUri.equals(Settings.Secure.CONTENT_URI)) { @@ -1432,7 +1432,7 @@ public class SettingsBackupAgent extends BackupAgentHelper { } /** - * Store the whitelist of settings to be backed up and validators for them. + * Store the allowlist of settings to be backed up and validators for them. */ @VisibleForTesting static class SettingsBackupWhitelist { diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index f60f8db5e773..215a040c6a72 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -250,7 +250,7 @@ public class SettingsProvider extends ContentProvider { public static final int WRITE_FALLBACK_SETTINGS_FILES_JOB_ID = 1; public static final long ONE_DAY_INTERVAL_MILLIS = 24 * 60 * 60 * 1000L; - // Overlay specified settings whitelisted for Instant Apps + // Overlay specified settings allowlisted for Instant Apps private static final Set<String> OVERLAY_ALLOWED_GLOBAL_INSTANT_APP_SETTINGS = new ArraySet<>(); private static final Set<String> OVERLAY_ALLOWED_SYSTEM_INSTANT_APP_SETTINGS = new ArraySet<>(); private static final Set<String> OVERLAY_ALLOWED_SECURE_INSTANT_APP_SETTINGS = new ArraySet<>(); @@ -1261,11 +1261,13 @@ public class SettingsProvider extends ContentProvider { Setting settingLocked = mSettingsRegistry.getSettingLocked( SETTINGS_TYPE_GLOBAL, UserHandle.USER_SYSTEM, Global.DEVICE_CONFIG_SYNC_DISABLED); - if (settingLocked == null) { - return SYNC_DISABLED_MODE_NONE; + String settingValue = settingLocked == null ? null : settingLocked.getValue(); + if (settingValue == null) { + // Disable sync by default in test harness mode. + return ActivityManager.isRunningInUserTestHarness() + ? SYNC_DISABLED_MODE_PERSISTENT : SYNC_DISABLED_MODE_NONE; } - String settingValue = settingLocked.getValue(); - boolean isSyncDisabledPersistent = settingValue != null && !"0".equals(settingValue); + boolean isSyncDisabledPersistent = !"0".equals(settingValue); return isSyncDisabledPersistent ? SYNC_DISABLED_MODE_PERSISTENT : SYNC_DISABLED_MODE_NONE; } finally { @@ -2129,7 +2131,7 @@ public class SettingsProvider extends ContentProvider { @GuardedBy("mLock") private List<String> getSettingsNamesLocked(int settingsType, int userId) { - // Don't enforce the instant app whitelist for now -- its too prone to unintended breakage + // Don't enforce the instant app allowlist for now -- its too prone to unintended breakage // in the current form. return mSettingsRegistry.getSettingsNamesLocked(settingsType, userId); } @@ -2170,7 +2172,7 @@ public class SettingsProvider extends ContentProvider { } if (!getInstantAppAccessibleSettings(settingsType).contains(settingName) && !getOverlayInstantAppAccessibleSettings(settingsType).contains(settingName)) { - // Don't enforce the instant app whitelist for now -- its too prone to unintended + // Don't enforce the instant app allowlist for now -- its too prone to unintended // breakage in the current form. Slog.w(LOG_TAG, "Instant App " + ai.packageName + " trying to access unexposed setting, this will be an error in the future."); @@ -5127,14 +5129,15 @@ public class SettingsProvider extends ContentProvider { Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY); final boolean supportMagnificationArea = getContext().getResources().getBoolean( com.android.internal.R.bool.config_magnification_area); - final int capability = supportMagnificationArea - ? R.integer.def_accessibility_magnification_capabilities - : Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; final String supportShowPrompt = supportMagnificationArea ? "1" : "0"; if (magnificationCapabilities.isNull()) { + final int capability = supportMagnificationArea + ? getContext().getResources().getInteger( + R.integer.def_accessibility_magnification_capabilities) + : Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN; secureSettings.insertSettingLocked( Secure.ACCESSIBILITY_MAGNIFICATION_CAPABILITY, - String.valueOf(getContext().getResources().getInteger(capability)), + String.valueOf(capability), null, true, SettingsState.SYSTEM_PACKAGE_NAME); if (isMagnificationSettingsOn(secureSettings)) { diff --git a/packages/SharedStorageBackup/Android.bp b/packages/SharedStorageBackup/Android.bp index 21516fade1ab..225b5b4234b6 100644 --- a/packages/SharedStorageBackup/Android.bp +++ b/packages/SharedStorageBackup/Android.bp @@ -27,9 +27,6 @@ android_app { name: "SharedStorageBackup", defaults: ["platform_app_defaults"], srcs: ["src/**/*.java"], - optimize: { - proguard_flags_files: ["proguard.flags"], - }, platform_apis: true, certificate: "platform", privileged: true, diff --git a/packages/SharedStorageBackup/proguard.flags b/packages/SharedStorageBackup/proguard.flags deleted file mode 100644 index 6a66a47e3050..000000000000 --- a/packages/SharedStorageBackup/proguard.flags +++ /dev/null @@ -1,2 +0,0 @@ --keep class com.android.sharedstoragebackup.SharedStorageAgent --keep class com.android.sharedstoragebackup.ObbBackupService diff --git a/packages/Shell/res/values-am/strings.xml b/packages/Shell/res/values-am/strings.xml index 6cc13eceaaee..99fb79851172 100644 --- a/packages/Shell/res/values-am/strings.xml +++ b/packages/Shell/res/values-am/strings.xml @@ -35,9 +35,9 @@ <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> - <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ቅጽበታዊ ገፅ እይታ በተሳካ ሁኔታ ተነስቷል"</string> - <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ቅጽበታዊ ገፅ እይታ ሊነሳ አይችልም"</string> + <string name="bugreport_screenshot_action" msgid="8677781721940614995">"ቅጽበታዊ ገፅ ዕይታ"</string> + <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"ቅጽበታዊ ገፅ ዕይታ በተሳካ ሁኔታ ተነስቷል"</string> + <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"ቅጽበታዊ ገፅ ዕይታ ሊነሳ አይችልም"</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"የሳንካ ሪፖርት <xliff:g id="ID">#%d</xliff:g> ዝርዝሮች"</string> <string name="bugreport_info_name" msgid="4414036021935139527">"የፋይል ስም"</string> <string name="bugreport_info_title" msgid="2306030793918239804">"የሳንካ ርዕስ"</string> diff --git a/packages/Shell/res/values-gl/strings.xml b/packages/Shell/res/values-gl/strings.xml index 912dc85e15e4..9d4f7de68793 100644 --- a/packages/Shell/res/values-gl/strings.xml +++ b/packages/Shell/res/values-gl/strings.xml @@ -20,7 +20,7 @@ <string name="bugreport_notification_channel" msgid="2574150205913861141">"Informes de erros"</string> <string name="bugreport_in_progress_title" msgid="4311705936714972757">"Estase xerando o informe de erros <xliff:g id="ID">#%d</xliff:g>"</string> <string name="bugreport_finished_title" msgid="4429132808670114081">"Rexistrouse o informe de erros <xliff:g id="ID">#%d</xliff:g>"</string> - <string name="bugreport_updating_title" msgid="4423539949559634214">"Engadindo detalles ao informe de erro"</string> + <string name="bugreport_updating_title" msgid="4423539949559634214">"Engadindo detalles ao informe de erros"</string> <string name="bugreport_updating_wait" msgid="3322151947853929470">"Agarda..."</string> <string name="bugreport_finished_text" product="watch" msgid="1223616207145252689">"O informe de erros aparecerá no teléfono en breve"</string> <string name="bugreport_finished_text" product="tv" msgid="5758325479058638893">"Selecciona para compartir o teu informe de erros"</string> @@ -32,7 +32,7 @@ <string name="bugreport_confirm_dont_repeat" msgid="6179945398364357318">"Non mostrar outra vez"</string> <string name="bugreport_storage_title" msgid="5332488144740527109">"Informes de erros"</string> <string name="bugreport_unreadable_text" msgid="586517851044535486">"Non se puido ler o ficheiro de informe de erros"</string> - <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Non se puideron engadir os detalles do informe de erro ao ficheiro zip"</string> + <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Non se puideron engadir os detalles do informe de erros ao ficheiro zip"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"sen nome"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detalles"</string> <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Captura de pantalla"</string> diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 7df3dfb89d96..a50b182f5270 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -152,6 +152,7 @@ android_library { "res-keyguard", "res", ], + use_resource_processor: true, static_libs: [ "WifiTrackerLib", "WindowManager-Shell", @@ -201,7 +202,7 @@ android_library { manifest: "AndroidManifest.xml", javacflags: ["-Adagger.fastInit=enabled"], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], plugins: ["dagger2-compiler"], @@ -387,13 +388,14 @@ android_library { "mockito-target-extended-minus-junit4", "androidx.test.ext.junit", "androidx.test.ext.truth", + "kotlin-test", ], libs: [ "android.test.runner", "android.test.base", "android.test.mock", ], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], aaptflags: [ "--extra-packages", "com.android.systemui", @@ -510,12 +512,13 @@ android_app { ], resource_dirs: [], + use_resource_processor: true, platform_apis: true, system_ext_specific: true, certificate: "platform", privileged: true, - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], dxflags: ["--multi-dex"], optimize: { diff --git a/packages/SystemUI/OWNERS b/packages/SystemUI/OWNERS index 1ce347215954..8f329b3dddd8 100644 --- a/packages/SystemUI/OWNERS +++ b/packages/SystemUI/OWNERS @@ -4,8 +4,8 @@ set noparent dsandler@android.com -aaliomer@google.com aaronjli@google.com +achalke@google.com acul@google.com adamcohen@google.com aioana@google.com @@ -23,6 +23,7 @@ bhnm@google.com brycelee@google.com brzezinski@google.com caitlinshk@google.com +cameronyee@google.com chandruis@google.com chrisgollner@google.com cinek@google.com @@ -34,6 +35,7 @@ gallmann@google.com gwasserman@google.com hwwang@google.com hyunyoungs@google.com +ikateryna@google.com jaggies@google.com jamesoleary@google.com jbolinger@google.com @@ -44,6 +46,7 @@ jglazier@google.com jjaggi@google.com jonmiranda@google.com joshtrask@google.com +juansmartinez@google.com juliacr@google.com juliatuttle@google.com justinkoh@google.com @@ -70,25 +73,28 @@ omarmt@google.com patmanning@google.com peanutbutter@google.com peskal@google.com +petrcermak@google.com pinyaoting@google.com pixel@google.com pomini@google.com rahulbanerjee@google.com -rasheedlewis@google.com roosa@google.com saff@google.com santie@google.com shanh@google.com snoeberger@google.com steell@google.com +stevenckng@google.com stwu@google.com syeonlee@google.com sunnygoyal@google.com thiruram@google.com +tkachenkoi@google.com tracyzhou@google.com tsuji@google.com twickham@google.com vadimt@google.com +vanjan@google.com victortulias@google.com winsonc@google.com wleshner@google.com @@ -98,7 +104,6 @@ yeinj@google.com yuandizhou@google.com yurilin@google.com zakcohen@google.com -zoepage@google.com #Android TV rgl@google.com diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml index 0aeb410d5e28..7def587b75c0 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-am/strings.xml @@ -12,7 +12,7 @@ <string name="lockscreen_label" msgid="648347953557887087">"ማያ ገፅ ቁልፍ"</string> <string name="quick_settings_label" msgid="2999117381487601865">"ፈጣን ቅንብሮች"</string> <string name="notifications_label" msgid="6829741046963013567">"ማሳወቂያዎች"</string> - <string name="screenshot_label" msgid="863978141223970162">"ቅጽበታዊ ገፅ እይታ"</string> + <string name="screenshot_label" msgid="863978141223970162">"ቅጽበታዊ ገፅ ዕይታ"</string> <string name="screenshot_utterance" msgid="1430760563401895074">"ቅጽበታዊ ገፅ እይታን ያነሳል"</string> <string name="volume_up_label" msgid="8592766918780362870">"ድምፅ ጨምር"</string> <string name="volume_down_label" msgid="8574981863656447346">"ድምፅ ቀንስ"</string> diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml index 5d1f722aee0c..0480a2e2e909 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-kn/strings.xml @@ -11,7 +11,7 @@ <string name="recent_apps_label" msgid="6583276995616385847">"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string> <string name="lockscreen_label" msgid="648347953557887087">"ಲಾಕ್ ಸ್ಕ್ರೀನ್"</string> <string name="quick_settings_label" msgid="2999117381487601865">"ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> - <string name="notifications_label" msgid="6829741046963013567">"ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="notifications_label" msgid="6829741046963013567">"ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string> <string name="screenshot_label" msgid="863978141223970162">"ಸ್ಕ್ರೀನ್ಶಾಟ್"</string> <string name="screenshot_utterance" msgid="1430760563401895074">"ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಿ"</string> <string name="volume_up_label" msgid="8592766918780362870">"ವಾಲ್ಯೂಮ್ ಜಾಸ್ತಿ"</string> diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt index 764a8556a54d..8306620b3de6 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt @@ -302,10 +302,9 @@ class ActivityLaunchAnimator( interface Callback { /** Whether we are currently on the keyguard or not. */ - @JvmDefault fun isOnKeyguard(): Boolean = false + fun isOnKeyguard(): Boolean = false /** Hide the keyguard and animate using [runner]. */ - @JvmDefault fun hideKeyguardWithAnimation(runner: IRemoteAnimationRunner) { throw UnsupportedOperationException() } @@ -316,16 +315,16 @@ class ActivityLaunchAnimator( interface Listener { /** Called when an activity launch animation started. */ - @JvmDefault fun onLaunchAnimationStart() {} + fun onLaunchAnimationStart() {} /** * Called when an activity launch animation is finished. This will be called if and only if * [onLaunchAnimationStart] was called earlier. */ - @JvmDefault fun onLaunchAnimationEnd() {} + fun onLaunchAnimationEnd() {} /** Called when an activity launch animation made progress. */ - @JvmDefault fun onLaunchAnimationProgress(linearProgress: Float) {} + fun onLaunchAnimationProgress(linearProgress: Float) {} } /** diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt index 48dd08f206c1..a2c76839fea7 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt @@ -249,7 +249,7 @@ constructor( // intent is to launch a dialog from another dialog. val animatedParent = openedDialogs.firstOrNull { - it.dialog.window.decorView.viewRootImpl == controller.viewRoot + it.dialog.window?.decorView?.viewRootImpl == controller.viewRoot } val controller = animatedParent?.dialogContentWithBackground?.let { @@ -336,7 +336,7 @@ constructor( ): ActivityLaunchAnimator.Controller? { val animatedDialog = openedDialogs.firstOrNull { - it.dialog.window.decorView.viewRootImpl == view.viewRootImpl + it.dialog.window?.decorView?.viewRootImpl == view.viewRootImpl } ?: return null return createActivityLaunchController(animatedDialog, cujType) @@ -417,7 +417,7 @@ constructor( animatedDialog.prepareForStackDismiss() // Remove the dim. - dialog.window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + dialog.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) } override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) { @@ -867,7 +867,7 @@ private class AnimatedDialog( } // Show the background dim. - dialog.window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + dialog.window?.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) startAnimation( isLaunching = true, @@ -947,7 +947,7 @@ private class AnimatedDialog( isLaunching = false, onLaunchAnimationStart = { // Remove the dim background as soon as we start the animation. - dialog.window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) + dialog.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) }, onLaunchAnimationEnd = { val dialogContentWithBackground = this.dialogContentWithBackground!! diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt index 1a03ede98d12..6c4b695ed709 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt @@ -206,8 +206,9 @@ constructor( return } - backgroundView = FrameLayout(launchContainer.context) - launchContainerOverlay.add(backgroundView) + backgroundView = FrameLayout(launchContainer.context).also { + launchContainerOverlay.add(it) + } // We wrap the ghosted view background and use it to draw the expandable background. Its // alpha will be set to 0 as soon as we start drawing the expanding background. @@ -319,7 +320,7 @@ constructor( backgroundDrawable?.wrapped?.alpha = startBackgroundAlpha GhostView.removeGhost(ghostedView) - launchContainerOverlay.remove(backgroundView) + backgroundView?.let { launchContainerOverlay.remove(it) } if (ghostedView is LaunchableView) { // Restore the ghosted view visibility. diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt index 142fd21d4a16..d6eba2e7064d 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/LaunchAnimator.kt @@ -283,7 +283,7 @@ class LaunchAnimator(private val timings: Timings, private val interpolators: In animator.addListener( object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator?, isReverse: Boolean) { + override fun onAnimationStart(animation: Animator, isReverse: Boolean) { if (DEBUG) { Log.d(TAG, "Animation started") } @@ -295,7 +295,7 @@ class LaunchAnimator(private val timings: Timings, private val interpolators: In launchContainerOverlay.add(windowBackgroundLayer) } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { if (DEBUG) { Log.d(TAG, "Animation ended") } diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt index b555fa583588..8dc74951d332 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt @@ -42,7 +42,9 @@ interface TypefaceVariantCache { return baseTypeface } - val axes = FontVariationAxis.fromFontVariationSettings(fVar).toMutableList() + val axes = FontVariationAxis.fromFontVariationSettings(fVar) + ?.toMutableList() + ?: mutableListOf() axes.removeIf { !baseTypeface.isSupportedAxes(it.getOpenTypeTagValue()) } if (axes.isEmpty()) { return baseTypeface @@ -120,8 +122,8 @@ class TextAnimator( } addListener( object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) = textInterpolator.rebase() - override fun onAnimationCancel(animation: Animator?) = textInterpolator.rebase() + override fun onAnimationEnd(animation: Animator) = textInterpolator.rebase() + override fun onAnimationCancel(animation: Animator) = textInterpolator.rebase() } ) } @@ -302,11 +304,11 @@ class TextAnimator( if (onAnimationEnd != null) { val listener = object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { onAnimationEnd.run() animator.removeListener(this) } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { animator.removeListener(this) } } diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt index 8e79e3ce1742..68d745621c87 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ViewHierarchyAnimator.kt @@ -1020,7 +1020,7 @@ class ViewHierarchyAnimator { } } - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { cancelled = true } } diff --git a/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt b/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt index d4a81f9c765d..ac1ef1509415 100644 --- a/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt +++ b/packages/SystemUI/compose/core/src/com/android/compose/animation/Expandable.kt @@ -70,8 +70,10 @@ import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp -import androidx.lifecycle.ViewTreeLifecycleOwner -import androidx.lifecycle.ViewTreeViewModelStoreOwner +import androidx.lifecycle.findViewTreeLifecycleOwner +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import androidx.lifecycle.setViewTreeLifecycleOwner +import androidx.lifecycle.setViewTreeViewModelStoreOwner import com.android.systemui.animation.Expandable import com.android.systemui.animation.LaunchAnimator import kotlin.math.max @@ -368,13 +370,10 @@ private fun AnimatedContentInOverlay( context, overlay, ) - ViewTreeLifecycleOwner.set( - overlayViewGroup, - ViewTreeLifecycleOwner.get(composeViewRoot), - ) - ViewTreeViewModelStoreOwner.set( - overlayViewGroup, - ViewTreeViewModelStoreOwner.get(composeViewRoot), + + overlayViewGroup.setViewTreeLifecycleOwner(composeViewRoot.findViewTreeLifecycleOwner()) + overlayViewGroup.setViewTreeViewModelStoreOwner( + composeViewRoot.findViewTreeViewModelStoreOwner() ) ViewTreeSavedStateRegistryOwner.set( overlayViewGroup, diff --git a/packages/SystemUI/compose/core/tests/Android.bp b/packages/SystemUI/compose/core/tests/Android.bp index 6119e96e5bac..06d94ac5400e 100644 --- a/packages/SystemUI/compose/core/tests/Android.bp +++ b/packages/SystemUI/compose/core/tests/Android.bp @@ -44,5 +44,5 @@ android_test { "androidx.compose.ui_ui-test-manifest", ], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], } diff --git a/packages/SystemUI/compose/features/tests/Android.bp b/packages/SystemUI/compose/features/tests/Android.bp index ff534bd01fd3..c7c9140b53ed 100644 --- a/packages/SystemUI/compose/features/tests/Android.bp +++ b/packages/SystemUI/compose/features/tests/Android.bp @@ -44,5 +44,5 @@ android_test { "androidx.compose.ui_ui-test-manifest", ], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], } diff --git a/packages/SystemUI/customization/Android.bp b/packages/SystemUI/customization/Android.bp index dc450bb71dfe..fc37b355494f 100644 --- a/packages/SystemUI/customization/Android.bp +++ b/packages/SystemUI/customization/Android.bp @@ -48,5 +48,5 @@ android_library { ], min_sdk_version: "current", plugins: ["dagger2-compiler"], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt index 702cc05f7f5f..f66dbfa233bd 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ClockRegistry.kt @@ -60,7 +60,7 @@ private val KNOWN_PLUGINS = "com.android.systemui.falcon.nine" to listOf(ClockMetadata("DIGITAL_CLOCK_WEATHER")), ) -private fun <TKey, TVal> ConcurrentHashMap<TKey, TVal>.concurrentGetOrPut( +private fun <TKey : Any, TVal : Any> ConcurrentHashMap<TKey, TVal>.concurrentGetOrPut( key: TKey, value: TVal, onNew: () -> Unit diff --git a/packages/SystemUI/docs/qs-tiles.md b/packages/SystemUI/docs/qs-tiles.md index 488f8c728d82..bd0b4abbeb34 100644 --- a/packages/SystemUI/docs/qs-tiles.md +++ b/packages/SystemUI/docs/qs-tiles.md @@ -123,7 +123,7 @@ A third party tile is any Quick Settings tile that is provided by an app (that's ### API classes -The classes that define the public API are in [core/java/android/service/quicksettings](core/java/android/service/quicksettings). +The classes that define the public API are in [core/java/android/service/quicksettings](/core/java/android/service/quicksettings). #### Tile diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/WeatherData.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/WeatherData.kt index a4b1ceeebfa3..c1cc3bd3c563 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/WeatherData.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/WeatherData.kt @@ -52,7 +52,7 @@ constructor( private fun readIntFromBundle(extras: Bundle, key: String): Int? = try { - extras.getString(key).toInt() + extras.getString(key)?.toInt() } catch (e: Exception) { null } diff --git a/packages/SystemUI/plugin_core/Android.bp b/packages/SystemUI/plugin_core/Android.bp index 34d31d9955fc..4e39f1ac9545 100644 --- a/packages/SystemUI/plugin_core/Android.bp +++ b/packages/SystemUI/plugin_core/Android.bp @@ -25,6 +25,9 @@ java_library { sdk_version: "current", name: "PluginCoreLib", srcs: ["src/**/*.java"], + optimize: { + proguard_flags_files: ["proguard.flags"], + }, // Enforce that the library is built against java 8 so that there are // no compatibility issues with launcher diff --git a/packages/SystemUI/plugin_core/proguard.flags b/packages/SystemUI/plugin_core/proguard.flags new file mode 100644 index 000000000000..6240898b3b93 --- /dev/null +++ b/packages/SystemUI/plugin_core/proguard.flags @@ -0,0 +1,11 @@ +# R8's full mode is a bit more aggressive in stripping annotations, but the +# SystemUI plugin architecture requires these annotations at runtime. The +# following rules are the minimal set necessary to ensure compatibility. +# For more details, see: +# https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md#r8-full-mode +-keepattributes RuntimeVisible*Annotation*,AnnotationDefault + +-keep interface com.android.systemui.plugins.annotations.** { + *; +} +-keep,allowshrinking,allowoptimization,allowobfuscation,allowaccessmodification @com.android.systemui.plugins.annotations.** class * diff --git a/packages/SystemUI/res-keyguard/values-da/strings.xml b/packages/SystemUI/res-keyguard/values-da/strings.xml index c4ea98ad35a9..f41c8d71d6a7 100644 --- a/packages/SystemUI/res-keyguard/values-da/strings.xml +++ b/packages/SystemUI/res-keyguard/values-da/strings.xml @@ -73,9 +73,9 @@ <string name="kg_unlock_with_password_or_fp" msgid="2251295907826814237">"Lås op med adgangskode eller fingeraftryk"</string> <string name="kg_unlock_with_pattern_or_fp" msgid="2391870539909135046">"Lås op med mønster eller fingeraftryk"</string> <string name="kg_prompt_after_dpm_lock" msgid="6002804765868345917">"Enhed låst af arbejdspolitik af hensyn til sikkerhed"</string> - <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"Pinkode er påkrævet efter brug af ekstralås"</string> - <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"Adgangskode er påkrævet efter brug af ekstralås"</string> - <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"Mønster er påkrævet efter brug af ekstralås"</string> + <string name="kg_prompt_after_user_lockdown_pin" msgid="5374732179740050373">"Pinkode er påkrævet efter brug af låsning"</string> + <string name="kg_prompt_after_user_lockdown_password" msgid="9097968458291129795">"Adgangskode er påkrævet efter brug af låsning"</string> + <string name="kg_prompt_after_user_lockdown_pattern" msgid="215072203613597906">"Mønster er påkrævet efter brug af låsning"</string> <string name="kg_prompt_unattended_update" msgid="8223448855578632202">"Opdateringen installeres under inaktivitet"</string> <string name="kg_prompt_pin_auth_timeout" msgid="5868644725126275245">"Mere sikkerhed er påkrævet. Pinkoden er ikke blevet brugt i et stykke tid."</string> <string name="kg_prompt_password_auth_timeout" msgid="5809110458491920871">"Mere sikkerhed er påkrævet. Adgangskoden er ikke blevet brugt i et stykke tid."</string> @@ -118,7 +118,7 @@ <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Enheden er blevet låst af administratoren"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Enheden blev låst manuelt"</string> <string name="kg_face_not_recognized" msgid="7903950626744419160">"Ikke genkendt"</string> - <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Aktivér kameraadgang i Indstillinger for at bruge ansigtslås"</string> + <string name="kg_face_sensor_privacy_enabled" msgid="939511161763558512">"Aktivér kameraadgang i Indstillinger for at bruge ansigtsoplåsning"</string> <string name="kg_password_default_pin_message" msgid="1434544655827987873">"{count,plural, =1{Angiv pinkoden til SIM-kortet. Du har # forsøg tilbage, før du skal kontakte dit mobilselskab for at låse din enhed op.}one{Angiv pinkoden til SIM-kortet. Du har # forsøg tilbage.}other{Angiv pinkoden til SIM-kortet. Du har # forsøg tilbage.}}"</string> <string name="kg_password_default_puk_message" msgid="1025139786449741950">"{count,plural, =1{SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har # forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.}one{SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har # forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.}other{SIM-kortet er nu deaktiveret. Angiv PUK-koden for at fortsætte. Du har # forsøg tilbage, før SIM-kortet bliver permanent ubrugeligt. Kontakt dit mobilselskab for at få flere oplysninger.}}"</string> <string name="clock_title_default" msgid="6342735240617459864">"Standard"</string> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index c394fb6ce55a..366ee57fde8e 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -113,7 +113,7 @@ <string name="kg_prompt_reason_restart_pin" msgid="2672166323886110512">"Pincode is vereist na opnieuw opstarten apparaat"</string> <string name="kg_prompt_reason_restart_password" msgid="3967993994418885887">"Wachtwoord is vereist na opnieuw opstarten apparaat"</string> <string name="kg_prompt_reason_timeout_pattern" msgid="5514969660010197363">"Gebruik in plaats daarvan het patroon voor extra beveiliging"</string> - <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik in plaats daarvan de pincode voor extra beveiliging"</string> + <string name="kg_prompt_reason_timeout_pin" msgid="4227962059353859376">"Gebruik de pincode voor extra beveiliging"</string> <string name="kg_prompt_reason_timeout_password" msgid="8810879144143933690">"Gebruik in plaats daarvan het wachtwoord voor extra beveiliging"</string> <string name="kg_prompt_reason_device_admin" msgid="6961159596224055685">"Apparaat vergrendeld door beheerder"</string> <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Apparaat is handmatig vergrendeld"</string> diff --git a/packages/SystemUI/res-keyguard/values-uk/strings.xml b/packages/SystemUI/res-keyguard/values-uk/strings.xml index a147d07ef28c..546f31b5e342 100644 --- a/packages/SystemUI/res-keyguard/values-uk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-uk/strings.xml @@ -81,7 +81,7 @@ <string name="kg_prompt_password_auth_timeout" msgid="5809110458491920871">"Потрібен додатковий захист. Пароль довго не використовувався."</string> <string name="kg_prompt_pattern_auth_timeout" msgid="1860605401869262178">"Потрібен додатковий захист. Ключ довго не використовувався."</string> <string name="kg_prompt_auth_timeout" msgid="6620679830980315048">"Потрібен додатковий захист. Пристрій довго не розблоковувався."</string> - <string name="kg_face_locked_out" msgid="2751559491287575">"Не розблоковано (фейсконтроль). Забагато спроб."</string> + <string name="kg_face_locked_out" msgid="2751559491287575">"Не розблоковано (фейс-контроль). Забагато спроб."</string> <string name="kg_fp_locked_out" msgid="6228277682396768830">"Не розблоковано (відбиток пальця). Забагато спроб."</string> <string name="kg_trust_agent_disabled" msgid="5400691179958727891">"Довірчий агент недоступний"</string> <string name="kg_primary_auth_locked_out_pin" msgid="5492230176361601475">"Неправильний PIN-код введено забагато разів"</string> diff --git a/packages/SystemUI/res-product/values-af/strings.xml b/packages/SystemUI/res-product/values-af/strings.xml index 1fab1d40833c..c1a6803f39db 100644 --- a/packages/SystemUI/res-product/values-af/strings.xml +++ b/packages/SystemUI/res-product/values-af/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Jy het die foon <xliff:g id="NUMBER">%d</xliff:g> keer verkeerd probeer ontsluit. Die werkprofiel sal verwyder word, wat alle profieldata sal uitvee."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd geteken. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal jy gevra word om jou e-posrekening te gebruik om jou tablet te ontsluit.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%3$d</xliff:g> sekondes."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Jy het jou ontsluitpatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer verkeerd geteken. Na nóg <xliff:g id="NUMBER_1">%2$d</xliff:g> onsuksesvolle pogings sal jy gevra word om jou e-posrekening te gebruik om jou foon te ontsluit.\n\n Probeer weer oor <xliff:g id="NUMBER_2">%3$d</xliff:g> sekondes."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Foon het afgeskakel weens hitte"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Toestel het afgeskakel weens hitte"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet het afgeskakel weens hitte"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Jou foon werk nou normaal.\nTik vir meer inligting"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Jou toestel werk nou normaal.\nTik vir meer inligting"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Jou tablet werk nou normaal.\nTik vir meer inligting"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Jou foon was te warm en het afgeskakel om af te koel. Jou foon werk nou normaal.\n\nJou foon sal dalk te warm word as jy:\n • Hulpbronintensiewe apps (soos dobbel-, video- of navigasieapps) gebruik\n • Groot lêers af- of oplaai\n • Jou foon in hoë temperature gebruik"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Jou toestel was te warm en het afgeskakel om af te koel. Jou toestel werk nou normaal.\n\nJou toestel sal dalk te warm word as jy:\n • Hulpbronintensiewe apps (soos dobbel-, video- of navigasieapps) gebruik\n • Groot lêers af- of oplaai\n • Jou toestel in hoë temperature gebruik"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Jou tablet was te warm en het afgeskakel om af te koel. Jou tablet werk nou normaal.\n\nJou tablet sal dalk te warm word as jy:\n • Hulpbronintensiewe apps (soos dobbel-, video- of navigasieapps) gebruik\n • Groot lêers af- of oplaai\n • Jou tablet in hoë temperature gebruik"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Foon word warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Toestel word warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet word warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Sommige kenmerke word beperk terwyl die foon besig is om af te koel.\nTik vir meer inligting"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Sommige kenmerke word beperk terwyl die toestel besig is om af te koel.\nTik vir meer inligting"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Sommige kenmerke word beperk terwyl die tablet besig is om af te koel.\nTik vir meer inligting"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Jou foon sal outomaties probeer afkoel. Jy kan steeds jou foon gebruik, maar dit sal dalk stadiger werk.\n\nJou foon sal normaal werk nadat dit afgekoel het."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Jou toestel sal outomaties probeer afkoel. Jy kan steeds jou toestel gebruik, maar dit sal dalk stadiger werk.\n\nJou toestel sal normaal werk nadat dit afgekoel het."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Jou tablet sal outomaties probeer afkoel. Jy kan steeds jou tablet gebruik, maar dit sal dalk stadiger werk.\n\nJou tablet sal normaal werk nadat dit afgekoel het."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Die vingerafdruksensor is op die aan/af-skakelaar. Dit is die plat knoppie langs die verhewe volumeknoppie aan die kant van die tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Die vingerafdruksensor is op die aan/af-skakelaar. Dit is die plat knoppie langs die verhewe volumeknoppie aan die kant van die toestel."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Die vingerafdruksensor is op die aan/af-skakelaar. Dit is die plat knoppie langs die verhewe volumeknoppie aan die kant van die foon."</string> diff --git a/packages/SystemUI/res-product/values-am/strings.xml b/packages/SystemUI/res-product/values-am/strings.xml index ab55d22ed059..b8b2df8c1e73 100644 --- a/packages/SystemUI/res-product/values-am/strings.xml +++ b/packages/SystemUI/res-product/values-am/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ስልኩን <xliff:g id="NUMBER">%d</xliff:g> ጊዜ ትክክል ባልሆነ መልኩ ለመክፈት ሞክረዋል። የስራ መገለጫው ይወገዳል፣ ይህም ሁሉንም የመገለጫ ውሂብ ይሰርዛል።"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%1$d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%2$d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ጡባዊዎን እንዲከፍቱ ይጠየቃሉ።\n\n ከ<xliff:g id="NUMBER_2">%3$d</xliff:g> ከሰከንዶች በኋላ እንደገና ይሞክሩ።"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"የመክፈቻ ስርዓተ ጥለቱን <xliff:g id="NUMBER_0">%1$d</xliff:g> ጊዜ በትክክል አልሳሉትም። ከ<xliff:g id="NUMBER_1">%2$d</xliff:g> ተጨማሪ ያልተሳኩ ሙከራዎች በኋላ የኢሜይል መለያ ተጠቅመው ስልክዎን እንዲከፍቱ ይጠየቃሉ።\n\nእባክዎ ከ<xliff:g id="NUMBER_2">%3$d</xliff:g> ሰከንዶች በኋላ እንደገና ይሞክሩ።"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ስልክ በሙቀት ምክንያት ጠፍቷል"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"መሣሪያ በሙቀት ምክንያት ጠፍቷል"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ጡባዊ በሙቀት ምክንያት ጠፍቷል"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"የእርስዎ ስልክ በመደበኛነት በማሄድ ላይ ነው።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"የእርስዎ ጡባዊ በመደበኛነት በማሄድ ላይ ነው።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"የእርስዎ ጡባዊ በመደበኛነት በማሄድ ላይ ነው።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"የእርስዎ ስልክ በጣም ግሎ ነበር ስለዚህ እንዲቀዘቅዝ ጠፍቷል። የእርስዎ ስልክ አሁን በመደበኛነት በማሄድ ላይ ነው።\n\nየሚከተሉትን ካደረጉ የእርስዎ ስልክ በጣም ሊግል ይችላል፦\n • ኃይል በጣም የሚጠቀሙ መተግበሪያዎችን (እንደ ጨዋታ፣ ቪድዮ ወይም የአሰሳ መተግበሪያዎች ያሉ) ከተጠቀሙ\n • ትልልቅ ፋይሎችን ካወረዱ ወይም ከሰቀሉ\n • ስልክዎን በከፍተኛ ሙቀት ውስጥ ከተጠቀሙ"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"የእርስዎ መሣሪያ በጣም ግሎ ነበር ስለዚህ እንዲቀዘቅዝ ጠፍቷል። የእርስዎ መሣሪያ አሁን በመደበኛነት በማሄድ ላይ ነው።\n\nየሚከተሉትን ካደረጉ የእርስዎ መሣሪያ በጣም ሊግል ይችላል፦\n • ኃይል በጣም የሚጠቀሙ መተግበሪያዎችን (እንደ ጨዋታ፣ ቪድዮ ወይም የአሰሳ መተግበሪያዎች ያሉ) ከተጠቀሙ\n • ትልልቅ ፋይሎችን ካወረዱ ወይም ከሰቀሉ\n • መሣሪያዎን በከፍተኛ ሙቀት ውስጥ ከተጠቀሙ"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"የእርስዎ ጡባዊ በጣም ግሎ ነበር ስለዚህ እንዲቀዘቅዝ ጠፍቷል። የእርስዎ ጡባዊ አሁን በመደበኛነት በማሄድ ላይ ነው።\n\nየሚከተሉትን ካደረጉ የእርስዎ ጡባዊ በጣም ሊግል ይችላል፦\n • ኃይል በጣም የሚጠቀሙ መተግበሪያዎችን (እንደ ጨዋታ፣ ቪድዮ ወይም የአሰሳ መተግበሪያዎች ያሉ) ከተጠቀሙ\n • ትልልቅ ፋይሎችን ካወረዱ ወይም ከሰቀሉ\n • ጡባዊዎን በከፍተኛ ሙቀት ውስጥ ከተጠቀሙ"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"የስልክ ሙቀት እየጨመረ ነው"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"የመሣሪያ ሙቀት እየጨመረ ነው"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"የጡባዊ ሙቀት እየጨመረ ነው"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ስልክ እየቀዘቀዘ ሳለ አንዳንድ ባህሪያት ይገደባሉ።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"መሣሪያ እየቀዘቀዘ ሳለ አንዳንድ ባህሪያት ይገደባሉ።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ጡባዊ እየቀዘቀዘ ሳለ አንዳንድ ባህሪያት ይገደባሉ።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"የእርስዎ ስልክ በራስ-ሰር ለመቀዝቀዝ ይሞክራል። አሁንም ስልክዎን መጠቀም ይችላሉ ነገር ግን ቀትፋፋ ሆኖ ሊያሄድ ይችላል።\n\nአንዴ ስልክዎ ከቀዘቀዘ በኋላ በመደበኛነት ያሄዳል።"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"መሣሪያዎ በራስ-ሰር ለመቀዝቀዝ ይሞክራል። አሁንም መሣሪያዎን መጠቀም ይችላሉ ነገር ግን ቀርፋፋ ሆኖ ሊያሄድ ይችላል።\n\nአንዴ መሣሪያዎ ከቀዘቀዘ በኋላ በመደበኛነት ያሄዳል"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"ጡባዊዎ በራስ-ሰር ለመቀዝቀዝ ይሞክራል። አሁንም ጡባዊዎን መጠቀም ይችላሉ ነገር ግን ቀርፋፋ ሆኖ ሊያሄድ ይችላል።\n\nአንዴ ጡባዊዎ ከቀዘቀዘ በኋላ በመደበኛነት ያሄዳል።"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"የጣት አሻራ ዳሳሹ የማብሪያ/ማጥፊያ ቁልፉ ላይ ነው። በጡባዊው ጫፍ ላይ ከፍ ካለው የድምፅ አዝራር ቀጥሎ ያለው ጠፍጣፋ አዝራር ነው።"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"የጣት አሻራ ዳሳሹ የማብሪያ/ማጥፊያ ቁልፉ ላይ ነው። በመሣሪያው ጫፍ ላይ ከፍ ካለው የድምፅ አዝራር ቀጥሎ ያለው ጠፍጣፋ አዝራር ነው።"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"የጣት አሻራ ዳሳሹ የማብሪያ/ማጥፊያ ቁልፉ ላይ ነው። በስልኩ ጫፍ ላይ ከፍ ካለው የድምፅ አዝራር ቀጥሎ ያለው ጠፍጣፋ አዝራር ነው።"</string> diff --git a/packages/SystemUI/res-product/values-ar/strings.xml b/packages/SystemUI/res-product/values-ar/strings.xml index 1664d6fcd7ff..4d4d8d06ac5e 100644 --- a/packages/SystemUI/res-product/values-ar/strings.xml +++ b/packages/SystemUI/res-product/values-ar/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"أخطأت في محاولة فتح قفل الهاتف <xliff:g id="NUMBER">%d</xliff:g> مرة. ستتم إزالة الملف الشخصي للعمل، ومن ثم يتم حذف جميع بياناته."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"رسمت نقش فتح القفل بشكل غير صحيح <xliff:g id="NUMBER_0">%1$d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%2$d</xliff:g> محاولة غير ناجحة أخرى، ستُطالَب بفتح قفل الجهاز اللوحي باستخدام معلومات حساب بريد إلكتروني.\n\n يُرجى إعادة المحاولة خلال <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانية."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"رسمت نقش فتح القفل بشكل غير صحيح <xliff:g id="NUMBER_0">%1$d</xliff:g> مرة. بعد إجراء <xliff:g id="NUMBER_1">%2$d</xliff:g> محاولة غير ناجحة أخرى، ستُطالَب بفتح قفل الهاتف باستخدام حساب بريد إلكتروني.\n\n يُرجى إعادة المحاولة خلال <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانية."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"تم إطفاء الهاتف بسبب ارتفاع درجة حرارته"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"تم إطفاء الجهاز بسبب ارتفاع درجة حرارته"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"تم إطفاء الجهاز اللوحي لارتفاع حرارته"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"يعمل هاتفك الآن بشكل طبيعي.\nانقر للحصول على مزيد من المعلومات."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"يعمل جهازك الآن بشكل طبيعي.\nانقر للحصول على مزيد من المعلومات."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"يعمل جهازك اللوحي الآن بشكل طبيعي.\nانقر للحصول على مزيد من المعلومات."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ارتفعت درجة حرارة هاتفك بشدة، لذا تم إطفاؤه لخفض درجة حرارته. يعمل هاتفك الآن بشكل طبيعي.\n\nقد ترتفع درجة حرارة هاتفك بشدة إذا:\n • استخدمت تطبيقات تستهلك موارد الجهاز بصورة كبيرة (مثل تطبيقات الألعاب أو الفيديو أو التنقل)\n • نزَّلت أو حمَّلت ملفات كبيرة الحجم\n • استخدمت هاتفك وسط أجواء مرتفعة الحرارة"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ارتفعت درجة حرارة جهازك بشدة، لذا تم إطفاؤه لخفض درجة حرارته. يعمل جهازك الآن بشكل طبيعي.\n\nقد ترتفع درجة حرارة جهازك بشدة إذا:\n • استخدمت تطبيقات تستهلك موارد الجهاز بصورة كبيرة (مثل تطبيقات الألعاب أو الفيديو أو التنقل)\n • نزَّلت أو حمَّلت ملفات كبيرة الحجم\n • استخدمت جهازك وسط أجواء مرتفعة الحرارة"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ارتفعت درجة حرارة جهازك اللوحي بشدة، لذا تم إطفاؤه لخفض درجة حرارته. يعمل جهازك اللوحي الآن بشكل طبيعي.\n\nقد ترتفع درجة حرارة جهازك اللوحي بشدة إذا:\n • استخدمت تطبيقات تستهلك موارد الجهاز بصورة كبيرة (مثل تطبيقات الألعاب أو الفيديو أو التنقل)\n • نزَّلت أو حمَّلت ملفات كبيرة الحجم\n • استخدمت جهازك اللوحي وسط أجواء مرتفعة الحرارة"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"تزداد درجة حرارة الهاتف"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"تزداد درجة حرارة الجهاز"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"تزداد درجة حرارة الجهاز اللوحي"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"سيتم فرض قيود على بعض الميزات إلى أن تنخفض درجة حرارة الهاتف.\nانقر للحصول على مزيد من المعلومات."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"سيتم فرض قيود على بعض الميزات إلى أن تنخفض درجة حرارة الجهاز.\nانقر للحصول على مزيد من المعلومات."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"سيتم فرض قيود على بعض الميزات إلى أن تنخفض درجة حرارة الجهاز اللوحي.\nانقر للحصول على مزيد من المعلومات."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"سيحاول الهاتف تخفيض درجة حرارته تلقائيًا. سيظل بإمكانك استخدام هاتفك، ولكنه قد يعمل بشكل أبطأ.\n\nبعد أن تنخفض درجة حرارة الهاتف، سيستعيد سرعته المعتادة."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"سيحاول جهازك تخفيض درجة حرارته تلقائيًا. سيظل بإمكانك استخدام جهازك، ولكنه قد يعمل بشكل أبطأ.\n\nبعد أن تنخفض درجة حرارة الجهاز، سيستعيد سرعته المعتادة."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"سيحاول جهازك اللوحي تخفيض درجة حرارته تلقائيًا. سيظل بإمكانك استخدام جهازك اللوحي، ولكنه قد يعمل بشكل أبطأ.\n\nبعد أن تنخفض درجة حرارة الجهاز اللوحي، سيستعيد سرعته المعتادة."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"توجد أداة استشعار بصمة الإصبع على زر التشغيل. زر التشغيل هو الزر المسطّح بجانب زرَّي التحكّم بمستوى الصوت البارزَين في الجزء الجانبي من الجهاز اللوحي."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"توجد أداة استشعار بصمة الإصبع على زر التشغيل. زر التشغيل هو الزر المسطّح بجانب زرَّي التحكّم بمستوى الصوت البارزَين في الجزء الجانبي من الجهاز."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"توجد أداة استشعار بصمة الإصبع على زر التشغيل. زر التشغيل هو الزر المسطّح بجانب زرَّي التحكّم بمستوى الصوت البارزَين في الجزء الجانبي من الهاتف."</string> diff --git a/packages/SystemUI/res-product/values-as/strings.xml b/packages/SystemUI/res-product/values-as/strings.xml index 05c69b838e10..40aab2f7cb08 100644 --- a/packages/SystemUI/res-product/values-as/strings.xml +++ b/packages/SystemUI/res-product/values-as/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"আপুনি ফ’নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুলকৈ প্ৰয়াস কৰিছে। কৰ্মস্থানৰ প্ৰ’ফাইলটো আঁতৰোৱা হ’ব, যিয়ে প্ৰ’ফাইলটোৰ আটাইবোৰ ডেটা মচি পেলাব।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"আপুনি নিজৰ আনলক কৰা আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাক নিজৰ টেবলেটটো এটা ইমেইল একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ’ব।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"আপুনি নিজৰ আনলক কৰা আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুলকৈ প্ৰয়াস কৰাৰ পাছত আপোনাক নিজৰ ফ’নটো এটা ইমেইল একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ’ব।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পাছত পুনৰ চেষ্টা কৰক।"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ফ’নটো গৰম হোৱাৰ কাৰণে অফ হৈছিল"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ডিভাইচটো গৰম হোৱাৰ কাৰণে অফ হৈছিল"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"টেবলেটটো গৰম হোৱাৰ কাৰণে অফ হৈছিল"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"আপোনাৰ ফ’নটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\nঅধিক তথ্যৰ বাবে টিপক"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"আপোনাৰ ডিভাইচটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\nঅধিক তথ্যৰ বাবে টিপক"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"আপোনাৰ টেবলেটটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\nঅধিক তথ্যৰ বাবে টিপক"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"আপোনাৰ ফ’নটো অত্যধিক গৰম হোৱাৰ বাবে সেইটো ঠাণ্ডা কৰিবলৈ অফ হৈছিল। আপোনাৰ ফ’নটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\n\nআপোনাৰ ফ’নটো গৰম হ’ব পাৰে, যদিহে আপুনি:\n • ফ’নটোৰ হাৰ্ডৱেৰ অত্যধিক মাত্ৰাত ব্যৱহাৰ কৰা এপ্ (যেনে- ভিডিঅ’ গে’ম, ভিডিঅ’, দিক্-নিৰ্দেশনাৰ এপ্) ব্যৱহাৰ কৰে\n • ডাঙৰ আকাৰৰ ফাইল আপল’ড অথবা ডাউনল’ড কৰে\n • আপোনাৰ ফ’নটো উচ্চ তাপমাত্ৰাৰ পৰিৱেশত ব্যৱহাৰ কৰে"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"আপোনাৰ ডিভাইচটো অত্যধিক গৰম হোৱাৰ বাবে সেইটো ঠাণ্ডা কৰিবলৈ অফ হৈছিল। আপোনাৰ ডিভাইচটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\n\nআপোনাৰ ডিভাইচটো গৰম হ’ব পাৰে, যদিহে আপুনি:\n • ডিভাইচটোৰ হাৰ্ডৱেৰ অত্যধিক মাত্ৰাত ব্যৱহাৰ কৰা এপ্ (যেনে- ভিডিঅ’ গে’ম, ভিডিঅ’, দিক্-নিৰ্দেশনাৰ এপ্) ব্যৱহাৰ কৰে\n • ডাঙৰ আকাৰৰ ফাইল আপল’ড অথবা ডাউনল’ড কৰে\n • আপোনাৰ ডিভাইচটো উচ্চ তাপমাত্ৰাৰ পৰিৱেশত ব্যৱহাৰ কৰে"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"আপোনাৰ টেবলেটটো অত্যধিক গৰম হোৱাৰ বাবে সেইটো ঠাণ্ডা কৰিবলৈ অফ হৈছিল। আপোনাৰ টেবলেটটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\n\nআপোনাৰ টেবলেটটো গৰম হ’ব পাৰে, যদিহে আপুনি:\n • টেবলেটটোৰ হাৰ্ডৱেৰ অত্যধিক মাত্ৰাত ব্যৱহাৰ কৰা এপ্ (যেনে- ভিডিঅ’ গে’ম, ভিডিঅ’, দিক্-নিৰ্দেশনাৰ এপ্) ব্যৱহাৰ কৰে\n • ডাঙৰ আকাৰৰ ফাইল আপল’ড অথবা ডাউনল’ড কৰে\n • আপোনাৰ টেবলেটটো উচ্চ তাপমাত্ৰাৰ পৰিৱেশত ব্যৱহাৰ কৰে"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ফ’নটো গৰম হ’বলৈ ধৰিছে"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ডিভাইচটো গৰম হবলৈ ধৰিছে"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"টেবলেটটো গৰম হবলৈ ধৰিছে"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ফ’নটো ঠাণ্ডা হ’বলৈ ধৰোঁতে কিছুমান সুবিধা উপলব্ধ নহয়।\nঅধিক তথ্যৰ বাবে টিপক"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ডিভাইচটো ঠাণ্ডা হ’বলৈ ধৰোঁতে কিছুমান সুবিধা উপলব্ধ নহয়।\nঅধিক তথ্যৰ বাবে টিপক"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"টেবলেটটো ঠাণ্ডা হ’বলৈ ধৰোঁতে কিছুমান সুবিধা উপলব্ধ নহয়।\nঅধিক তথ্যৰ বাবে টিপক"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"আপোনাৰ ফ’নটোৱে নিজে নিজে ঠাণ্ডা হ’বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ’নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ’নটো ঠাণ্ডা হোৱাৰ পাছত ই আগৰ নিচিনাকৈ চলিব।"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"আপোনাৰ ডিভাইচটোৱে নিজে নিজে ঠাণ্ডা হ’বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ডিভাইচটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nআপোনাৰ ডিভাইচটো ঠাণ্ডা হোৱাৰ পাছত ই আগৰ নিচিনাকৈ চলিব।"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"আপোনাৰ টেবলেটটোৱে নিজে নিজে ঠাণ্ডা হ’বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি টেবলেটটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nআপোনাৰ টেবলেটটো ঠাণ্ডা হোৱাৰ পাছত ই আগৰ নিচিনাকৈ চলিব।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো পাৱাৰ বুটামটোত আছে। এইটো হৈছে টেবলেটটোৰ প্ৰান্তত থকা উঠঙা ভলিউমৰ বুটামটোৰ কাষত থকা চেপেটা বুটামটো।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো পাৱাৰ বুটামটোত আছে। এইটো হৈছে ডিভাইচটোৰ প্ৰান্তত থকা উঠঙা ভলিউমৰ বুটামটোৰ কাষত থকা চেপেটা বুটামটো।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো পাৱাৰ বুটামটোত আছে। এইটো হৈছে ফ’নটোৰ প্ৰান্তত থকা উঠঙা ভলিউমৰ বুটামটোৰ কাষত থকা চেপেটা বুটামটো।"</string> diff --git a/packages/SystemUI/res-product/values-az/strings.xml b/packages/SystemUI/res-product/values-az/strings.xml index 3cc7d8cb9492..b7e93fd4de90 100644 --- a/packages/SystemUI/res-product/values-az/strings.xml +++ b/packages/SystemUI/res-product/values-az/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefonun kilidini açmaq üçün <xliff:g id="NUMBER">%d</xliff:g> dəfə yanlış cəhd etmisiniz. İş profili silinəcək və bütün data ləğv ediləcək."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Kilid açma modelini <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış çəkmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra planşet kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniyə sonra cəhd edin."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Kilid açma modelini artıq <xliff:g id="NUMBER_0">%1$d</xliff:g> dəfə yanlış çəkmisiniz. Daha <xliff:g id="NUMBER_1">%2$d</xliff:g> uğursuz cəhddən sonra telefon kilidini e-poçt hesabınızla açmaq tələb olunacaq.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniyə sonra cəhd edin."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon qızdığı üçün söndü"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Cihaz qızdığı üçün söndü"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Planşet qızdığı üçün söndü"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Hazırda telefon normal işləyir.\nƏtraflı məlumat üçün toxunun"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Hazırda cihaz normal işləyir.\nƏtraflı məlumat üçün toxunun"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Hazırda planşet normal işləyir.\nƏtraflı məlumat üçün toxunun"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon çox isti idi və soyumaq üçün söndü. Hazırda telefon normal işləyir.\n\nTelefon bu hallarda çox isinə bilər:\n • Çoxresurslu tətbiq (oyun, video və ya naviqasiya tətbiqi kimi) istifadə etsəniz\n • Böyük fayl endirsəniz və ya yükləsəniz\n • Telefonu yüksək temperaturda istifadə etsəniz"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Cihaz çox isti idi və soyumaq üçün söndü. Hazırda cihaz normal işləyir.\n\nCihaz bu hallarda çox isinə bilər:\n • Çoxresurslu tətbiq (oyun, video və ya naviqasiya tətbiqi kimi) istifadə etsəniz\n • Böyük fayl endirsəniz və ya yükləsəniz\n • Cihazı yüksək temperaturda istifadə etsəniz"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Planşet çox isti idi və soyumaq üçün söndü. Hazırda planşet normal işləyir.\n\nPlanşet bu hallarda çox isinə bilər:\n • Çoxresurslu tətbiq (oyun, video və ya naviqasiya tətbiqi kimi) istifadə etsəniz\n • Böyük fayl endirsəniz və ya yükləsəniz\n • Planşeti yüksək temperaturda istifadə etsəniz"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon isinir"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Cihaz isinir"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Planşet isinir"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Telefon soyuyarkən bəzi funksiyalar məhdudlaşdırılır.\nƏtraflı məlumat üçün toxunun"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Cihaz soyuyarkən bəzi funksiyalar məhdudlaşdırılır.\nƏtraflı məlumat üçün toxunun"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Planşet soyuyarkən bəzi funksiyalar məhdudlaşdırılır.\nƏtraflı məlumat üçün toxunun"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefon avtomatik soyuyacaq. Telefondan istifadə mümkündür, lakin asta işləyə bilər.\n\nSoyuduqdan sonra normal işləyəcək."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Cihaz avtomatik soyuyacaq. Cihazdan istifadə mümkündür, lakin asta işləyə bilər.\n\nSoyuduqdan sonra normal işləyəcək."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Planşet avtomatik soyuyacaq. Planşetdən istifadə mümkündür, lakin asta işləyə bilər.\n\nSoyuduqdan sonra normal işləyəcək."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Barmaq izi sensoru enerji düyməsinin üzərindədir. Bu, planşetin kənarındakı qabarıq səs düyməsinin yanındakı yastı düymədir."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Barmaq izi sensoru enerji düyməsinin üzərindədir. Bu, cihazın kənarındakı qabarıq səs düyməsinin yanındakı yastı düymədir."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Barmaq izi sensoru enerji düyməsinin üzərindədir. Bu, telefonun kənarındakı qabarıq səs düyməsinin yanındakı yastı düymədir."</string> diff --git a/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml index 07d8c9449314..067c16b41d9f 100644 --- a/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-product/values-b+sr+Latn/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Pogrešno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Uklonićemo poslovni profil, čime se brišu svi podaci sa profila."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate tablet pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Netačno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Ako pogrešno pokušate još <xliff:g id="NUMBER_1">%2$d</xliff:g> puta, zatražićemo da otključate telefon pomoću imejl naloga.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon se isključio zbog toplote"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Uređaj se isključio zbog toplote"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet se isključio zbog toplote"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefon sada funkcioniše normalno.\nDodirnite za više informacija"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Uređaj sada funkcioniše normalno.\nDodirnite za više informacija"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tablet sada funkcioniše normalno.\nDodirnite za više informacija"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon je bio prevruć, pa se isključio da se ohladi. Sada radi normalno.\n\nTelefon može previše da se ugreje ako:\n • koristite aplikacije koje zahtevaju puno resursa (npr. video igre, video ili aplikacije za navigaciju)\n • preuzimate ili otpremate velike fajlove\n • koristite telefon na visokoj temperaturi"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Uređaj je bio prevruć, pa se isključio da se ohladi. Sada radi normalno.\n\nUređaj može previše da se ugreje ako:\n • koristite aplikacije koje zahtevaju puno resursa (npr. video igre, video ili aplikacije za navigaciju)\n • preuzimate ili otpremate velike fajlove\n • koristite uređaj na visokoj temperaturi"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablet je bio prevruć, pa se isključio da se ohladi. Sada radi normalno.\n\nTablet može previše da se ugreje ako:\n • koristite aplikacije koje zahtevaju puno resursa (npr. video igre, video ili aplikacije za navigaciju)\n • preuzimate ili otpremate velike fajlove\n • koristite tablet na visokoj temperaturi"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon se zagrejao"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Uređaj se zagrejao"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet se zagrejao"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Neke funkcije su ograničene dok se telefon ne ohladi.\nDodirnite za više informacija"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Neke funkcije su ograničene dok se uređaj ne ohladi.\nDodirnite za više informacija"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Neke funkcije su ograničene dok se tablet ne ohladi.\nDodirnite za više informacija"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefon će automatski pokušati da se ohladi. I dalje možete da koristite telefon, ali će možda raditi sporije.\n\nKad se telefon ohladi, funkcionisaće normalno."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Uređaj će automatski pokušati da se ohladi. I dalje možete da koristite uređaj, ali će možda raditi sporije.\n\nKad se uređaj ohladi, funkcionisaće normalno."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablet će automatski pokušati da se ohladi. I dalje možete da koristite tablet, ali će možda raditi sporije.\n\nKad se tablet ohladi, funkcionisaće normalno."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Senzor za otisak prsta se nalazi na dugmetu za uključivanje. To je ravno dugme pored izdignutog dugmeta za jačinu zvuka na ivici tableta."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Senzor za otisak prsta se nalazi na dugmetu za uključivanje. To je ravno dugme pored izdignutog dugmeta za jačinu zvuka na ivici uređaja."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Senzor za otisak prsta se nalazi na dugmetu za uključivanje. To je ravno dugme pored izdignutog dugmeta za jačinu zvuka na ivici telefona."</string> diff --git a/packages/SystemUI/res-product/values-be/strings.xml b/packages/SystemUI/res-product/values-be/strings.xml index e9c491a64735..f9ef0d5f1ebf 100644 --- a/packages/SystemUI/res-product/values-be/strings.xml +++ b/packages/SystemUI/res-product/values-be/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Вы не змаглі разблакіраваць тэлефон столькі разоў: <xliff:g id="NUMBER">%d</xliff:g>. Працоўны профіль будзе выдалены, і гэта прывядзе да выдалення ўсіх даных у профілі."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Вы няправільна ўвялі ўзор разблакіроўкі столькі разоў: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Пасля яшчэ некалькіх няўдалых спроб (<xliff:g id="NUMBER_1">%2$d</xliff:g>) вам будзе прапанавана разблакіраваць планшэт, увайшоўшы ва ўліковы запіс электроннай пошты.\n\n Паўтарыце спробу праз <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Вы няправільна ўвялі ўзор разблакіроўкі столькі разоў: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Пасля яшчэ некалькіх няўдалых спроб (<xliff:g id="NUMBER_1">%2$d</xliff:g>) вам будзе прапанавана разблакіраваць тэлефон, увайшоўшы ва ўліковы запіс электроннай пошты.\n\n Паўтарыце спробу праз <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Тэлефон выключыўся з-за перагрэву"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Прылада выключылася з-за перагрэву"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Планшэт выключыўся з-за перагрэву"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Ваш тэлефон працуе ў звычайным рэжыме.\nНацісніце, каб даведацца больш"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Ваша прылада працуе ў звычайным рэжыме.\nНацісніце, каб даведацца больш"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Ваш планшэт працуе ў звычайным рэжыме.\nНацісніце, каб даведацца больш"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Ваш тэлефон пераграваўся, таму ён выключыўся, каб астыць. Зараз тэлефон працуе ў звычайным рэжыме.\n\nТэлефон можа перагравацца пры:\n • выкарыстанні рэсурсаёмістых праграм (напрыклад, гульняў або праграм, звязаных з відэа або навігацыяй);\n • спампоўванні або запампоўванні вялікіх файлаў;\n • выкарыстанні тэлефона пры высокіх тэмпературах."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Ваша прылада перагравалася, таму яна выключылася, каб астыць. Зараз прылада працуе ў звычайным рэжыме.\n\nПрылада можа перагравацца пры:\n • выкарыстанні рэсурсаёмістых праграм (напрыклад, гульняў або праграм, звязаных з відэа або навігацыяй);\n • спампоўванні або запампоўванні вялікіх файлаў;\n • выкарыстанні прылады пры высокіх тэмпературах."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Ваш планшэт пераграваўся, таму ён выключыўся, каб астыць. Зараз планшэт працуе ў звычайным рэжыме.\n\nПланшэт можа перагравацца пры:\n • выкарыстанні рэсурсаёмістых праграм (напрыклад, гульняў або праграм, звязаных з відэа або навігацыяй);\n • спампоўванні або запампоўванні вялікіх файлаў;\n • выкарыстанні планшэта пры высокіх тэмпературах."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Тэлефон награваецца"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Прылада награваецца"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Планшэт награваецца"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Некаторыя функцыі абмежаваны, пакуль тэлефон не астыне.\nНацісніце, каб даведацца больш"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Некаторыя функцыі абмежаваны, пакуль прылада не астыне.\nНацісніце, каб даведацца больш"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Некаторыя функцыі абмежаваны, пакуль планшэт не астыне.\nНацісніце, каб даведацца больш"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Ваш тэлефон будзе астываць аўтаматычна. Вы можаце і далей ім карыстацца, але ён можа працаваць больш павольна.\n\nПасля таго як тэлефон астыне, ён будзе працаваць у звычайным рэжыме."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Ваша прылада будзе астываць аўтаматычна. Вы можаце і далей ёй карыстацца, але яна можа працаваць больш павольна.\n\nПасля таго як прылада астыне, яна будзе працаваць у звычайным рэжыме."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Ваш планшэт будзе астываць аўтаматычна. Вы можаце і далей ім карыстацца, але ён можа працаваць больш павольна.\n\nПасля таго як планшэт астыне, ён будзе працаваць у звычайным рэжыме."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Сканер адбіткаў пальцаў знаходзіцца на кнопцы сілкавання. Гэта плоская кнопка побач з выпуклай кнопкай гучнасці на бакавой грані планшэта."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Сканер адбіткаў пальцаў знаходзіцца на кнопцы сілкавання. Гэта плоская кнопка побач з выпуклай кнопкай гучнасці на бакавой грані прылады."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Сканер адбіткаў пальцаў знаходзіцца на кнопцы сілкавання. Гэта плоская кнопка побач з выпуклай кнопкай гучнасці на бакавой грані тэлефона."</string> diff --git a/packages/SystemUI/res-product/values-bg/strings.xml b/packages/SystemUI/res-product/values-bg/strings.xml index 35425585ac4f..40140c4df396 100644 --- a/packages/SystemUI/res-product/values-bg/strings.xml +++ b/packages/SystemUI/res-product/values-bg/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Опитахте да отключите телефона и сбъркахте <xliff:g id="NUMBER">%d</xliff:g> пъти. Служебният потребителски профил ще бъде премахнат, при което ще се изтрият всички данни за него."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%1$d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни опита ще бъдете помолени да отключите таблета си посредством имейл адрес.\n\n Опитайте отново след <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Начертахте неправилно фигурата си за отключване <xliff:g id="NUMBER_0">%1$d</xliff:g> пъти. След още <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни опита ще бъдете помолени да отключите телефона посредством имейл адрес.\n\n Опитайте отново след <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Телефонът се изключи поради загряване"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Устройството се изключи поради загряване"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Таблетът се изключи поради загряване"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Телефонът ви вече работи нормално.\nДокоснете за още информация"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Устройството ви вече работи нормално.\nДокоснете за още информация"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Таблетът ви вече работи нормално.\nДокоснете за още информация"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Телефонът ви бе твърде горещ, затова се изключи с цел охлаждане. Вече работи нормално.\n\nТелефонът ви може да стане твърде горещ, ако:\n • използвате натоварващи приложения (като например игри или приложения за видео или за навигация);\n • изтегляте или качвате големи файлове;\n • използвате устройството си при високи температури."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Устройството ви бе твърде горещо, затова се изключи с цел охлаждане. Вече работи нормално.\n\nУстройството ви може да стане твърде горещо, ако:\n • използвате натоварващи приложения (като например игри или приложения за видео или за навигация);\n • изтегляте или качвате големи файлове;\n • използвате устройството си при високи температури."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Таблетът ви бе твърде горещ, затова се изключи с цел охлаждане. Вече работи нормално.\n\nТаблетът ви може да стане твърде горещ, ако:\n • използвате натоварващи приложения (като например игри или приложения за видео или за навигация);\n • изтегляте или качвате големи файлове;\n • използвате устройството си при високи температури."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Телефонът загрява"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Устройството загрява"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Таблетът загрява"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Някои функции са ограничени, докато телефонът се охлажда.\nДокоснете за още информация"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Някои функции са ограничени, докато устройството се охлажда.\nДокоснете за още информация"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Някои функции са ограничени, докато таблетът се охлажда.\nДокоснете за още информация"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Телефонът ви автоматично ще направи опит да се охлади. Пак можете да го използвате, но той може да работи по-бавно.\n\nСлед като се охлади, ще работи нормално."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Устройството ви автоматично ще направи опит да се охлади. Пак можете да го използвате, но то може да работи по-бавно.\n\nСлед като се охлади, ще работи нормално."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Таблетът ви автоматично ще направи опит да се охлади. Пак можете да го използвате, но той може да работи по-бавно.\n\nСлед като се охлади, ще работи нормално."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Сензорът за отпечатъци се намира върху бутона за захранване. Този бутон е плосък и е разположен на ръба на таблета до повдигнатия бутон за силата на звука."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Сензорът за отпечатъци се намира върху бутона за захранване. Този бутон е плосък и е разположен на ръба на устройството до повдигнатия бутон за силата на звука."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Сензорът за отпечатъци се намира върху бутона за захранване. Този бутон е плосък и е разположен на ръба на телефона до повдигнатия бутон за силата на звука."</string> diff --git a/packages/SystemUI/res-product/values-bn/strings.xml b/packages/SystemUI/res-product/values-bn/strings.xml index 0984de29e497..19165ef63bc9 100644 --- a/packages/SystemUI/res-product/values-bn/strings.xml +++ b/packages/SystemUI/res-product/values-bn/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"আপনি <xliff:g id="NUMBER">%d</xliff:g> বার ভুল পদ্ধতিতে ফোন আনলক করার চেষ্টা করেছেন। অফিস প্রোফাইলটি সরিয়ে দেওয়া হবে, যার ফলে প্রোফাইলের সমস্ত ডেটা মুছে যাবে।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল পদ্ধতিতে প্যাটার্ন আনলক করার চেষ্টা করেছেন। আরও <xliff:g id="NUMBER_1">%2$d</xliff:g> বার এটি করলে আপনাকে প্যাটার্ন আনলক করতে একটি ইমেল অ্যাকাউন্ট ব্যবহার করতে বলা হবে।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"আপনি <xliff:g id="NUMBER_0">%1$d</xliff:g> বার ভুল পদ্ধতিতে প্যাটার্ন আনলক করার চেষ্টা করেছেন। আরও <xliff:g id="NUMBER_1">%2$d</xliff:g> বার এটি করলে আপনাকে প্যাটার্ন আনলক করতে একটি ইমেল অ্যাকাউন্ট ব্যবহারের করতে বলা হবে।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> সেকেন্ড পরে আবার চেষ্টা করুন।"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ফোন গরম হওয়ার জন্য বন্ধ হয়ে গেছে"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ডিভাইস গরম হওয়ার জন্য বন্ধ হয়ে গেছে"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ট্যাবলেট গরম হওয়ার জন্য বন্ধ হয়ে গেছে"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"আপনার ফোন এখন ভালভাবে কাজ করছে।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"আপনার ডিভাইস এখন ভালভাবে কাজ করছে।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"আপনার ট্যাবলেট এখন ভালভাবে কাজ করছে।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"আপনার ফোন খুব বেশি গরম হয়ে যায়, তাই ঠাণ্ডা হওয়ার জন্য বন্ধ হয়ে গেছে। আপনার ফোন এখন ভালভাবে কাজ করছে।\n\nআপনার ফোন খুব বেশি গরম হয়ে যেতে পারে যদি আপনি:\n •এমন অ্যাপ ব্যবহার করেন যেটি আপনার ফোনের রিসোর্স বেশি ব্যবহার করে (যেমন গেমিং, ভিডিও বা নেভিগেশন অ্যাপ)\n • বড় ফাইল ডাউনলোড বা আপলোড করেন\n • অনেক বেশি তাপমাত্রায় ফোন ব্যবহার করেন"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"আপনার ডিভাইস খুব বেশি গরম হয়ে যায়, তাই ঠাণ্ডা হওয়ার জন্য বন্ধ হয়ে গেছে। আপনার ডিভাইস এখন ভালভাবে কাজ করছে।\n\nআপনার ডিভাইস খুব বেশি গরম হয়ে যেতে পারে যদি আপনি:\n •এমন অ্যাপ ব্যবহার করেন যেটি আপনার ডিভাইসের রিসোর্স বেশি ব্যবহার করে (যেমন গেমিং, ভিডিও বা নেভিগেশন অ্যাপ)\n • বড় ফাইল ডাউনলোড বা আপলোড করেন\n • অনেক বেশি তাপমাত্রায় ডিভাইস ব্যবহার করেন"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"আপনার ট্যাবলেট খুব বেশি গরম হয়ে যায়, তাই ঠাণ্ডা হওয়ার জন্য বন্ধ হয়ে গেছে। আপনার ট্যাবলেট এখন ভালভাবে কাজ করছে।\n\nআপনার ট্যাবলেট খুব বেশি গরম হয়ে যেতে পারে যদি আপনি:\n •এমন অ্যাপ ব্যবহার করেন যেটি আপনার ট্যাবলেটের রিসোর্স বেশি ব্যবহার করে (যেমন গেমিং, ভিডিও বা নেভিগেশন অ্যাপ)\n • বড় ফাইল ডাউনলোড বা আপলোড করেন\n • অনেক বেশি তাপমাত্রায় ট্যাবলেট ব্যবহার করেন"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ফোন গরম হয়ে গেছে"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ডিভাইস গরম হয়ে গেছে"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ট্যাবলেট গরম হয়ে গেছে"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ফোন ঠাণ্ডা না হওয়া পর্যন্ত কিছু ফিচার কাজ করতে পারে না।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ডিভাইস ঠাণ্ডা না হওয়া পর্যন্ত কিছু ফিচার কাজ করতে পারে না।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ট্যাবলেট ঠাণ্ডা না হওয়া পর্যন্ত কিছু ফিচার কাজ করতে পারে না।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"আপনার ফোনটি অটোমেটিক ঠাণ্ডা হওয়ার চেষ্টা করবে। আপনি তবুও ফোন ব্যবহার করতে পারেন, কিন্তু এটি একটু ধীরে চলতে পারে।\n\nফোন পুরোপুরি ঠাণ্ডা হয়ে গেলে, এটি ভালভাবে চলবে।"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"আপনার ডিভাইস অটোমেটিক ঠাণ্ডা হওয়ার চেষ্টা করবে। আপনি তবুও ডিভাইস ব্যবহার করতে পারবেন, কিন্তু এটি একটু ধীরে চলতে পারে।\n\nডিভাইস পুরোপুরি ঠাণ্ডা হয়ে গেলে, এটি ভালভাবে চলবে।"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"আপনার ট্যাবলেট অটোমেটিক ঠাণ্ডা হওয়ার চেষ্টা করবে। আপনি তবুও ট্যাবলেট ব্যবহার করতে পারবেন, কিন্তু এটি একটু ধীরে চলতে পারে।\n\nট্যাবলেট পুরোপুরি ঠাণ্ডা হয়ে গেলে, এটি ভালভাবে চলবে।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"\'পাওয়ার\' বোতামের উপরে ফিঙ্গারপ্রিন্ট সেন্সর দেওয়া হয়েছে। ট্যাবলেটের প্রান্তে একটু বাইরে বেরিয়ে থাকা ভলিউমের বোতামের ঠিক পাশে এই ফ্ল্যাট বোতামটি আপনি খুঁজে পাবেন।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"\'পাওয়ার\' বোতামের উপরে ফিঙ্গারপ্রিন্ট সেন্সর দেওয়া হয়েছে। ডিভাইসের সাইডে একটু বাইরে বেরিয়ে থাকা ভলিউমের বোতামের ঠিক পাশে এই ফ্ল্যাট বোতামটি আপনি খুঁজে পাবেন।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"\'পাওয়ার\' বোতামের উপরে ফিঙ্গারপ্রিন্ট সেন্সর দেওয়া হয়েছে। ফোনের প্রান্তে একটু বাইরে বেরিয়ে থাকা ভলিউমের বোতামের ঠিক পাশে এই ফ্ল্যাট বোতামটি আপনি খুঁজে পাবেন।"</string> diff --git a/packages/SystemUI/res-product/values-bs/strings.xml b/packages/SystemUI/res-product/values-bs/strings.xml index 576fac40f29b..1c1316fa7620 100644 --- a/packages/SystemUI/res-product/values-bs/strings.xml +++ b/packages/SystemUI/res-product/values-bs/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Pokušali ste neispravno otključati telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Radni profil će se ukloniti i svi podaci s profila će se izbrisati."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Pogrešno ste nacrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, od vas će se tražiti da otključate tablet pomoću računa e-pošte. \n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Pogrešno ste nacrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. U slučaju još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja bez uspjeha, od vas će se tražiti da otključate telefon pomoću računa e-pošte. \n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon se isključio zbog pregrijavanja"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Uređaj se isključio zbog pregrijavanja"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet se isključio zbog pregrijavanja"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Vaš telefon sada radi normalno.\nDodirnite za više informacija"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Vaš uređaj sada radi normalno.\nDodirnite za više informacija"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Vaš tablet sada radi normalno.\nDodirnite za više informacija"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Vaš telefon se pregrijao, pa se isključio da se ohladi. Telefon sada radi normalno.\n\nTelefon se može pregrijati ako:\n • koristite aplikacije koje troše puno resursa (kao što su aplikacije za igranje, videozapise ili navigaciju)\n • preuzimate ili otpremate velike fajlove\n • koristite telefon na visokim temperaturama"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Vaš uređaj se pregrijao, pa se isključio da se ohladi. Uređaj sada radi normalno.\n\nUređaj se može pregrijati ako:\n • koristite aplikacije koje troše puno resursa (kao što su aplikacije za igranje, videozapise ili navigaciju)\n • preuzimate ili otpremate velike fajlove\n • koristite uređaj na visokim temperaturama"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Vaš tablet se pregrijao, pa se isključio da se ohladi. Tablet sada radi normalno.\n\nTablet se može pregrijati ako:\n • koristite aplikacije koje troše puno resursa (kao što su aplikacije za igranje, videozapise ili navigaciju)\n • preuzimate ili otpremate velike fajlove\n • koristite tablet na visokim temperaturama"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon se zagrijava"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Uređaj se zagrijava"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet se zagrijava"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Neke funkcije su ograničene dok se telefon hladi.\nDodirnite za više informacija"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Neke funkcije su ograničene dok se uređaj hladi.\nDodirnite za više informacija"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Neke funkcije su ograničene dok se tablet hladi.\nDodirnite za više informacija"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Vaš telefon će se automatski pokušati ohladiti. I dalje možete koristiti telefon, ali će možda sporije raditi.\n\nNakon što se ohladi, telefon će raditi normalno."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Uređaj će se automatski pokušati ohladiti. I dalje možete koristiti uređaj, ali će možda sporije raditi.\n\nNakon što se ohladi, uređaj će raditi normalno."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablet će se automatski pokušati ohladiti. I dalje možete koristiti tablet, ali će možda sporije raditi.\n\nNakon što se ohladi, tablet će raditi normalno."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Senzor za otisak prsta je na dugmetu za uključivanje. To je ravno dugme pored izdignutog dugmeta za jačinu zvuka na rubu tableta."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Senzor za otisak prsta je na dugmetu za uključivanje. To je ravno dugme pored izdignutog dugmeta za jačinu zvuka na rubu uređaja."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Senzor za otisak prsta je na dugmetu za uključivanje. To je ravno dugme pored izdignutog dugmeta za jačinu zvuka na rubu telefona."</string> diff --git a/packages/SystemUI/res-product/values-ca/strings.xml b/packages/SystemUI/res-product/values-ca/strings.xml index d8d4a4763a49..4b84a6bca16d 100644 --- a/packages/SystemUI/res-product/values-ca/strings.xml +++ b/packages/SystemUI/res-product/values-ca/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER">%d</xliff:g> vegades de manera incorrecta. El perfil de treball se suprimirà, juntament amb totes les dades que contingui."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, se\'t demanarà que desbloquegis la tauleta amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%3$d</xliff:g> segons."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Has dibuixat el patró de desbloqueig <xliff:g id="NUMBER_0">%1$d</xliff:g> vegades de manera incorrecta. Si falles <xliff:g id="NUMBER_1">%2$d</xliff:g> vegades més, se\'t demanarà que desbloquegis el telèfon amb un compte de correu electrònic.\n\n Torna-ho a provar d\'aquí a <xliff:g id="NUMBER_2">%3$d</xliff:g> segons."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"El telèfon s\'ha apagat per la calor"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"El dispositiu s\'ha apagat per la calor"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"La tauleta s\'ha apagat per la calor"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Ara el telèfon funciona amb normalitat.\nToca per obtenir més informació."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Ara el dispositiu funciona amb normalitat.\nToca per obtenir més informació."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Ara la tauleta funciona amb normalitat.\nToca per obtenir més informació."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"El telèfon s\'havia sobreescalfat i s\'ha apagat per refredar-se. Ara funciona amb normalitat.\n\nEs pot sobreescalfar si:\n • Utilitzes aplicacions que consumeixen molts recursos (com ara, videojocs, vídeos o aplicacions de navegació).\n • Baixes o penges fitxers grans.\n • L\'utilitzes amb temperatures altes."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"El dispositiu s\'havia sobreescalfat i s\'ha apagat per refredar-se. Ara funciona amb normalitat.\n\nEs pot sobreescalfar si:\n • Utilitzes aplicacions que consumeixen molts recursos (com ara videojocs, vídeos o aplicacions de navegació).\n • Baixes o penges fitxers grans.\n • L\'utilitzes amb temperatures altes."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"La tauleta s\'havia sobreescalfat i s\'ha apagat per refredar-se. Ara funciona amb normalitat.\n\nEs pot sobreescalfar si:\n • Utilitzes aplicacions que consumeixen molts recursos (com ara videojocs, vídeos o aplicacions de navegació).\n • Baixes o penges fitxers grans.\n • L\'utilitzes amb temperatures altes."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"El telèfon s\'està escalfant"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"El dispositiu s\'està escalfant"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"La tauleta s\'està escalfant"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Algunes funcions estan limitades mentre el telèfon es refreda.\nToca per obtenir més informació."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Algunes funcions estan limitades mentre el dispositiu es refreda.\nToca per obtenir més informació."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Algunes funcions estan limitades mentre la tauleta es refreda.\nToca per obtenir més informació."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"El telèfon provarà de refredar-se automàticament. Podràs continuar utilitzant-lo, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"El dispositiu provarà de refredar-se automàticament. Pots continuar utilitzant-lo, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"La tauleta provarà de refredar-se automàticament. Pots continuar utilitzant-la, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"El sensor d\'empremtes digitals es troba al botó d\'engegada. És el botó pla situat al costat del botó de volum amb relleu al lateral de la tauleta."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"El sensor d\'empremtes digitals es troba al botó d\'engegada. És el botó pla situat al costat del botó de volum amb relleu al lateral del dispositiu."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"El sensor d\'empremtes digitals es troba al botó d\'engegada. És el botó pla situat al costat del botó de volum amb relleu al lateral del telèfon."</string> diff --git a/packages/SystemUI/res-product/values-cs/strings.xml b/packages/SystemUI/res-product/values-cs/strings.xml index 47881bd9c5d2..ffefb987ba52 100644 --- a/packages/SystemUI/res-product/values-cs/strings.xml +++ b/packages/SystemUI/res-product/values-cs/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Již <xliff:g id="NUMBER">%d</xliff:g>krát jste se pokusili odemknout telefon nesprávným způsobem. Pracovní profil bude odstraněn, čímž budou smazána všechna jeho data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně zadali své bezpečnostní gesto. Po <xliff:g id="NUMBER_1">%2$d</xliff:g>dalších neúspěšných pokusech budete požádáni o odemčení tabletu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Již <xliff:g id="NUMBER_0">%1$d</xliff:g>krát jste nesprávně zadali své bezpečnostní gesto. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> dalších neúspěšných pokusech budete požádáni o odemčení telefonu pomocí e-mailového účtu.\n\n Zkuste to znovu za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon se vypnul z důvodu zahřátí"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Zařízení se vypnulo z důvodu zahřátí"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet se vypnul z důvodu zahřátí"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Nyní telefon funguje jako obvykle.\nKlepnutím zobrazíte další informace"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Nyní zařízení funguje jako obvykle.\nKlepnutím zobrazíte další informace"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Nyní tablet funguje jako obvykle.\nKlepnutím zobrazíte další informace"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon byl příliš zahřátý, proto se vypnul, aby vychladl. Nyní telefon funguje jako obvykle.\n\nTelefon se může příliš zahřát v těchto případech:\n • používání náročných aplikací (např. her, videí nebo navigace),\n • stahování nebo nahrávání velkých souborů,\n • používání telefonu při vysokých teplotách."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Zařízení bylo příliš zahřáté, proto se vypnulo, aby vychladlo. Nyní zařízení funguje jako obvykle.\n\nZařízení se může příliš zahřát v těchto případech:\n • používání náročných aplikací (např. her, videí nebo navigace),\n • stahování nebo nahrávání velkých souborů,\n • používání zařízení při vysokých teplotách."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablet byl příliš zahřátý, proto se vypnul, aby vychladl. Nyní tablet funguje jako obvykle.\n\nTablet se může příliš zahřát v těchto případech:\n • používání náročných aplikací (např. her, videí nebo navigace),\n • stahování nebo nahrávání velkých souborů,\n • používání tabletu při vysokých teplotách."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon se zahřívá"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Zařízení se zahřívá"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet se zahřívá"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Některé funkce jsou při chladnutí telefonu omezeny.\nKlepnutím zobrazíte další informace"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Některé funkce jsou při chladnutí zařízení omezeny.\nKlepnutím zobrazíte další informace"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Některé funkce jsou při chladnutí tabletu omezeny.\nKlepnutím zobrazíte další informace"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefon se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž telefon vychladne, bude fungovat normálně."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Zařízení se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž zařízení vychladne, bude fungovat normálně."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablet se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž tablet vychladne, bude fungovat normálně."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Snímač otisků prstů je na vypínači. Je to ploché tlačítko vedle vystouplého tlačítka hlasitosti na hraně tabletu."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Snímač otisků prstů je na vypínači. Je to ploché tlačítko vedle vystouplého tlačítka hlasitosti na hraně zařízení."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Snímač otisků prstů je na vypínači. Je to ploché tlačítko vedle vystouplého tlačítka hlasitosti na hraně telefonu."</string> diff --git a/packages/SystemUI/res-product/values-da/strings.xml b/packages/SystemUI/res-product/values-da/strings.xml index 47531e7da1c4..9bed837210c1 100644 --- a/packages/SystemUI/res-product/values-da/strings.xml +++ b/packages/SystemUI/res-product/values-da/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du har forsøgt at låse telefonen op med den forkerte adgangskode <xliff:g id="NUMBER">%d</xliff:g> gange. Arbejdsprofilen fjernes, hvilket sletter alle profildata."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg bliver du bedt om at låse din tablet op ved hjælp af en mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du har tegnet dit oplåsningsmønster forkert <xliff:g id="NUMBER_0">%1$d</xliff:g> gange. Efter endnu <xliff:g id="NUMBER_1">%2$d</xliff:g> mislykkede forsøg bliver du bedt om at låse din telefon op ved hjælp af en mailkonto.\n\n Prøv igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefonen slukkede pga. varme"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Enheden slukkede pga. varme"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Din tablet slukkede pga. varme"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Din telefon kører nu normalt.\nTryk for at få flere oplysninger"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Din enhed kører nu normalt.\nTryk for at få flere oplysninger"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Din tablet kører nu normalt.\nTryk for at få flere oplysninger"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Din telefon var blevet for varm, så den slukkede for at køle ned. Din telefon kører nu igen normalt. \n\nDin telefon kan blive for varm, hvis du:\n • Bruger ressourcekrævende apps (f.eks. spil, video eller navigation)\n • Downloader eller uploader store filer\n • Bruger din telefon i varme omgivelser"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Din enhed var blevet for varm, så den slukkede for at køle ned. Din enhed kører nu igen normalt. \n\nDin enhed kan blive for varm, hvis du:\n • Bruger ressourcekrævende apps (f.eks. spil, video eller navigation)\n • Downloader eller uploader store filer\n • Bruger din enhed i varme omgivelser"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Din tablet var blevet for varm, så den slukkede for at køle ned. Din tablet kører nu igen normalt. \n\nDin tablet kan blive for varm, hvis du:\n • Bruger ressourcekrævende apps (f.eks. spil, video eller navigation)\n • Downloader eller uploader store filer\n • Bruger din tablet i varme omgivelser"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefonen er ved at blive varm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Enheden er ved at blive varm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tabletten er ved at blive varm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Nogle funktioner er begrænsede, mens telefonen køler ned.\nTryk for at få flere oplysninger"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Nogle funktioner er begrænsede, mens enheden køler ned.\nTryk for at få flere oplysninger"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Nogle funktioner er begrænsede, mens din tablet køler ned.\nTryk for at få flere oplysninger"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Din telefon forsøger automatisk at køle sig selv ned. Du kan stadig bruge telefonen, men den kører muligvis langsommere end normalt.\n\nNår din telefon er kølet ned, fungerer den normalt igen."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Din enhed forsøger automatisk at køle sig selv ned. Du kan stadig bruge din enhed, men den kører muligvis langsommere end normalt.\n\nNår din enhed er kølet ned, fungerer den normalt igen."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Din tablet forsøger automatisk at køle sig selv ned. Du kan stadig bruge din tablet, men den kører muligvis langsommere end normalt.\n\nNår din tablet er kølet ned, fungerer den normalt igen."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Fingeraftrykssensoren sidder på afbryderknappen. Det er den flade knap ved siden af den hævede lydstyrkeknap på siden af din tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Fingeraftrykssensoren sidder på afbryderknappen. Det er den flade knap ved siden af den hævede lydstyrkeknap på siden af enheden."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Fingeraftrykssensoren sidder på afbryderknappen. Det er den flade knap ved siden af den hævede lydstyrkeknap på siden af telefonen."</string> diff --git a/packages/SystemUI/res-product/values-de/strings.xml b/packages/SystemUI/res-product/values-de/strings.xml index 9c0b7680e5a7..80389a498cc2 100644 --- a/packages/SystemUI/res-product/values-de/strings.xml +++ b/packages/SystemUI/res-product/values-de/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du hast <xliff:g id="NUMBER">%d</xliff:g>-mal erfolglos versucht, das Smartphone zu entsperren. Das Arbeitsprofil wird nun entfernt und alle Profildaten werden gelöscht."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du hast dein Entsperrungsmuster <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wirst du aufgefordert, dein Tablet mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuche es in <xliff:g id="NUMBER_2">%3$d</xliff:g> Sekunden noch einmal."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du hast dein Entsperrungsmuster <xliff:g id="NUMBER_0">%1$d</xliff:g>-mal falsch gezeichnet. Nach <xliff:g id="NUMBER_1">%2$d</xliff:g> weiteren erfolglosen Versuchen wirst du aufgefordert, dein Smartphone mithilfe eines E-Mail-Kontos zu entsperren.\n\n Versuche es in <xliff:g id="NUMBER_2">%3$d</xliff:g> Sekunden noch einmal."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Smartphone wegen Überhitzung ausgeschaltet"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Gerät wegen Überhitzung ausgeschaltet"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet wegen Überhitzung ausgeschaltet"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Dein Smartphone funktioniert jetzt wieder normal.\nFür mehr Informationen tippen."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Dein Gerät funktioniert jetzt wieder normal.\nFür mehr Informationen tippen."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Dein Tablet funktioniert jetzt wieder normal.\nFür mehr Informationen tippen."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Dein Smartphone war zu heiß und wurde zum Abkühlen ausgeschaltet. Nun funktioniert es wieder normal.\n\nMögliche Ursachen:\n • Verwendung ressourcenintensiver Apps, z. B. Spiele-, Video- oder Navigations-Apps\n • Download oder Upload großer Dateien\n • Verwendung des Smartphones bei hohen Temperaturen"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Dein Gerät war zu heiß und wurde zum Abkühlen ausgeschaltet. Nun funktioniert es wieder normal.\n\nMögliche Ursachen:\n • Verwendung ressourcenintensiver Apps, z. B. Spiele-, Video- oder Navigations-Apps\n • Download oder Upload großer Dateien\n • Verwendung des Geräts bei hohen Temperaturen"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Dein Tablet war zu heiß und wurde zum Abkühlen ausgeschaltet. Nun funktioniert es wieder normal.\n\nMögliche Ursachen:\n • Verwendung ressourcenintensiver Apps, z. B. Spiele-, Video- oder Navigations-Apps\n • Download oder Upload großer Dateien\n • Verwendung des Tablets bei hohen Temperaturen"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Smartphone wird warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Gerät wird warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet wird warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Einige Funktionen sind während der Abkühlphase des Smartphones eingeschränkt.\nFür mehr Informationen tippen."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Einige Funktionen sind während der Abkühlphase des Geräts eingeschränkt.\nFür mehr Informationen tippen."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Einige Funktionen sind während der Abkühlphase des Tablets eingeschränkt.\nFür mehr Informationen tippen."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Dein Smartphone kühlt sich automatisch ab. Du kannst es weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Smartphone abgekühlt ist, funktioniert es wieder normal."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Dein Gerät kühlt sich automatisch ab. Du kannst es weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Gerät abgekühlt ist, funktioniert es wieder normal."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Dein Tablet kühlt sich automatisch ab. Du kannst es weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Tablet abgekühlt ist, funktioniert es wieder normal."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Der Fingerabdrucksensor befindet sich auf der Ein-/Aus-Taste. Das ist die flache Taste neben der erhöhten Lautstärketaste am Rand des Tablets."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Der Fingerabdrucksensor befindet sich auf der Ein-/Aus-Taste. Das ist die flache Taste neben der erhöhten Lautstärketaste am Rand des Geräts."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Der Fingerabdrucksensor befindet sich auf der Ein-/Aus-Taste. Das ist die flache Taste neben der erhöhten Lautstärketaste am Rand des Smartphones."</string> diff --git a/packages/SystemUI/res-product/values-el/strings.xml b/packages/SystemUI/res-product/values-el/strings.xml index 139fa04603b2..67bdbcff788b 100644 --- a/packages/SystemUI/res-product/values-el/strings.xml +++ b/packages/SystemUI/res-product/values-el/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Δοκιμάσατε να ξεκλειδώσετε το τηλέφωνο <xliff:g id="NUMBER">%d</xliff:g> φορές χωρίς επιτυχία. Το προφίλ εργασίας θα καταργηθεί και θα διαγραφούν όλα τα δεδομένα προφίλ."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%1$d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%2$d</xliff:g> ακόμα ανεπιτυχείς προσπάθειες, θα σας ζητηθεί να ξεκλειδώσετε το tablet με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου.\n\n Δοκιμάστε να συνδεθείτε ξανά σε <xliff:g id="NUMBER_2">%3$d</xliff:g> δευτερόλεπτα."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Σχεδιάσατε το μοτίβο ξεκλειδώματος εσφαλμένα <xliff:g id="NUMBER_0">%1$d</xliff:g> φορές. Μετά από <xliff:g id="NUMBER_1">%2$d</xliff:g> ακόμα ανεπιτυχείς προσπάθειες, θα σας ζητηθεί να ξεκλειδώσετε το τηλέφωνό σας με τη χρήση ενός λογαριασμού ηλεκτρονικού ταχυδρομείου.\n\n Δοκιμάστε ξανά σε <xliff:g id="NUMBER_2">%3$d</xliff:g> δευτερόλεπτα."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Το τηλέφωνο απενεργοποιήθηκε λόγω ζέστης"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Η συσκευή απενεργοποιήθηκε λόγω ζέστης"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Το tablet απενεργοποιήθηκε λόγω ζέστης"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Το τηλέφωνο λειτουργεί πλέον κανονικά.\nΠατήστε για περισσότερες πληροφορίες"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Η συσκευή λειτουργεί πλέον κανονικά.\nΠατήστε για περισσότερες πληροφορίες"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Το tablet λειτουργεί πλέον κανονικά.\nΠατήστε για περισσότερες πληροφορίες"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Η θερμοκρασία του τηλεφώνου είναι πολύ υψηλή και απενεργοποιήθηκε για να κρυώσει. Πλέον, το τηλέφωνο λειτουργεί κανονικά.\n\nΗ θερμοκρασία του τηλεφώνου ενδέχεται να ανέβει κατά τη:\n • Χρήση εφαρμογών υψηλής κατανάλωσης πόρων (όπως gaming, βίντεο ή περιήγησης)\n • Λήψη ή μεταφόρτωση μεγάλων αρχείων\n • Χρήση του τηλεφώνου σε υψηλές θερμοκρασίες"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Η θερμοκρασία της συσκευής είναι πολύ υψηλή και απενεργοποιήθηκε για να κρυώσει. Πλέον, η συσκευή λειτουργεί κανονικά.\n\nΗ θερμοκρασία της συσκευής ενδέχεται να ανέβει κατά τη:\n • Χρήση εφαρμογών υψηλής κατανάλωσης πόρων (όπως gaming, βίντεο ή περιήγησης)\n • Λήψη ή μεταφόρτωση μεγάλων αρχείων\n • Χρήση της συσκευής σε υψηλές θερμοκρασίες"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Η θερμοκρασία του tablet είναι πολύ υψηλή και απενεργοποιήθηκε για να κρυώσει. Πλέον, το tablet λειτουργεί κανονικά.\n\nΗ θερμοκρασία του tablet ενδέχεται να ανέβει κατά τη:\n • Χρήση εφαρμογών υψηλής κατανάλωσης πόρων (όπως gaming, βίντεο ή περιήγησης)\n • Λήψη ή μεταφόρτωση μεγάλων αρχείων\n • Χρήση του tablet σε υψηλές θερμοκρασίες"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Το τηλέφωνο θερμαίνεται"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Η συσκευή θερμαίνεται"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Το tablet θερμαίνεται"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Ορισμένες λειτουργίες περιορίζονται κατά τη μείωση της θερμοκρασίας του τηλεφώνου.\nΠατήστε για περισσότερες πληροφορίες"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Ορισμένες λειτουργίες περιορίζονται κατά τη μείωση της θερμοκρασίας της συσκευής.\nΠατήστε για περισσότερες πληροφορίες"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Ορισμένες λειτουργίες περιορίζονται κατά τη μείωση της θερμοκρασίας του tablet.\nΠατήστε για περισσότερες πληροφορίες"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Το τηλέφωνό σας θα προσπαθήσει αυτόματα να κρυώσει. Μπορείτε να εξακολουθήσετε να το χρησιμοποιείτε, αλλά είναι πιθανό να λειτουργεί πιο αργά.\n\nΜόλις μειωθεί η θερμοκρασία του τηλεφώνου σας, θα λειτουργεί ξανά κανονικά."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Η συσκευή σας θα προσπαθήσει αυτόματα να κρυώσει. Μπορείτε να εξακολουθήσετε να τη χρησιμοποιείτε, αλλά είναι πιθανό να λειτουργεί πιο αργά.\n\nΜόλις μειωθεί η θερμοκρασία της συσκευής σας, θα λειτουργεί ξανά κανονικά."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Το tablet σας θα προσπαθήσει αυτόματα να κρυώσει. Μπορείτε να εξακολουθήσετε να το χρησιμοποιείτε, αλλά είναι πιθανό να λειτουργεί πιο αργά.\n\nΜόλις μειωθεί η θερμοκρασία του tablet σας, θα λειτουργεί ξανά κανονικά."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Ο αισθητήρας δακτυλικών αποτυπωμάτων βρίσκεται στο κουμπί λειτουργίας. Είναι το επίπεδο κουμπί δίπλα στο ανυψωμένο κουμπί έντασης ήχου στο άκρο του tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Ο αισθητήρας δακτυλικών αποτυπωμάτων βρίσκεται στο κουμπί λειτουργίας. Είναι το επίπεδο κουμπί δίπλα στο ανυψωμένο κουμπί έντασης ήχου στο άκρο της συσκευής."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Ο αισθητήρας δακτυλικών αποτυπωμάτων βρίσκεται στο κουμπί λειτουργίας. Είναι το επίπεδο κουμπί δίπλα στο ανυψωμένο κουμπί έντασης ήχου στο άκρο του τηλεφώνου."</string> diff --git a/packages/SystemUI/res-product/values-en-rAU/strings.xml b/packages/SystemUI/res-product/values-en-rAU/strings.xml index 6356fc2e674a..137325196a94 100644 --- a/packages/SystemUI/res-product/values-en-rAU/strings.xml +++ b/packages/SystemUI/res-product/values-en-rAU/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Phone turned off due to heat"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Device turned off due to heat"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet turned off due to heat"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Your phone is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Your device is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Your tablet is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Your device was too hot, so it turned off to cool down. Your device is now running normally.\n\nYour device may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your device in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Your tablet was too hot, so it turned off to cool down. Your tablet is now running normally.\n\nYour tablet may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your tablet in high temperatures"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Phone is getting warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Device is getting warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet is getting warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Some features limited while phone cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Some features limited while device cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Some features limited while tablet cools down.\nTap for more info"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Your device will automatically try to cool down. You can still use your device, but it may run slower.\n\nOnce your device has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Your tablet will automatically try to cool down. You can still use your tablet, but it may run slower.\n\nOnce your tablet has cooled down, it will run normally."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone."</string> diff --git a/packages/SystemUI/res-product/values-en-rCA/strings.xml b/packages/SystemUI/res-product/values-en-rCA/strings.xml index fb7aa72178de..eaa5de0f9ad5 100644 --- a/packages/SystemUI/res-product/values-en-rCA/strings.xml +++ b/packages/SystemUI/res-product/values-en-rCA/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Phone turned off due to heat"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Device turned off due to heat"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet turned off due to heat"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Your phone is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Your device is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Your tablet is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Your device was too hot, so it turned off to cool down. Your device is now running normally.\n\nYour device may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your device in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Your tablet was too hot, so it turned off to cool down. Your tablet is now running normally.\n\nYour tablet may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your tablet in high temperatures"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Phone is getting warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Device is getting warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet is getting warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Some features limited while phone cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Some features limited while device cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Some features limited while tablet cools down.\nTap for more info"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Your device will automatically try to cool down. You can still use your device, but it may run slower.\n\nOnce your device has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Your tablet will automatically try to cool down. You can still use your tablet, but it may run slower.\n\nOnce your tablet has cooled down, it will run normally."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"The fingerprint sensor is on the power button. It\'s the flat button next to the raised volume button on the edge of the tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"The fingerprint sensor is on the power button. It\'s the flat button next to the raised volume button on the edge of the device."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"The fingerprint sensor is on the power button. It\'s the flat button next to the raised volume button on the edge of the phone."</string> diff --git a/packages/SystemUI/res-product/values-en-rGB/strings.xml b/packages/SystemUI/res-product/values-en-rGB/strings.xml index 6356fc2e674a..137325196a94 100644 --- a/packages/SystemUI/res-product/values-en-rGB/strings.xml +++ b/packages/SystemUI/res-product/values-en-rGB/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Phone turned off due to heat"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Device turned off due to heat"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet turned off due to heat"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Your phone is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Your device is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Your tablet is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Your device was too hot, so it turned off to cool down. Your device is now running normally.\n\nYour device may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your device in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Your tablet was too hot, so it turned off to cool down. Your tablet is now running normally.\n\nYour tablet may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your tablet in high temperatures"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Phone is getting warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Device is getting warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet is getting warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Some features limited while phone cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Some features limited while device cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Some features limited while tablet cools down.\nTap for more info"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Your device will automatically try to cool down. You can still use your device, but it may run slower.\n\nOnce your device has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Your tablet will automatically try to cool down. You can still use your tablet, but it may run slower.\n\nOnce your tablet has cooled down, it will run normally."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone."</string> diff --git a/packages/SystemUI/res-product/values-en-rIN/strings.xml b/packages/SystemUI/res-product/values-en-rIN/strings.xml index 6356fc2e674a..137325196a94 100644 --- a/packages/SystemUI/res-product/values-en-rIN/strings.xml +++ b/packages/SystemUI/res-product/values-en-rIN/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Phone turned off due to heat"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Device turned off due to heat"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet turned off due to heat"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Your phone is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Your device is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Your tablet is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Your device was too hot, so it turned off to cool down. Your device is now running normally.\n\nYour device may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your device in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Your tablet was too hot, so it turned off to cool down. Your tablet is now running normally.\n\nYour tablet may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your tablet in high temperatures"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Phone is getting warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Device is getting warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet is getting warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Some features limited while phone cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Some features limited while device cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Some features limited while tablet cools down.\nTap for more info"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Your device will automatically try to cool down. You can still use your device, but it may run slower.\n\nOnce your device has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Your tablet will automatically try to cool down. You can still use your tablet, but it may run slower.\n\nOnce your tablet has cooled down, it will run normally."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone."</string> diff --git a/packages/SystemUI/res-product/values-en-rXC/strings.xml b/packages/SystemUI/res-product/values-en-rXC/strings.xml index 4a7d0ad92f03..b1a56136fddd 100644 --- a/packages/SystemUI/res-product/values-en-rXC/strings.xml +++ b/packages/SystemUI/res-product/values-en-rXC/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"You have incorrectly attempted to unlock the phone <xliff:g id="NUMBER">%d</xliff:g> times. The work profile will be removed, which will delete all profile data."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your tablet using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"You have incorrectly drawn your unlock pattern <xliff:g id="NUMBER_0">%1$d</xliff:g> times. After <xliff:g id="NUMBER_1">%2$d</xliff:g> more unsuccessful attempts, you will be asked to unlock your phone using an email account.\n\n Try again in <xliff:g id="NUMBER_2">%3$d</xliff:g> seconds."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Phone turned off due to heat"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Device turned off due to heat"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet turned off due to heat"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Your phone is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Your device is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Your tablet is now running normally.\nTap for more info"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Your device was too hot, so it turned off to cool down. Your device is now running normally.\n\nYour device may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your device in high temperatures"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Your tablet was too hot, so it turned off to cool down. Your tablet is now running normally.\n\nYour tablet may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your tablet in high temperatures"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Phone is getting warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Device is getting warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet is getting warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Some features limited while phone cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Some features limited while device cools down.\nTap for more info"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Some features limited while tablet cools down.\nTap for more info"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Your device will automatically try to cool down. You can still use your device, but it may run slower.\n\nOnce your device has cooled down, it will run normally."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Your tablet will automatically try to cool down. You can still use your tablet, but it may run slower.\n\nOnce your tablet has cooled down, it will run normally."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone."</string> diff --git a/packages/SystemUI/res-product/values-es-rUS/strings.xml b/packages/SystemUI/res-product/values-es-rUS/strings.xml index 3a2230465a8f..7ee96b286ce5 100644 --- a/packages/SystemUI/res-product/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-product/values-es-rUS/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Intentaste desbloquear el teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de manera incorrecta. Se quitará el perfil de trabajo, lo que borrará todos los datos asociados."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Dibujaste el patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees la tablet mediante una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Dibujaste el patrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de manera incorrecta. Después de <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te solicitará que desbloquees el dispositivo mediante una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Se apagó el tel. debido a alta temp."</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Se apagó el disp. debido a alta temp."</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Se apagó la tablet debido a alta temp."</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Tu teléfono ahora se ejecuta con normalidad.\nPresiona para obtener más información"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Tu dispositivo ahora se ejecuta con normalidad.\nPresiona para obtener más información"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tu tablet ahora se ejecuta con normalidad.\nPresiona para obtener más información"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Tu teléfono estaba muy caliente y se apagó para enfriarse. Ya funciona correctamente.\n\nTu teléfono puede calentarse en los siguientes casos:\n • Si usas apps que consumen muchos recursos (como juegos, videos o navegación).\n • Si subes o descargas archivos grandes.\n • Si usas el teléfono en condiciones de temperatura alta."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Tu dispositivo estaba muy caliente y se apagó para enfriarse. Ya funciona correctamente.\n\nTu dispositivo puede calentarse en los siguientes casos:\n • Si usas apps que consumen muchos recursos (como juegos, videos o navegación).\n • Si subes o descargas archivos grandes.\n • Si usas el dispositivo en condiciones de temperatura alta."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tu tablet estaba muy caliente y se apagó para enfriarse. Ya funciona correctamente.\n\nTu tablet puede calentarse en los siguientes casos:\n • Si usas apps que consumen muchos recursos (como juegos, videos o navegación).\n • Si subes o descargas archivos grandes.\n • Si usas la tablet en condiciones de temperatura alta."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"El teléfono se está calentando"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"El disp. se está calentando"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"La tablet se está calentando"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Algunas funciones se limitan durante el enfriamiento del teléfono.\nPresiona para obtener más información"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Algunas funciones se limitan durante el enfriamiento del dispositivo.\nPresiona para obtener más información"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Algunas funciones se limitan durante el enfriamiento de la tablet.\nPresiona para obtener más información"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Tu teléfono intentará enfriarse automáticamente. Podrás usarlo, pero es posible que funcione más lento.\n\nUna vez que se haya enfriado, volverá a funcionar con normalidad."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Tu dispositivo intentará enfriarse automáticamente. Podrás usarlo, pero es posible que funcione más lento.\n\nUna vez que se haya enfriado, volverá a funcionar con normalidad."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tu tablet intentará enfriarse automáticamente. Podrás usarla, pero es posible que funcione más lenta.\n\nUna vez que se haya enfriado, volverá a funcionar con normalidad."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"El sensor de huellas dactilares está en el botón de encendido. Es el botón plano que está junto al botón de volumen en relieve, en el borde de la tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"El sensor de huellas dactilares está en el botón de encendido. Es el botón plano que está junto al botón de volumen en relieve, en el borde del dispositivo."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"El sensor de huellas dactilares está en el botón de encendido. Es el botón plano que está junto al botón de volumen en relieve, en el borde del teléfono."</string> diff --git a/packages/SystemUI/res-product/values-es/strings.xml b/packages/SystemUI/res-product/values-es/strings.xml index 744761dc3c4a..d39c6ed5fffa 100644 --- a/packages/SystemUI/res-product/values-es/strings.xml +++ b/packages/SystemUI/res-product/values-es/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Has intentado desbloquear el teléfono de forma incorrecta <xliff:g id="NUMBER">%d</xliff:g> veces. Se quitará este perfil de trabajo y se eliminarán todos sus datos."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Has dibujado un patrón de desbloqueo incorrecto <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Si se producen <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te pedirá que desbloquees el tablet con una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Has dibujado un patrón de desbloqueo incorrecto <xliff:g id="NUMBER_0">%1$d</xliff:g> veces. Si se producen <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos más, se te pedirá que desbloquees el teléfono con una cuenta de correo electrónico.\n\n Vuelve a intentarlo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Teléfono apagado por calor"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Dispositivo apagado por calor"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet apagada por calor"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"El teléfono ya funciona con normalidad.\nToca para ver más información."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"El dispositivo ya funciona con normalidad.\nToca para ver más información."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"La tablet ya funciona con normalidad.\nToca para ver más información."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"El teléfono se calentó demasiado, así que se apagó para enfriarse. Ahora funciona con normalidad.\n\nTu teléfono puede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (como aplicaciones de juegos, vídeos o navegación)\n • Descargas o subes archivos de gran tamaño\n • Lo usas a altas temperaturas"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"El dispositivo se calentó demasiado, así que se apagó para enfriarse. Ahora funciona con normalidad.\n\nTu dispositivo puede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (como aplicaciones de juegos, vídeos o navegación)\n • Descargas o subes archivos de gran tamaño\n • Lo usas a altas temperaturas"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"La tablet se calentó demasiado, así que se apagó para enfriarse. Ahora funciona con normalidad.\n\nTu tablet puede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (como aplicaciones de juegos, vídeos o navegación)\n • Descargas o subes archivos de gran tamaño\n • La usas a altas temperaturas"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"El teléfono se está calentando"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"El dispositivo se está calentando"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"La tablet se está calentando"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Se han limitado algunas funciones mientras el teléfono se enfría.\nToca para ver más información."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Se han limitado algunas funciones mientras el dispositivo se enfría.\nToca para ver más información."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Se han limitado algunas funciones mientras la tablet se enfría.\nToca para ver más información."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"El teléfono intentará enfriarse automáticamente. Puedes seguir usándolo, pero es posible que funcione más lento.\n\nUna vez que el teléfono se haya enfriado, funcionará con normalidad."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"El dispositivo intentará enfriarse automáticamente. Puedes seguir usándolo, pero es posible que funcione más lento.\n\nUna vez que el dispositivo se haya enfriado, funcionará con normalidad."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"La tablet intentará enfriarse automáticamente. Puedes seguir usándola, pero es posible que funcione más lenta.\n\nUna vez que la tablet se haya enfriado, funcionará con normalidad."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"El sensor de huellas digitales está en el botón de encendido. Es el botón plano situado junto al botón de volumen con relieve cerca de una de la esquinas de la tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"El sensor de huellas digitales está en el botón de encendido. Es el botón plano situado junto al botón de volumen con relieve en el lateral del dispositivo."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"El sensor de huellas digitales está en el botón de encendido. Es el botón plano situado junto al botón de volumen con relieve en el lateral del teléfono."</string> diff --git a/packages/SystemUI/res-product/values-et/strings.xml b/packages/SystemUI/res-product/values-et/strings.xml index 4d8af24167a1..8cd4ae6241e6 100644 --- a/packages/SystemUI/res-product/values-et/strings.xml +++ b/packages/SystemUI/res-product/values-et/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Olete püüdnud <xliff:g id="NUMBER">%d</xliff:g> korda telefoni valesti avada. Tööprofiil eemaldatakse ja kõik profiiliandmed kustutatakse."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset palutakse teil tahvelarvuti avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundi pärast."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Joonistasite oma avamismustri <xliff:g id="NUMBER_0">%1$d</xliff:g> korda valesti. Pärast veel <xliff:g id="NUMBER_1">%2$d</xliff:g> ebaõnnestunud katset palutakse teil telefon avada meilikontoga.\n\n Proovige uuesti <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundi pärast."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon lülitati kuuma tõttu välja"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Seade lülitati kuuma tõttu välja"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tahvelarvuti lülitati kuuma tõttu välja"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefon töötab nüüd tavapäraselt.\nPuudutage lisateabe saamiseks."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Seade töötab nüüd tavapäraselt.\nPuudutage lisateabe saamiseks."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tahvelarvuti töötab nüüd tavapäraselt.\nPuudutage lisateabe saamiseks."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon oli liiga kuum, seetõttu lülitus see jahtumiseks välja. Telefon töötab nüüd tavapäraselt.\n\nTelefon võib kuumaks minna:\n • ressursse koormavate rakenduste kasutamisel (nt mängu-, video- või navigatsioonirakendused)\n • suurte failide alla-/üleslaadimisel\n • telefoni kasutamisel kõrgel temperatuuril"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Seade oli liiga kuum, seetõttu lülitus see jahtumiseks välja. Seade töötab nüüd tavapäraselt.\n\nSeade võib kuumaks minna:\n • ressursse koormavate rakenduste kasutamisel (nt mängu-, video- või navigatsioonirakendused)\n • suurte failide alla-/üleslaadimisel\n • seadme kasutamisel kõrgel temperatuuril"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tahvelarvuti oli liiga kuum, seetõttu lülitus see jahtumiseks välja. Tahvelarvuti töötab nüüd tavapäraselt.\n\nTahvelarvuti võib kuumaks minna:\n • ressursse koormavate rakenduste kasutamisel (nt mängu-, video- või navigatsioonirakendused)\n • suurte failide alla-/üleslaadimisel\n • tahvelarvuti kasutamisel kõrgel temperatuuril"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon soojeneb"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Seade soojeneb"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tahvelarvuti soojeneb"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Mõned funktsioonid on piiratud, kuni telefon jahtub.\nPuudutage lisateabe saamiseks."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Mõned funktsioonid on piiratud, kuni seade jahtub.\nPuudutage lisateabe saamiseks."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Mõned funktsioonid on piiratud, kuni tahvelarvuti jahtub.\nPuudutage lisateabe saamiseks."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Teie telefon proovib automaatselt maha jahtuda. Saate telefoni ikka kasutada, kuid see võib olla aeglasem.\n\nKui telefon on jahtunud, töötab see tavapäraselt."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Teie seade proovib automaatselt maha jahtuda. Saate seadet ikka kasutada, kuid see võib olla aeglasem.\n\nKui seade on jahtunud, töötab see tavapäraselt."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Teie tahvelarvuti proovib automaatselt maha jahtuda. Saate tahvelarvutit ikka kasutada, kuid see võib olla aeglasem.\n\nKui tahvelarvuti on jahtunud, töötab see tavapäraselt."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Sõrmejäljeandur asub toitenupul. See on tahvelarvuti küljel helitugevuse kõrgendatud nupu kõrval olev lame nupp."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Sõrmejäljeandur asub toitenupul. See on seadme küljel helitugevuse kõrgendatud nupu kõrval olev lame nupp."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Sõrmejäljeandur asub toitenupul. See on telefoni küljel helitugevuse kõrgendatud nupu kõrval olev lame nupp."</string> diff --git a/packages/SystemUI/res-product/values-eu/strings.xml b/packages/SystemUI/res-product/values-eu/strings.xml index dcb1ead60b12..032811c608b6 100644 --- a/packages/SystemUI/res-product/values-eu/strings.xml +++ b/packages/SystemUI/res-product/values-eu/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> aldiz saiatu zara telefonoa desblokeatzen, baina huts egin duzu denetan. Laneko profila kendu egingo da eta, ondorioz, profileko datu guztiak ezabatuko dira."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Desblokeatzeko eredua oker marraztu duzu <xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz oker marrazten baduzu, tableta posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%3$d</xliff:g> segundo barru."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Desblokeatzeko eredua oker marraztu duzu <xliff:g id="NUMBER_0">%1$d</xliff:g> aldiz. Beste <xliff:g id="NUMBER_1">%2$d</xliff:g> aldiz oker marrazten baduzu, telefonoa posta-kontu baten bidez desblokeatzeko eskatuko dizugu.\n\n Saiatu berriro <xliff:g id="NUMBER_2">%3$d</xliff:g> segundo barru."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Gehiegi berotu delako itzali da telefonoa"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Gehiegi berotu delako itzali da gailua"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Gehiegi berotu delako itzali da tableta"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Orain, ohi bezala funtzionatzen du telefonoak.\nInformazio gehiago lortzeko, sakatu hau"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Orain, ohi bezala funtzionatzen du gailuak.\nInformazio gehiago lortzeko, sakatu hau"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Orain, ohi bezala funtzionatzen du tabletak.\nInformazio gehiago lortzeko, sakatu hau"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefonoa gehiegi berotu denez, itzali egin da hoztu ahal izateko. Orain, ohi bezala funtzionatzen du.\n\nBerotzeko arrazoi posibleak:\n • Baliabide asko behar dituzten aplikazioak erabiltzea (adibidez, jokoak, bideoak edo nabigazio-aplikazioak).\n • Fitxategi handiak deskargatzea edo kargatzea.\n • Telefonoa tenperatura altuak daudenean erabiltzea."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Gailua gehiegi berotu denez, itzali egin da hoztu ahal izateko. Orain, ohi bezala funtzionatzen du.\n\nBerotzeko arrazoi posibleak:\n • Baliabide asko behar dituzten aplikazioak erabiltzea (adibidez, jokoak, bideoak edo nabigazio-aplikazioak).\n • Fitxategi handiak deskargatzea edo kargatzea.\n • Gailua tenperatura altuak daudenean erabiltzea."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tableta gehiegi berotu denez, itzali egin da hoztu ahal izateko. Orain, ohi bezala funtzionatzen du.\n\nBerotzeko arrazoi posibleak:\n • Baliabide asko behar dituzten aplikazioak erabiltzea (adibidez, jokoak, bideoak edo nabigazio-aplikazioak).\n • Fitxategi handiak deskargatzea edo kargatzea.\n • Tableta tenperatura altuak daudenean erabiltzea."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefonoa berotzen ari da"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Gailua berotzen ari da"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tableta berotzen ari da"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Eginbide batzuk ezingo dira erabili telefonoa hozten den arte.\nInformazio gehiago lortzeko, sakatu hau"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Eginbide batzuk ezingo dira erabili gailua hozten den arte.\nInformazio gehiago lortzeko, sakatu hau"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Eginbide batzuk ezingo dira erabili tableta hozten den arte.\nInformazio gehiago lortzeko, sakatu hau"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefonoa automatikoki saiatuko da hozten. Hoztu bitartean, erabiltzen jarrai dezakezu, baina baliteke mantsoago funtzionatzea.\n\nHozten denean, ohi bezala funtzionatuko du."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Gailua automatikoki saiatuko da hozten. Hoztu bitartean, erabiltzen jarrai dezakezu, baina baliteke mantsoago funtzionatzea.\n\nHozten denean, ohi bezala funtzionatuko du."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tableta automatikoki saiatuko da hozten. Hoztu bitartean, erabiltzen jarrai dezakezu, baina baliteke mantsoago funtzionatzea.\n\nHozten denean, ohi bezala funtzionatuko du."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Hatz-marken sentsorea etengailuan dago. Tabletaren ertzeko bolumen-botoi goratuaren ondoan dagoen botoi laua da."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Hatz-marken sentsorea etengailuan dago. Gailuaren ertzeko bolumen-botoi goratuaren ondoan dagoen botoi laua da."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Hatz-marken sentsorea etengailuan dago. Telefonoaren ertzeko bolumen-botoi goratuaren ondoan dagoen botoi laua da."</string> diff --git a/packages/SystemUI/res-product/values-fa/strings.xml b/packages/SystemUI/res-product/values-fa/strings.xml index a8612611752d..30121ccad04a 100644 --- a/packages/SystemUI/res-product/values-fa/strings.xml +++ b/packages/SystemUI/res-product/values-fa/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> تلاش ناموفق برای باز کردن قفل تلفن داشتهاید. نمایه کاری پاک میشود که با آن همه دادههای نمایه حذف میشود."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"الگوی بازگشایی قفل را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه کشیدهاید. بعداز <xliff:g id="NUMBER_1">%2$d</xliff:g> تلاش ناموفق، از شما خواسته میشود که بااستفاده از یک حساب ایمیل قفل رایانه لوحیتان را باز کنید.\n\n لطفاً پساز <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانیه دوباره امتحان کنید."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"الگوی بازگشایی قفل را <xliff:g id="NUMBER_0">%1$d</xliff:g> بار اشتباه کشیدهاید. پساز <xliff:g id="NUMBER_1">%2$d</xliff:g> تلاش ناموفق، از شما خواسته میشود که بااستفاده از یک حساب ایمیل قفل تلفن را باز کنید.\n\n لطفاً پساز <xliff:g id="NUMBER_2">%3$d</xliff:g> ثانیه دوباره امتحان کنید."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"تلفن بهعلت گرم شدن خاموش شد"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"دستگاه بهعلت گرم شدن خاموش شد"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"رایانه لوحی بهعلت گرم شدن خاموش شد"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"اکنون عملکرد تلفنتان به حالت عادی برگشته است.\nبرای اطلاعات بیشتر ضربه بزنید"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"اکنون عملکرد دستگاهتان به حالت عادی برگشته است.\nبرای اطلاعات بیشتر ضربه بزنید"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"اکنون عملکرد رایانه لوحیتان به حالت عادی برگشته است.\nبرای اطلاعات بیشتر ضربه بزنید"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"تلفنتان خیلی گرم شده بود، بنابراین خاموش شد تا خنک شود. اکنون تلفنتان عملکرد معمولش را دارد.\n\nتلفنتان ممکن است خیلی گرم شود، اگر:\n • از برنامههای نیازمند پردازش زیاد (مثل بازی، ویدیو، یا برنامههای ناوبری) استفاده کنید\n • فایلهای بزرگ بارگیری یا بارگذاری کنید\n • در دماهای بالا از تلفنتان استفاده کنید"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"دستگاهتان خیلی گرم شده بود، بنابراین خاموش شد تا خنک شود. اکنون دستگاهتان عملکرد معمولش را دارد.\n\nدستگاهتان ممکن است خیلی گرم شود، اگر:\n • از برنامههای نیازمند پردازش زیاد (مثل بازی، ویدیو، یا برنامههای ناوبری) استفاده کنید\n • فایلهای بزرگ بارگیری یا بارگذاری کنید\n • در دماهای بالا از دستگاهتان استفاده کنید"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"رایانه لوحیتان خیلی گرم شده بود، بنابراین خاموش شد تا خنک شود. اکنون رایانه لوحیتان عملکرد معمولش را دارد.\n\nرایانه لوحیتان ممکن است خیلی گرم شود، اگر:\n • از برنامههای نیازمند پردازش زیاد (مثل بازی، ویدیو، یا برنامههای ناوبری) استفاده کنید\n • فایلهای بزرگ بارگیری یا بارگذاری کنید\n • در دماهای بالا از رایانه لوحیتان استفاده کنید"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"تلفن درحال گرم شدن است"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"دستگاه درحال گرم شدن است"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"رایانه لوحی درحال گرم شدن است"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"وقتی تلفن درحال خنک شدن است، بعضیاز ویژگیها محدود میشوند.\nبرای اطلاعات بیشتر ضربه بزنید"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"وقتی دستگاه درحال خنک شدن است، بعضیاز ویژگیها محدود میشوند.\nبرای اطلاعات بیشتر ضربه بزنید"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"وقتی رایانه لوحی درحال خنک شدن است، بعضیاز ویژگیها محدود میشوند.\nبرای اطلاعات بیشتر ضربه بزنید"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"تلفنتان بهطور خودکار سعی میکند خنک شود. همچنان میتوانید از تلفنتان استفاده کنید، اما ممکن است کندتر عمل کند.\n\nوقتی تلفن خنک شد، عملکرد عادیاش از سرگرفته میشود."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"دستگاهتان بهطور خودکار سعی میکند خنک شود. همچنان میتوانید از دستگاهتان استفاده کنید، اما ممکن است کندتر عمل کند.\n\nوقتی دستگاه خنک شد، عملکرد عادیاش از سرگرفته میشود."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"رایانه لوحیتان بهطور خودکار سعی میکند خنک شود. همچنان میتوانید از رایانه لوحیتان استفاده کنید، اما ممکن است کندتر عمل کند.\n\nوقتی رایانه لوحی خنک شد، عملکرد عادیاش از سرگرفته میشود."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"حسگر اثر انگشت روی دکمه روشن/خاموش قرار دارد. این همان دکمه مسطحی است که در کنار دکمه برآمده صدا در لبه رایانه لوحی قرار دارد."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"حسگر اثر انگشت روی دکمه روشن/خاموش قرار دارد. این همان دکمه مسطحی است که در کنار دکمه برآمده صدا در لبه دستگاه قرار دارد."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"حسگر اثر انگشت روی دکمه روشن/خاموش قرار دارد. این همان دکمه مسطحی است که در کنار دکمه برآمده صدا در لبه تلفن قرار دارد."</string> diff --git a/packages/SystemUI/res-product/values-fi/strings.xml b/packages/SystemUI/res-product/values-fi/strings.xml index c6db4fef14d5..3ed7f6d4c613 100644 --- a/packages/SystemUI/res-product/values-fi/strings.xml +++ b/packages/SystemUI/res-product/values-fi/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Yritit avata puhelimen lukituksen virheellisillä tiedoilla <xliff:g id="NUMBER">%d</xliff:g> kertaa. Työprofiili ja kaikki sen data poistetaan."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%2$d</xliff:g> kertaa, sinua pyydetään avaamaan tabletin lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunnin kuluttua."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Piirsit lukituksenpoistokuvion väärin <xliff:g id="NUMBER_0">%1$d</xliff:g> kertaa. Jos piirrät kuvion väärin vielä <xliff:g id="NUMBER_1">%2$d</xliff:g> kertaa, sinua pyydetään avaamaan puhelimesi lukitus sähköpostitilin avulla.\n\n Yritä uudelleen <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunnin kuluttua."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Puhelin sammui kuumuuden takia"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Laite sammui kuumuuden takia"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tabletti sammui kuumuuden takia"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Puhelimesi toimii nyt normaalisti.\nLue lisää napauttamalla"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Laitteesi toimii nyt normaalisti.\nLue lisää napauttamalla"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tablettisi toimii nyt normaalisti.\nLue lisää napauttamalla"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Puhelimesi oli liian kuuma, joten se sammui. Puhelimesi toimii nyt normaalisti.\n\nPuhelimesi voi kuumentua liikaa, jos\n • käytät paljon resursseja vaativia sovelluksia (esim. pelejä, videoita tai navigointisovelluksia)\n • lataat tai lähetät suuria tiedostoja\n • käytät puhelintasi korkeissa lämpötiloissa."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Laitteesi oli liian kuuma, joten se sammui. Laitteesi toimii nyt normaalisti.\n\nLaitteesi voi kuumentua liikaa, jos\n • käytät paljon resursseja vaativia sovelluksia (esim. pelejä, videoita tai navigointisovelluksia)\n • lataat tai lähetät suuria tiedostoja\n • käytät laitetta korkeissa lämpötiloissa."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablettisi oli liian kuuma, joten se sammui. Tablettisi toimii nyt normaalisti.\n\nTablettisi voi kuumentua liikaa, jos\n • käytät paljon resursseja vaativia sovelluksia (esim. pelejä, videoita tai navigointisovelluksia)\n • lataat tai lähetät suuria tiedostoja\n • käytät tablettia korkeissa lämpötiloissa."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Puhelin lämpenee"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Laite lämpenee"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tabletti lämpenee"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Joidenkin ominaisuuksien käyttöä on rajoitettu puhelimen jäähtymisen aikana.\nLue lisää napauttamalla"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Joidenkin ominaisuuksien käyttöä on rajoitettu laitteen jäähtymisen aikana.\nLue lisää napauttamalla"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Joidenkin ominaisuuksien käyttöä on rajoitettu tabletin jäähtymisen aikana.\nLue lisää napauttamalla"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Puhelimesi yrittää automaattisesti jäähdyttää itsensä. Voit silti käyttää puhelinta, mutta se voi toimia hitaammin.\n\nKun puhelin on jäähtynyt, se toimii normaalisti."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Laitteesi yrittää jäähtyä automaattisesti. Voit silti käyttää laitetta, mutta se voi toimia hitaammin.\n\nKun laite on jäähtynyt, se toimii normaalisti."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablettisi yrittää jäähtyä automaattisesti. Voit silti käyttää tablettia, mutta se voi toimia hitaammin.\n\nKun tabletti on jäähtynyt, se toimii normaalisti."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Sormenjälkitunnistin on virtapainikkeessa. Se on litteä painike koholla olevan äänenvoimakkuuspainikkeen vieressä tabletin sivussa."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Sormenjälkitunnistin on virtapainikkeessa. Se on litteä painike koholla olevan äänenvoimakkuuspainikkeen vieressä laitteen sivussa."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Sormenjälkitunnistin on virtapainikkeessa. Se on litteä painike koholla olevan äänenvoimakkuuspainikkeen vieressä puhelimen sivussa."</string> diff --git a/packages/SystemUI/res-product/values-fr-rCA/strings.xml b/packages/SystemUI/res-product/values-fr-rCA/strings.xml index 3862796fdc09..1b6c6099b89d 100644 --- a/packages/SystemUI/res-product/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res-product/values-fr-rCA/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Vous avez tenté de déverrouiller ce téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel sera supprimé, ce qui entraîne la suppression de toutes ses données."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"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 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="44112553371516141">"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 courriel.\n\nVeuillez réessayer dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Le téléphone s\'est éteint; surchauffage."</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"L\'appareil s\'est éteint; surchauffage."</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"La tablette s\'est éteinte; surchauffage."</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Votre téléphone fonctionne normalement maintenant.\nTouchez pour en savoir plus"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Votre appareil fonctionne normalement maintenant.\nTouchez pour en savoir plus"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Votre tablette fonctionne normalement maintenant.\nTouchez pour en savoir plus."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Votre téléphone surchauffait et s\'est éteint afin de se refroidir. Il fonctionne normalement maintenant.\n\nIl peut surchauffer si vous :\n • utilisez. des applications qui utilisent beaucoup de ressources (jeux, vidéo, navigation, etc.)\n • téléchargez ou téléversez des fichiers lourds \n • si vous l\'utilisez lors de températures élevées."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Votre téléphone surchauffait et s\'est éteint afin de se refroidir. Il fonctionne normalement maintenant.\n\nIl peut surchauffer si vous :\n • utilisez. des applications qui utilisent beaucoup de ressources (jeux, vidéo, navigation, etc.)\n • téléchargez ou téléversez des fichiers lourds \n • ou si vous l\'utilisez lors de températures élevées."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Votre tablette surchauffait et s\'est éteinte afin de se refroidir. Elle fonctionne normalement maintenant.\n\nElle peut surchauffer si vous :\n • utilisez. des applications qui utilisent beaucoup de ressources (jeux, vidéo, navigation, etc.)\n • téléchargez ou téléversez des fichiers lourds \n • si vous l\'utilisez lors de températures élevées."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Le téléphone surchauffe"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"L\'appareil surchauffe"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"La tablette surchauffe"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Certaines fonctionnalités sont limitées lors du refroidissement du téléphone.\nTouchez pour en savoir plus"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Certaines fonctionnalités sont limitées lors du refroidissement du téléphone.\nTouchez pour en savoir plus"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Certaines fonctionnalités sont limitées lors du refroidissement du téléphone.\nTouchez pour en savoir plus"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Votre téléphone va se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il va fonctionner normalement."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Votre téléphone va se refroidir automatiquement. Vous pouvez toujours utiliser votre téléphone, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Votre tablette va se refroidir automatiquement. Vous pouvez toujours utiliser votre tablette, mais elle risque d\'être plus lente.\n\nUne fois refroidie, elle va fonctionner normalement."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Le capteur d\'empreintes digitales est situé sur l\'interrupteur. Il s\'agit du bouton plat situé à côté du bouton de volume surélevé, sur le bord de la tablette."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Le capteur d\'empreintes digitales est situé sur l\'interrupteur. Il s\'agit du bouton plat situé à côté du bouton de volume surélevé, sur le bord de l\'appareil."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Le capteur d\'empreintes digitales est situé sur l\'interrupteur. Il s\'agit du bouton plat situé à côté du bouton de volume surélevé, sur le bord du téléphone."</string> diff --git a/packages/SystemUI/res-product/values-fr/strings.xml b/packages/SystemUI/res-product/values-fr/strings.xml index d874882a90c5..eedc18220870 100644 --- a/packages/SystemUI/res-product/values-fr/strings.xml +++ b/packages/SystemUI/res-product/values-fr/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Vous avez tenté de déverrouiller le téléphone à <xliff:g id="NUMBER">%d</xliff:g> reprises. Le profil professionnel et toutes les données associées vont être supprimés."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"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\nRéessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"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\nRéessayez dans <xliff:g id="NUMBER_2">%3$d</xliff:g> secondes."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Téléphone éteint car il surchauffait"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Appareil éteint car il surchauffait"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablette éteinte car elle surchauffait"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"À présent, votre téléphone fonctionne normalement.\nAppuyer pour en savoir plus"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"À présent, votre appareil fonctionne normalement.\nAppuyer pour en savoir plus"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"À présent, votre tablette fonctionne normalement.\nAppuyer pour en savoir plus"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Votre téléphone s\'est éteint, car il surchauffait. Il s\'est refroidi et fonctionne normalement.\n\nIl peut surchauffer si vous :\n • exécutez des applis utilisant beaucoup de ressources (jeux, vidéo, navigation, etc.) ;\n • téléchargez ou importez de gros fichiers ;\n • utilisez votre téléphone à des températures élevées."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Votre appareil s\'est éteint, car il surchauffait. Il s\'est refroidi et fonctionne normalement.\n\nIl peut surchauffer si vous :\n • exécutez des applis utilisant beaucoup de ressources (jeux, vidéo, navigation, etc.) ;\n • téléchargez ou importez de gros fichiers ;\n • utilisez votre appareil à des températures élevées."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Votre tablette s\'est éteinte, car elle surchauffait. Elle s\'est refroidie et fonctionne normalement.\n\nElle peut surchauffer si vous :\n • exécutez des applis utilisant beaucoup de ressources (jeux, vidéo, navigation, etc.) ;\n • téléchargez ou importez de gros fichiers ;\n • utilisez votre tablette à des températures élevées."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Le téléphone chauffe"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"L\'appareil chauffe"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"La tablette chauffe"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Fonctionnalités limitées pendant le refroidissement du téléphone.\nAppuyer pour en savoir plus"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Fonctionnalités limitées pendant le refroidissement de l\'appareil.\nAppuyer pour en savoir plus"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Fonctionnalités limitées pendant le refroidissement de la tablette.\nAppuyer pour en savoir plus"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Votre appareil va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Votre tablette va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais elle risque d\'être plus lente.\n\nUne fois refroidie elle fonctionnera normalement."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Le lecteur d\'empreinte digitale est sur le bouton Marche/Arrêt. C\'est le bouton plat à côté du bouton de volume en relief sur un bord de la tablette."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Le lecteur d\'empreinte digitale est sur le bouton Marche/Arrêt. C\'est le bouton plat à côté du bouton de volume en relief sur un bord de l\'appareil."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Le lecteur d\'empreinte digitale est sur le bouton Marche/Arrêt. C\'est le bouton plat à côté du bouton de volume en relief sur un bord du téléphone."</string> diff --git a/packages/SystemUI/res-product/values-gl/strings.xml b/packages/SystemUI/res-product/values-gl/strings.xml index b3e03caf4908..67be4b23b409 100644 --- a/packages/SystemUI/res-product/values-gl/strings.xml +++ b/packages/SystemUI/res-product/values-gl/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Tentaches desbloquear o teléfono <xliff:g id="NUMBER">%d</xliff:g> veces de forma incorrecta. Quitarase o perfil de traballo e, por conseguinte, todos os seus datos."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Debuxaches o padrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, terás que desbloquear a tableta a través dunha conta de correo electrónico.\n\n Téntao de novo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Debuxaches o padrón de desbloqueo <xliff:g id="NUMBER_0">%1$d</xliff:g> veces de forma incorrecta. Se realizas <xliff:g id="NUMBER_1">%2$d</xliff:g> intentos incorrectos máis, terás que desbloquear o teléfono a través dunha conta de correo electrónico.\n\n Téntao de novo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"O teléfono apagouse pola calor"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"O dispositivo apagouse pola calor"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"A tableta apagouse pola calor"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"O teléfono funciona con normalidade.\nToca para obter máis información"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"O dispositivo funciona con normalidade.\nToca para obter máis información"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"A tableta funciona con normalidade.\nToca para obter máis información"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Como teléfono estaba demasiado quente, apagouse para arrefriar. Agora funciona con normalidade.\n\nÉ posible que se quente demasiado se:\n • Usas aplicacións que requiran moitos recursos (como aplicacións de navegación, vídeos ou xogos).\n • Descargas ou cargas ficheiros grandes.\n • Utilizas o teléfono en ambientes con temperatura elevada."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Como o dispositivo estaba demasiado quente, apagouse para arrefriar. Agora funciona con normalidade.\n\nÉ posible que se quente demasiado se:\n • Usas aplicacións que requiran moitos recursos (como aplicacións de navegación, vídeos ou xogos).\n • Descargas ou cargas ficheiros grandes.\n • Utilizas o dispositivo en ambientes con temperatura elevada."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Como a tableta estaba demasiado quente, apagouse para arrefriar. Agora funciona con normalidade.\n\nÉ posible que se quente demasiado se:\n • Usas aplicacións que requiran moitos recursos (como aplicacións de navegación, vídeos ou xogos).\n • Descargas ou cargas ficheiros grandes.\n • Utilizas a tableta en ambientes con temperatura elevada."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"O teléfono estase quentando"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"O dispositivo estase quentando"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"A tableta estase quentando"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Algunhas funcións estarán limitadas mentres arrefría o teléfono.\nToca para obter máis información"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Algunhas funcións estarán limitadas mentres arrefría o dispositivo.\nToca para obter máis información"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Algunhas funcións estarán limitadas mentres arrefría a tableta.\nToca para obter máis información"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"O teléfono tentará arrefriar automaticamente. Podes utilizalo igual, pero quizais vaia máis lento.\n\nUnha vez que arrefríe, funcionará con normalidade."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"O dispositivo tentará arrefriar automaticamente. Podes utilizalo igual, pero quizais vaia máis lento.\n\nUnha vez que arrefríe, funcionará con normalidade."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"A tableta tentará arrefriar automaticamente. Podes utilizala igual, pero quizais vaia máis lenta.\n\nUnha vez que arrefríe, funcionará con normalidade."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"O sensor de impresión dixital está no botón de acendido. É o botón plano que se atopa a carón do botón de volume con relevo, no lateral da tableta."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"O sensor de impresión dixital está no botón de acendido. É o botón plano que se atopa a carón do botón de volume con relevo, no lateral do dispositivo."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"O sensor de impresión dixital está no botón de acendido. É o botón plano que se atopa a carón do botón de volume con relevo, no lateral do teléfono."</string> diff --git a/packages/SystemUI/res-product/values-gu/strings.xml b/packages/SystemUI/res-product/values-gu/strings.xml index 4621be3dfe6f..d43c3d39eed4 100644 --- a/packages/SystemUI/res-product/values-gu/strings.xml +++ b/packages/SystemUI/res-product/values-gu/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"તમે ફોનને <xliff:g id="NUMBER">%d</xliff:g> વખત ખોટી રીતે અનલૉક કરવાનો પ્રયાસ કર્યો છે. આ કાર્યાલયની પ્રોફાઇલ કાઢી નાખવામાં આવશે, જે તમામ પ્રોફાઇલ ડેટાને ડિલીટ કરી દેશે."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"તમે તમારી અનલૉક પૅટર્ન <xliff:g id="NUMBER_0">%1$d</xliff:g> વખત ખોટી રીતે દોરી છે. વધુ <xliff:g id="NUMBER_1">%2$d</xliff:g> અસફળ પ્રયાસો પછી, તમને એક ઇમેઇલ એકાઉન્ટનો ઉપયોગ કરીને તમારા ટૅબ્લેટને અનલૉક કરવાનું કહેવામાં આવશે.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> સેકન્ડમાં ફરી પ્રયાસ કરો."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"તમે તમારી અનલૉક પૅટર્ન <xliff:g id="NUMBER_0">%1$d</xliff:g> વખત ખોટી રીતે દોરી છે. વધુ <xliff:g id="NUMBER_1">%2$d</xliff:g> અસફળ પ્રયાસો પછી, તમને ઇમેઇલ એકાઉન્ટનો ઉપયોગ કરીને તમારા ફોનને અનલૉક કરવાનું કહેવામાં આવશે.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> સેકન્ડમાં ફરીથી પ્રયાસ કરો."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ગરમ થવાના કારણે ફોન બંધ થઇ ગયો છે"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ગરમ થવાના કારણે ડિવાઇસ બંધ થઈ ગયું છે"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ગરમ થવાના કારણે ટૅબ્લેટ બંધ થઈ ગયું છે"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"તમારો ફોન હવે સામાન્ય રીતે કાર્ય કરી રહ્યો છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"તમારું ડિવાઇસ હવે સામાન્ય રીતે કાર્ય કરી રહ્યું છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"તમારું ટૅબ્લેટ હવે સામાન્ય રીતે કાર્ય કરી રહ્યું છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા ઑટોમૅટિક રીતે બંધ થઈ ગયો છે. તમારો ફોન હવે સામાન્ય રીતે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઈ શકે છે, જો તમે:\n • એવી ઍપ વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વીડિયો, અથવા નેવિગેટ કરતી ઍપ)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"તમારું ડિવાઇસ અત્યંત ગરમ હતું, તેથી તે ઠંડું થવા ઑટોમૅટિક રીતે બંધ થઈ ગયું છે. તમારું ડિવાઇસ હવે સામાન્ય રીતે કાર્ય કરી રહ્યું છે.\n\nતમારું ડિવાઇસ અત્યંત ગરમ થઈ શકે છે, જો તમે:\n • એવી ઍપ વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વીડિયો, અથવા નેવિગેટ કરતી ઍપ)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ડિવાઇસનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"તમારું ટૅબ્લેટ અત્યંત ગરમ હતું, તેથી તે ઠંડું થવા ઑટોમૅટિક રીતે બંધ થઈ ગયું છે. તમારું ટૅબ્લેટ હવે સામાન્ય રીતે કાર્ય કરી રહ્યું છે.\n\nતમારું ટૅબ્લેટ અત્યંત ગરમ થઈ શકે છે, જો તમે:\n • એવી ઍપ વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વીડિયો, અથવા નેવિગેટ કરતી ઍપ)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ટૅબ્લેટનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ફોન ગરમ થવા લાગ્યો છે"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ડિવાઇસ ગરમ થવા લાગ્યું છે"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ટૅબ્લેટ ગરમ થવા લાગ્યું છે"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ફોન ઠંડો થાય ત્યાં સુધી અમુક સુવિધાઓ મર્યાદિત હોય છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ડિવાઇસ ઠંડું થાય ત્યાં સુધી અમુક સુવિધાઓ મર્યાદિત હોય છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ટૅબ્લેટ ઠંડું થાય ત્યાં સુધી અમુક સુવિધાઓ મર્યાદિત હોય છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"તમારો ફોન ઑટોમૅટિક રીતે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nએકવાર તમારો ફોન ઠંડો થઈ ગયા પછી, તે સામાન્ય રીતે ચાલશે."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"તમારું ડિવાઇસ ઑટોમૅટિક રીતે ઠંડુ થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ડિવાઇસનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડું ધીમું કાર્ય કરે.\n\nએકવાર તમારું ડિવાઇસ ઠંડું થઈ ગયા પછી, તે સામાન્ય રીતે કાર્ય કરશે."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"તમારું ટૅબ્લેટ ઑટોમૅટિક રીતે ઠંડું થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ટૅબ્લેટનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડું ધીમું ચાલે.\n\nએકવાર તમારું ટૅબ્લેટ ઠંડું થઈ ગયા પછી, તે સામાન્ય રીતે કાર્ય કરશે."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"ફિંગરપ્રિન્ટ સેન્સર પાવર બટન પર છે. તે ટૅબ્લેટની કિનારીએ આવેલા ઉપસેલા વૉલ્યૂમ બટનની બાજુમાં આવેલું સપાટ બટન છે."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"ફિંગરપ્રિન્ટ સેન્સર પાવર બટન પર છે. તે ડિવાઇસની કિનારીએ આવેલા ઉપસેલા વૉલ્યૂમ બટનની બાજુમાં આવેલું સપાટ બટન છે."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"ફિંગરપ્રિન્ટ સેન્સર પાવર બટન પર છે. તે ફોનની કિનારીએ આવેલા ઉપસેલા વૉલ્યૂમ બટનની બાજુમાં આવેલું સપાટ બટન છે."</string> diff --git a/packages/SystemUI/res-product/values-hi/strings.xml b/packages/SystemUI/res-product/values-hi/strings.xml index 4c69df502dc9..dab5f5764b0b 100644 --- a/packages/SystemUI/res-product/values-hi/strings.xml +++ b/packages/SystemUI/res-product/values-hi/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"आप फ़ोन को अनलॉक करने के लिए <xliff:g id="NUMBER">%d</xliff:g> बार गलत पासवर्ड डाल चुके हैं. इसकी वजह से वर्क प्रोफ़ाइल को हटा दिया जाएगा जिससे उपयोगकर्ता की प्रोफ़ाइल का सारा डेटा मिट जाएगा."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"आपने लॉक खोलने के पैटर्न को <xliff:g id="NUMBER_0">%1$d</xliff:g> बार गलत तरीके से बनाया है. इसलिए, <xliff:g id="NUMBER_1">%2$d</xliff:g> और गलत पैटर्न बनाने के बाद, टैबलेट को अनलॉक करने के लिए आपसे ईमेल खाते का इस्तेमाल करने को कहा जाएगा.\n\n अनलॉक करने के लिए <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंड में फिर से कोशिश करें."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"आपने लॉक खोलने के पैटर्न को <xliff:g id="NUMBER_0">%1$d</xliff:g> बार गलत तरीके से बनाया है. इसलिए, <xliff:g id="NUMBER_1">%2$d</xliff:g> और गलत पैटर्न बनाने के बाद, आपसे फ़ोन को अनलॉक करने के लिए ईमेल खाते का इस्तेमाल करने को कहा जाएगा.\n\n अनलॉक करने के लिए <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंड में फिर से कोशिश करें."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"गर्म होने की वजह से फ़ोन बंद हो गया"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"गर्म होने की वजह से डिवाइस बंद हो गया"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"गर्म होने की वजह से टैबलेट बंद हो गया"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"आपका फ़ोन अब सामान्य रूप से काम कर रहा है.\nज़्यादा जानकारी के लिए टैप करें"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"आपका डिवाइस अब सामान्य रूप से काम कर रहा है.\nज़्यादा जानकारी के लिए टैप करें"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"आपका टैबलेट अब सामान्य रूप से काम कर रहा है.\nज़्यादा जानकारी के लिए टैप करें"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"आपका फ़ोन बहुत गर्म हो गया था. इसलिए, यह ठंडा होने के लिए बंद हो गया. फ़ोन अब सामान्य रूप से काम कर रहा है.\n\nफ़ोन बहुत गर्म हो सकता है, अगर:\n • ज़्यादा रिसॉर्स का इस्तेमाल करने वाले ऐप्लिकेशन चलाए जाते हैं. जैसे, गेमिंग, वीडियो या नेविगेशन ऐप्लिकेशन\n • बड़ी फ़ाइलें डाउनलोड या अपलोड की जाती हैं\n • ज़्यादा तापमान में फ़ोन का इस्तेमाल किया जाता है"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"आपका डिवाइस बहुत गर्म हो गया था. इसलिए, यह ठंडा होने के लिए बंद हो गया. डिवाइस अब सामान्य रूप से काम कर रहा है.\n\nडिवाइस बहुत गर्म हो सकता है, अगर:\n • ज़्यादा रिसॉर्स का इस्तेमाल करने वाले ऐप्लिकेशन चलाए जाते हैं. जैसे, गेमिंग, वीडियो या नेविगेशन ऐप्लिकेशन\n • बड़ी फ़ाइलें डाउनलोड या अपलोड की जाती हैं\n • ज़्यादा तापमान में डिवाइस का इस्तेमाल किया जाता है"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"आपका टैबलेट बहुत गर्म हो गया था. इसलिए, यह ठंडा होने के लिए बंद हो गया. टैबलेट अब सामान्य रूप से काम कर रहा है.\n\nटैबलेट बहुत गर्म हो सकता है, अगर:\n • ज़्यादा रिसॉर्स का इस्तेमाल करने वाले ऐप्लिकेशन चलाए जाते हैं. जैसे, गेमिंग, वीडियो या नेविगेशन ऐप्लिकेशन\n • बड़ी फ़ाइलें डाउनलोड या अपलोड की जाती हैं\n • ज़्यादा तापमान में टैबलेट का इस्तेमाल किया जाता है"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"फ़ोन गर्म हो रहा है"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"डिवाइस गर्म हो रहा है"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"टैबलेट गर्म हो रहा है"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"फ़ोन के ठंडा होने तक कुछ सुविधाएं काम नहीं करतीं.\nज़्यादा जानकारी के लिए टैप करें"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"डिवाइस के ठंडा होने तक कुछ सुविधाएं काम नहीं करतीं.\nज़्यादा जानकारी के लिए टैप करें"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"टैबलेट के ठंडा होने तक कुछ सुविधाएं काम नहीं करतीं.\nज़्यादा जानकारी के लिए टैप करें"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"आपका फ़ोन अपने-आप ठंडा हो जाएगा. इस दौरान भी अपने फ़ोन का इस्तेमाल किया जा सकता है. हालांकि, ऐसे में फ़ोन शायद धीमा काम करे.\n\nठंडा हो जाने के बाद, यह पहले की तरह काम करेगा."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"आपका डिवाइस अपने-आप ठंडा हो जाएगा. इस दौरान भी अपने डिवाइस का इस्तेमाल किया जा सकता है. हालांकि, ऐसे में डिवाइस शायद धीमा काम करे.\n\nठंडा हो जाने के बाद, यह पहले की तरह काम करेगा."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"आपका टैबलेट अपने-आप ठंडा हो जाएगा. इस दौरान भी अपने टैबलेट का इस्तेमाल किया जा सकता है. हालांकि, ऐसे में टैबलेट शायद धीमा काम करे.\n\nठंडा हो जाने के बाद, यह पहले की तरह काम करेगा."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"फ़िंगरप्रिंट सेंसर, पावर बटन पर होता है. यह टैबलेट के किनारे पर मौजूद एक फ़्लैट बटन होता है, जो कि आपको आवाज़ कम या ज़्यादा करने वाले उभरे हुए बटन के बगल में मिलेगा."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"फ़िंगरप्रिंट सेंसर, पावर बटन पर होता है. यह डिवाइस के किनारे पर मौजूद एक फ़्लैट बटन होता है, जो कि आपको आवाज़ कम या ज़्यादा करने वाले उभरे हुए बटन के बगल में मिलेगा."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"फ़िंगरप्रिंट सेंसर, पावर बटन पर होता है. यह फ़ोन के किनारे पर मौजूद एक फ़्लैट बटन होता है, जो कि आपको आवाज़ कम या ज़्यादा करने वाले उभरे हुए बटन के बगल में मिलेगा."</string> diff --git a/packages/SystemUI/res-product/values-hr/strings.xml b/packages/SystemUI/res-product/values-hr/strings.xml index a7bd4b0a2747..8be9a2203752 100644 --- a/packages/SystemUI/res-product/values-hr/strings.xml +++ b/packages/SystemUI/res-product/values-hr/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Neuspješno ste pokušali otključati telefon <xliff:g id="NUMBER">%d</xliff:g> put/a. Radni će se profil ukloniti, a time će se izbrisati i svi njegovi podaci."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja morat ćete otključati tablet pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Netočno ste iscrtali uzorak za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> put/a. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> pokušaja morat ćete otključati telefon pomoću računa e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon se isključio zbog vrućine"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Uređaj se isključio zbog vrućine"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet se isključio zbog vrućine"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefon sad radi normalno.\nDodirnite za više informacija."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Uređaj sad radi normalno.\nDodirnite za više informacija."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tablet sad radi normalno.\nDodirnite za više informacija."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon se pregrijao, stoga se isključio kako bi se ohladio Telefon sada radi normalno.\n\nTelefon se može pregrijati ako:\n • Upotrebljavate zahtjevne aplikacije (kao što su igre, aplikacije za videozapise ili navigaciju).\n • Preuzimate ili prenosite velike datoteke.\n • Upotrebljavate telefon na visokim temperaturama."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Uređaj se pregrijao, stoga se isključio kako bi se ohladio Uređaj sada radi normalno.\n\nUređaj se može pregrijati ako:\n • Upotrebljavate zahtjevne aplikacije (kao što su igre, aplikacije za videozapise ili navigaciju).\n • Preuzimate ili prenosite velike datoteke.\n • Upotrebljavate uređaj na visokim temperaturama."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablet se pregrijao, stoga se isključio kako bi se ohladio Tablet sada radi normalno.\n\nTablet se može pregrijati ako:\n • Upotrebljavate zahtjevne aplikacije (kao što su igre, aplikacije za videozapise ili navigaciju).\n • Preuzimate ili prenosite velike datoteke.\n • Upotrebljavate tablet na visokim temperaturama."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon se zagrijava"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Uređaj se zagrijava"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet se zagrijava"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Neke su značajke ograničene dok se telefon ne ohladi.\nDodirnite za više informacija"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Neke su značajke ograničene dok se uređaj ne ohladi.\nDodirnite za više informacija"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Neke su značajke ograničene dok se tablet ne ohladi.\nDodirnite za više informacija"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefon će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Uređaj će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablet će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Senzor otiska prsta nalazi se na tipki za uključivanje/isključivanje. To je ravni gumb pored izdignutog gumba za glasnoću na rubu tableta."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Senzor otiska prsta nalazi se na tipki za uključivanje/isključivanje. To je ravni gumb pored izdignutog gumba za glasnoću na rubu uređaja."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Senzor otiska prsta nalazi se na tipki za uključivanje/isključivanje. To je ravni gumb pored izdignutog gumba za glasnoću na rubu telefona."</string> diff --git a/packages/SystemUI/res-product/values-hu/strings.xml b/packages/SystemUI/res-product/values-hu/strings.xml index 75c10e9e9ddd..34f20a0450f0 100644 --- a/packages/SystemUI/res-product/values-hu/strings.xml +++ b/packages/SystemUI/res-product/values-hu/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> alkalommal próbálkozott sikertelenül a telefon zárolásának feloldásával. A rendszer eltávolítja a munkaprofilt, és ezzel a profil összes adata törlődik."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után e-mail-fiók használatával kell feloldania táblagépét.\n\nPróbálja újra <xliff:g id="NUMBER_2">%3$d</xliff:g> másodperc múlva."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> alkalommal helytelenül rajzolta le a feloldási mintát. További <xliff:g id="NUMBER_1">%2$d</xliff:g> sikertelen kísérlet után e-mail-fiók használatával kell feloldania telefonját.\n\nPróbálja újra <xliff:g id="NUMBER_2">%3$d</xliff:g> másodperc múlva."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"A telefon a meleg miatt kikapcsolt"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Az eszköz a meleg miatt kikapcsolt"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"A táblagép a meleg miatt kikapcsolt"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefonja most már megfelelően működik.\nKoppintson, ha további információra van szüksége."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Eszköze most már megfelelően működik.\nKoppintson, ha további információra van szüksége."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Táblagépe most már megfelelően működik.\nKoppintson, ha további információra van szüksége."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefonja túlmelegedett, így kikapcsolt, hogy lehűlhessen. Most már megfelelően működik.\n\nA telefon akkor melegedhet túl, ha Ön:\n • Energiaigényes alkalmazásokat használ (például játékokat, videókat vagy navigációs alkalmazásokat)\n • Nagy fájlokat tölt le vagy fel\n • Melegben használja a telefonját"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Eszköze túlmelegedett, így kikapcsolt, hogy lehűlhessen. Most már megfelelően működik.\n\nAz eszköz akkor melegedhet túl, ha Ön:\n • Energiaigényes alkalmazásokat használ (például játékokat, videókat vagy navigációs alkalmazásokat)\n • Nagy fájlokat tölt le vagy fel\n • Melegben használja eszközét"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Táblagépe túlmelegedett, így kikapcsolt, hogy lehűlhessen. Most már megfelelően működik.\n\nA táblagép akkor melegedhet túl, ha Ön:\n • Energiaigényes alkalmazásokat használ (például játékokat, videókat vagy navigációs alkalmazásokat)\n • Nagy fájlokat tölt le vagy fel\n • Melegben használja a táblagépet"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"A telefon melegszik"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Az eszköz melegszik"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"A táblagép melegszik"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Bizonyos funkciók korlátozottan működnek a telefon lehűlése közben.\nKoppintson, ha további információra van szüksége."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Bizonyos funkciók korlátozottan működnek az eszköz lehűlése közben.\nKoppintson, ha további információra van szüksége."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Bizonyos funkciók korlátozottan működnek a táblagép lehűlése közben.\nKoppintson, ha további információra van szüksége."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"A telefon automatikusan megpróbál lehűlni. Továbbra is tudja használni a telefont, de elképzelhető, hogy működése lelassul.\n\nAmint a telefon lehűl, újra a szokásos módon működik majd."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Az eszköz automatikusan megpróbál lehűlni. Továbbra is tudja használni, de elképzelhető, hogy működése lelassul.\n\nAmint az eszköz lehűl, újra a szokásos módon működik majd."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"A táblagép automatikusan megpróbál lehűlni. Továbbra is tudja használni, de elképzelhető, hogy működése lelassul.\n\nAmint a táblagép lehűl, újra a szokásos módon működik majd."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Az ujjlenyomat-érzékelő a bekapcsológombon található. Ez a kiemelkedő hangerőgomb melletti lapos gomb a táblagép szélén."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Az ujjlenyomat-érzékelő a bekapcsológombon található. Ez a kiemelkedő hangerőgomb melletti lapos gomb az eszköz szélén."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Az ujjlenyomat-érzékelő a bekapcsológombon található. Ez a kiemelkedő hangerőgomb melletti lapos gomb a telefon szélén."</string> diff --git a/packages/SystemUI/res-product/values-hy/strings.xml b/packages/SystemUI/res-product/values-hy/strings.xml index acee335dbd29..f527eaba4ee5 100644 --- a/packages/SystemUI/res-product/values-hy/strings.xml +++ b/packages/SystemUI/res-product/values-hy/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Դուք կատարել եք հեռախոսն ապակողպելու <xliff:g id="NUMBER">%d</xliff:g> անհաջող փորձ: Աշխատանքային պրոֆիլը կհեռացվի, և պրոֆիլի բոլոր տվյալները կջնջվեն:"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Դուք կատարել եք ապակողպման նախշը մուտքագրելու <xliff:g id="NUMBER_0">%1$d</xliff:g> անհաջող փորձ: Եվս <xliff:g id="NUMBER_1">%2$d</xliff:g> անհաջող փորձից հետո ձեզանից կպահանջվի ապակողպել պլանշետը էլփոստի հաշվի միջոցով։\n\n Խնդրում ենք կրկին փորձել <xliff:g id="NUMBER_2">%3$d</xliff:g> վայրկյանից:"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Դուք <xliff:g id="NUMBER_0">%1$d</xliff:g> անգամ սխալ եք հավաքել ձեր ապակողպման նմուշը: Եվս <xliff:g id="NUMBER_1">%2$d</xliff:g> անհաջող փորձից հետո ձեզ կառաջարկվի ապակողպել հեռախոսը` օգտագործելով էլփոստի հաշիվ:\n\n Կրկին փորձեք <xliff:g id="NUMBER_2">%3$d</xliff:g> վայրկյանից:"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Հեռախոսն անջատվել էր տաքանալու պատճառով"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Սարքն անջատվել էր տաքանալու պատճառով"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Պլանշետն անջատվել էր տաքանալու պատճառով"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Ձեր հեռախոսն այժմ նորմալ է աշխատում։\nՀպեք՝ ավելին իմանալու համար"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Ձեր սարքն այժմ նորմալ է աշխատում։\nՀպեք՝ ավելին իմանալու համար"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Ձեր պլանշետն այժմ նորմալ է աշխատում։\nՀպեք՝ ավելին իմանալու համար"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Ձեր հեռախոսը չափազանց տաք էր, այդ պատճառով այն անջատվել է՝ հովանալու համար։ Հեռախոսն այժմ նորմալ աշխատում է։\n\nՀեռախոսը կարող է տաքանալ, եթե՝\n • Օգտագործում եք ռեսուրսատար հավելվածներ (օրինակ՝ խաղեր, տեսանյութեր կամ նավիգացիայի հավելվածներ)\n • Ներբեռնում կամ վերբեռնում եք ծանր ֆայլեր\n • Օգտագործում եք ձեր հեռախոսը բարձր ջերմային պայմաններում"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Ձեր սարքը չափազանց տաք էր, այդ պատճառով այն անջատվել է՝ հովանալու համար։ Սարքն այժմ նորմալ աշխատում է։\n\nՍարքը կարող է տաքանալ, եթե՝\n • Օգտագործում եք ռեսուրսատար հավելվածներ (օրինակ՝ խաղեր, տեսանյութեր կամ նավիգացիայի հավելվածներ)\n • Ներբեռնում կամ վերբեռնում եք ծանր ֆայլեր\n • Օգտագործում եք ձեր սարքը բարձր ջերմային պայմաններում"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Ձեր պլանշետը չափազանց տաք էր, այդ պատճառով այն անջատվել է՝ հովանալու համար: Պլանշետը այժմ նորմալ աշխատում է:\n\nՊլանշետը կարող է տաքանալ, եթե՝\n • Օգտագործում եք ռեսուրսատար հավելվածներ (օրինակ՝ խաղեր, տեսանյութեր կամ նավիգացիայի հավելվածներ)\n • Ներբեռնում կամ վերբեռնում եք ծանր ֆայլեր\n • Օգտագործում եք ձեր պլանշետը բարձր ջերմային պայմաններում"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Հեռախոսը տաքանում է"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Սարքը տաքանում է"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Պլանշետը տաքանում է"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Հովանալու ընթացքում հեռախոսի որոշ գործառույթներ սահմանափակված են։\nՀպեք՝ ավելին իմանալու համար"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Հովանալու ընթացքում սարքի որոշ գործառույթներ սահմանափակված են։\nՀպեք՝ ավելին իմանալու համար"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Հովանալու ընթացքում պլանշետի որոշ գործառույթներ սահմանափակված են։\nՀպեք՝ ավելին իմանալու համար"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Ձեր հեռախոսն ավտոմատ կերպով կփորձի hովանալ։ Կարող եք շարունակել օգտագործել հեռախոսը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի։\n\nՀովանալուց հետո հեռախոսը կաշխատի կանոնավոր կերպով։"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Ձեր սարքը ավտոմատ կերպով կփորձի hովանալ։ Կարող եք շարունակել օգտագործել սարքը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի:\n\nՀովանալուց հետո սարքը կաշխատի կանոնավոր կերպով։"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Ձեր պլանշետը ավտոմատ կերպով կփորձի hովանալ։ Կարող եք շարունակել օգտագործել պլանշետը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի:\n\nՀովանալուց հետո պլանշետը կաշխատի կանոնավոր կերպով։"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Մատնահետքերի սկաները սնուցման կոճակի վրա է։ Այն հարթ կոճակ է ձայնի ուժգնության ուռուցիկ կոճակի կողքին՝ պլանշետի կողային մասում։"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Մատնահետքերի սկաները սնուցման կոճակի վրա է։ Այն հարթ կոճակ է ձայնի ուժգնության ուռուցիկ կոճակի կողքին՝ սարքի կողային մասում։"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Մատնահետքերի սկաները սնուցման կոճակի վրա է։ Այն հարթ կոճակ է ձայնի ուժգնության ուռուցիկ կոճակի կողքին՝ հեռախոսի կողային մասում։"</string> diff --git a/packages/SystemUI/res-product/values-in/strings.xml b/packages/SystemUI/res-product/values-in/strings.xml index af1895ce5ebd..2224810764da 100644 --- a/packages/SystemUI/res-product/values-in/strings.xml +++ b/packages/SystemUI/res-product/values-in/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Anda telah <xliff:g id="NUMBER">%d</xliff:g> kali berupaya membuka kunci ponsel dengan tidak benar. Profil kerja akan dihapus, sehingga semua data profil akan dihapus."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, Anda akan diminta membuka kunci tablet menggunakan akun email.\n\n Coba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> detik."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Anda telah <xliff:g id="NUMBER_0">%1$d</xliff:g> kali salah menggambar pola pembuka kunci. Setelah <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi upaya yang tidak berhasil, Anda akan diminta membuka kunci ponsel menggunakan akun email.\n\n Coba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> detik."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Ponsel dimatikan karena panas"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Perangkat dimatikan karena panas"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet dimatikan karena panas"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Ponsel kini berfungsi normal.\nKetuk untuk info selengkapnya"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Perangkat kini berfungsi normal.\nKetuk untuk info selengkapnya"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tablet kini berfungsi normal.\nKetuk untuk info selengkapnya"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Ponsel terlalu panas, jadi dimatikan agar mendingin. Ponsel kini berfungsi normal.\n\nPonsel dapat menjadi terlalu panas jika Anda:\n • Menggunakan aplikasi yang menggunakan sumber daya secara intensif (seperti aplikasi game, video, atau navigasi)\n • Mendownload atau mengupload file besar\n • Menggunakan ponsel dalam suhu tinggi"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Perangkat terlalu panas, jadi dimatikan agar mendingin. Perangkat kini berfungsi normal.\n\nPerangkat dapat menjadi terlalu panas jika Anda:\n • Menggunakan aplikasi yang menggunakan sumber daya secara intensif (seperti aplikasi game, video, atau navigasi)\n • Mendownload atau mengupload file besar\n • Menggunakan perangkat dalam suhu tinggi"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablet terlalu panas, jadi dimatikan agar mendingin. Tablet kini berfungsi normal.\n\nTablet dapat menjadi terlalu panas jika Anda:\n • Menggunakan aplikasi yang menggunakan sumber daya secara intensif (seperti aplikasi game, video, atau navigasi)\n • Mendownload atau mengupload file besar\n • Menggunakan tablet dalam suhu tinggi"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Ponsel menjadi panas"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Perangkat menjadi panas"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet menjadi panas"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Beberapa fitur dibatasi saat ponsel mendingin.\nKetuk untuk info selengkapnya"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Beberapa fitur dibatasi saat perangkat mendingin.\nKetuk untuk info selengkapnya"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Beberapa fitur dibatasi saat tablet mendingin.\nKetuk untuk info selengkapnya"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Ponsel akan otomatis mencoba mendingin. Anda tetap dapat menggunakan ponsel, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, ponsel akan berjalan seperti biasa."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Perangkat akan otomatis mencoba mendingin. Anda tetap dapat menggunakan perangkat, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, perangkat akan berjalan seperti biasa."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablet akan otomatis mencoba mendingin. Anda tetap dapat menggunakan tablet, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, tablet akan berjalan seperti biasa."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Sensor sidik jari ada di tombol daya. Tombol ini berupa tombol datar di samping tombol volume timbul di tepi tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Sensor sidik jari ada di tombol daya. Tombol ini berupa tombol datar di samping tombol volume timbul di tepi perangkat."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Sensor sidik jari ada di tombol daya. Tombol ini berupa tombol datar di samping tombol volume timbul di tepi ponsel."</string> diff --git a/packages/SystemUI/res-product/values-is/strings.xml b/packages/SystemUI/res-product/values-is/strings.xml index 1e42255aa2c3..0f3f71cb9979 100644 --- a/packages/SystemUI/res-product/values-is/strings.xml +++ b/packages/SystemUI/res-product/values-is/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Þú hefur gert <xliff:g id="NUMBER">%d</xliff:g> árangurslausar tilraunir til að opna símann. Vinnusniðið verður fjarlægt, með þeim afleiðingum að öllum gögnum þess verður eytt."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verðurðu beðin(n) um að opna spjaldtölvuna með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%3$d</xliff:g> sekúndur."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Þú hefur teiknað rangt opnunarmynstur <xliff:g id="NUMBER_0">%1$d</xliff:g> sinnum. Eftir <xliff:g id="NUMBER_1">%2$d</xliff:g> árangurslausar tilraunir í viðbót verðurðu beðin(n) um að opna símann með tölvupóstreikningi.\n\n Reyndu aftur eftir <xliff:g id="NUMBER_2">%3$d</xliff:g> sekúndur."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Slökkt var á símanum vegna hita"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Slökkt var á tækinu vegna hita"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Slökkt var á spjaldtölvunni vegna hita"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Síminn virkar nú eins og venjulega.\nÝttu til að fá frekari upplýsingar"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Tækið virkar nú eins og venjulega.\nÝttu til að fá frekari upplýsingar"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Spjaldtölvan virkar nú eins og venjulega.\nÝttu til að fá frekari upplýsingar"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Síminn varð of heitur og því var slökkt á honum til að kæla hann. Síminn virkar núna sem skyldi.\n\nSíminn getur orðið of heitur ef þú:\n • Notar plássfrek forrit (t.d. leikja-, myndbands- eða leiðsagnarforrit\n • Sækir eða hleður upp stórum skrám\n • Notar símann í miklum hita"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Tækið varð of heitt og því var slökkt á því til að kæla það. Tækið virkar núna sem skyldi.\n\nTækið getur orðið of heitt ef þú:\n • Notar plássfrek forrit (t.d. leikja-, myndbands- eða leiðsagnarforrit\n • Sækir eða hleður upp stórum skrám\n • Notar tækið í miklum hita"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Spjaldtölvan varð of heit og því var slökkt á henni til að kæla hana. Spjaldtölvan virkar núna sem skyldi.\n\nSpjaldtölvan getur orðið of heit ef þú:\n • Notar plássfrek forrit (t.d. leikja-, myndbands- eða leiðsagnarforrit\n • Sækir eða hleður upp stórum skrám\n • Notar spjaldtölvuna í miklum hita"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Síminn er að hitna"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Tækið er að hitna"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Spjaldtölvan er að hitna"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Sumir eiginleikar eru takmarkaðir á meðan síminn kælir sig.\nÝttu til að fá frekari upplýsingar"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Sumir eiginleikar eru takmarkaðir á meðan tækið kælir sig.\nÝttu til að fá frekari upplýsingar"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Sumir eiginleikar eru takmarkaðir á meðan spjaldtölvan kælir sig.\nÝttu til að fá frekari upplýsingar"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Síminn reynir að kæla sig sjálfkrafa. Þú getur áfram notað símann en hann gæti verið hægvirkari.\n\nÞegar síminn hefur kælt sig mun hann virka eðlilega."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Tækið reynir að kæla sig sjálfkrafa. Þú getur áfram notað tækið en það gæti verið hægvirkara.\n\nÞegar tækið hefur kælt sig mun það virka eðlilega."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Spjaldtölvan reynir að kæla sig sjálfkrafa. Þú getur áfram notað spjaldtölvuna en hún gæti verið hægvirkari.\n\nÞegar spjaldtölvan hefur kælt sig mun hún virka eðlilega."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Fingrafaralesarinn er á aflrofanum. Það er flati hnappurinn við hliðina á upphleypta hljóðstyrkshnappnum á hlið spjaldtölvunnar."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Fingrafaralesarinn er á aflrofanum. Það er flati hnappurinn við hliðina á upphleypta hljóðstyrkshnappnum á hlið tækisins."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Fingrafaralesarinn er á aflrofanum. Það er flati hnappurinn við hliðina á upphleypta hljóðstyrkshnappnum á hlið símans."</string> diff --git a/packages/SystemUI/res-product/values-it/strings.xml b/packages/SystemUI/res-product/values-it/strings.xml index 0b3bb3d8d0b5..a9fd80b32d0b 100644 --- a/packages/SystemUI/res-product/values-it/strings.xml +++ b/packages/SystemUI/res-product/values-it/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Hai tentato di sbloccare il telefono senza riuscirci per <xliff:g id="NUMBER">%d</xliff:g> volte. Il profilo di lavoro verrà rimosso e verranno quindi eliminati tutti i dati associati."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il tablet con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%3$d</xliff:g> secondi."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> tentativi errati di inserimento della sequenza di sblocco. Dopo altri <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativi falliti, ti verrà chiesto di sbloccare il telefono con un account email.\n\n Riprova tra <xliff:g id="NUMBER_2">%3$d</xliff:g> secondi."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Lo smartphone si è spento per il calore"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Il dispositivo si è spento per il calore"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Il tablet si è spento per il calore"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Ora lo smartphone funziona normalmente.\nTocca per maggiori informazioni"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Ora il dispositivo funziona normalmente.\nTocca per maggiori informazioni"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Ora il tablet funziona normalmente.\nTocca per maggiori informazioni"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Lo smartphone era surriscaldato e si è spento per raffreddarsi. Ora funziona normalmente.\n\nLo smartphone può surriscaldarsi se:\n • Utilizzi app che consumano molte risorse (ad esempio app di navigazione, giochi o video)\n • Scarichi o carichi grandi file\n • Lo utilizzi in presenza di alte temperature"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Il dispositivo era surriscaldato e si è spento per raffreddarsi. Ora funziona normalmente.\n\nIl dispositivo può surriscaldarsi se:\n • Utilizzi app che consumano molte risorse (ad esempio app di navigazione, giochi o video)\n • Scarichi o carichi grandi file\n • Lo utilizzi in presenza di alte temperature"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Il tablet era surriscaldato e si è spento per raffreddarsi. Ora funziona normalmente.\n\nIl tablet può surriscaldarsi se:\n • Utilizzi app che consumano molte risorse (ad esempio app di navigazione, giochi o video)\n • Scarichi o carichi grandi file\n • Lo utilizzi in presenza di alte temperature"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Surriscaldamento smartphone"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Surriscaldamento dispositivo"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Surriscaldamento tablet"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Alcune funzionalità sono state limitate durante il raffreddamento dello smartphone.\nTocca per maggiori informazioni"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Alcune funzionalità sono state limitate durante il raffreddamento del dispositivo.\nTocca per maggiori informazioni"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Alcune funzionalità sono state limitate durante il raffreddamento del tablet.\nTocca per maggiori informazioni"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Lo smartphone cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, lo smartphone funzionerà normalmente."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Il dispositivo cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, il dispositivo funzionerà normalmente."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Il tablet cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, il tablet funzionerà normalmente."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Il sensore di impronte digitali si trova sul tasto di accensione. Si tratta del tasto piatto accanto al tasto del volume in rilievo sul bordo del tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Il sensore di impronte digitali si trova sul tasto di accensione. Si tratta del tasto piatto accanto al tasto del volume in rilievo sulla parte laterale del dispositivo."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Il sensore di impronte digitali si trova sul tasto di accensione. Si tratta del tasto piatto accanto al tasto del volume in rilievo sulla parte laterale dello smartphone."</string> diff --git a/packages/SystemUI/res-product/values-iw/strings.xml b/packages/SystemUI/res-product/values-iw/strings.xml index 71779f30d8b5..9365dd996301 100644 --- a/packages/SystemUI/res-product/values-iw/strings.xml +++ b/packages/SystemUI/res-product/values-iw/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ניסית לבטל את נעילת הטלפון <xliff:g id="NUMBER">%d</xliff:g> פעמים. פרופיל העבודה יוסר וכל נתוני הפרופיל יימחקו."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, ,תישלח אליך בקשה לבטל את נעילת הטאבלט באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"שרטטת קו ביטול נעילה שגוי <xliff:g id="NUMBER_0">%1$d</xliff:g> פעמים. לאחר <xliff:g id="NUMBER_1">%2$d</xliff:g> ניסיונות כושלים נוספים, תישלח אליך בקשה לבטל את נעילת הטלפון באמצעות חשבון אימייל.\n\n יש לנסות שוב בעוד <xliff:g id="NUMBER_2">%3$d</xliff:g> שניות."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"הטלפון כבה בגלל התחממות"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"המכשיר כבה בגלל התחממות"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"הטאבלט כבה בגלל התחממות"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"הטלפון פועל כרגיל עכשיו.\nיש להקיש כדי להציג מידע נוסף"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"המכשיר פועל כרגיל עכשיו.\nיש להקיש כדי להציג מידע נוסף"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"הטאבלט פועל כרגיל עכשיו.\nיש להקיש כדי להציג מידע נוסף"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • משתמשים באפליקציות עתירות משאבים (כמו משחקים, אפליקציות וידאו או אפליקציות ניווט).\n • מורידים או מעלים קבצים גדולים.\n • משתמשים בטלפון בסביבה עם טמפרטורות גבוהות."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"המכשיר שלך התחמם יותר מדי וכבה כדי להתקרר. המכשיר פועל כרגיל עכשיו.\n\nייתכן שהמכשיר יתחמם יותר מדי אם:\n • משתמשים באפליקציות עתירות משאבים (כמו משחקים, אפליקציות וידאו או אפליקציות ניווט).\n • מורידים או מעלים קבצים גדולים.\n • משתמשים במכשיר בסביבה עם טמפרטורות גבוהות."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"הטאבלט שלך התחמם יותר מדי וכבה כדי להתקרר. הטאבלט פועל כרגיל עכשיו.\n\nייתכן שהטאבלט יתחמם יותר מדי אם:\n • משתמשים באפליקציות עתירות משאבים (כמו משחקים, אפליקציות וידאו או אפליקציות ניווט).\n • מורידים או מעלים קבצים גדולים.\n • משתמשים בטאבלט בסביבה עם טמפרטורות גבוהות."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"הטלפון מתחמם"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"המכשיר מתחמם"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"הטאבלט מתחמם"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר.\nיש להקיש כדי להציג מידע נוסף"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"חלק מהתכונות מוגבלות כל עוד המכשיר מתקרר.\nיש להקיש כדי להציג מידע נוסף"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"חלק מהתכונות מוגבלות כל עוד הטאבלט מתקרר.\nיש להקיש כדי להציג מידע נוסף"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"קירור הטלפון ייעשה באופן אוטומטי. אפשר עדיין להשתמש בטלפון, אבל ייתכן שהוא יפעל לאט יותר.\n\nהטלפון יחזור לפעול כרגיל לאחר שיתקרר."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"קירור המכשיר ייעשה באופן אוטומטי. אפשר עדיין להשתמש במכשיר אבל ייתכן שהוא יפעל לאט יותר.\n\nהמכשיר יחזור לפעול כרגיל לאחר שיתקרר."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"קירור הטאבלט ייעשה באופן אוטומטי. אפשר עדיין להשתמש בטאבלט אבל ייתכן שהוא יפעל לאט יותר.\n\nהטאבלט יחזור לפעול כרגיל לאחר שיתקרר."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"חיישן טביעות האצבע נמצא על לחצן ההפעלה. זה הלחצן השטוח ליד הלחצן הבולט של עוצמת הקול בשולי הטאבלט."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"חיישן טביעות האצבע נמצא על לחצן ההפעלה. זה הלחצן השטוח ליד הלחצן הבולט של עוצמת הקול בשולי המכשיר."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"חיישן טביעות האצבע נמצא על לחצן ההפעלה. זה הלחצן השטוח ליד הלחצן הבולט של עוצמת הקול בשולי הטלפון."</string> diff --git a/packages/SystemUI/res-product/values-ja/strings.xml b/packages/SystemUI/res-product/values-ja/strings.xml index 68f030b8c3c1..1fc8775b40e8 100644 --- a/packages/SystemUI/res-product/values-ja/strings.xml +++ b/packages/SystemUI/res-product/values-ja/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"スマートフォンのロック解除に <xliff:g id="NUMBER">%d</xliff:g> 回失敗しました。仕事用プロファイルは削除され、プロファイルのデータはすべて消去されます。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ロック解除パターンの入力を <xliff:g id="NUMBER_0">%1$d</xliff:g> 回間違えました。あと <xliff:g id="NUMBER_1">%2$d</xliff:g> 回間違えると、タブレットのロック解除にメール アカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後にもう一度お試しください。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ロック解除パターンの入力を <xliff:g id="NUMBER_0">%1$d</xliff:g> 回間違えました。あと <xliff:g id="NUMBER_1">%2$d</xliff:g> 回間違えると、スマートフォンのロック解除にメール アカウントが必要になります。\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後にもう一度お試しください。"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"温度上昇により電源が OFF になりました"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"温度上昇により電源が OFF になりました"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"温度上昇により電源が OFF になりました"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"お使いのスマートフォンは現在、正常に動作しています。\nタップして詳細を表示"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"お使いのデバイスは現在、正常に動作しています。\nタップして詳細を表示"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"お使いのタブレットは現在、正常に動作しています。\nタップして詳細を表示"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"スマートフォンが熱くなりすぎたため電源が OFF になりました。現在は正常に動作しています。\n\nスマートフォンは以下の場合に熱くなる場合があります。\n • リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n • サイズの大きいファイルをダウンロードまたはアップロード\n • 高温の場所で使用"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"デバイスが熱くなりすぎたため電源が OFF になりました。現在は正常に動作しています。\n\nデバイスは以下の場合に熱くなる場合があります。\n • リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n • サイズの大きいファイルをダウンロードまたはアップロード\n • 高温の場所で使用"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"タブレットが熱くなりすぎたため電源が OFF になりました。現在は正常に動作しています。\n\nタブレットは以下の場合に熱くなる場合があります。\n • リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n • サイズの大きいファイルをダウンロードまたはアップロード\n • 高温の場所で使用"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"スマートフォンの温度が上昇中"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"デバイスの温度が上昇中"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"タブレットの温度が上昇中"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"スマートフォンのクールダウン中は一部の機能が制限されます。\nタップして詳細を表示"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"デバイスのクールダウン中は一部の機能が制限されます。\nタップして詳細を表示"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"タブレットのクールダウン中は一部の機能が制限されます。\nタップして詳細を表示"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"スマートフォンは自動的にクールダウンを行います。その間もスマートフォンを使用できますが、動作が遅くなる可能性があります。\n\nクールダウンが完了すると、通常どおり動作します。"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"デバイスは自動的にクールダウンを行います。その間もデバイスを使用できますが、動作が遅くなる可能性があります。\n\nクールダウンが完了すると、通常どおり動作します。"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"タブレットは自動的にクールダウンを行います。その間もタブレットを使用できますが、動作が遅くなる可能性があります。\n\nクールダウンが完了すると、通常どおり動作します。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"指紋認証センサーは電源ボタンに内蔵されています。タブレット側面のボタンのうち、音量ボタンの横にあるフラットなボタンです。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"指紋認証センサーは電源ボタンに内蔵されています。デバイス側面のボタンのうち、音量ボタンの横にあるフラットなボタンです。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"指紋認証センサーは電源ボタンに内蔵されています。スマートフォン側面のボタンのうち、音量ボタンの横にあるフラットなボタンです。"</string> diff --git a/packages/SystemUI/res-product/values-ka/strings.xml b/packages/SystemUI/res-product/values-ka/strings.xml index 34fc24c36d6e..f007c4a1e0b2 100644 --- a/packages/SystemUI/res-product/values-ka/strings.xml +++ b/packages/SystemUI/res-product/values-ka/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"თქვენ არასწორად ცადეთ ტელეფონის განბლოკვა <xliff:g id="NUMBER">%d</xliff:g>-ჯერ. ამის გამო, სამსახურის პროფილი ამოიშლება, რაც პროფილის ყველა მონაცემის წაშლას გამოიწვევს."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"თქვენ არასწორად დახატეთ თქვენი განბლოკვის ნიმუში <xliff:g id="NUMBER_0">%1$d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%2$d</xliff:g> წარუმატებელი მცდელობის შემდეგ მოგთხოვთ, ტაბლეტი თქვენი ელფოსტის ანგარიშის მეშვეობით განბლოკოთ.\n\n ცადეთ ხელახლა <xliff:g id="NUMBER_2">%3$d</xliff:g> წამში."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"თქვენ არასწორად დახატეთ თქვენი განბლოკვის ნიმუში <xliff:g id="NUMBER_0">%1$d</xliff:g>-ჯერ. კიდევ <xliff:g id="NUMBER_1">%2$d</xliff:g> წარუმატებელი მცდელობის შემდეგ მოგთხოვთ, ტელეფონი თქვენი ელფოსტის ანგარიშის მეშვეობით განბლოკოთ.\n\n ცადეთ ხელახლა <xliff:g id="NUMBER_2">%3$d</xliff:g> წამში."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ტელეფონი გამოირთო გაცხელების გამო"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"მოწყობილობა გამოირთო გაცხელების გამო"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ტაბლეტი გამოირთო გაცხელების გამო"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"თქვენი ტელეფონი უკვე ნორმალურად მუშაობს.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"თქვენი მოწყობილობა უკვე ნორმალურად მუშაობს.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"თქვენი ტაბლეტი უკვე ნორმალურად მუშაობს.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"თქვენი ტელეფონი გამოირთო გასაგრილებლად, რადგან ის მეტისმეტად გაცხელდა. ახლა ის ჩვეულებრივად მუშაობს.\n\nტელეფონის გაცხელების მიზეზებია:\n • რესურსტევადი აპების გამოყენება (მაგ.: სათამაშო, ვიდეო ან ნავიგაციის აპების)\n • დიდი ფაილების ჩამოტვირთვა ან ატვირთვა\n • მოწყობილობის გამოყენება მაღალი ტემპერატურისას"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"თქვენი მოწყობილობა გამოირთო გასაგრილებლად, რადგან ის მეტისმეტად გაცხელდა. ახლა ის ჩვეულებრივად მუშაობს.\n\nმოწყობილობის გაცხელების მიზეზებია:\n • რესურსტევადი აპების გამოყენება (მაგ.: სათამაშო, ვიდეო ან ნავიგაციის აპების)\n • დიდი ფაილების ჩამოტვირთვა ან ატვირთვა\n • მოწყობილობის გამოყენება მაღალი ტემპერატურისას"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"თქვენი ტაბლეტი გამოირთო გასაგრილებლად, რადგან ის მეტისმეტად გაცხელდა. ახლა ის ჩვეულებრივად მუშაობს.\n\nტაბლეტის გაცხელების მიზეზებია:\n • რესურსტევადი აპების გამოყენება (მაგ.: სათამაშო, ვიდეო ან ნავიგაციის აპების)\n • დიდი ფაილების ჩამოტვირთვა ან ატვირთვა\n • მოწყობილობის გამოყენება მაღალი ტემპერატურისას"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ტელეფონი ცხელდება"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"მოწყობილობა ცხელდება"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ტაბლეტი ცხელდება"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ზოგიერთი ფუნქცია შეზღუდული იქნება, სანამ ტელეფონი გაგრილდება.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ზოგიერთი ფუნქცია შეზღუდული იქნება, სანამ მოწყობილობა გაგრილდება.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ზოგიერთი ფუნქცია შეზღუდული იქნება, სანამ ტაბლეტი გაგრილდება.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"თქვენი ტელეფონი გაგრილებას ავტომატურად შეეცდება. შეგიძლიათ გააგრძელოთ მისით სარგებლობა, თუმცა ტელეფონმა შეიძლება უფრო ნელა იმუშაოს.\n\nგაგრილების შემდგომ ის ჩვეულებრივად იმუშავებს."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"თქვენი მოწყობილობა გაგრილებას ავტომატურად შეეცდება. შეგიძლიათ გააგრძელოთ მისით სარგებლობა, თუმცა ტელეფონმა შეიძლება უფრო ნელა იმუშაოს.\n\nგაგრილების შემდგომ ის ჩვეულებრივად იმუშავებს."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"თქვენი ტაბლეტი გაგრილებას ავტომატურად შეეცდება. შეგიძლიათ გააგრძელოთ თქვენი ტაბლეტით სარგებლობა, თუმცა მან შეიძლება უფრო ნელა იმუშაოს.\n\nგაგრილების შემდგომ ის ჩვეულებრივად იმუშავებს."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"თითის ანაბეჭდის სენსორი ჩართვის ღილაკზეა. ეს არის ბრტყელი ღილაკი ხმის აწევის ღილაკის გვერდით, ტაბლეტის კიდეში."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"თითის ანაბეჭდის სენსორი ჩართვის ღილაკზეა. ეს არის ბრტყელი ღილაკი ხმის აწევის ღილაკის გვერდით, მოწყობილობის კიდეში."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"თითის ანაბეჭდის სენსორი ჩართვის ღილაკზეა. ეს არის ბრტყელი ღილაკი ხმის აწევის ღილაკის გვერდით, ტელეფონის კიდეში."</string> diff --git a/packages/SystemUI/res-product/values-kk/strings.xml b/packages/SystemUI/res-product/values-kk/strings.xml index 73b637eba8c5..83b2351b9979 100644 --- a/packages/SystemUI/res-product/values-kk/strings.xml +++ b/packages/SystemUI/res-product/values-kk/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Телефон құлпын ашуға <xliff:g id="NUMBER">%d</xliff:g> рет сәтсіз әрекет жасалды. Жұмыс профилі өшіріліп, оның бүкіл деректері жойылады."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Құлыпты ашу өрнегі <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате енгізілді. <xliff:g id="NUMBER_1">%2$d</xliff:g> әрекет қалды. Одан кейін планшетті аккаунт арқылы ашу сұралады. \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін әрекетті қайталаңыз."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Құлыпты ашу өрнегі <xliff:g id="NUMBER_0">%1$d</xliff:g> рет қате енгізілді. <xliff:g id="NUMBER_1">%2$d</xliff:g> әрекет қалды. Одан кейін телефонды аккаунт арқылы ашу сұралады. \n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундтан кейін әрекетті қайталаңыз."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Телефон қызып кеткендіктен өшірілді"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Құрылғы қызып кеткендіктен өшірілді"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Планшет қызып кеткендіктен өшірілді"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Телефоныңыз қалыпты жұмыс істеп тұр.\nТолық ақпарат алу үшін түртіңіз."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Құрылғыңыз қалыпты жұмыс істеп тұр.\nТолық ақпарат алу үшін түртіңіз."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Планшетіңіз қалыпты жұмыс істеп тұр.\nТолық ақпарат алу үшін түртіңіз."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Телефоныңыз қатты қызып кеткендіктен өшірілген еді. Ал қазір қалыпты жұмыс істеп тұр.\n\nОл мына жағдайларда қызып кетуі мүмкін:\n • ресурстарды көп көлемде қажет ететін қолданбаларды (ойын, бейне немесе навигация қолданбалары) пайдалану\n • үлкен көлемді файлдарды жүктеу немесе жүктеп салу;\n • телефонды жоғары температурада пайдалану."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Құрылғыңыз қатты қызып кеткендіктен өшірілген еді. Ал қазір қалыпты жұмыс істеп тұр.\n\nОл мына жағдайларда қызып кетуі мүмкін:\n • ресурстарды көп көлемде қажет ететін қолданбаларды (ойын, бейне немесе навигация қолданбалары) пайдалану;\n • үлкен көлемді файлдарды жүктеу немесе жүктеп салу;\n • құрылғыны жоғары температурада пайдалану."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Планшетіңіз қатты қызып кеткендіктен өшірілген еді. Ал қазір қалыпты жұмыс істеп тұр.\n\nОл мына жағдайларда қызып кетуі мүмкін:\n • ресурстарды көп көлемде қажет ететін қолданбаларды (ойын, бейне немесе навигация қолданбалары) пайдалану;\n • үлкен көлемді файлдарды жүктеу немесе жүктеп салу;\n • планшетті жоғары температурада пайдалану."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Телефон қызып бара жатыр"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Құрылғы қызып бара жатыр"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Планшет қызып бара жатыр"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Телефон толық суығанға дейін, кейбір функцияның жұмысы шектеледі.\nТолық ақпарат үшін түртіңіз."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Құрылғы толық суығанға дейін, кейбір функцияның жұмысы шектеледі.\nТолық ақпарат үшін түртіңіз."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Планшет толық суығанға дейін, кейбір функцияның жұмысы шектеледі.\nТолық ақпарат үшін түртіңіз."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Телефон автоматты түрде суи бастайды. Оны пайдалана бере аласыз, бірақ ол баяуырақ жұмыс істеуі мүмкін.\n\nСуығаннан кейін, оның жұмысы қалпына келеді."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Құрылғы автоматты түрде суи бастайды. Оны пайдалана бере аласыз, бірақ ол баяуырақ жұмыс істеуі мүмкін.\n\nСуығаннан кейін, оның жұмысы қалпына келеді."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Планшет автоматты түрде суи бастайды. Оны пайдалана бере аласыз, бірақ ол баяуырақ жұмыс істеуі мүмкін.\n\nСуығаннан кейін, оның жұмысы қалпына келеді."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Саусақ ізін оқу сканері қуат түймесінде орналасқан. Ол – планшет шетіндегі шығыңқы дыбыс деңгейі түймесінің жанында орналасқан жалпақ түйме."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Саусақ ізін оқу сканері қуат түймесінде орналасқан. Ол – құрылғы шетіндегі шығыңқы дыбыс деңгейі түймесінің жанында орналасқан жалпақ түйме."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Саусақ ізін оқу сканері қуат түймесінде орналасқан. Ол – телефон шетіндегі шығыңқы дыбыс деңгейі түймесінің жанында орналасқан жалпақ түйме."</string> diff --git a/packages/SystemUI/res-product/values-km/strings.xml b/packages/SystemUI/res-product/values-km/strings.xml index 611ee94a28b2..34189d47bc4b 100644 --- a/packages/SystemUI/res-product/values-km/strings.xml +++ b/packages/SystemUI/res-product/values-km/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"អ្នកបានព្យាយាមដោះសោទូរសព្ទនេះមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER">%d</xliff:g> ដងហើយ។ កម្រងព័ត៌មានការងារនេះនឹងត្រូវបានលុប ហើយវានឹងលុបទិន្នន័យកម្រងព័ត៌មានទាំងអស់។"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"អ្នកបានគូរលំនាំដោះសោរបស់អ្នកមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER_0">%1$d</xliff:g> ដងហើយ។ បន្ទាប់ពីមានការព្យាយាមដោះសោចំនួន <xliff:g id="NUMBER_1">%2$d</xliff:g> ដងទៀតមិនទទួលបានជោគជ័យ អ្នកនឹងត្រូវបានស្នើឱ្យដោះសោថេប្លេតរបស់អ្នក ដោយប្រើគណនីអ៊ីមែល។\n\n សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_2">%3$d</xliff:g> វិនាទីទៀត។"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"អ្នកបានគូរលំនាំដោះសោរបស់អ្នកមិនត្រឹមត្រូវចំនួន <xliff:g id="NUMBER_0">%1$d</xliff:g> ដងហើយ។ បន្ទាប់ពីមានការព្យាយាមដោះសោចំនួន <xliff:g id="NUMBER_1">%2$d</xliff:g> ដងទៀតមិនទទួលបានជោគជ័យ អ្នកនឹងត្រូវបានស្នើឱ្យដោះសោទូរសព្ទរបស់អ្នកដោយប្រើគណនីអ៊ីមែល។\n\n សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="NUMBER_2">%3$d</xliff:g> វិនាទីទៀត។"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ទូរសព្ទបានបិទដោយសារកម្ដៅ"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ឧបករណ៍បានបិទដោយសារកម្ដៅ"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ថេប្លេតបានបិទដោយសារកម្ដៅ"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"ឥឡូវនេះ ទូរសព្ទរបស់អ្នកកំពុងដំណើរការជាធម្មតា។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"ឥឡូវនេះ ឧបករណ៍របស់អ្នកកំពុងដំណើរការជាធម្មតា។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"ឥឡូវនេះ ថេប្លេតរបស់អ្នកកំពុងដំណើរការជាធម្មតា។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ទូរសព្ទរបស់អ្នកក្តៅពេក ដូច្នេះវាបានបិទដើម្បីបន្ថយកម្តៅ។ ឥឡូវនេះ ទូរសព្ទរបស់អ្នកកំពុងដំណើរការធម្មតា។\n\nទូរសព្ទរបស់អ្នកអាចនឹងឡើងកម្តៅខ្លាំងជ្រុល ប្រសិនបើអ្នក៖\n • ប្រើប្រាស់កម្មវិធីដែលប្រើប្រាស់ទិន្នន័យច្រើនក្នុងរយៈពេលខ្លី (ដូចជាហ្គេម វីដេអូ ឬកម្មវិធីរុករក)\n • ទាញយក ឬបង្ហោះឯកសារដែលមានទំហំធំ\n • ប្រើប្រាស់ទូរសព្ទរបស់អ្នកនៅកន្លែងមានសីតុណ្ហភាពខ្ពស់"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ឧបករណ៍របស់អ្នកក្តៅពេក ដូច្នេះវាបានបិទដើម្បីបន្ថយកម្តៅ។ ឥឡូវនេះ ឧបករណ៍របស់អ្នកកំពុងដំណើរការធម្មតា។\n\nឧបករណ៍របស់អ្នកអាចនឹងឡើងកម្តៅខ្លាំងជ្រុល ប្រសិនបើអ្នក៖\n • ប្រើប្រាស់កម្មវិធីដែលប្រើប្រាស់ទិន្នន័យច្រើនក្នុងរយៈពេលខ្លី (ដូចជាហ្គេម វីដេអូ ឬកម្មវិធីរុករក)\n • ទាញយក ឬបង្ហោះឯកសារដែលមានទំហំធំ\n • ប្រើប្រាស់ឧបករណ៍របស់អ្នកនៅកន្លែងមានសីតុណ្ហភាពខ្ពស់"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ថេប្លេតរបស់អ្នកក្តៅពេក ដូច្នេះវាបានបិទដើម្បីបន្ថយកម្តៅ។ ឥឡូវនេះ ថេប្លេតរបស់អ្នកកំពុងដំណើរការធម្មតា។\n\nថេប្លេតរបស់អ្នកអាចនឹងឡើងកម្តៅខ្លាំងជ្រុល ប្រសិនបើអ្នក៖\n • ប្រើប្រាស់កម្មវិធីដែលប្រើប្រាស់ទិន្នន័យច្រើនក្នុងរយៈពេលខ្លី (ដូចជាហ្គេម វីដេអូ ឬកម្មវិធីរុករក)\n • ទាញយក ឬបង្ហោះឯកសារដែលមានទំហំធំ\n • ប្រើប្រាស់ថេប្លេតរបស់អ្នកនៅកន្លែងមានសីតុណ្ហភាពខ្ពស់"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ទូរសព្ទកំពុងកើនកម្តៅ"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ឧបករណ៍កំពុងកើនកម្ដៅ"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ថេប្លេតកំពុងកើនកម្តៅ"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"មុខងារមួយចំនួននឹងមិនអាចប្រើបានពេញលេញនោះទេ ខណៈពេលដែលទូរសព្ទកំពុងបញ្ចុះកម្ដៅ។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"មុខងារមួយចំនួននឹងមិនអាចប្រើបានពេញលេញនោះទេ ខណៈពេលដែលឧបករណ៍កំពុងបញ្ចុះកម្ដៅ។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"មុខងារមួយចំនួននឹងមិនអាចប្រើបានពេញលេញនោះទេ ខណៈពេលដែលថេប្លេតកំពុងបញ្ចុះកម្ដៅ។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"ទូរសព្ទរបស់អ្នកនឹងព្យាយាមបញ្ចុះកម្តៅដោយស្វ័យប្រវត្តិ។ អ្នកនៅតែអាចប្រើទូរសព្ទរបស់អ្នកបានដដែល ប៉ុន្តែទូរសព្ទនេះអាចដំណើរការយឺតជាងមុន។\n\nនៅពេលទូរសព្ទរបស់អ្នកចុះត្រជាក់ហើយ ទូរសព្ទនេះនឹងដំណើរការធម្មតា។"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"ឧបករណ៍របស់អ្នកនឹងព្យាយាមបញ្ចុះកម្ដៅដោយស្វ័យប្រវត្តិ។ អ្នកនៅតែអាចប្រើឧបករណ៍របស់អ្នកបានដដែល ប៉ុន្តែឧបករណ៍នេះអាចដំណើរការយឺតជាងមុន។\n\nនៅពេលឧបករណ៍របស់អ្នកចុះត្រជាក់ហើយ ឧបករណ៍នេះនឹងដំណើរការធម្មតា។"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"ថេប្លេតរបស់អ្នកនឹងព្យាយាមបញ្ចុះកម្ដៅដោយស្វ័យប្រវត្តិ។ អ្នកនៅតែអាចប្រើថេប្លេតរបស់អ្នកបានដដែល ប៉ុន្តែថេប្លេតនេះអាចដំណើរការយឺតជាងមុន។\n\nនៅពេលថេប្លេតរបស់អ្នកចុះត្រជាក់ហើយ ថេប្លេតនេះនឹងដំណើរការធម្មតា។"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"សេនស័រចាប់ស្នាមម្រាមដៃស្ថិតនៅលើប៊ូតុងថាមពល។ វាជាប៊ូតុងរាបស្មើនៅជាប់នឹងប៊ូតុងកម្រិតសំឡេងដែលលៀនចេញមកនៅលើគែមថេប្លេត។"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"សេនស័រចាប់ស្នាមម្រាមដៃស្ថិតនៅលើប៊ូតុងថាមពល។ វាជាប៊ូតុងរាបស្មើនៅជាប់នឹងប៊ូតុងកម្រិតសំឡេងដែលលៀនចេញមកនៅលើគែមឧបករណ៍។"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"សេនស័រចាប់ស្នាមម្រាមដៃស្ថិតនៅលើប៊ូតុងថាមពល។ វាជាប៊ូតុងរាបស្មើនៅជាប់នឹងប៊ូតុងកម្រិតសំឡេងដែលលៀនចេញមកនៅលើគែមទូរសព្ទ។"</string> diff --git a/packages/SystemUI/res-product/values-kn/strings.xml b/packages/SystemUI/res-product/values-kn/strings.xml index 4fbf76f406e1..4532d8372cfb 100644 --- a/packages/SystemUI/res-product/values-kn/strings.xml +++ b/packages/SystemUI/res-product/values-kn/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ಫೋನ್ ಅನ್ನು ಅನ್ಲಾಕ್ ಮಾಡಲು ನೀವು <xliff:g id="NUMBER">%d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಉದ್ಯೋಗ ಪ್ರೊಫೈಲ್ ಅನ್ನು ತೆಗೆದುಹಾಕಲಾಗುತ್ತದೆ, ಇದು ಪ್ರೊಫೈಲ್ನ ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%1$d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಡ್ರಾ ಮಾಡಿರುವಿರಿ. <xliff:g id="NUMBER_1">%2$d</xliff:g> ಕ್ಕೂ ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ಬಳಿಕ, ನಿಮ್ಮ ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಬಳಸಿ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ಸೆಕೆಂಡ್ಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ನಿಮ್ಮ ಅನ್ಲಾಕ್ ಪ್ಯಾಟರ್ನ್ ಅನ್ನು ನೀವು <xliff:g id="NUMBER_0">%1$d</xliff:g> ಬಾರಿ ತಪ್ಪಾಗಿ ಡ್ರಾ ಮಾಡಿರುವಿರಿ. <xliff:g id="NUMBER_1">%2$d</xliff:g> ಕ್ಕೂ ಹೆಚ್ಚಿನ ವಿಫಲ ಪ್ರಯತ್ನಗಳ ಬಳಿಕ, ಇಮೇಲ್ ಖಾತೆಯನ್ನು ಬಳಸಿ ನಿಮ್ಮ ಫೋನ್ ಅನ್ಲಾಕ್ ಮಾಡಲು ನಿಮ್ಮನ್ನು ಕೇಳಲಾಗುತ್ತದೆ.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ಸೆಕೆಂಡ್ಗಳಲ್ಲಿ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ಫೋನ್ ಬಿಸಿಯಾದ ಕಾರಣದಿಂದಾಗಿ ಆಫ್ ಆಗಿದೆ"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ಸಾಧನ ಬಿಸಿಯಾದ ಕಾರಣದಿಂದಾಗಿ ಆಫ್ ಆಗಿದೆ"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ಟ್ಯಾಬ್ಲೆಟ್ ಬಿಸಿಯಾದ ಕಾರಣ ಆಫ್ ಆಗಿದೆ"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"ನಿಮ್ಮ ಫೋನ್ ಈಗ ಎಂದಿನಂತೆ ರನ್ ಆಗುತ್ತಿದೆ.\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"ನಿಮ್ಮ ಸಾಧನವು ಈಗ ಎಂದಿನಂತೆ ರನ್ ಆಗುತ್ತಿದೆ.\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಈಗ ಎಂದಿನಂತೆ ರನ್ ಆಗುತ್ತಿದೆ.\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ನಿಮ್ಮ ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾದ ಕಾರಣ ಅದನ್ನು ತಣ್ಣಗಾಗಿಸಲು ಆಫ್ ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಫೋನ್ ಈಗ ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ಫೋನ್ ಈ ಕೆಳಗಿನ ಕಾರಣಗಳಿಂದ ತುಂಬಾ ಬಿಸಿಯಾಗಬಹುದು:\n • ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳುವ ಆ್ಯಪ್ಗಳ ಬಳಕೆ (ಉದಾಹರಣೆಗೆ ಗೇಮಿಂಗ್, ವೀಡಿಯೊ ಅಥವಾ ನ್ಯಾವಿಗೇಶನ್ ಆ್ಯಪ್ಗಳು)\n • ದೊಡ್ಡ ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಅಥವಾ ಅಪ್ಲೋಡ್ ಮಾಡುವುದು\n • ಅಧಿಕ ತಾಪಮಾನದಲ್ಲಿ ಫೋನ್ ಬಳಸುವುದು"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ನಿಮ್ಮ ಸಾಧನವು ತುಂಬಾ ಬಿಸಿಯಾದ ಕಾರಣ ಅದನ್ನು ತಣ್ಣಗಾಗಿಸಲು ಆಫ್ ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಸಾಧನವು ಈಗ ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ಸಾಧನವು ಈ ಕೆಳಗಿನ ಕಾರಣಗಳಿಂದ ತುಂಬಾ ಬಿಸಿಯಾಗಬಹುದು:\n • ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳುವ ಆ್ಯಪ್ಗಳ ಬಳಕೆ (ಉದಾಹರಣೆಗೆ ಗೇಮಿಂಗ್, ವೀಡಿಯೊ ಅಥವಾ ನ್ಯಾವಿಗೇಶನ್ ಆ್ಯಪ್ಗಳು)\n • ದೊಡ್ಡ ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಅಥವಾ ಅಪ್ಲೋಡ್ ಮಾಡುವುದು\n • ಅಧಿಕ ತಾಪಮಾನದಲ್ಲಿ ಸಾಧನವನ್ನು ಬಳಸುವುದು"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ತುಂಬಾ ಬಿಸಿಯಾದ ಕಾರಣ ಅದನ್ನು ತಣ್ಣಗಾಗಿಸಲು ಆಫ್ ಮಾಡಲಾಗಿದೆ. ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಈಗ ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ರನ್ ಆಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಈ ಕೆಳಗಿನ ಕಾರಣಗಳಿಂದ ತುಂಬಾ ಬಿಸಿಯಾಗಬಹುದು:\n • ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲಗಳನ್ನು ಬಳಸಿಕೊಳ್ಳುವ ಆ್ಯಪ್ಗಳ ಬಳಕೆ (ಉದಾಹರಣೆಗೆ ಗೇಮಿಂಗ್, ವೀಡಿಯೊ ಅಥವಾ ನ್ಯಾವಿಗೇಶನ್ ಆ್ಯಪ್ಗಳು)\n • ದೊಡ್ಡ ಫೈಲ್ಗಳನ್ನು ಡೌನ್ಲೋಡ್ ಅಥವಾ ಅಪ್ಲೋಡ್ ಮಾಡುವುದು\n • ಅಧಿಕ ತಾಪಮಾನದಲ್ಲಿ ಟ್ಯಾಬ್ಲೆಟ್ ಬಳಸುವುದು"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ಫೋನ್ ಬಿಸಿಯಾಗುತ್ತಿದೆ"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ಸಾಧನವು ಬಿಸಿಯಾಗುತ್ತಿದೆ"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ಟ್ಯಾಬ್ಲೆಟ್ ಬಿಸಿಯಾಗುತ್ತಿದೆ"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ಫೋನ್ ತಣ್ಣಗಾಗುವವರೆಗೂ ಕೆಲವು ಫೀಚರ್ಗಳನ್ನು ಸೀಮಿತಗೊಳಿಸಲಾಗುತ್ತದೆ.\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ಸಾಧನವು ತಣ್ಣಗಾಗುವವರೆಗೂ ಕೆಲವು ಫೀಚರ್ಗಳು ಸೀಮಿತಗೊಳಿಸಲಾಗುತ್ತದೆ.\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ಟ್ಯಾಬ್ಲೆಟ್ ತಣ್ಣಗಾಗುವವರೆಗೂ ಕೆಲವು ಫೀಚರ್ಗಳನ್ನು ಸೀಮಿತಗೊಳಿಸಲಾಗುತ್ತದೆ.\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"ನಿಮ್ಮ ಫೋನ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತಣ್ಣಗಾಗಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೀವು ಈಗಲೂ ಬಳಸಬಹುದು, ಆದರೆ ಅದು ನಿಧಾನವಾಗಿ ರನ್ ಆಗಬಹುದು.\n\nಫೋನ್ ತಣ್ಣಗಾದ ನಂತರ ಇದು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"ನಿಮ್ಮ ಸಾಧನವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತಣ್ಣಗಾಗಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ನಿಮ್ಮ ಸಾಧನವನ್ನು ನೀವು ಈಗಲೂ ಬಳಸಬಹುದು, ಆದರೆ ಅದು ನಿಧಾನವಾಗಿ ರನ್ ಆಗಬಹುದು.\n\nಸಾಧನವು ತಣ್ಣಗಾದ ನಂತರ, ಇದು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತಣ್ಣಗಾಗಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ನೀವು ಈಗಲೂ ಬಳಸಬಹುದು, ಆದರೆ ಅದು ನಿಧಾನವಾಗಿ ರನ್ ಆಗಬಹುದು.\n\nಟ್ಯಾಬ್ಲೆಟ್ ತಣ್ಣಗಾದ ನಂತರ, ಇದು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ರನ್ ಆಗುತ್ತದೆ."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಪವರ್ ಬಟನ್ನಲ್ಲಿದೆ. ಇದು ಟ್ಯಾಬ್ಲೆಟ್ನ ಅಂಚಿನಲ್ಲಿರುವ ಎತ್ತರಿಸಿದ ವಾಲ್ಯೂಮ್ ಬಟನ್ನ ಪಕ್ಕದಲ್ಲಿರುವ ಫ್ಲ್ಯಾಟ್ ಬಟನ್ ಆಗಿದೆ."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಪವರ್ ಬಟನ್ನಲ್ಲಿದೆ. ಇದು ಸಾಧನದ ಅಂಚಿನಲ್ಲಿರುವ ಎತ್ತರಿಸಿದ ವಾಲ್ಯೂಮ್ ಬಟನ್ನ ಪಕ್ಕದಲ್ಲಿರುವ ಫ್ಲಾಟ್ ಬಟನ್ ಆಗಿದೆ."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಪವರ್ ಬಟನ್ನಲ್ಲಿದೆ. ಇದು ಫೋನ್ನ ಅಂಚಿನಲ್ಲಿರುವ ಎತ್ತರಿಸಿದ ವಾಲ್ಯೂಮ್ ಬಟನ್ನ ಪಕ್ಕದಲ್ಲಿರುವ ಫ್ಲ್ಯಾಟ್ ಬಟನ್ ಆಗಿದೆ."</string> diff --git a/packages/SystemUI/res-product/values-ko/strings.xml b/packages/SystemUI/res-product/values-ko/strings.xml index b2624521811d..cb4a6206dbfb 100644 --- a/packages/SystemUI/res-product/values-ko/strings.xml +++ b/packages/SystemUI/res-product/values-ko/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"휴대전화 잠금 해제에 <xliff:g id="NUMBER">%d</xliff:g>번 실패했습니다. 직장 프로필과 모든 프로필 데이터가 삭제됩니다."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"잠금 해제 패턴을 <xliff:g id="NUMBER_0">%1$d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%2$d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 태블릿을 잠금 해제해야 합니다.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g>초 후에 다시 시도해 주세요."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"잠금 해제 패턴을 <xliff:g id="NUMBER_0">%1$d</xliff:g>회 잘못 그렸습니다. <xliff:g id="NUMBER_1">%2$d</xliff:g>회 더 실패하면 이메일 계정을 사용하여 휴대전화를 잠금 해제해야 합니다.\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g>초 후에 다시 시도해 주세요."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"발열로 인해 휴대전화가 꺼짐"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"발열로 인해 기기가 꺼짐"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"발열로 인해 태블릿이 꺼짐"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"이제 휴대전화가 정상적으로 작동합니다.\n자세히 알아보려면 탭하세요."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"이제 기기가 정상적으로 작동합니다.\n자세히 알아보려면 탭하세요."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"이제 태블릿이 정상적으로 작동합니다.\n자세히 알아보려면 탭하세요."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"휴대전화가 과열되어 온도를 낮추기 위해 전원이 종료되었습니다. 지금은 휴대전화가 정상적으로 작동합니다.\n\n휴대전화가 과열되는 이유는 다음과 같습니다.\n • 리소스를 많이 사용하는 앱 사용(예: 게임, 동영상 또는 내비게이션 앱)\n • 대용량 파일을 다운로드 또는 업로드\n • 온도가 높은 곳에서 휴대전화 사용"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"기기가 과열되어 온도를 낮추기 위해 전원이 종료되었습니다. 지금은 기기가 정상적으로 작동합니다.\n\n기기가 과열되는 이유는 다음과 같습니다.\n • 리소스를 많이 사용하는 앱 사용(예: 게임, 동영상 또는 내비게이션 앱)\n • 대용량 파일을 다운로드 또는 업로드\n • 온도가 높은 곳에서 기기 사용"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"태블릿이 과열되어 온도를 낮추기 위해 전원이 종료되었습니다. 지금은 태블릿이 정상적으로 작동합니다.\n\n태블릿이 과열되는 이유는 다음과 같습니다.\n • 리소스를 많이 사용하는 앱 사용(예: 게임, 동영상 또는 내비게이션 앱)\n • 대용량 파일을 다운로드 또는 업로드\n • 온도가 높은 곳에서 태블릿 사용"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"휴대전화 온도가 높음"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"기기 온도가 높음"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"태블릿 온도가 높음"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"휴대전화 온도를 낮추는 동안 일부 기능이 제한됩니다.\n자세히 알아보려면 탭하세요."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"기기 온도를 낮추는 동안 일부 기능이 제한됩니다.\n자세히 알아보려면 탭하세요."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"태블릿 온도를 낮추는 동안 일부 기능이 제한됩니다.\n자세히 알아보려면 탭하세요."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"휴대전화가 자동으로 온도를 낮추려고 시도합니다. 휴대전화를 계속 사용할 수는 있지만 작동이 느려질 수도 있습니다.\n\n휴대전화 온도가 낮아지면 정상적으로 작동됩니다."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"기기가 자동으로 온도를 낮추려고 시도합니다. 기기를 계속 사용할 수는 있지만 작동이 느려질 수도 있습니다.\n\n기기 온도가 낮아지면 정상적으로 작동됩니다."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"태블릿이 자동으로 온도를 낮추려고 시도합니다. 태블릿을 계속 사용할 수 있지만 작동이 느려질 수도 있습니다.\n\n태블릿 온도가 낮아지면 정상적으로 작동합니다."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"지문 센서는 전원 버튼에 있습니다. 태블릿 옆면에 있는 튀어나온 볼륨 버튼 옆의 평평한 버튼입니다."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"지문 센서는 전원 버튼에 있습니다. 기기 옆면에 있는 튀어나온 볼륨 버튼 옆의 평평한 버튼입니다."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"지문 센서는 전원 버튼에 있습니다. 휴대전화 옆면에 있는 튀어나온 볼륨 버튼 옆의 평평한 버튼입니다."</string> diff --git a/packages/SystemUI/res-product/values-ky/strings.xml b/packages/SystemUI/res-product/values-ky/strings.xml index 0f6acfcd0ec7..8bd066f0241e 100644 --- a/packages/SystemUI/res-product/values-ky/strings.xml +++ b/packages/SystemUI/res-product/values-ky/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Телефондун кулпусун <xliff:g id="NUMBER">%d</xliff:g> жолу туура эмес ачууга аракет жасадыңыз. Жумуш профили өчүрүлүп, андагы бардык нерселер өчүрүлөт."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> ийгиликсиз аракеттен кийин планшетиңизди бөгөттөн электрондук почтаңыз аркылуу чыгаруу талап кылынат.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секунддан кийин кайра аракеттениңиз."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Графикалык ачкычты <xliff:g id="NUMBER_0">%1$d</xliff:g> жолу туура эмес тарттыңыз. Дагы <xliff:g id="NUMBER_1">%2$d</xliff:g> ийгиликсиз аракеттен кийин телефонуңузду бөгөттөн электрондук почтаңыз аркылуу чыгаруу талап кылынат.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секунддан кийин кайра аракеттениңиз."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Телефон ысыгандыктан өчүрүлдү"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Түзмөк ысыгандыктан өчүрүлдү"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Планшет ысыгандыктан өчүрүлдү"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Телефонуңуз кадимкидей иштеп жатат.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Түзмөгүңүз кадимкидей иштеп жатат.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Планшетиңиз кадимкидей иштеп жатат.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Телефонуңуз өтө ысып кеткендиктен, аны муздатуу үчүн өчүрүлдү. Эми телефонуңуз кадимкидей иштеп жатат.\n\nТелефонуңуз төмөнкү шарттарда ысып кетиши мүмкүн:\n • Ашыкча ресурс короткон колдонмолорду (оюндар, видео же чабыттоо колдонмолору) пайдалансаңыз \n • Ири көлөмдөгү файлдарды жүктөп алсаңыз же берсеңиз\n • Телефонуңузду жогорку температураларда пайдалансаңыз"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Түзмөгүңүз өтө ысып кеткендиктен, аны муздатуу үчүн өчүрүлдү. Эми түзмөгүңүз кадимкидей иштеп жатат.\n\nТүзмөгүңүз төмөнкү шарттарда ысып кетиши мүмкүн:\n • Ашыкча ресурс короткон колдонмолорду (оюндар, видео же чабыттоо колдонмолору) пайдалансаңыз \n • Ири көлөмдөгү файлдарды жүктөп алсаңыз же берсеңиз\n • Түзмөгүңүздү жогорку температураларда пайдалансаңыз"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Планшетиңиз өтө ысып кеткендиктен, аны муздатуу үчүн өчүрүлдү. Эми планшетиңиз кадимкидей иштеп жатат.\n\nПланшетиңиз төмөнкү шарттарда ысып кетиши мүмкүн:\n • Ашыкча ресурс короткон колдонмолорду (оюндар, видео же чабыттоо колдонмолору) пайдалансаңыз \n • Ири көлөмдөгү файлдарды жүктөп алсаңыз же берсеңиз\n • Планшетиңизди жогорку температураларда пайдалансаңыз"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Телефон ысып баратат"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Түзмөк ысып баратат"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Планшет ысып баратат"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Телефон сууганча айрым элементтердин иши чектелген.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Түзмөк сууганча айрым элементтердин иши чектелген.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Планшет сууганча айрым элементтердин иши чектелген.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Телефонуңуз автоматтык түрдө сууйт. Аны колдоно берсеңиз болот, бирок ал жайыраак иштеп калат.\n\nТелефонуңуз суугандан кийин адаттагыдай эле иштеп баштайт."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Түзмөгүңүз автоматтык түрдө сууйт. Аны колдоно берсеңиз болот, бирок ал жайыраак иштеп калат.\n\nТүзмөгүңүз суугандан кийин адаттагыдай эле иштеп баштайт."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Планшетиңиз автоматтык түрдө сууйт. Аны колдоно берсеңиз болот, бирок ал жайыраак иштеп калат.\n\nПланшетиңиз суугандан кийин адаттагыдай эле иштеп баштайт."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Манжа изинин сенсору кубат баскычында жайгашкан. Бул планшеттин четиндеги үндү катуулатуу/акырындатуу баскычынын (көтөрүлгөн) жанындагы жалпак баскыч."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Манжа изинин сенсору кубат баскычында жайгашкан. Бул түзмөктүн четиндеги үндү катуулатуу/акырындатуу баскычынын (көтөрүлгөн) жанындагы жалпак баскыч."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Манжа изинин сенсору кубат баскычында жайгашкан. Бул телефондун четиндеги үндү катуулатуу/акырындатуу баскычынын (көтөрүлгөн) жанындагы жалпак баскыч."</string> diff --git a/packages/SystemUI/res-product/values-lo/strings.xml b/packages/SystemUI/res-product/values-lo/strings.xml index fee741dceb28..958cf32ab8e6 100644 --- a/packages/SystemUI/res-product/values-lo/strings.xml +++ b/packages/SystemUI/res-product/values-lo/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ທ່ານພະຍາຍາມປົດລັອກໂທລະສັບຜິດ <xliff:g id="NUMBER">%d</xliff:g> ເທື່ອແລ້ວ. ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກຈະຖືກລຶບອອກ, ເຊິ່ງຈະລຶບຂໍ້ມູນໂປຣໄຟລ໌ທັງໝົດອອກນຳ."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ທ່ານແຕ້ມຮູບແບບປົດລັອກຜິດ <xliff:g id="NUMBER_0">%1$d</xliff:g> ເທື່ອແລ້ວ. ຫຼັງຈາກແຕ້ມຜິດອີກ <xliff:g id="NUMBER_1">%2$d</xliff:g> ເທື່ອ, ທ່ານຈະຖືກຖາມໃຫ້ປົດລັອກແທັບເລັດຂອງທ່ານດ້ວຍການເຂົ້າສູ່ລະບົບໂດຍໃຊ້ອີເມວຂອງທ່ານ.\n\n ກະລຸນາລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER_2">%3$d</xliff:g> ວິນາທີ."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ທ່ານແຕ້ມຮູບແບບປົດລັອກຜິດ <xliff:g id="NUMBER_0">%1$d</xliff:g> ເທື່ອແລ້ວ. ຫຼັງຈາກແຕ້ມຜິດອີກ <xliff:g id="NUMBER_1">%2$d</xliff:g> ເທື່ອ, ທ່ານຈະຖືກຖາມໃຫ້ປົດໂທລະສັບຂອງທ່ານດ້ວຍການເຂົ້າສູ່ລະບົບໂດຍໃຊ້ບັນຊີອີເມວ.\n\n ກະລຸນາລອງໃໝ່ໃນອີກ <xliff:g id="NUMBER_2">%3$d</xliff:g> ວິນາທີ."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ໂທລະສັບປິດເຄື່ອງເນື່ອງຈາກຮ້ອນເກີນໄປ"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ອຸປະກອນປິດເຄື່ອງເນື່ອງຈາກຮ້ອນເກີນໄປ"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ແທັບເລັດປິດເຄື່ອງເນື່ອງຈາກຮ້ອນເກີນໄປ"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"ຕອນນີ້ໂທລະສັບຂອງທ່ານເຮັດວຽກຕາມປົກກະຕິແລ້ວ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"ຕອນນີ້ອຸປະກອນຂອງທ່ານເຮັດວຽກຕາມປົກກະຕິແລ້ວ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"ຕອນນີ້ແທັບເລັດຂອງທ່ານເຮັດວຽກຕາມປົກກະຕິແລ້ວ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ໂທລະສັບຂອງທ່ານຮ້ອນເກີນໄປ, ດັ່ງນັ້ນຈຶ່ງຖືກປິດເຄື່ອງເພື່ອໃຫ້ເຢັນລົງ. ຕອນນີ້ໂທລະສັບຂອງທ່ານເຮັດວຽກຕາມປົກກະຕິແລ້ວ.\n\nໂທລະສັບຂອງທ່ານອາດຮ້ອນເກີນໄປ ຫາກທ່ານ:\n • ໃຊ້ແອັບທີ່ກິນຊັບພະຍາກອນຫຼາຍ (ເຊັ່ນ: ເກມ, ວິດີໂອ ຫຼື ແອັບການນຳທາງ)\n • ດາວໂຫຼດ ຫຼື ອັບໂຫຼດໄຟລ໌ຂະໜາດໃຫຍ່\n • ໃຊ້ໂທລະສັບຂອງທ່ານໃນອຸນຫະພູມທີ່ສູງ"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ອຸປະກອນຂອງທ່ານຮ້ອນເກີນໄປ, ດັ່ງນັ້ນຈຶ່ງຖືກປິດເຄື່ອງເພື່ອໃຫ້ເຢັນລົງ. ຕອນນີ້ອຸປະກອນຂອງທ່ານເຮັດວຽກຕາມປົກກະຕິແລ້ວ.\n\nອຸປະກອນຂອງທ່ານອາດຮ້ອນເກີນໄປ ຫາກທ່ານ:\n • ໃຊ້ແອັບທີ່ກິນຊັບພະຍາກອນຫຼາຍ (ເຊັ່ນ: ເກມ, ວິດີໂອ ຫຼື ແອັບການນຳທາງ)\n • ດາວໂຫຼດ ຫຼື ອັບໂຫຼດໄຟລ໌ຂະໜາດໃຫຍ່\n • ໃຊ້ອຸປະກອນຂອງທ່ານໃນອຸນຫະພູມທີ່ສູງ"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ແທັບເລັດຂອງທ່ານຮ້ອນເກີນໄປ, ດັ່ງນັ້ນຈຶ່ງຖືກປິດເຄື່ອງເພື່ອໃຫ້ເຢັນລົງ. ຕອນນີ້ແທັບເລັດຂອງທ່ານເຮັດວຽກຕາມປົກກະຕິແລ້ວ.\n\nແທັບເລັດຂອງທ່ານອາດຮ້ອນເກີນໄປ ຫາກທ່ານ:\n • ໃຊ້ແອັບທີ່ກິນຊັບພະຍາກອນຫຼາຍ (ເຊັ່ນ: ເກມ, ວິດີໂອ ຫຼື ແອັບການນຳທາງ)\n • ດາວໂຫຼດ ຫຼື ອັບໂຫຼດໄຟລ໌ຂະໜາດໃຫຍ່\n • ໃຊ້ແທັບເລັດຂອງທ່ານໃນອຸນຫະພູມທີ່ສູງ"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ໂທລະສັບເລີ່ມຮ້ອນຂຶ້ນ"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ອຸປະກອນເລີ່ມຮ້ອນຂຶ້ນ"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ແທັບເລັດເລີ່ມຮ້ອນຂຶ້ນ"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ຄຸນສົມບັດບາງຢ່າງອາດໃຊ້ໄດ້ແບບຈຳກັດໃນລະຫວ່າງທີ່ໂທລະສັບເຢັນລົງ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ຄຸນສົມບັດບາງຢ່າງອາດໃຊ້ໄດ້ແບບຈຳກັດໃນລະຫວ່າງທີ່ອຸປະກອນເຢັນລົງ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ຄຸນສົມບັດບາງຢ່າງອາດໃຊ້ໄດ້ແບບຈຳກັດໃນລະຫວ່າງທີ່ແທັບເລັດເຢັນລົງ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"ໂທລະສັບຂອງທ່ານຈະພະຍາຍາມຫຼຸດອຸນຫະພູມລົງໂດຍອັດຕະໂນມັດ. ທ່ານຍັງສາມາດໃຊ້ໂທລະສັບຂອງທ່ານໄດ້ຢູ່, ແຕ່ໂທລະສັບອາດເຮັດວຽກຊ້າລົງ.\n\nໂທລະສັບຂອງທ່ານຈະກັບມາເຮັດວຽກຕາມປົກກະຕິເມື່ອເຢັນລົງແລ້ວ."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"ອຸປະກອນຂອງທ່ານຈະພະຍາຍາມເຮັດໃຫ້ເຢັນລົງໂດຍອັດຕະໂນມັດ. ທ່ານຍັງສາມາດໃຊ້ອຸປະກອນຂອງທ່ານໄດ້ຢູ່, ແຕ່ອຸປະກອນອາດເຮັດວຽກຊ້າລົງ.\n\nອຸປະກອນຂອງທ່ານຈະກັບມາເຮັດວຽກຕາມປົກກະຕິເມື່ອເຢັນລົງແລ້ວ."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"ແທັບເລັດຂອງທ່ານຈະພະຍາຍາມເຮັດໃຫ້ເຢັນລົງໂດຍອັດຕະໂນມັດ. ທ່ານຍັງສາມາດໃຊ້ແທັບເລັດຂອງທ່ານໄດ້ຢູ່, ແຕ່ແທັບເລັດອາດເຮັດວຽກຊ້າລົງ.\n\nແທັບເລັດຂອງທ່ານຈະກັບມາເຮັດວຽກຕາມປົກກະຕິເມື່ອເຢັນລົງແລ້ວ."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"ເຊັນເຊີລາຍນິ້ວມືແມ່ນຢູ່ປຸ່ມເປີດປິດ. ມັນເປັນປຸ່ມແປໆທີ່ຢູ່ຖັດຈາກປຸ່ມລະດັບສຽງຢູ່ຂອບຂອງແທັບເລັດ."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"ເຊັນເຊີລາຍນິ້ວມືແມ່ນຢູ່ປຸ່ມເປີດປິດ. ມັນເປັນປຸ່ມແປໆທີ່ຢູ່ຖັດຈາກປຸ່ມລະດັບສຽງຢູ່ຂອບຂອງອຸປະກອນ."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"ເຊັນເຊີລາຍນິ້ວມືແມ່ນຢູ່ປຸ່ມເປີດປິດ. ມັນເປັນປຸ່ມແປໆທີ່ຢູ່ຖັດຈາກປຸ່ມລະດັບສຽງຢູ່ຂອບຂອງໂທລະສັບ."</string> diff --git a/packages/SystemUI/res-product/values-lt/strings.xml b/packages/SystemUI/res-product/values-lt/strings.xml index 3035e4ff510f..989e41173d57 100644 --- a/packages/SystemUI/res-product/values-lt/strings.xml +++ b/packages/SystemUI/res-product/values-lt/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> kart. nesėkmingai bandėte atrakinti telefoną. Darbo profilis bus pašalintas ir visi profilio duomenys bus ištrinti."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai nupiešėte atrakinimo piešinį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. būsite paprašyti atrakinti planšetinį kompiuterį naudodami el. pašto paskyrą.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> kart. netinkamai nupiešėte atrakinimo piešinį. Po dar <xliff:g id="NUMBER_1">%2$d</xliff:g> nesėkm. band. būsite paprašyti atrakinti telefoną naudodami el. pašto paskyrą.\n\n Bandykite dar kartą po <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefonas išjungtas, nes įkaito"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Įrenginys išjungtas, nes įkaito"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Planšetinis komp. išjungtas, nes įkaito"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefonas dabar veikia įprastai.\nPalietę gausite daugiau informacijos"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Įrenginys dabar veikia įprastas.\nPalietę gausite daugiau informacijos"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Planšetinis kompiuteris dabar veikia įprastai.\nPalietę gausite daugiau informacijos"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefonas per daug įkaito, todėl buvo išjungtas, kad atvėstų. Dabar telefonas veikia įprastai.\n\nTelefonas gali per daug įkaisti, jei:\n • esate įjungę daug išteklių naudojančių programų (pvz., žaidimų, vaizdo įrašų arba navigacijos programų);\n • atsisiunčiate arba įkeliate didelius failus;\n • telefoną naudojate esant aukštai temperatūrai."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Įrenginys per daug įkaito, todėl buvo išjungtas, kad atvėstų. Dabar įrenginys veikia įprastai.\n\nĮrenginys gali per daug įkaisti, jei:\n • esate įjungę daug išteklių naudojančių programų (pvz., žaidimų, vaizdo įrašų arba navigacijos programų);\n • atsisiunčiate arba įkeliate didelius failus;\n • įrenginį naudojate esant aukštai temperatūrai."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Planšetinis kompiuteris per daug įkaito, todėl buvo išjungtas, kad atvėstų. Dabar planšetinis kompiuteris veikia įprastai.\n\nPlanšetinis kompiuteris gali per daug įkaisti, jei:\n • esate įjungę daug išteklių naudojančių programų (pvz., žaidimų, vaizdo įrašų arba navigacijos programų);\n • atsisiunčiate arba įkeliate didelius failus;\n • planšetinį kompiuterį naudojate esant aukštai temperatūrai."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefonas kaista"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Įrenginys kaista"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Planšetinis kompiuteris kaista"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Kai kurios funkcijos gali neveikti, kol telefonas vėsta.\nPalietę gausite daugiau informacijos"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Kai kurios funkcijos gali neveikti, kol įrenginys vėsta.\nPalietę gausite daugiau informacijos"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Kai kurios funkcijos gali neveikti, kol planšetinis kompiuteris vėsta.\nPalietę gausite daugiau informacijos"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefonas automatiškai bandys atvėsti. Telefoną vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai telefonas atvės, jis veiks įprastai."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Įrenginys automatiškai bandys atvėsti. Įrenginį vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai įrenginys atvės, jis veiks įprastai."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Planšetinis kompiuteris automatiškai bandys atvėsti. Planšetinį kompiuterį vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai planšetinis kompiuteris atvės, jis veiks įprastai."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Piršto atspaudo jutiklis yra ant maitinimo mygtuko. Tai yra plokščias mygtukas šalia iškilusio garsumo mygtuko ant planšetinio kompiuterio krašto."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Piršto atspaudo jutiklis yra ant maitinimo mygtuko. Tai yra plokščias mygtukas šalia iškilusio garsumo mygtuko ant įrenginio krašto."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Piršto atspaudo jutiklis yra ant maitinimo mygtuko. Tai yra plokščias mygtukas šalia iškilusio garsumo mygtuko ant telefono krašto."</string> diff --git a/packages/SystemUI/res-product/values-lv/strings.xml b/packages/SystemUI/res-product/values-lv/strings.xml index 8e9c064d7ef2..a18076a8c607 100644 --- a/packages/SystemUI/res-product/values-lv/strings.xml +++ b/packages/SystemUI/res-product/values-lv/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Jūs <xliff:g id="NUMBER">%d</xliff:g> reizi(-es) nesekmīgi mēģinājāt atbloķēt tālruni. Darba profils tiks noņemts, kā arī visi profila dati tiks dzēsti."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nepareizi norādījāt atbloķēšanas kombināciju. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> neveiksmīga(-iem) mēģinājuma(-iem) planšetdators būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundes(-ēm)."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Jūs <xliff:g id="NUMBER_0">%1$d</xliff:g> reizi(-es) nepareizi norādījāt atbloķēšanas kombināciju. Pēc vēl <xliff:g id="NUMBER_1">%2$d</xliff:g> nesekmīga(-iem) mēģinājuma(-iem) tālrunis būs jāatbloķē, izmantojot e-pasta kontu.\n\nMēģiniet vēlreiz pēc <xliff:g id="NUMBER_2">%3$d</xliff:g> sekundes(-ēm)."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Tālrunis izslēgts karstuma dēļ"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Ierīce izslēgta karstuma dēļ"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Planšetdators izslēgts karstuma dēļ"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Tagad jūsu tālrunis darbojas normāli.\nPieskarieties, lai uzzinātu vairāk."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Tagad jūsu ierīce darbojas normāli.\nPieskarieties, lai uzzinātu vairāk."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tagad jūsu planšetdators darbojas normāli.\nPieskarieties, lai uzzinātu vairāk."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Jūsu tālrunis bija pārkarsis un tika izslēgts. Tagad tas darbojas normāli.\n\nTālrunis var sakarst, ja:\n • tiek izmantotas lietotnes, kas patērē daudz enerģijas (piem., spēles, video lietotnes vai navigācija);\n • tiek lejupielādēti/augšupielādēti lieli faili;\n • tālrunis tiek lietots augstā temperatūrā."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Jūsu ierīce bija pārkarsusi un tika izslēgta. Tagad tā darbojas normāli.\n\nIerīce var sakarst, ja:\n • tiek izmantotas lietotnes, kas patērē daudz enerģijas (piem., spēles, video lietotnes vai navigācija);\n • tiek lejupielādēti/augšupielādēti lieli faili;\n • ierīce tiek lietota augstā temperatūrā."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Jūsu planšetdators bija pārkarsis un tika izslēgts. Tagad tas darbojas normāli.\n\nPlanšetdators var sakarst, ja:\n • tiek izmantotas lietotnes, kas patērē daudz enerģijas (piem., spēles, video lietotnes vai navigācija);\n • tiek lejupielādēti/augšupielādēti lieli faili;\n • planšetdators tiek lietots augstā temperatūrā."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Tālrunis kļūst silts"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Ierīce kļūst silta"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Planšetdators kļūst silts"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Dažas funkcijas ir ierobežotas, kamēr notiek tālruņa atdzišana.\nPieskarieties, lai uzzinātu vairāk."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Dažas funkcijas ir ierobežotas, kamēr notiek ierīces atdzišana.\nPieskarieties, lai uzzinātu vairāk."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Dažas funkcijas ir ierobežotas, kamēr notiek planšetdatora atdzišana.\nPieskarieties, lai uzzinātu vairāk."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Jūsu tālrunis automātiski mēģinās atdzist. Jūs joprojām varat izmantot tālruni, taču tas, iespējams, darbosies lēnāk.\n\nTiklīdz tālrunis būs atdzisis, tas darbosies normāli."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Jūsu ierīce automātiski mēģinās atdzist. Jūs joprojām varat izmantot ierīci, taču tā, iespējams, darbosies lēnāk.\n\nTiklīdz ierīce būs atdzisusi, tā darbosies normāli."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Jūsu planšetdators automātiski mēģinās atdzist. Jūs joprojām varat izmantot planšetdatoru, taču tas, iespējams, darbosies lēnāk.\n\nTiklīdz planšetdators būs atdzisis, tas darbosies normāli."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Pirksta nospieduma sensors atrodas uz barošanas pogas. Tā ir plakanā poga, kas atrodas blakus augstākai skaļuma pogai planšetdatora sānos."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Pirksta nospieduma sensors atrodas uz barošanas pogas. Tā ir plakanā poga, kas atrodas blakus augstākai skaļuma pogai ierīces sānos."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Pirksta nospieduma sensors atrodas uz barošanas pogas. Tā ir plakanā poga, kas atrodas blakus augstākai skaļuma pogai tālruņa sānos."</string> diff --git a/packages/SystemUI/res-product/values-mk/strings.xml b/packages/SystemUI/res-product/values-mk/strings.xml index 6d34f97a2d87..bb58df28288d 100644 --- a/packages/SystemUI/res-product/values-mk/strings.xml +++ b/packages/SystemUI/res-product/values-mk/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Погрешно се обидовте да го отклучите телефонот <xliff:g id="NUMBER">%d</xliff:g> пати. Работниот профил ќе се отстрани, со што ќе се избришат сите податоци на профилот."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Погрешно ја употребивте вашата шема на отклучување <xliff:g id="NUMBER_0">%1$d</xliff:g> пати. По уште <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни обиди, ќе побараме да го отклучите таблетот со сметка на е-пошта.\n\n Обидете се повторно за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Погрешно ја употребивте вашата шема на отклучување <xliff:g id="NUMBER_0">%1$d</xliff:g> пати. По уште <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешни обиди, ќе побараме да го отклучите телефонот со сметка на е-пошта.\n\n Обидете се повторно за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунди."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Телефонот се исклучи поради загреаност"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Уредот се исклучи поради загреаност"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Таблетот се исклучи поради загреаност"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Сега телефонот работи нормално.\nДопрете за повеќе информации"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Сега уредот работи нормално.\nДопрете за повеќе информации"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Сега таблетот работи нормално.\nДопрете за повеќе информации"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Телефонот беше премногу загреан, така што се исклучи за да се олади. Сега работи нормално.\n\nТелефонот може премногу да се загрее ако:\n • користите апликации што користат многу ресурси (како што се, на пример, апликациите за видеа, навигација или игри)\n • преземате или поставувате големи датотеки\n • го користите телефонот на високи температури"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Уредот беше премногу загреан, така што се исклучи за да се олади. Сега работи нормално.\n\nУредот може премногу да се загрее ако:\n • користите апликации што користат многу ресурси (како што се, на пример, апликациите за видеа, навигација или игри)\n • преземате или прикачувате големи датотеки\n • го користите уредот на високи температури"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Таблетот беше премногу загреан, така што се исклучи за да се олади. Сега работи нормално.\n\nТаблетот може премногу да се загрее ако:\n • користите апликации што користат многу ресурси (како што се, на пример, апликациите за видеа, навигација или игри)\n • преземате или поставувате големи датотеки\n • го користите таблетот на високи температури"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Телефонот се загрева"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Уредот се загрева"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Таблетот се загрева"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Некои функции се ограничени додека телефонот се лади.\nДопрете за повеќе информации"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Некои функции се ограничени додека уредот се лади.\nДопрете за повеќе информации"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Некои функции се ограничени додека таблетот се лади.\nДопрете за повеќе информации"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Телефонот автоматски ќе почне да се лади. Сѐ уште ќе може да го користите, но можно е да работи побавно.\n\nОткако ќе се олади, ќе работи нормално."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Уредот автоматски ќе почне да се лади. Сѐ уште ќе може да го користите, но можно е да работи побавно.\n\nОткако ќе се олади, ќе работи нормално."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Таблетот автоматски ќе почне да се лади. Сѐ уште ќе може да го користите, но можно е да работи побавно.\n\nОткако ќе се олади, ќе работи нормално."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Сензорот за отпечатоци се наоѓа на копчето за вклучување. Тоа е рамното копче веднаш до подигнатото копче за јачина на звук на работ од таблетот."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Сензорот за отпечатоци се наоѓа на копчето за вклучување. Тоа е рамното копче веднаш до подигнатото копче за јачина на звук на работ од уредот."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Сензорот за отпечатоци се наоѓа на копчето за вклучување. Тоа е рамното копче веднаш до подигнатото копче за јачина на звук на работ од телефонот."</string> diff --git a/packages/SystemUI/res-product/values-ml/strings.xml b/packages/SystemUI/res-product/values-ml/strings.xml index d1e7b4b023ec..55cfd0613327 100644 --- a/packages/SystemUI/res-product/values-ml/strings.xml +++ b/packages/SystemUI/res-product/values-ml/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"നിങ്ങൾ <xliff:g id="NUMBER">%d</xliff:g> തവണ തെറ്റായ രീതിയിൽ ഫോൺ അൺലോക്ക് ചെയ്യാൻ ശ്രമിച്ചു. ഔദ്യോഗിക പ്രൊഫൈൽ നീക്കം ചെയ്യപ്പെടുകയും, അതുവഴി എല്ലാ പ്രൊഫൈൽ ഡാറ്റയും ഇല്ലാതാകുകയും ചെയ്യും."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"നിങ്ങൾ <xliff:g id="NUMBER_0">%1$d</xliff:g> തവണ തെറ്റായ രീതിയിൽ അൺലോക്ക് പാറ്റേൺ വരച്ചു. <xliff:g id="NUMBER_1">%2$d</xliff:g> ശ്രമങ്ങൾ കൂടി പരാജയപ്പെട്ടാൽ, ഒരു ഇമെയിൽ അക്കൗണ്ടുപയോഗിച്ച് ടാബ്ലെറ്റ് അൺലോക്ക് ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> സെക്കന്റ് കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"നിങ്ങൾ <xliff:g id="NUMBER_0">%1$d</xliff:g> തവണ തെറ്റായ രീതിയിൽ അൺലോക്ക് പാറ്റേൺ വരച്ചു. <xliff:g id="NUMBER_1">%2$d</xliff:g> ശ്രമങ്ങൾ കൂടി പരാജയപ്പെട്ടാൽ, ഒരു ഇമെയിൽ അക്കൗണ്ടുപയോഗിച്ച് ഫോൺ അൺലോക്ക് ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> സെക്കന്റ് കഴിഞ്ഞ് വീണ്ടും ശ്രമിക്കുക."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ചൂട് കൂടിയതിനാൽ ഫോൺ ഓഫായി"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ചൂട് കൂടിയതിനാൽ ഉപകരണം ഓഫായി"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ചൂട് കൂടിയതിനാൽ ടാബ്ലെറ്റ് ഓഫായി"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"നിങ്ങളുടെ ഫോൺ ഇപ്പോൾ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കുന്നുണ്ട്.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"നിങ്ങളുടെ ഉപകരണം ഇപ്പോൾ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കുന്നുണ്ട്.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"നിങ്ങളുടെ ടാബ്ലെറ്റ് ഇപ്പോൾ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കുന്നുണ്ട്.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ഫോൺ വളരെയധികം ചൂടായതിനാൽ തണുക്കാൻ വേണ്ടിയാണ് ഓഫായത്. ഫോൺ ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നുണ്ട്.\n\nഇനിപ്പറയുന്ന സാഹചര്യങ്ങളിൽ ഫോൺ വളരെയധികം ചൂടായേക്കാം:\n • ഗെയിമിംഗ്, വീഡിയോ അല്ലെങ്കിൽ നാവിഗേഷൻ തുടങ്ങിയ കൂടുതൽ വിഭവങ്ങൾ ഉപയോഗിക്കുന്ന ആപ്പുകൾ ഉപയോഗിക്കുന്നത്\n • വലിയ ഫയലുകൾ അപ്ലോഡോ ഡൗൺലോഡോ ചെയ്യുന്നത്\n • ഉയർന്ന താപനിലയിൽ ഫോൺ ഉപയോഗിക്കുന്നത്"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ഉപകരണം വളരെയധികം ചൂടായതിനാൽ തണുക്കാൻ വേണ്ടിയാണ് ഓഫായത്. ഉപകരണം ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നുണ്ട്.\n\nഇനിപ്പറയുന്ന സാഹചര്യങ്ങളിൽ ഉപകരണം വളരെയധികം ചൂടായേക്കാം:\n • ഗെയിമിംഗ്, വീഡിയോ അല്ലെങ്കിൽ നാവിഗേഷൻ തുടങ്ങിയ കൂടുതൽ വിഭവങ്ങൾ ഉപയോഗിക്കുന്ന ആപ്പുകൾ ഉപയോഗിക്കുന്നത്\n • വലിയ ഫയലുകൾ അപ്ലോഡോ ഡൗൺലോഡോ ചെയ്യുന്നത്\n • ഉയർന്ന താപനിലയിൽ ഉപകരണം ഉപയോഗിക്കുന്നത്"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ടാബ്ലെറ്റ് വളരെയധികം ചൂടായതിനാൽ തണുക്കാൻ വേണ്ടിയാണ് ഓഫായത്. ടാബ്ലെറ്റ് ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നുണ്ട്.\n\nഇനിപ്പറയുന്ന സാഹചര്യങ്ങളിൽ ടാബ്ലെറ്റ് വളരെയധികം ചൂടായേക്കാം:\n • ഗെയിമിംഗ്, വീഡിയോ അല്ലെങ്കിൽ നാവിഗേഷൻ തുടങ്ങിയ കൂടുതൽ വിഭവങ്ങൾ ഉപയോഗിക്കുന്ന ആപ്പുകൾ ഉപയോഗിക്കുന്നത്\n • വലിയ ഫയലുകൾ അപ്ലോഡോ ഡൗൺലോഡോ ചെയ്യുന്നത്\n • ഉയർന്ന താപനിലയിൽ ടാബ്ലെറ്റ് ഉപയോഗിക്കുന്നത്"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ഫോൺ ചൂടാകുന്നു"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ഉപകരണം ചൂടാകുന്നു"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ടാബ്ലെറ്റ് ചൂടാകുന്നു"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ഫോൺ തണുത്തുകൊണ്ടിരിക്കുമ്പോൾ ചില ഫീച്ചറുകൾ പരിമിതപ്പെടുത്തും.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ഉപകരണം തണുത്തുകൊണ്ടിരിക്കുമ്പോൾ ചില ഫീച്ചറുകൾ പരിമിതപ്പെടുത്തും.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ടാബ്ലെറ്റ് തണുത്തുകൊണ്ടിരിക്കുമ്പോൾ ചില ഫീച്ചറുകൾ പരിമിതപ്പെടുത്തും.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"നിങ്ങളുടെ ഫോൺ സ്വയമേവ തണുക്കാൻ ശ്രമിക്കും. നിങ്ങൾക്ക് അപ്പോഴും ഫോൺ ഉപയോഗിക്കാമെങ്കിലും അതിന്റെ പ്രവർത്തനം മന്ദഗതിയിലായിരിക്കാം.\n\nതണുത്തുകഴിഞ്ഞാൽ ഫോൺ സാധാരണപോലെ പ്രവർത്തിക്കും."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"നിങ്ങളുടെ ഉപകരണം സ്വയമേവ തണുക്കാൻ ശ്രമിക്കും. നിങ്ങൾക്ക് അപ്പോഴും ഉപകരണം ഉപയോഗിക്കാമെങ്കിലും അതിന്റെ പ്രവർത്തനം മന്ദഗതിയിലായിരിക്കാം.\n\nതണുത്തുകഴിഞ്ഞാൽ ഉപകരണം സാധാരണപോലെ പ്രവർത്തിക്കും."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"നിങ്ങളുടെ ടാബ്ലെറ്റ് സ്വയമേവ തണുക്കാൻ ശ്രമിക്കും. നിങ്ങൾക്ക് അപ്പോഴും ടാബ്ലെറ്റ് ഉപയോഗിക്കാമെങ്കിലും അതിന്റെ പ്രവർത്തനം മന്ദഗതിയിലായിരിക്കാം.\n\nതണുത്തുകഴിഞ്ഞാൽ ടാബ്ലെറ്റ് സാധാരണപോലെ പ്രവർത്തിക്കും."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"പവർ ബട്ടണിലാണ് ഫിംഗർപ്രിന്റ് സെൻസർ ഉള്ളത്. ടാബ്ലെറ്റിന്റെ അറ്റത്ത് ഉയർന്ന് നിൽക്കുന്ന ശബ്ദ ബട്ടണിന്റെ അടുത്തുള്ള പരന്ന ബട്ടൺ ആണ് ഇത്."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"പവർ ബട്ടണിലാണ് ഫിംഗർപ്രിന്റ് സെൻസർ ഉള്ളത്. ഉപകരണത്തിന്റെ അറ്റത്ത് ഉയർന്ന് നിൽക്കുന്ന ശബ്ദ ബട്ടണിന്റെ അടുത്തുള്ള പരന്ന ബട്ടൺ ആണ് ഇത്."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"പവർ ബട്ടണിലാണ് ഫിംഗർപ്രിന്റ് സെൻസർ ഉള്ളത്. ഫോണിന്റെ അറ്റത്ത് ഉയർന്ന് നിൽക്കുന്ന ശബ്ദ ബട്ടണിന്റെ അടുത്തുള്ള പരന്ന ബട്ടൺ ആണ് ഇത്."</string> diff --git a/packages/SystemUI/res-product/values-mn/strings.xml b/packages/SystemUI/res-product/values-mn/strings.xml index 1cc1a1c05aa4..179e8164cdec 100644 --- a/packages/SystemUI/res-product/values-mn/strings.xml +++ b/packages/SystemUI/res-product/values-mn/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Та утасны түгжээг тайлах оролдлогыг <xliff:g id="NUMBER">%d</xliff:g> удаа буруу хийсэн байна. Ажлын профайлыг устгах бөгөөд ингэснээр профайлын бүх өгөгдлийг устгах болно."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Та тайлах хээгээ <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурсан байна. Дахин <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа буруу зурсны дараа та имэйл бүртгэл ашиглан таблетынхаа түгжээг тайлах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундийн дараа дахин оролдоно уу."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Та тайлах хээгээ <xliff:g id="NUMBER_0">%1$d</xliff:g> удаа буруу зурсан байна. Дахин <xliff:g id="NUMBER_1">%2$d</xliff:g> удаа буруу зурсны дараа та имэйл бүртгэл ашиглан утасныхаа түгжээг тайлах шаардлагатай болно.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> секундийн дараа дахин оролдоно уу."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Халсны улмаас утас унтарсан"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Халсны улмаас төхөөрөмж унтарсан"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Халсны улмаас таблет унтарсан"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Таны утас одоо хэвийн ажиллаж байна.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Таны төхөөрөмж одоо хэвийн ажиллаж байна.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Таны таблет одоо хэвийн ажиллаж байна.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Таны утас хэт халсан тул хөрөхөөр унтарсан. Таны утас одоо хэвийн ажиллаж байна.\n\nТа дараахыг хийсэн тохиолдолд утас тань хэт халж магадгүй:\n • Нөөц их ашигладаг аппуудыг (тоглоом, видео эсвэл навигацын аппууд) ашиглах\n • Том файлууд татах эсвэл байршуулах\n • Утсаа өндөр температурт ашиглах"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Таны төхөөрөмж хэт халсан тул хөрөхөөр унтарсан. Таны төхөөрөмж одоо хэвийн ажиллаж байна.\n\nТа дараахыг хийсэн тохиолдолд төхөөрөмж тань хэт халж магадгүй:\n • Нөөц их ашигладаг аппуудыг (тоглоом, видео эсвэл навигацын аппууд) ашиглах\n • Том файлууд татах эсвэл байршуулах\n • Төхөөрөмжөө өндөр температурт ашиглах"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Таны таблет хэт халсан тул хөрөхөөр унтарсан. Таны таблет одоо хэвийн ажиллаж байна.\n\nТа дараахыг хийсэн тохиолдолд таблет тань хэт халж магадгүй:\n • Нөөц их ашигладаг аппуудыг (тоглоом, видео эсвэл навигацын аппууд) ашиглах\n • Том файлууд татах эсвэл байршуулах\n • Таблетаа өндөр температурт ашиглах"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Утас халж байна"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Төхөөрөмж халж байна"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Таблет халж байна"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Утсыг хөрөх үед зарим онцлогийг хязгаарлана.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Төхөөрөмжийг хөрөх үед зарим онцлогийг хязгаарлана.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Таблетыг хөрөх үед зарим онцлогийг хязгаарлана.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Таны утас хөрөхөөр автоматаар оролдоно. Та утсаа ашиглах боломжтой хэвээр байх хэдий ч энэ нь удаан ажиллаж магадгүй.\n\nТаны утас хөрснийхөө дараа хэвийн ажиллана."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Таны төхөөрөмж хөрөхөөр автоматаар оролдоно. Та төхөөрөмжөө ашиглах боломжтой хэвээр байх хэдий ч энэ нь удаан ажиллаж магадгүй.\n\nТаны төхөөрөмж хөрснийхөө дараа хэвийн ажиллана."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Таны таблет хөрөхөөр автоматаар оролдоно. Та таблетаа ашиглах боломжтой хэвээр байх хэдий ч энэ нь удаан ажиллаж магадгүй.\n\nТаны таблет хөрснийхөө дараа хэвийн ажиллана."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Хурууны хээ мэдрэгч асаах/унтраах товчин дээр байдаг. Энэ нь таблетын ирмэг дээрх дууны түвшний товгор товчлуурын хажууд байх хавтгай товчлуур юм."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Хурууны хээ мэдрэгч асаах/унтраах товчин дээр байдаг. Энэ нь төхөөрөмжийн ирмэг дээрх дууны түвшний товгор товчлуурын хажууд байх хавтгай товчлуур юм."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Хурууны хээ мэдрэгч асаах/унтраах товчин дээр байдаг. Энэ нь утасны ирмэг дээрх дууны түвшний товгор товчлуурын хажууд байх хавтгай товчлуур юм."</string> diff --git a/packages/SystemUI/res-product/values-mr/strings.xml b/packages/SystemUI/res-product/values-mr/strings.xml index 33c3eb4e46bc..821b303dc182 100644 --- a/packages/SystemUI/res-product/values-mr/strings.xml +++ b/packages/SystemUI/res-product/values-mr/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"तुम्ही फोन अनलॉक करण्याचा <xliff:g id="NUMBER">%d</xliff:g> वेळा चुकीच्या पद्धतीने प्रयत्न केला आहे. कार्य प्रोफाइल काढली जाईल, त्यामुळे सर्व प्रोफाइल डेटा हटवला जाईल."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"तुम्ही तुमचा अनलॉक पॅटर्न <xliff:g id="NUMBER_0">%1$d</xliff:g> वेळा चुकीच्या पद्धतीने काढला आहे. आणखी <xliff:g id="NUMBER_1">%2$d</xliff:g> अयशस्वी प्रयत्नांनंतर, तुम्हाला ईमेल खाते वापरून तुमचा टॅबलेट अनलॉक करण्यास सांगितले जाईल.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"तुम्ही तुमचा अनलॉक पॅटर्न <xliff:g id="NUMBER_0">%1$d</xliff:g> वेळा चुकीच्या पद्धतीने काढला आहे. आणखी <xliff:g id="NUMBER_1">%2$d</xliff:g> अयशस्वी प्रयत्नांनंतर, तुम्हाला ईमेल खाते वापरून तुमचा फोन अनलॉक करण्यास सांगितले जाईल.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकंदांमध्ये पुन्हा प्रयत्न करा."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"खूप गरम झाल्यामुळे फोन बंद झाला"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"खूप गरम झाल्यामुळे डिव्हाइस बंद झाले"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"खूप गरम झाल्यामुळे टॅबलेट बंद झाला"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"तुमचा फोन आता सामान्यपणे रन होत आहे.\nअधिक माहितीसाठी टॅप करा"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"तुमचे डिव्हाइस आता सामान्यपणे रन होत आहे.\nअधिक माहितीसाठी टॅप करा"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"तुमचा टॅबलेट आता सामान्यपणे रन होत आहे.\nअधिक माहितीसाठी टॅप करा"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"तुमचा फोन खूप गरम झाला होता, म्हणून तो थंड होण्यासाठी बंद झाला आहे. तुमचा फोन आता सामान्यपणे रन होत आहे.\n\nतुम्ही पुढील गोष्टी केल्यास तुमचा फोन खूप गरम होऊ शकतो:\n •स्रोत इंटेन्सिव्ह अॅप्स वापरणे (जसे की गेमिंग, व्हिडिओ किंवा नेव्हिगेशन यांसारखी अॅप्स)\n •मोठ्या फाइल डाउनलोड किंवा अपलोड करणे\n •तुमचा फोन उच्च तापमानांमध्ये वापरणे"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"तुमचे डिव्हाइस खूप गरम झाले होते, म्हणून ते थंड होण्यासाठी बंद झाले आहे. तुमचे डिव्हाइस आता सामान्यपणे रन होत आहे.\n\nतुम्ही पुढील गोष्टी केल्यास तुमचे डिव्हाइस खूप गरम होऊ शकते:\n •स्रोत इंटेन्सिव्ह अॅप्स वापरणे (जसे की गेमिंग, व्हिडिओ किंवा नेव्हिगेशन यांसारखी अॅप्स)\n •मोठ्या फाइल डाउनलोड किंवा अपलोड करणे\n •तुमचे डिव्हाइस उच्च तापमानांमध्ये वापरणे"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"तुमचा टॅबलेट खूप गरम झाला होता, म्हणून तो थंड होण्यासाठी बंद झाला आहे. तुमचा टॅबलेट आता सामान्यपणे रन होत आहे.\n\nतुम्ही पुढील गोष्टी केल्यास तुमचा टॅबलेट खूप गरम होऊ शकतो:\n •स्रोत इंटेन्सिव्ह अॅप्स वापरणे (जसे की गेमिंग, व्हिडिओ किंवा नेव्हिगेशन यांसारखी अॅप्स)\n •मोठ्या फाइल डाउनलोड किंवा अपलोड करणे\n •तुमचा टॅबलेट उच्च तापमानांमध्ये वापरणे"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"फोन गरम होत आहे"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"डिव्हाइस गरम होत आहे"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"टॅबलेट गरम होत आहे"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"फोन थंड होईपर्यंत काही वैशिष्ट्ये मर्यादित केली आहेत.\nअधिक माहितीसाठी टॅप करा"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"डिव्हाइस थंड होईपर्यंत काही वैशिष्ट्ये मर्यादित केली आहेत.\nअधिक माहितीसाठी टॅप करा"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"टॅबलेट थंड होईपर्यंत काही वैशिष्ट्ये मर्यादित केली आहेत.\nअधिक माहितीसाठी टॅप करा"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"तुमचा फोन आपोआप थंड होण्याचा प्रयत्न करेल. तुम्ही तरीही तुमचा फोन वापरू शकता, पण तो कदाचित धीम्या गतीने रन होईल.\n\nतुमचा फोन थंड झाल्यानंतर तो सामान्यपणे काम करेल."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"तुमचे डिव्हाइस आपोआप थंड होण्याचा प्रयत्न करेल. तुम्ही तरीही तुमचे डिव्हाइस वापरू शकता, पण ते कदाचित धीम्या गतीने रन होईल.\n\nतुमचे डिव्हाइस थंड झाल्यानंतर ते सामान्यपणे काम करेल."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"तुमचा टॅबलेट आपोआप थंड होण्याचा प्रयत्न करेल. तुम्ही तरीही तुमचा टॅबलेट वापरू शकता, पण तो कदाचित धीम्या गतीने रन होईल.\n\nतुमचा टॅबलेट थंड झाल्यानंतर तो सामान्यपणे काम करेल."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"फिंगरप्रिंट सेन्सर हे पॉवर बटणावर आहे. टॅबलेटच्या कडेला वर आलेल्या व्हॉल्यूम बटणाच्या बाजूला असलेले सपाट बटण म्हणजे पॉवर बटण."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"फिंगरप्रिंट सेन्सर हे पॉवर बटणावर आहे. डिव्हाइसच्या कडेला वरती आलेल्या व्हॉल्यूम बटणाच्या बाजूला असलेले सपाट बटण म्हणजे पॉवर बटण."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"फिंगरप्रिंट सेन्सर हे पॉवर बटणावर आहे. फोनच्या कडेला वर आलेल्या व्हॉल्यूम बटणाच्या बाजूला असलेले सपाट बटण म्हणजे पॉवर बटण."</string> diff --git a/packages/SystemUI/res-product/values-ms/strings.xml b/packages/SystemUI/res-product/values-ms/strings.xml index e1e69761caf9..ee10626c5a1d 100644 --- a/packages/SystemUI/res-product/values-ms/strings.xml +++ b/packages/SystemUI/res-product/values-ms/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Anda telah salah membuka kunci telefon sebanyak <xliff:g id="NUMBER">%d</xliff:g> kali. Profil kerja ini akan dialih keluar sekali gus memadamkan semua data profil."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, anda akan diminta membuka kunci tablet anda menggunakan akaun e-mel.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> saat."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Anda telah tersilap lukis corak buka kunci sebanyak <xliff:g id="NUMBER_0">%1$d</xliff:g> kali. Selepas <xliff:g id="NUMBER_1">%2$d</xliff:g> lagi percubaan yang gagal, anda akan diminta membuka kunci telefon anda menggunakan akaun e-mel.\n\n Cuba lagi dalam <xliff:g id="NUMBER_2">%3$d</xliff:g> saat."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon dimatikan kerana panas"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Peranti dimatikan kerana panas"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet dimatikan kerana panas"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Kini telefon anda berjalan seperti biasa.\nKetik untuk mendapatkan maklumat lanjut"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Kini peranti anda berjalan seperti biasa.\nKetik untuk mendapatkan maklumat lanjut"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Kini tablet anda berjalan seperti biasa.\nKetik untuk mendapatkan maklumat lanjut"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon anda terlalu panas, oleh yang demikian telefon itu telah dimatikan untuk menyejuk. Sekarang, telefon anda berjalan seperti biasa.\n\nTelefon anda mungkin menjadi terlalu panas jika anda:\n • Menggunakan apl intensif sumber (seperti permainan, video atau apl navigasi)\n • Memuat turun atau memuat naik fail besar\n • Menggunakan telefon anda dalam suhu tinggi"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Peranti anda terlalu panas, oleh yang demikian peranti itu telah dimatikan untuk menyejuk. Sekarang, peranti anda berjalan seperti biasa.\n\nPeranti anda mungkin menjadi terlalu panas jika anda:\n • Menggunakan apl intensif sumber (seperti permainan, video atau apl navigasi)\n • Memuat turun atau memuat naik fail besar\n • Menggunakan peranti anda dalam suhu tinggi"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablet anda terlalu panas, oleh yang demikian tablet itu telah dimatikan untuk menyejuk. Sekarang, tablet anda berjalan seperti biasa.\n\nTablet anda mungkin menjadi terlalu panas jika anda:\n • Menggunakan apl intensif sumber (seperti permainan, video atau apl navigasi)\n • Memuat turun atau memuat naik fail besar\n • Menggunakan tablet anda dalam suhu tinggi"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon semakin panas"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Peranti semakin panas"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet semakin panas"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Sesetengah ciri adalah terhad semasa telefon menyejuk.\nKetik untuk mendapatkan maklumat lanjut"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Sesetengah ciri adalah terhad semasa peranti menyejuk.\nKetik untuk mendapatkan maklumat lanjut"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Sesetengah ciri adalah terhad semasa tablet menyejuk.\nKetik untuk mendapatkan maklumat lanjut"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefon anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan telefon itu tetapi telefon tersebut mungkin berjalan lebih perlahan.\n\nSetelah telefon anda sejuk, telefon itu akan berjalan seperti biasa."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Peranti anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan peranti anda tetapi peranti tersebut mungkin berjalan lebih perlahan.\n\nSetelah peranti anda sejuk, peranti itu akan berjalan seperti biasa."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablet anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan tablet itu tetapi tablet tersebut mungkin berjalan lebih perlahan.\n\nSetelah tablet anda sejuk, tablet itu akan berjalan seperti biasa."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Penderia cap jari berada pada butang kuasa. Penderia cap jari ialah butang leper yang terletak bersebelahan butang kelantangan timbul pada bahagian tepi tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Penderia cap jari berada pada butang kuasa. Penderia cap jari ialah butang leper yang terletak bersebelahan butang kelantangan timbul pada bahagian tepi peranti."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Penderia cap jari berada pada butang kuasa. Penderia cap jari ialah butang leper yang terletak bersebelahan butang kelantangan timbul pada bahagian tepi telefon."</string> diff --git a/packages/SystemUI/res-product/values-my/strings.xml b/packages/SystemUI/res-product/values-my/strings.xml index 68711e8fa0ee..9a6169239c6b 100644 --- a/packages/SystemUI/res-product/values-my/strings.xml +++ b/packages/SystemUI/res-product/values-my/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ဖုန်းကို <xliff:g id="NUMBER">%d</xliff:g> ကြိမ် မှားယွင်းစွာ လော့ခ်ဖွင့်ရန် ကြိုးစားခဲ့ပါသည်။ အလုပ်ပရိုဖိုင်ကို ဖယ်ရှားလိုက်မည်ဖြစ်ပြီး ပရိုဖိုင်ဒေတာ အားလုံးကိုလည်း ဖျက်လိုက်ပါမည်။"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"သင်သည် သင်၏ လော့ခ်ဖွင့်ခြင်းပုံစံကို <xliff:g id="NUMBER_0">%1$d</xliff:g> ကြိမ် မှားယွင်းစွာ ဆွဲခဲ့ပါသည်။ <xliff:g id="NUMBER_1">%2$d</xliff:g> ကြိမ် ထပ်မံမှားယွင်းပြီးသည့်နောက်တွင် သင့်အီးမေးလ်အကောင့်အား အသုံးပြု၍ တက်ဘလက်ကို လော့ခ်ဖွင့်ရန် တောင်းဆိုသွားပါမည်။\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်ပါ။"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"သင်သည် သင်၏ လော့ခ်ဖွင့်ခြင်းပုံစံကို <xliff:g id="NUMBER_0">%1$d</xliff:g> ကြိမ် မှားယွင်းစွာ ဆွဲခဲ့ပါသည်။ <xliff:g id="NUMBER_1">%2$d</xliff:g> ကြိမ် ထပ်မံမှားယွင်းပြီးသည့်နောက်တွင် သင့်အီးမေးလ်အကောင့်အား အသုံးပြု၍ ဖုန်းကို လော့ခ်ဖွင့်ရန် တောင်းဆိုသွားပါမည်။\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> စက္ကန့်အကြာတွင် ထပ်စမ်းကြည့်ပါ။"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"အပူရှိန်ကြောင့် ဖုန်းပိတ်သွားသည်"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"အပူရှိန်ကြောင့် စက်ပစ္စည်းပိတ်သွားသည်"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"အပူရှိန်ကြောင့် တက်ဘလက်ပိတ်သွားသည်"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"သင့်ဖုန်းသည် ယခု ပုံမှန်လုပ်ဆောင်နေပါပြီ။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"သင့်စက်ပစ္စည်းသည် ယခု ပုံမှန်လုပ်ဆောင်နေပါပြီ။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"သင့်တက်ဘလက်သည် ယခု ပုံမှန်လုပ်ဆောင်နေပါပြီ။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"သင့်ဖုန်းအလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် လုပ်ဆောင်နေပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် အလွန်ပူလာနိုင်သည်-\n • ရင်းမြစ်အထူးစိုက်ထုတ်ရသော အက်ပ်များကို သုံးခြင်း (ဂိမ်းကစားခြင်း၊ ဗီဒီယို (သို့) လမ်းညွှန်အက်ပ်များ ကဲ့သို့)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် ဖုန်းကိုသုံးခြင်း"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"သင့်စက်ပစ္စည်း အလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် လုပ်ဆောင်နေပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် အလွန်ပူလာနိုင်သည်-\n • ရင်းမြစ်အထူးစိုက်ထုတ်ရသော အက်ပ်များကို သုံးခြင်း (ဂိမ်းကစားခြင်း၊ ဗီဒီယို (သို့) လမ်းညွှန်အက်ပ်များကဲ့သို့)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် စက်ပစ္စည်းကိုသုံးခြင်း"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"သင့်တက်ဘလက်အလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် လုပ်ဆောင်နေပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် အလွန်ပူလာနိုင်သည်-\n • ရင်းမြစ်အထူးစိုက်ထုတ်ရသော အက်ပ်များကို သုံးခြင်း (ဂိမ်းကစားခြင်း၊ ဗီဒီယို (သို့) လမ်းညွှန်အက်ပ်များကဲ့သို့)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် တက်ဘလက်ကိုသုံးခြင်း"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ဖုန်း ပူနွေးလာပါပြီ"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"စက်ပစ္စည်း ပူနွေးလာပါပြီ"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"တက်ဘလက် ပူနွေးလာပါပြီ"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ဖုန်း ပြန်အေးလာစဉ် အင်္ဂါရပ်အချို့ကို ကန့်သတ်ထားပါသည်။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"စက်ပစ္စည်း ပြန်အေးလာစဉ် အင်္ဂါရပ်အချို့ကို ကန့်သတ်ထားပါသည်။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"တက်ဘလက် ပြန်အေးလာစဉ် အင်္ဂါရပ်အချို့ကို ကန့်သတ်ထားပါသည်။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"သင့်ဖုန်းသည် အလိုအလျောက် ပြန်အေးသွားပါမည်။ ဖုန်းကို အသုံးပြုနိုင်သေးသော်လည်း ပိုနှေးသွားနိုင်ပါသည်။\n\nဖုန်း အေးသွားသည့်အခါ ပုံမှန်အတိုင်း ပြန်လုပ်ဆောင်လိမ့်မည်။"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"သင့်စက်ပစ္စည်းသည် အလိုအလျောက် ပြန်အေးသွားပါမည်။ စက်ပစ္စည်းကို အသုံးပြုနိုင်သေးသော်လည်း ပိုနှေးသွားနိုင်ပါသည်။\n\nစက်ပစ္စည်း အေးသွားသည့်အခါ ပုံမှန်အတိုင်း ပြန်လုပ်ဆောင်လိမ့်မည်။"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"သင့်တက်ဘလက်သည် အလိုအလျောက် ပြန်အေးသွားပါမည်။ တက်ဘလက်ကို အသုံးပြုနိုင်သေးသော်လည်း ပိုနှေးသွားနိုင်ပါသည်။\n\nတက်ဘလက် အေးသွားသည့်အခါ ပုံမှန်အတိုင်း ပြန်လုပ်ဆောင်လိမ့်မည်။"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"လက်ဗွေ အာရုံခံကိရိယာသည် ဖွင့်ပိတ်ခလုတ်ပေါ်တွင် ရှိသည်။ တက်ဘလက်၏ဘေးဘက်ရှိ အသံထိန်းခလုတ်ဖုသီးနှင့် ကပ်လျက်မှ ခလုတ်ပြားဖြစ်သည်။"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"လက်ဗွေ အာရုံခံကိရိယာသည် ဖွင့်ပိတ်ခလုတ်ပေါ်တွင် ရှိသည်။ စက်၏ဘေးဘက်ရှိ အသံထိန်းခလုတ်ဖုသီးနှင့် ကပ်လျက်မှ ခလုတ်ပြားဖြစ်သည်။"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"လက်ဗွေ အာရုံခံကိရိယာသည် ဖွင့်ပိတ်ခလုတ်ပေါ်တွင် ရှိသည်။ ဖုန်း၏ဘေးဘက်ရှိ အသံထိန်းခလုတ်ဖုသီးနှင့် ကပ်လျက်မှ ခလုတ်ပြားဖြစ်သည်။"</string> diff --git a/packages/SystemUI/res-product/values-nb/strings.xml b/packages/SystemUI/res-product/values-nb/strings.xml index 4b16a43c8f09..533a9b8822b5 100644 --- a/packages/SystemUI/res-product/values-nb/strings.xml +++ b/packages/SystemUI/res-product/values-nb/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du har gjort feil i forsøket på å låse opp telefonen <xliff:g id="NUMBER">%d</xliff:g> ganger. Jobbprofilen blir fjernet, og alle profildataene blir slettet."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du har tegnet opplåsingsmønsteret feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk blir du bedt om å låse opp nettbrettet via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du har tegnet opplåsingsmønsteret feil <xliff:g id="NUMBER_0">%1$d</xliff:g> ganger. Etter ytterligere <xliff:g id="NUMBER_1">%2$d</xliff:g> nye mislykkede forsøk blir du bedt om å låse opp telefonen via en e-postkonto.\n\n Prøv på nytt om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefonen ble slått av på grunn av varme"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Enheten ble slått av på grunn av varme"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Nettbrett ble slått av på grunn av varme"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefonen kjører nå som normalt.\nTrykk for å se mer informasjon"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Enheten kjører nå som normalt.\nTrykk for å se mer informasjon"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Nettbrettet kjører nå som normalt.\nTrykk for å se mer informasjon"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefonen var for varm, så den ble slått av for å kjøles ned. Den kjører nå som normalt.\n\nTelefonen kan blir for varm hvis du\n • bruker ressurskrevende apper (for eksempel spill-, video- eller navigeringsapper)\n • laster store filer opp eller ned\n • bruker den ved høy temperatur"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Enheten var for varm, så den ble slått av for å kjøles ned. Den kjører nå som normalt.\n\nEnheten kan blir for varm hvis du\n • bruker ressurskrevende apper (for eksempel spill-, video- eller navigeringsapper)\n • laster store filer opp eller ned\n • bruker den ved høy temperatur"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Nettbrettet var for varmt, så det ble slått av for å kjøles ned. Det kjører nå som normalt.\n\nNettbrettet kan blir for varmt hvis du\n • bruker ressurskrevende apper (for eksempel spill-, video- eller navigeringsapper)\n • laster store filer opp eller ned\n • bruker det ved høy temperatur"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefonen begynner å bli varm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Enheten begynner å bli varm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Nettbrett begynner å bli varmt"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Enkelte funksjoner er begrenset mens telefonen kjøles ned.\nTrykk for å se mer informasjon"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Enkelte funksjoner er begrenset mens enheten kjøles ned.\nTrykk for å se mer informasjon"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Enkelte funksjoner er begrenset mens nettbrettet kjøles ned.\nTrykk for å se mer informasjon"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefonen prøver automatisk å kjøle seg ned. Du kan fremdeles bruke den, men den kjører muligens saktere.\n\nNår telefonen har kjølt seg ned, kjører den som normalt."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Enheten prøver automatisk å kjøle seg ned. Du kan fremdeles bruke den, men den kjører muligens saktere.\n\nNår enheten har kjølt seg ned, kjører den som normalt."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Nettbrettet prøver automatisk å kjøle seg ned. Du kan fremdeles bruke det, men det kjører muligens saktere.\n\nNår nettbrettet har kjølt seg ned, kjører det som normalt."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Fingeravtrykkssensoren er på av/på-knappen. Det er den flate knappen ved siden av den hevede volumknappen på siden av nettbrettet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Fingeravtrykkssensoren er på av/på-knappen. Det er den flate knappen ved siden av den hevede volumknappen på siden av enheten."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Fingeravtrykkssensoren er på av/på-knappen. Det er den flate knappen ved siden av den hevede volumknappen på siden av telefonen."</string> diff --git a/packages/SystemUI/res-product/values-ne/strings.xml b/packages/SystemUI/res-product/values-ne/strings.xml index 7276e232ee26..274b72a7fbc7 100644 --- a/packages/SystemUI/res-product/values-ne/strings.xml +++ b/packages/SystemUI/res-product/values-ne/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"तपाईंले <xliff:g id="NUMBER">%d</xliff:g> पटक गलत तरिकाले फोन अनलक गर्ने प्रयास गर्नुभएको छ। कार्य प्रोफाइललाई यसका सबै डेटा मेटिने गरी हटाइने छ।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"तपाईंले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक आफ्नो अनलक गर्ने ढाँचा गलत रूपमा कोर्नुभयो। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> पटक असफल प्रयास गरेपछि, तपाईंलाई एउटा इमेल खाता प्रयोग गरेर आफ्नो ट्याब्लेट अनलक गर्न आग्रह गरिने छ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"तपाईंले <xliff:g id="NUMBER_0">%1$d</xliff:g> पटक आफ्नो अनलक गर्ने ढाँचा गलत रूपमा कोर्नुभयो। थप <xliff:g id="NUMBER_1">%2$d</xliff:g> पटक असफल प्रयास गरेपछि, तपाईंलाई एउटा इमेल खाता प्रयोग गरेर आफ्नो फोन अनलक गर्न आग्रह गरिने छ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> सेकेन्डमा फेरि प्रयास गर्नुहोस्।"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"तातिएका कारण फोन अफ भयो"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"तातिएका कारण डिभाइस अफ भयो"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"तातिएका कारण ट्याब्लेट अफ भयो"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"तपाईंको फोन अहिले सामान्य रूपमा चलिरहेको छ।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"तपाईंको डिभाइस अहिले सामान्य रूपमा चलिरहेको छ।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"तपाईंको ट्याब्लेट अहिले सामान्य रूपमा चलिरहेको छ।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"तपाईंको फोन अत्यधिक तातेका कारण सेलाउनका लागि अफ भयो। तपाईंको फोन अहिले सामान्य रूपमा चल्दै छ।\n\nतपाईंले निम्न कुरा गर्नुभयो भने तपाईंको फोन अत्यधिक तात्न सक्छ:\n • धेरै स्रोत प्रयोग गर्ने एपहरू (गेमिङ, भिडियो वा नेभिगेसन एप जस्ता) प्रयोग गर्दा\n • ठुला फाइलहरू डाउनलोड वा अपलोड गर्दा\n • उच्च तापक्रममा फोन प्रयोग गर्दा"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"तपाईंको डिभाइस अत्यधिक तातेका कारण सेलाउनका लागि अफ भयो। तपाईंको डिभाइस अहिले सामान्य रूपमा चल्दै छ।\n\nतपाईंले निम्न कुरा गर्नुभयो भने तपाईंको डिभाइस अत्यधिक तात्न सक्छ:\n • धेरै स्रोत प्रयोग गर्ने एपहरू (गेमिङ, भिडियो वा नेभिगेसन एप जस्ता) प्रयोग गर्दा\n • ठुला फाइलहरू डाउनलोड वा अपलोड गर्दा\n •उच्च तापक्रममा डिभाइस प्रयोग गर्दा"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"तपाईंको ट्याब्लेट अत्यधिक तातेका कारण सेलाउनका लागि अफ भयो। तपाईंको ट्याब्लेट अहिले सामान्य रूपमा चल्दै छ।\n\nतपाईंले निम्न कुरा गर्नुभयो भने तपाईंको ट्याब्लेट अत्यधिक तात्न सक्छ:\n •धेरै स्रोत प्रयोग गर्ने एपहरू (गेमिङ, भिडियो वा नेभिगेसन एप जस्ता) प्रयोग गर्दा \n • ठुला फाइलहरू डाउनलोड वा अपलोड गर्दा\n • उच्च तापक्रममा ट्याब्लेट प्रयोग गर्दा"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"फोन तात्न थालेको छ"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"डिभाइस तात्न थालेको छ"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ट्याब्लेट तात्न थालेको छ"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"फोन सेलाउने क्रममा गर्दा केही सुविधाहरू उपलब्ध हुँदैनन्।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"डिभाइस सेलाउने क्रममा केही सुविधाहरू उपलब्ध हुँदैनन्।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ट्याब्लेट सेलाउने क्रममा केही सुविधाहरू उपलब्ध हुँदैनन्।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"तपाईंको फोनले स्वतः सेलाउने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो फोन प्रयोग गर्न सक्नुहुन्छ तर उक्त फोन अलि सुस्त चल्न सक्छ।\n\nसेलाइसकेपछि भने तपाईंको फोन पहिले जस्तै राम्ररी चल्न थाल्ने छ।"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"तपाईंको डिभाइसले स्वतः सेलाउने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो डिभाइस प्रयोग गर्न सक्नुहुन्छ तर उक्त डिभाइस अलि सुस्त चल्न सक्छ।\n\nसेलाइसकेपछि भने तपाईंको डिभाइस पहिले जस्तै राम्ररी चल्न थाल्ने छ।"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"तपाईंको ट्याब्लेटले स्वतः सेलाउने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो ट्याब्लेट प्रयोग गर्न सक्नुहुन्छ तर उक्त ट्याब्लेट अलि सुस्त चल्न सक्छ।\n\nसेलाइसकेपछि भने तपाईंको ट्याब्लेट पहिले जस्तै राम्ररी चल्न थाल्ने छ।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"फिंगरप्रिन्ट सेन्सर पावर बटनमा हुन्छ। यो ट्याब्लेटको किनारामा रहेको थोरै उचालिएको भोल्युम बटनको छेउमा रहेको चेप्टो बटन नै पावर बटन हो।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"फिंगरप्रिन्ट सेन्सर पावर बटनमा हुन्छ। यो डिभाइसको किनारामा रहेको थोरै उचालिएको भोल्युम बटनको छेउमा रहेको चेप्टो बटन नै पावर बटन हो।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"फिंगरप्रिन्ट सेन्सर पावर बटनमा हुन्छ। यो फोनको किनारामा रहेको थोरै उचालिएको भोल्युम बटनको छेउमा रहेको चेप्टो बटन नै पावर बटन हो।"</string> diff --git a/packages/SystemUI/res-product/values-nl/strings.xml b/packages/SystemUI/res-product/values-nl/strings.xml index 70cd0a44c174..abdc7eefe2b0 100644 --- a/packages/SystemUI/res-product/values-nl/strings.xml +++ b/packages/SystemUI/res-product/values-nl/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Je hebt <xliff:g id="NUMBER">%d</xliff:g> mislukte pogingen ondernomen om de telefoon te ontgrendelen. Het werkprofiel wordt verwijderd, waardoor alle profielgegevens worden verwijderd."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt je gevraagd je tablet te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%3$d</xliff:g> seconden opnieuw."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Je hebt je ontgrendelingspatroon <xliff:g id="NUMBER_0">%1$d</xliff:g> keer onjuist getekend. Na nog eens <xliff:g id="NUMBER_1">%2$d</xliff:g> mislukte pogingen wordt je gevraagd je telefoon te ontgrendelen via een e-mailaccount.\n\n Probeer het over <xliff:g id="NUMBER_2">%3$d</xliff:g> seconden opnieuw."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefoon uitgezet wegens hitte"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Apparaat uitgezet wegens hitte"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet uitgezet wegens hitte"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Je telefoon functioneert nu weer zoals normaal.\nTik voor meer informatie"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Je apparaat functioneert nu weer zoals normaal.\nTik voor meer informatie"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Je tablet functioneert nu weer zoals normaal.\nTik voor meer informatie"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Je telefoon was te warm en is uitgezet om af te koelen. Je telefoon presteert nu weer zoals normaal.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Je apparaat was te warm en is uitgezet om af te koelen. Je apparaat presteert nu weer zoals normaal.\n\nJe apparaat kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je apparaat gebruikt bij hoge temperaturen."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Je tablet was te warm en is uitgezet om af te koelen. Je tablet presteert nu weer zoals normaal.\n\nJe tablet kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je tablet gebruikt bij hoge temperaturen."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"De telefoon wordt warm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Het apparaat wordt warm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"De tablet wordt warm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Bepaalde functies zijn beperkt terwijl de telefoon afkoelt.\nTik voor meer informatie"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Bepaalde functies zijn beperkt terwijl het apparaat afkoelt.\nTik voor meer informatie"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Bepaalde functies zijn beperkt terwijl de tablet afkoelt.\nTik voor meer informatie"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Je telefoon probeert automatisch af te koelen. Je kunt je telefoon nog steeds gebruiken, maar deze kan langzamer werken.\n\nZodra de telefoon is afgekoeld, werkt deze weer normaal."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Je apparaat probeert automatisch af te koelen. Je kunt je apparaat nog steeds gebruiken, maar het kan langzamer werken.\n\nZodra het apparaat is afgekoeld, werkt het weer normaal."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Je tablet probeert automatisch af te koelen. Je kunt je tablet nog steeds gebruiken, maar deze kan langzamer werken.\n\nZodra de tablet is afgekoeld, werkt deze weer normaal."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Je vindt de vingerafdruksensor op de aan/uit-knop. Het is de platte knop naast de verhoogde volumeknop aan de zijkant van de tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Je vindt de vingerafdruksensor op de aan/uit-knop. Het is de platte knop naast de verhoogde volumeknop aan de zijkant van het apparaat."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Je vindt de vingerafdruksensor op de aan/uit-knop. Het is de platte knop naast de verhoogde volumeknop aan de zijkant van de telefoon."</string> diff --git a/packages/SystemUI/res-product/values-or/strings.xml b/packages/SystemUI/res-product/values-or/strings.xml index f3e8d2fa9e3e..5d9345b9c73a 100644 --- a/packages/SystemUI/res-product/values-or/strings.xml +++ b/packages/SystemUI/res-product/values-or/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ଆପଣ ଫୋନ୍କୁ ଅନ୍ଲକ୍ କରିବାକୁ<xliff:g id="NUMBER">%d</xliff:g>ଥର ଭୁଲ ପ୍ରୟାସ କରିଛନ୍ତି। କାର୍ଯ୍ୟ ପ୍ରୋଫାଇଲ୍ ବାହାର କରିଦିଆଯିବ, ଯାହା ଫଳରେ ସମସ୍ତ ପ୍ରୋଫାଇଲ୍ ଡାଟା ଡିଲିଟ୍ ହେବ।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ଆପଣ ଆପଣଙ୍କ ଅନ୍ଲକ୍ ପାଟର୍ନକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ଡ୍ର କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଆପଣଙ୍କୁ ଏକ ଇମେଲ୍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ଆପଣଙ୍କ ଟାବ୍ଲୋଟ୍କୁ ଅନ୍ଲକ୍ କରିବା ପାଇଁ କୁହାଯିବ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ଆପଣ ଆପଣଙ୍କ ଅନ୍ଲକ୍ ପାଟର୍ନକୁ <xliff:g id="NUMBER_0">%1$d</xliff:g>ଥର ଭୁଲ ଭାବେ ଡ୍ର କରିଛନ୍ତି। ଆଉ <xliff:g id="NUMBER_1">%2$d</xliff:g>ଟି ଭୁଲ ପ୍ରୟାସ ପରେ ଆପଣଙ୍କୁ ଏକ ଇମେଲ୍ ଆକାଉଣ୍ଟ ବ୍ୟବହାର କରି ଆପଣଙ୍କ ଫୋନ୍କୁ ଅନ୍ଲକ୍ କରିବା ପାଇଁ କୁହାଯିବ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ସେକେଣ୍ଡ ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ଗରମ ହେବା ଯୋଗୁଁ ଫୋନଟି ବନ୍ଦ ହୋଇଯାଇଛି"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ଗରମ ହେବା ଯୋଗୁଁ ଡିଭାଇସଟି ବନ୍ଦ ହୋଇଯାଇଛି"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ଗରମ ହେବା ଯୋଗୁଁ ଟାବଲେଟଟି ବନ୍ଦ ହୋଇଯାଇଛି"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"ଆପଣଙ୍କ ଫୋନ ବର୍ତ୍ତମାନ ସ୍ୱାଭାବିକ ଭାବେ ଚାଲୁଛି।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"ଆପଣଙ୍କ ଡିଭାଇସ ବର୍ତ୍ତମାନ ସ୍ୱାଭାବିକ ଭାବେ ଚାଲୁଛି।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"ଆପଣଙ୍କ ଟାବଲେଟ ବର୍ତ୍ତମାନ ସ୍ୱାଭାବିକ ଭାବେ ଚାଲୁଛି।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ଆପଣଙ୍କ ଫୋନଟି ଅତ୍ୟଧିକ ଗରମ ଥିବା ଯୋଗୁଁ ଥଣ୍ଡା କରାଯିବାକୁ ଏହାକୁ ବନ୍ଦ କରାଯାଇଛି। ଆପଣଙ୍କ ଫୋନ ବର୍ତ୍ତମାନ ସ୍ୱାଭାବିକ ଭାବେ ଚାଲୁଛି।\n\nଆପଣଙ୍କ ଫୋନ ଅତ୍ୟଧିକ ଗରମ ହୋଇଯାଇପାରେ ଯଦି ଆପଣ:\n • ରିସୋର୍ସ-ଇଣ୍ଟେନସିଭ ଆପ୍ସ (ଯେପରି ଗେମିଂ, ଭିଡିଓ କିମ୍ବା ନେଭିଗେସନ ଆପ୍ସ) ବ୍ୟବହାର କରନ୍ତି\n • ବଡ଼ ଫାଇଲଗୁଡ଼ିକ ଡାଉନଲୋଡ କିମ୍ବା ଅପଲୋଡ କରନ୍ତି\n • ଅଧିକ ତାପମାତ୍ରାରେ ଆପଣଙ୍କ ଫୋନ ବ୍ୟବହାର କରନ୍ତି"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ଆପଣଙ୍କ ଡିଭାଇସଟି ଅତ୍ୟଧିକ ଗରମ ଥିବା ଯୋଗୁଁ ଥଣ୍ଡା କରାଯିବାକୁ ଏହାକୁ ବନ୍ଦ କରାଯାଇଛି। ଆପଣଙ୍କ ଡିଭାଇସ ବର୍ତ୍ତମାନ ସ୍ୱାଭାବିକ ଭାବେ ଚାଲୁଛି।\n\nଆପଣଙ୍କ ଡିଭାଇସ ଅତ୍ୟଧିକ ଗରମ ହୋଇଯାଇପାରେ ଯଦି ଆପଣ:\n • ରିସୋର୍ସ-ଇଣ୍ଟେନସିଭ ଆପ୍ସ (ଯେପରି ଗେମିଂ, ଭିଡିଓ କିମ୍ବା ନେଭିଗେସନ ଆପ୍ସ) ବ୍ୟବହାର କରନ୍ତି\n • ବଡ଼ ଫାଇଲଗୁଡ଼ିକ ଡାଉନଲୋଡ କିମ୍ବା ଅପଲୋଡ କରନ୍ତି\n • ଅଧିକ ତାପମାତ୍ରାରେ ଆପଣଙ୍କ ଡିଭାଇସ ବ୍ୟବହାର କରନ୍ତି"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ଆପଣଙ୍କ ଟାବଲେଟଟି ଅତ୍ୟଧିକ ଗରମ ଥିବା ଯୋଗୁଁ ଥଣ୍ଡା କରାଯିବାକୁ ଏହାକୁ ବନ୍ଦ କରାଯାଇଛି। ଆପଣଙ୍କ ଟାବଲେଟ ବର୍ତ୍ତମାନ ସ୍ୱାଭାବିକ ଭାବେ ଚାଲୁଛି।\n\nଆପଣଙ୍କ ଟାବଲେଟ ଅତ୍ୟଧିକ ଗରମ ହୋଇଯାଇପାରେ ଯଦି ଆପଣ:\n • ରିସୋର୍ସ-ଇଣ୍ଟେନସିଭ ଆପ୍ସ (ଯେପରି ଗେମିଂ, ଭିଡିଓ କିମ୍ବା ନେଭିଗେସନ ଆପ୍ସ) ବ୍ୟବହାର କରନ୍ତି\n • ବଡ଼ ଫାଇଲଗୁଡ଼ିକ ଡାଉନଲୋଡ କିମ୍ବା ଅପଲୋଡ କରନ୍ତି\n • ଅଧିକ ତାପମାତ୍ରାରେ ଆପଣଙ୍କ ଟାବଲେଟ ବ୍ୟବହାର କରନ୍ତି"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ଫୋନଟି ଗରମ ହେଉଛି"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ଡିଭାଇସଟି ଗରମ ହେଉଛି"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ଟାବଲେଟଟି ଗରମ ହେଉଛି"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ଫୋନ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର ସୀମିତ ଅଟେ।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ଡିଭାଇସ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର ସୀମିତ ଅଟେ।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ଟାବଲେଟ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର ସୀମିତ ଅଟେ।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"ଆପଣଙ୍କ ଫୋନ ସ୍ୱତଃ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ଏବେ ବି ଆପଣଙ୍କ ଫୋନ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଫୋନ ଥଣ୍ଡା ହୋଇଯିବା ପରେ ଏହା ସ୍ୱାଭାବିକ ଭାବେ ଚାଲିବ।"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"ଆପଣଙ୍କ ଡିଭାଇସ ସ୍ୱତଃ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ଏବେ ବି ଆପଣଙ୍କ ଡିଭାଇସ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଡିଭାଇସ ଥଣ୍ଡା ହୋଇଯିବା ପରେ ଏହା ସ୍ୱାଭାବିକ ଭାବେ ଚାଲିବ।"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"ଆପଣଙ୍କ ଟାବଲେଟ ସ୍ୱତଃ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ଏବେ ବି ଆପଣଙ୍କ ଟାବଲେଟ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଟାବଲେଟ ଥଣ୍ଡା ହୋଇଯିବା ପରେ ଏହା ସ୍ୱାଭାବିକ ଭାବେ ଚାଲିବ।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"ଟିପଚିହ୍ନ ସେନ୍ସର ପାୱାର ବଟନରେ ଅଛି। ଏହା ଟାବଲେଟର ଧାରରେ ବଢ଼ାଯାଇଥିବା ଭଲ୍ୟୁମ ବଟନ ପାଖରେ ଥିବା ଫ୍ଲାଟ ବଟନ ଅଟେ।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"ଟିପଚିହ୍ନ ସେନ୍ସର ପାୱାର ବଟନରେ ଅଛି। ଏହା ଡିଭାଇସର ଧାରରେ ବଢ଼ାଯାଇଥିବା ଭଲ୍ୟୁମ ବଟନ ପାଖରେ ଥିବା ଫ୍ଲାଟ ବଟନ ଅଟେ।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"ଟିପଚିହ୍ନ ସେନ୍ସର ପାୱାର ବଟନରେ ଅଛି। ଏହା ଫୋନର ଧାରରେ ଉଠି ରହିଥିବା ଭଲ୍ୟୁମ ବଟନ ପାଖରେ ଥିବା ଫ୍ଲାଟ ବଟନ ଅଟେ।"</string> diff --git a/packages/SystemUI/res-product/values-pa/strings.xml b/packages/SystemUI/res-product/values-pa/strings.xml index 38fd890416c3..81b047cbdf2d 100644 --- a/packages/SystemUI/res-product/values-pa/strings.xml +++ b/packages/SystemUI/res-product/values-pa/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ਤੁਸੀਂ <xliff:g id="NUMBER">%d</xliff:g> ਵਾਰ ਗਲਤ ਢੰਗ ਨਾਲ ਫ਼ੋਨ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਹੈ। ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ, ਜਿਸ ਨਾਲ ਸਾਰਾ ਪ੍ਰੋਫਾਈਲ ਡਾਟਾ ਮਿਟ ਜਾਵੇਗਾ।"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ਤੁਸੀਂ <xliff:g id="NUMBER_0">%1$d</xliff:g> ਵਾਰ ਆਪਣਾ ਅਣਲਾਕ ਪੈਟਰਨ ਗਲਤ ਢੰਗ ਨਾਲ ਉਲੀਕਿਆ ਹੈ। <xliff:g id="NUMBER_1">%2$d</xliff:g> ਹੋਰ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਨੂੰ ਇੱਕ ਈਮੇਲ ਖਾਤਾ ਵਰਤਦੇ ਹੋਏ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਅਣਲਾਕ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਵੇਗਾ।\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ਤੁਸੀਂ <xliff:g id="NUMBER_0">%1$d</xliff:g> ਵਾਰ ਆਪਣਾ ਅਣਲਾਕ ਪੈਟਰਨ ਗਲਤ ਢੰਗ ਨਾਲ ਡ੍ਰਾ ਕੀਤਾ ਹੈ। <xliff:g id="NUMBER_1">%2$d</xliff:g> ਹੋਰ ਅਸਫਲ ਕੋਸ਼ਿਸ਼ਾਂ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਨੂੰ ਇੱਕ ਈਮੇਲ ਖਾਤਾ ਵਰਤਦੇ ਹੋਏ ਆਪਣਾ ਫ਼ੋਨ ਅਣਲਾਕ ਕਰਨ ਲਈ ਕਿਹਾ ਜਾਏਗਾ।\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> ਸਕਿੰਟਾਂ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"ਗਰਮ ਹੋਣ ਕਰਕੇ ਫ਼ੋਨ ਬੰਦ ਹੋ ਗਿਆ"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"ਗਰਮ ਹੋਣ ਕਰਕੇ ਡੀਵਾਈਸ ਬੰਦ ਹੋ ਗਿਆ"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ਗਰਮ ਹੋਣ ਕਰਕੇ ਟੈਬਲੈੱਟ ਬੰਦ ਹੋ ਗਿਆ"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ\n • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਡੀਵਾਈਸ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ\n • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ\n • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ਫ਼ੋਨ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"ਡੀਵਾਈਸ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ਟੈਬਲੈੱਟ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ਫ਼ੋਨ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਤ ਹੁੰਦੀਆਂ ਹਨ।\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ਡੀਵਾਈਸ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਤ ਹੁੰਦੀਆਂ ਹਨ।\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ਟੈਬਲੈੱਟ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਤ ਹੁੰਦੀਆਂ ਹਨ।\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਆਪਣੇ-ਆਪ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਹੌਲੀ ਚੱਲੇ।\n\nਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਡਾ ਫ਼ੋਨ ਆਮ ਵਾਂਗ ਚੱਲੇਗਾ।"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਆਪਣੇ-ਆਪ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰ ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਹੌਲੀ ਚੱਲੇ।\n\nਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਆਮ ਵਾਂਗ ਚੱਲੇਗਾ।"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਆਪਣੇ-ਆਪ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਟੈਬਲੈੱਟ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰ ਹੋ ਸਕਦਾ ਹੈ ਇਹ ਹੌਲੀ ਚੱਲੇ।\n\nਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ, ਤੁਹਾਡਾ ਟੈਬਲੈੱਟ ਆਮ ਵਾਂਗ ਚੱਲੇਗਾ।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਪਾਵਰ ਬਟਨ \'ਤੇ ਹੈ। ਇਹ ਟੈਬਲੈੱਟ ਦੇ ਕਿਨਾਰੇ \'ਤੇ ਅਜਿਹਾ ਸਮਤਲ ਬਟਨ ਹੁੰਦਾ ਹੈ ਜੋ ਉੱਭਰੇ ਹੋਏ ਅਵਾਜ਼ ਬਟਨ ਦੇ ਅੱਗੇ ਹੁੰਦਾ ਹੈ।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਪਾਵਰ ਬਟਨ \'ਤੇ ਹੈ। ਇਹ ਡੀਵਾਈਸ ਦੇ ਕਿਨਾਰੇ \'ਤੇ ਅਜਿਹਾ ਸਮਤਲ ਬਟਨ ਹੁੰਦਾ ਹੈ ਜੋ ਉੱਭਰੇ ਹੋਏ ਅਵਾਜ਼ ਬਟਨ ਦੇ ਅੱਗੇ ਹੁੰਦਾ ਹੈ।"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਪਾਵਰ ਬਟਨ \'ਤੇ ਹੈ। ਇਹ ਫ਼ੋਨ ਦੇ ਕਿਨਾਰੇ \'ਤੇ ਅਜਿਹਾ ਸਮਤਲ ਬਟਨ ਹੁੰਦਾ ਹੈ ਜੋ ਉੱਭਰੇ ਹੋਏ ਅਵਾਜ਼ ਬਟਨ ਦੇ ਅੱਗੇ ਹੁੰਦਾ ਹੈ।"</string> diff --git a/packages/SystemUI/res-product/values-pl/strings.xml b/packages/SystemUI/res-product/values-pl/strings.xml index 7dc2dedfd601..286a24219fbe 100644 --- a/packages/SystemUI/res-product/values-pl/strings.xml +++ b/packages/SystemUI/res-product/values-pl/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowano nieprawidłowo odblokować telefon. Profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich jego danych."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowano wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowano wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon wyłączony: przegrzanie"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Urządzenie wyłączone: przegrzanie"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet wyłączony: przegrzanie"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefon działa teraz normalnie.\nKliknij, aby dowiedzieć się więcej"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Urządzenie działa teraz normalnie.\nKliknij, aby dowiedzieć się więcej"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tablet działa teraz normalnie.\nKliknij, aby dowiedzieć się więcej"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon był zbyt gorący i wyłączył się, aby obniżyć temperaturę. Działa teraz normalnie.\n\nTelefon może się przegrzać, gdy:\n • używasz aplikacji zużywających dużo zasobów (np. aplikacji do gier, nawigacji lub odtwarzania filmów);\n • pobierasz lub przesyłasz duże pliki;\n • używasz go w wysokiej temperaturze."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Urządzenie było zbyt gorące i wyłączyło się, aby obniżyć temperaturę. Działa teraz normalnie.\n\nUrządzenie może się przegrzać, gdy:\n • używasz aplikacji zużywających dużo zasobów (np. aplikacji do gier, nawigacji lub odtwarzania filmów);\n • pobierasz lub przesyłasz duże pliki;\n • używasz go w wysokiej temperaturze."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablet był zbyt gorący i wyłączył się, aby obniżyć temperaturę. Działa teraz normalnie.\n\nTablet może się przegrzać, gdy:\n • używasz aplikacji zużywających dużo zasobów (np. aplikacji do gier, nawigacji lub odtwarzania filmów);\n • pobierasz lub przesyłasz duże pliki;\n • używasz go w wysokiej temperaturze."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon się nagrzewa"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Urządzenie się nagrzewa"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet się nagrzewa"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Podczas obniżania temperatury telefonu niektóre funkcje są ograniczone.\nKliknij, aby dowiedzieć się więcej"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Podczas obniżania temperatury urządzenia niektóre funkcje są ograniczone.\nKliknij, aby dowiedzieć się więcej"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Podczas obniżania temperatury tabletu niektóre funkcje są ograniczone.\nKliknij, aby dowiedzieć się więcej"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefon automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale może działać wolniej.\n\nGdy temperatura się obniży, telefon będzie działać normalnie."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Urządzenie automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale może działać wolniej.\n\nGdy temperatura się obniży, urządzenie będzie działać normalnie."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablet automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale może działać wolniej.\n\nGdy temperatura się obniży, tablet będzie działać normalnie."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Czytnik linii papilarnych znajduje się na przycisku zasilania. To płaski przycisk przy uniesionym przycisku głośności na krawędzi tabletu."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Czytnik linii papilarnych znajduje się na przycisku zasilania. To płaski przycisk przy uniesionym przycisku głośności na krawędzi urządzenia."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Czytnik linii papilarnych znajduje się na przycisku zasilania. To płaski przycisk przy uniesionym przycisku głośności na krawędzi telefonu."</string> diff --git a/packages/SystemUI/res-product/values-pt-rBR/strings.xml b/packages/SystemUI/res-product/values-pt-rBR/strings.xml index 53efe3e984d8..3d6d8901f512 100644 --- a/packages/SystemUI/res-product/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res-product/values-pt-rBR/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o tablet.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o smartphone.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Smartphone desligado por superaquecimento"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Dispositivo desligado por superaquecimento"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet desligado por superaquecimento"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"O smartphone está funcionando normalmente agora.\nToque para saber mais"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"O dispositivo está funcionando normalmente agora.\nToque para saber mais"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"O tablet está funcionando normalmente agora.\nToque para saber mais"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"O smartphone estava muito quente e foi desligado para resfriar. Agora, ele está funcionando normalmente.\n\nO smartphone pode ficar quente demais se você:\n • usar apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • fizer o download ou upload de arquivos grandes;\n • usar o smartphone em temperaturas altas."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"O dispositivo estava muito quente e foi desligado para resfriar. Agora, ele está funcionando normalmente.\n\nO dispositivo pode ficar quente demais se você:\n • usa apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • faz download ou upload de arquivos grandes;\n • usa o dispositivo em temperaturas altas."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"O tablet estava muito quente e foi desligado para resfriar. Agora, ele está funcionando normalmente.\n\nO tablet pode ficar quente demais se você:\n • usar apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • fizer download ou upload de arquivos grandes;\n • usar o tablet em temperaturas altas."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"O smartphone está esquentando"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"O dispositivo está esquentando"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"O tablet está esquentando"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Alguns recursos ficam limitados enquanto o smartphone é resfriado.\nToque para saber mais"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Alguns recursos ficam limitados enquanto o dispositivo é resfriado.\nToque para saber mais"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Alguns recursos ficam limitados enquanto o tablet é resfriado.\nToque para saber mais"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Seu dispositivo vai tentar se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nDepois de resfriado, o dispositivo volta ao normal."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Seu tablet vai tentar se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nDepois de resfriado, o tablet volta ao normal."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"O sensor de impressão digital fica no botão liga/desliga. Ele é plano e está ao lado do botão de volume na borda do tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"O sensor de impressão digital fica no botão liga/desliga. Ele é plano e está ao lado do botão de volume na borda do dispositivo."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"O sensor de impressão digital fica no botão liga/desliga. Ele é plano e está ao lado do botão de volume na borda do smartphone."</string> diff --git a/packages/SystemUI/res-product/values-pt-rPT/strings.xml b/packages/SystemUI/res-product/values-pt-rPT/strings.xml index 29a200112732..40c7e5364a07 100644 --- a/packages/SystemUI/res-product/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-product/values-pt-rPT/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telemóvel desligado devido ao calor"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Dispositivo desligado devido ao calor"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet desligado devido ao calor"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"O seu telemóvel já está a funcionar normalmente.\nToque para obter mais informações"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"O seu dispositivo já está a funcionar normalmente.\nToque para obter mais informações"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"O seu tablet já está a funcionar normalmente.\nToque para obter mais informações"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"O telemóvel estava muito quente, por isso desligou-se para arrefecer. Agora funciona normalmente.\n\nO telemóvel pode sobreaquecer se:\n • Usar apps que exigem mais recursos (jogos, vídeo ou apps de navegação)\n • Transferir ou carregar ficheiros grandes\n • For usado em altas temperaturas"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"O dispositivo estava muito quente, por isso desligou-se para arrefecer. Agora funciona normalmente.\n\nO dispositivo pode sobreaquecer se:\n • Usar apps que exigem mais recursos (jogos, vídeo ou apps de navegação)\n • Transferir ou carregar ficheiros grandes\n • For usado em altas temperaturas"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"O tablet estava muito quente, por isso desligou-se para arrefecer. Agora funciona normalmente.\n\nO tablet pode sobreaquecer se:\n • Usar apps que exigem mais recursos (jogos, vídeo ou apps de navegação)\n • Transferir ou carregar ficheiros grandes\n • For usado em altas temperaturas"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"O telemóvel está a aquecer"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"O dispositivo está a aquecer"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"O tablet está a aquecer"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Algumas funcionalidades são limitadas enquanto o telemóvel arrefece.\nToque para obter mais informações"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Algumas funcionalidades são limitadas enquanto o dispositivo arrefece.\nToque para obter mais informações"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Algumas funcionalidades são limitadas enquanto o tablet arrefece.\nToque para obter mais informações"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Pode continuar a usá-lo, mas este pode funcionar mais lentamente.\n\nAssim que o telemóvel tiver arrefecido, vai funcionar normalmente."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"O dispositivo vai tentar arrefecer automaticamente. Pode continuar a usá-lo, mas este pode funcionar mais lentamente.\n\nAssim que o dispositivo tiver arrefecido, vai funcionar normalmente."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"O tablet vai tentar arrefecer automaticamente. Pode continuar a usá-lo, mas este pode funcionar mais lentamente.\n\nAssim que o tablet tiver arrefecido, vai funcionar normalmente."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"O sensor de impressões digitais encontra-se no botão ligar/desligar. É o botão sem relevo junto ao botão de volume com relevo na extremidade do tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"O sensor de impressões digitais encontra-se no botão ligar/desligar. É o botão sem relevo junto ao botão de volume com relevo na extremidade do dispositivo."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"O sensor de impressões digitais encontra-se no botão ligar/desligar. É o botão sem relevo junto ao botão de volume com relevo na extremidade do telemóvel."</string> diff --git a/packages/SystemUI/res-product/values-pt/strings.xml b/packages/SystemUI/res-product/values-pt/strings.xml index 53efe3e984d8..3d6d8901f512 100644 --- a/packages/SystemUI/res-product/values-pt/strings.xml +++ b/packages/SystemUI/res-product/values-pt/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Você tentou desbloquear o smartphone incorretamente <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que excluirá todos os dados do perfil."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o tablet.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Você desenhou seu padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Se fizer mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas incorretas, será solicitado que você use uma conta de e-mail para desbloquear o smartphone.\n\n Tente novamente em <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Smartphone desligado por superaquecimento"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Dispositivo desligado por superaquecimento"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet desligado por superaquecimento"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"O smartphone está funcionando normalmente agora.\nToque para saber mais"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"O dispositivo está funcionando normalmente agora.\nToque para saber mais"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"O tablet está funcionando normalmente agora.\nToque para saber mais"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"O smartphone estava muito quente e foi desligado para resfriar. Agora, ele está funcionando normalmente.\n\nO smartphone pode ficar quente demais se você:\n • usar apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • fizer o download ou upload de arquivos grandes;\n • usar o smartphone em temperaturas altas."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"O dispositivo estava muito quente e foi desligado para resfriar. Agora, ele está funcionando normalmente.\n\nO dispositivo pode ficar quente demais se você:\n • usa apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • faz download ou upload de arquivos grandes;\n • usa o dispositivo em temperaturas altas."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"O tablet estava muito quente e foi desligado para resfriar. Agora, ele está funcionando normalmente.\n\nO tablet pode ficar quente demais se você:\n • usar apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • fizer download ou upload de arquivos grandes;\n • usar o tablet em temperaturas altas."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"O smartphone está esquentando"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"O dispositivo está esquentando"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"O tablet está esquentando"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Alguns recursos ficam limitados enquanto o smartphone é resfriado.\nToque para saber mais"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Alguns recursos ficam limitados enquanto o dispositivo é resfriado.\nToque para saber mais"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Alguns recursos ficam limitados enquanto o tablet é resfriado.\nToque para saber mais"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Seu dispositivo vai tentar se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nDepois de resfriado, o dispositivo volta ao normal."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Seu tablet vai tentar se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nDepois de resfriado, o tablet volta ao normal."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"O sensor de impressão digital fica no botão liga/desliga. Ele é plano e está ao lado do botão de volume na borda do tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"O sensor de impressão digital fica no botão liga/desliga. Ele é plano e está ao lado do botão de volume na borda do dispositivo."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"O sensor de impressão digital fica no botão liga/desliga. Ele é plano e está ao lado do botão de volume na borda do smartphone."</string> diff --git a/packages/SystemUI/res-product/values-ro/strings.xml b/packages/SystemUI/res-product/values-ro/strings.xml index cd08dee9e442..f10d5ca82f56 100644 --- a/packages/SystemUI/res-product/values-ro/strings.xml +++ b/packages/SystemUI/res-product/values-ro/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Ai făcut <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ai desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, ți se va solicita să deblochezi tableta cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ai desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, ți se va solicita să deblochezi telefonul cu ajutorul unui cont de e-mail.\n\n Încearcă din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefonul s-a oprit din cauza încălzirii"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Dispozitiv oprit din cauza căldurii"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tableta s-a oprit din cauza încălzirii"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Acum telefonul funcționează normal.\nAtinge pentru mai multe informații"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Acum dispozitivul funcționează normal.\nAtinge pentru mai multe informații"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Acum tableta funcționează normal.\nAtinge pentru mai multe informații"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video sau de navigare);\n • descarci sau încarci fișiere mari;\n • folosești telefonul la temperaturi ridicate."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Dispozitivul se încălzise prea mult și s-a oprit pentru a se răci. Acum funcționează normal.\n\nDispozitivul s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video sau de navigare);\n • descarci sau încarci fișiere mari;\n • folosești dispozitivul la temperaturi ridicate."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tableta se încălzise prea mult și s-a oprit pentru a se răci. Acum funcționează normal.\n\nTableta s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video sau de navigare);\n • descarci sau încarci fișiere mari;\n • folosești tableta la temperaturi ridicate."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefonul se încălzește"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Dispozitivul se încălzește"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tableta se încălzește"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Anumite funcții sunt limitate în timp ce dispozitivul se răcește.\nAtinge pentru mai multe informații"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Anumite funcții sunt limitate în timp ce tableta se răcește.\nAtinge pentru mai multe informații"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefonul va încerca automat să se răcească. Îl poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Dispozitivul va încerca automat să se răcească. Îl poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, dispozitivul va funcționa normal."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tableta va încerca automat să se răcească. O poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, tableta va funcționa normal."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Senzorul de amprentă se află pe butonul de pornire. Este butonul plat de lângă butonul de volum în relief de pe marginea tabletei."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Senzorul de amprentă se află pe butonul de pornire. Este butonul plat de lângă butonul de volum în relief de pe marginea dispozitivului."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Senzorul de amprentă se află pe butonul de pornire. Este butonul plat de lângă butonul de volum în relief de pe marginea telefonului."</string> diff --git a/packages/SystemUI/res-product/values-ru/strings.xml b/packages/SystemUI/res-product/values-ru/strings.xml index 1649c0294927..ed9ad1a66b16 100644 --- a/packages/SystemUI/res-product/values-ru/strings.xml +++ b/packages/SystemUI/res-product/values-ru/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Вы несколько раз (<xliff:g id="NUMBER">%d</xliff:g>) не смогли разблокировать телефон. Рабочий профиль и все его данные будут удалены."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Вы несколько раз (<xliff:g id="NUMBER_0">%1$d</xliff:g>) ввели неверный графический ключ. Осталось попыток: <xliff:g id="NUMBER_1">%2$d</xliff:g>. В случае неудачи вам будет предложено разблокировать планшет с помощью аккаунта электронной почты.\n\nПовторите попытку через <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Вы несколько раз (<xliff:g id="NUMBER_0">%1$d</xliff:g>) ввели неверный графический ключ. Осталось попыток: <xliff:g id="NUMBER_1">%2$d</xliff:g>. В случае неудачи вам будет предложено разблокировать телефон с помощью аккаунта электронной почты.\n\nПовторите попытку через <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Телефон выключился из-за перегрева"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Устройство выключилось из-за перегрева"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Планшет выключился из-за перегрева"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Сейчас телефон работает нормально.\nНажмите, чтобы получить дополнительную информацию."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Сейчас устройство работает нормально.\nНажмите, чтобы получить дополнительную информацию."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Сейчас планшет работает нормально.\nНажмите, чтобы получить дополнительную информацию."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Телефон выключился из-за перегрева. Сейчас он работает нормально.\n\nВозможные причины перегрева:\n • использование ресурсоемких игр и приложений, например связанных с видео или навигацией;\n • скачивание или загрузка больших файлов;\n • высокая температура окружающей среды."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Устройство выключилось из-за перегрева. Сейчас оно работает нормально.\n\nВозможные причины перегрева:\n • использование ресурсоемких игр и приложений, например связанных с видео или навигацией;\n • скачивание или загрузка больших файлов;\n • высокая температура окружающей среды."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Планшет выключился из-за перегрева. Сейчас он работает нормально.\n\nВозможные причины перегрева:\n • использование ресурсоемких игр и приложений, например связанных с видео или навигацией;\n • скачивание или загрузка больших файлов;\n • высокая температура окружающей среды."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Телефон нагревается"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Устройство нагревается"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Планшет нагревается"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Пока телефон не остынет, некоторые функции могут быть недоступны.\nНажмите, чтобы получить дополнительную информацию."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Пока устройство не остынет, некоторые функции могут быть недоступны.\nНажмите, чтобы получить дополнительную информацию."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Пока планшет не остынет, некоторые функции могут быть недоступны.\nНажмите, чтобы получить дополнительную информацию."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Телефон автоматически попробует снизить температуру. Вы можете продолжать им пользоваться, но его производительность, возможно, уменьшится.\n\nСкорость работы телефона восстановится, когда он остынет."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Устройство автоматически попробует снизить температуру. Вы можете продолжать им пользоваться, но его производительность, возможно, уменьшится.\n\nСкорость работы устройства восстановится, когда оно остынет."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Планшет автоматически попробует снизить температуру. Вы можете продолжать им пользоваться, но его производительность, возможно, уменьшится.\n\nСкорость работы планшета восстановится, когда он остынет."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Сканер отпечатков пальцев находится на кнопке питания. Она плоская и расположена рядом с приподнятой кнопкой регулировки громкости на боковой стороне планшета."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Сканер отпечатков пальцев находится на кнопке питания. Она плоская и расположена рядом с приподнятой кнопкой регулировки громкости на боковой стороне устройства."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Сканер отпечатков пальцев находится на кнопке питания. Она плоская и расположена рядом с приподнятой кнопкой регулировки громкости на боковой стороне телефона."</string> diff --git a/packages/SystemUI/res-product/values-si/strings.xml b/packages/SystemUI/res-product/values-si/strings.xml index 4ab2a4bc2e56..f2c0f4327732 100644 --- a/packages/SystemUI/res-product/values-si/strings.xml +++ b/packages/SystemUI/res-product/values-si/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"ඔබ දුරකථනය අගුළු හැරීමට <xliff:g id="NUMBER">%d</xliff:g> වරක් වැරදියට උත්සාහ කර ඇත. කාර්යාල පැතිකඩ ඉවත් කරනු ඇති අතර, එය සියලු පැතිකඩ දත්ත මකනු ඇත."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"ඔබ අගුළු ඇරිමේ රටාව <xliff:g id="NUMBER_0">%1$d</xliff:g> වතාවක් වැරදියට ඇඳ ඇත. තවත් අසාර්ථක උත්සාහ <xliff:g id="NUMBER_1">%2$d</xliff:g> කින් පසුව, ඊ-තැපැල් ගිණුම භාවිතා කරමින් ඔබගේ ටැබ්ලටයේ අගුළු ඇරීමට ඔබට පවසනු ඇත.\n\n නැවත තත්පර <xliff:g id="NUMBER_2">%3$d</xliff:g> කින් උත්සාහ කරන්න."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"ඔබ වැරදියට <xliff:g id="NUMBER_0">%1$d</xliff:g> වතාවක් ඔබගේ අගුළු හැරීමේ රටාව ඇඳ ඇත. අසාර්ථක උත්සහ කිරීම් <xliff:g id="NUMBER_1">%2$d</xliff:g> න් පසුව, ඔබගේ ඊ-තැපැල් ලිපිනය භාවිතයෙන් ඔබගේ දුරකථනය අගුළු හැරීමට ඔබගෙන් අසයි.\n\n තත්පර <xliff:g id="NUMBER_2">%3$d</xliff:g> න් පසුව නැවත උත්සහ කරන්න."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"දුරකථනය රත් වීම නිසා ක්රියාවිරහිත විය"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"උණුසුම හේතුවෙන් උපාංගය ක්රියාවිරහිත විය"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"ටැබ්ලටය රත් වීම නිසා ක්රියාවිරහිත විය"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"ඔබේ දුරකථනය දැන් සාමාන්ය ලෙස ධාවනය වේ.\nතව තතු සඳහා තට්ටු කරන්න"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"ඔබේ උපාංගය දැන් සාමාන්ය ලෙස ධාවනය වේ.\nතව තතු සඳහා තට්ටු කරන්න"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"ඔබේ ටැබ්ලටය දැන් සාමාන්ය ලෙස ධාවනය වේ.\nතව තතු සඳහා තට්ටු කරන්න"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"ඔබේ දුරකථනය ඉතාම උණුසුම් විය, එම නිසා එය සිසිල් වීමට ක්රියාවිරහිත කරන ලදි. දැන් ඔබේ දුරකථනය සාමාන්ය පරිදි ධාවනය වේ.\n\nඔබ පහත දේවල් සිදු කළහොත් ඔබේ දුරකථනය ඉතාම උණුසුම් විය හැක:\n • සම්පත්-දැඩි සත්කාරක යෙදුම් භාවිතය (ක්රීඩා, වීඩියෝ, හෝ සංචලන යෙදුම් යනාදී)\n • විශාල ගොනු බාගැනීම හෝ උඩුගත කිරීම\n • ඔබේ දුරකථනය අධික උෂ්ණත්වයේදී භාවිත කිරීම"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"ඔබේ උපාංගය ඉතාම උණුසුම් විය, එම නිසා එය සිසිල් වීමට ක්රියාවිරහිත කරන ලදි. දැන් ඔබේ දුරකථනය සාමාන්ය පරිදි ධාවනය වේ.\n\nඔබ පහත දේවල් සිදු කළහොත් ඔබේ උපාංගය ඉතාම උණුසුම් විය හැක:\n • සම්පත්-දැඩි සත්කාරක යෙදුම් භාවිතය (ක්රීඩා, වීඩියෝ, හෝ සංචලන යෙදුම් යනාදී)\n • විශාල ගොනු බාගැනීම හෝ උඩුගත කිරීම\n • ඔබේ දුරකථනය අධික උෂ්ණත්වයේ දී භාවිත කිරීම"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"ඔබේ ටැබ්ලටය ඉතාම උණුසුම් විය, එම නිසා එය සිසිල් වීමට ක්රියාවිරහිත කරන ලදි. දැන් ඔබේ දුරකථනය සාමාන්ය පරිදි ධාවනය වේ.\n\nඔබ පහත දේවල් සිදු කළහොත් ඔබේ දුරකථනය ඉතාම උණුසුම් විය හැක:\n • සම්පත්-දැඩි සත්කාරක යෙදුම් භාවිතය (ක්රීඩා, වීඩියෝ, හෝ සංචලන යෙදුම් යනාදී)\n • විශාල ගොනු බාගැනීම හෝ උඩුගත කිරීම\n • ඔබේ දුරකථනය අධික උෂ්ණත්වයේ දී භාවිත කිරීම"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"දුරකථනය උණුසුම් වෙමින්"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"උපාංගය උණුසුම් වෙමින් පවතී"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ටැබ්ලටය උණුසුම් වෙමින් පවතී"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"දුරකථනය සිසිල් වන අතරේ සමහර විශේෂාංග සීමිත විය හැක.\nතව තතු සඳහා තට්ටු කරන්න"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"උපාංගය සිසිල් වන අතරේ සමහර විශේෂාංග සීමිත විය හැක.\nතව තතු සඳහා තට්ටු කරන්න"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ටැබ්ලටය සිසිල් වන අතරේ සමහර විශේෂාංග සීමිත විය හැක.\nතව තතු සඳහා තට්ටු කරන්න"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"ඔ බේ දුරකථනය ස්වයංක්රීයව සිසිල් වීමට උත්සාහ කරනු ඇත. ඔබට තවම ඔබේ දුරකථනය භාවිත කළ හැකි නමුත්, එය සෙමින් ධාවනය විය හැක.\n\nඔබේ දුරකථනය සිසිල් වූ පසු, එය සාමාන්ය ලෙස ධාවනය වනු ඇත."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"ඔබේ උපාංගය ස්වයංක්රීයව සිසිල් වීමට උත්සාහ දරනු ඇත. ඔබට තවමත් බබේ උපාංගය භාවිතා කළ හැකි නමුත්, එය මන්දගාමීව ධාවනය විය හැක.\n\nඔබේ උපාංගය සිසිල් වූ පසු, එය සාමාන්ය පරිදි ධාවනය වනු ඇත."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"ඔබේ ටැබ්ලටය ස්වයංක්රීයව සිසිල් වීමට උත්සාහ දරනු ඇත. ඔබට තවමත් බබේ ටැබ්ලටය භාවිතා කළ හැකි නමුත්, එය මන්දගාමීව ධාවනය විය හැක.\n\nඔබේ ටැබ්ලටය සිසිල් වූ පසු, එය සාමාන්ය පරිදි ධාවනය වනු ඇත."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"ඇඟිලි සලකුණු සංවේදකය බල බොත්තම මත ඇත. එය ටැබ්ලටයෙහි කෙළවර ඇති ඉහළ හඬ පරිමා බොත්තම අසල ඇති පැතලි බොත්තමයි."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"ඇඟිලි සලකුණු සංවේදකය බල බොත්තම මත ඇත. එය උපාංගයෙහි කෙළවර ඇති ඉහළ හඬ පරිමා බොත්තම අසල ඇති පැතලි බොත්තමයි."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"ඇඟිලි සලකුණු සංවේදකය බල බොත්තම මත ඇත. එය දුරකථනයෙහි කෙළවර ඇති ඉහළ හඬ පරිමා බොත්තම අසල ඇති පැතලි බොත්තමයි."</string> diff --git a/packages/SystemUI/res-product/values-sk/strings.xml b/packages/SystemUI/res-product/values-sk/strings.xml index 21bcc2a24fd8..8e1bb3968608 100644 --- a/packages/SystemUI/res-product/values-sk/strings.xml +++ b/packages/SystemUI/res-product/values-sk/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefón ste sa pokúsili <xliff:g id="NUMBER">%d</xliff:g>‑krát nesprávne odomknúť. Pracovný profil bude odstránený spolu so všetkými údajmi."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g>‑krát ste nesprávne nakreslili svoj bezpečnostný vzor. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> ďalších neúspešných pokusoch sa zobrazí výzva na odomknutie tabletu pomocou e‑mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Už ste <xliff:g id="NUMBER_0">%1$d</xliff:g>‑krát nesprávne nakreslili svoj bezpečnostný vzor. Po <xliff:g id="NUMBER_1">%2$d</xliff:g> ďalších neúspešných pokusoch sa zobrazí výzva na odomknutie telefónu pomocou e‑mailového účtu.\n\n Skúste to znova o <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefón sa vypol z dôvodu prehriatia"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Zariadenie sa vyplo z dôvodu prehriatia"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet sa vypol z dôvodu prehriatia"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Teraz telefón funguje ako obvykle.\nViac sa dozviete po klepnutí."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Teraz zariadenie funguje ako obvykle.\nViac sa dozviete po klepnutí."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Teraz tablet funguje ako obvykle.\nViac sa dozviete po klepnutí."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefón bol príliš horúci, preto sa vypol, aby vychladol. Teraz funguje ako obvykle.\n\nTelefón sa môže prehrievať, keď:\n • používate aplikácie náročné na zdroje (ako sú aplikácie na video alebo herné či navigačné),\n • sťahujete alebo nahrávate veľké súbory,\n • používate telefón pri vysokých teplotách."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Zariadenie bolo príliš horúce, preto sa vyplo, aby vychladlo. Teraz funguje ako obvykle.\n\nZariadenie sa môže prehrievať, keď:\n • používate aplikácie náročné na zdroje (ako sú aplikácie na video alebo herné či navigačné),\n • sťahujete alebo nahrávate veľké súbory,\n • používate zariadenie pri vysokých teplotách."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablet bol príliš horúci, preto sa vypol, aby vychladol. Teraz funguje ako obvykle.\n\nTablet sa môže prehrievať, keď:\n • používate aplikácie náročné na zdroje (ako sú aplikácie na video alebo herné či navigačné),\n • sťahujete alebo nahrávate veľké súbory,\n • používate tablet pri vysokých teplotách."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefón sa prehrieva"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Zariadenie sa prehrieva"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet sa prehrieva"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Niektoré funkcie budú obmedzené, dokým neklesne teplota telefónu.\nViac sa dozviete po klepnutí."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Niektoré funkcie budú obmedzené, dokým neklesne teplota zariadenia.\nViac sa dozviete po klepnutí."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Niektoré funkcie budú obmedzené, dokým neklesne teplota tabletu.\nViac sa dozviete po klepnutí."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Váš telefón sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude fungovať ako obvykle."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Vaše zariadenie sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude fungovať ako obvykle."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Váš tablet sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude fungovať ako obvykle."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Senzor odtlačkov prstov je na vypínači. Je to ploché tlačidlo vedľa vypuklého tlačidla hlasitosti na okraji tabletu."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Senzor odtlačkov prstov je na vypínači. Je to ploché tlačidlo vedľa vypuklého tlačidla hlasitosti na okraji zariadenia."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Senzor odtlačkov prstov je na vypínači. Je to ploché tlačidlo vedľa vypuklého tlačidla hlasitosti na okraji telefónu."</string> diff --git a/packages/SystemUI/res-product/values-sl/strings.xml b/packages/SystemUI/res-product/values-sl/strings.xml index 95191a4b8d6f..04c7bc7bc4ef 100644 --- a/packages/SystemUI/res-product/values-sl/strings.xml +++ b/packages/SystemUI/res-product/values-sl/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefon ste neuspešno poskusili odkleniti <xliff:g id="NUMBER">%d</xliff:g>-krat. Delovni profil bo odstranjen in vsi podatki profila bodo izbrisani."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat napačno vnesli. Če ga neuspešno poskusite vnesti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, boste pozvani, da tablični računalnik odklenete z e-poštnim računom.\n\nPoskusite znova čez <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Vzorec za odklepanje ste <xliff:g id="NUMBER_0">%1$d</xliff:g>-krat napačno vnesli. Če ga neuspešno poskusite vnesti še <xliff:g id="NUMBER_1">%2$d</xliff:g>-krat, boste pozvani, da telefon odklenete z e-poštnim računom.\n\nPoskusite znova čez <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon se je izklopil zaradi vročine"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Naprava se je izklopila zaradi vročine"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablični računalnik se je izklopil zaradi vročine"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefon zdaj deluje kot običajno.\nDotaknite se za več informacij"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Naprava zdaj deluje kot običajno.\nDotaknite se za več informacij"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tablični računalnik zdaj deluje kot običajno.\nDotaknite se za več informacij"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon je bil prevroč, zato se je izklopil, da se ohladi. Zdaj deluje kot običajno.\n\nTelefon lahko postane prevroč pri:\n • uporabi aplikacij, ki intenzivno porabljajo sredstva (npr. za igranje iger, videoposnetke ali navigacijo);\n • prenosu ali nalaganju velikih datotek;\n • uporabi naprave pri visokih temperaturah."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Naprava je bila prevroča, zato se je izklopila, da se ohladi. Zdaj deluje kot običajno.\n\nNaprava lahko postane prevroča pri:\n • uporabi aplikacij, ki intenzivno porabljajo sredstva (npr. za igranje iger, videoposnetke ali navigacijo);\n • prenosu ali nalaganju velikih datotek;\n • uporabi naprave pri visokih temperaturah."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tablični računalnik je bil prevroč, zato se je izklopil, da se ohladi. Zdaj deluje kot običajno.\n\nTablični računalnik lahko postane prevroč pri:\n • uporabi aplikacij, ki intenzivno porabljajo sredstva (npr. za igranje iger, videoposnetke ali navigacijo);\n • prenosu ali nalaganju velikih datotek;\n • uporabi naprave pri visokih temperaturah."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon se segreva"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Naprava se segreva"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablični računalnik se segreva"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Nekatere funkcije bodo med ohlajanjem telefona omejene.\nDotaknite se za več informacij"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Nekatere funkcije bodo med ohlajanjem naprave omejene.\nDotaknite se za več informacij"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Nekatere funkcije bodo med ohlajanjem tabličnega računalnika omejene.\nDotaknite se za več informacij"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefon se bo samodejno poskusil ohladiti. Še naprej ga lahko uporabljate, vendar bo morda deloval počasneje.\n\nKo se bo telefon ohladil, bo znova deloval kot običajno."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Naprava se bo samodejno poskusila ohladiti. Še naprej jo lahko uporabljate, vendar bo morda delovala počasneje.\n\nKo se bo naprava ohladila, bo znova delovala kot običajno."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tablični računalnik se bo samodejno poskusil ohladiti. Še naprej ga lahko uporabljate, vendar bo morda deloval počasneje.\n\nKo se bo tablični računalnik ohladil, bo znova deloval kot običajno."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Tipalo prstnih odtisov je na gumbu za vklop. To je ploski gumb ob izbočenem gumbu za glasnost na robu tabličnega računalnika."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Tipalo prstnih odtisov je na gumbu za vklop. To je ploski gumb ob izbočenem gumbu za glasnost na robu naprave."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Tipalo prstnih odtisov je na gumbu za vklop. To je ploski gumb ob izbočenem gumbu za glasnost na robu telefona."</string> diff --git a/packages/SystemUI/res-product/values-sq/strings.xml b/packages/SystemUI/res-product/values-sq/strings.xml index 435966eb4685..619f22fe3978 100644 --- a/packages/SystemUI/res-product/values-sq/strings.xml +++ b/packages/SystemUI/res-product/values-sq/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Ke tentuar <xliff:g id="NUMBER">%d</xliff:g> herë pa sukses për ta shkyçur telefonin. Profili i punës do të hiqet, gjë që do të fshijë të gjitha të dhënat e profilit."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ke vizatuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses motivin tënd të shkyçjes. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, do të të duhet ta shkyçësh tabletin duke përdorur një llogari email-i.\n\n Provo sërish për <xliff:g id="NUMBER_2">%3$d</xliff:g> sekonda."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ke vizatuar <xliff:g id="NUMBER_0">%1$d</xliff:g> herë pa sukses motivin tënd. Pas <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativave të tjera të pasuksesshme, do të të duhet ta shkyçësh telefonin duke përdorur një llogari email-i.\n\n Provo sërish për <xliff:g id="NUMBER_2">%3$d</xliff:g> sekonda."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefoni u fik për shkak të nxehtësisë"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Pajisja u fik për shkak të nxehtësisë"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tableti u fik për shkak të nxehtësisë"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefoni tani po funksionon normalisht.\nTrokit për më shumë informacione"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Pajisja tani po funksionon normalisht.\nTrokit për më shumë informacione"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tableti tani po funksionon normalisht.\nTrokit për më shumë informacione"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefoni yt ishte shumë i nxehtë, prandaj u fik për t\'u ftohur. Telefoni tani po funksionon normalisht.\n\nTelefoni yt mund të nxehet shumë nëse ti:\n • Përdor aplikacione intensive për burimet (si p.sh. aplikacione lojërash, videosh ose navigimi)\n • Shkarkon ose ngarkon skedarë të mëdhenj\n • Përdor telefonin në temperatura të larta"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Pajisja jote ishte shumë e nxehtë, prandaj u fik për t\'u ftohur. Pajisja tani po funksionon normalisht.\n\nPajisja jote mund të nxehet shumë nëse ti:\n • Përdor aplikacione intensive për burimet (si p.sh. aplikacione lojërash, videosh ose navigimi)\n • Shkarkon ose ngarkon skedarë të mëdhenj\n • Përdor pajisjen në temperatura të larta"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tableti yt ishte shumë i nxehtë, prandaj u fik për t\'u ftohur. Tableti tani po funksionon normalisht.\n\nTableti yt mund të nxehet shumë nëse ti:\n • Përdor aplikacione intensive për burimet (si p.sh. aplikacione lojërash, videosh ose navigimi)\n • Shkarkon ose ngarkon skedarë të mëdhenj\n • Përdor tabletin në temperatura të larta"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefoni po nxehet"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Pajisja po nxehet"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tableti po nxehet"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Disa veçori janë të kufizuara ndërkohë që telefoni ftohet.\nTrokit për më shumë informacione"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Disa veçori janë të kufizuara ndërkohë që pajisja ftohet.\nTrokit për më shumë informacione"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Disa veçori janë të kufizuara ndërkohë që telefoni ftohet.\nTrokit për më shumë informacione"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefoni yt do të përpiqet automatikisht të ftohet. Mund të vazhdosh ta përdorësh telefonin, por ai mund të funksionojë më ngadalë.\n\nPasi telefoni të jetë ftohur, ai do të funksionojë normalisht."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Pajisja jote do të përpiqet automatikisht të ftohet. Mund të vazhdosh ta përdorësh pajisjen, por ajo mund të funksionojë më ngadalë.\n\nPasi pajisja të jetë ftohur, ajo do të funksionojë normalisht."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tableti yt do të përpiqet automatikisht të ftohet. Mund të vazhdosh ta përdorësh tabletin, por ai mund të funksionojë më ngadalë.\n\nPasi tableti të jetë ftohur, ai do të funksionojë normalisht."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Sensori i gjurmës së gishtit është në butonin e energjisë. Ai është butoni i rrafshët pranë butonit të ngritur të volumit në anë të tabletit."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Sensori i gjurmës së gishtit është në butonin e energjisë. Ai është butoni i rrafshët pranë butonit të ngritur të volumit në anë të pajisjes."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Sensori i gjurmës së gishtit është në butonin e energjisë. Ai është butoni i rrafshët pranë butonit të ngritur të volumit në anë të telefonit."</string> diff --git a/packages/SystemUI/res-product/values-sr/strings.xml b/packages/SystemUI/res-product/values-sr/strings.xml index 4c458a4493d1..76cd9ed1c4b1 100644 --- a/packages/SystemUI/res-product/values-sr/strings.xml +++ b/packages/SystemUI/res-product/values-sr/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Погрешно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Уклонићемо пословни профил, чиме се бришу сви подаци са профила."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Нетачно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, затражићемо да откључате таблет помоћу имејл налога.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Нетачно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Ако погрешно покушате још <xliff:g id="NUMBER_1">%2$d</xliff:g> пута, затражићемо да откључате телефон помоћу имејл налога.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Телефон се искључио због топлоте"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Уређај се искључио због топлоте"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Таблет се искључио због топлоте"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Телефон сада функционише нормално.\nДодирните за више информација"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Уређај сада функционише нормално.\nДодирните за више информација"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Таблет сада функционише нормално.\nДодирните за више информација"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Телефон је био преврућ, па се искључио да се охлади. Сада ради нормално.\n\nТелефон може превише да се угреје ако:\n • користите апликације које захтевају пуно ресурса (нпр. видео игре, видео или апликације за навигацију)\n • преузимате или отпремате велике фајлове\n • користите телефон на високој температури"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Уређај је био преврућ, па се искључио да се охлади. Сада ради нормално.\n\nУређај може превише да се угреје ако:\n • користите апликације које захтевају пуно ресурса (нпр. видео игре, видео или апликације за навигацију)\n • преузимате или отпремате велике фајлове\n • користите уређај на високој температури"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Таблет је био преврућ, па се искључио да се охлади. Сада ради нормално.\n\nТаблет може превише да се угреје ако:\n • користите апликације које захтевају пуно ресурса (нпр. видео игре, видео или апликације за навигацију)\n • преузимате или отпремате велике фајлове\n • користите таблет на високој температури"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Телефон се загрејао"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Уређај се загрејао"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Таблет се загрејао"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Неке функције су ограничене док се телефон не охлади.\nДодирните за више информација"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Неке функције су ограничене док се уређај не охлади.\nДодирните за више информација"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Неке функције су ограничене док се таблет не охлади.\nДодирните за више информација"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Телефон ће аутоматски покушати да се охлади. И даље можете да користите телефон, али ће можда радити спорије.\n\nКад се телефон охлади, функционисаће нормално."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Уређај ће аутоматски покушати да се охлади. И даље можете да користите уређај, али ће можда радити спорије.\n\nКад се уређај охлади, функционисаће нормално."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Таблет ће аутоматски покушати да се охлади. И даље можете да користите таблет, али ће можда радити спорије.\n\nКад се таблет охлади, функционисаће нормално."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Сензор за отисак прста се налази на дугмету за укључивање. То је равно дугме поред издигнутог дугмета за јачину звука на ивици таблета."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Сензор за отисак прста се налази на дугмету за укључивање. То је равно дугме поред издигнутог дугмета за јачину звука на ивици уређаја."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Сензор за отисак прста се налази на дугмету за укључивање. То је равно дугме поред издигнутог дугмета за јачину звука на ивици телефона."</string> diff --git a/packages/SystemUI/res-product/values-sv/strings.xml b/packages/SystemUI/res-product/values-sv/strings.xml index e2bbfa1915ff..bb97e5ca4998 100644 --- a/packages/SystemUI/res-product/values-sv/strings.xml +++ b/packages/SystemUI/res-product/values-sv/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Du har försökt låsa upp telefonen på ett felaktigt sätt <xliff:g id="NUMBER">%d</xliff:g> gånger. Jobbprofilen tas bort och all profildata raderas."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök måste du låsa upp surfplattan med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Du har ritat ditt grafiska lösenord fel <xliff:g id="NUMBER_0">%1$d</xliff:g> gånger. Efter ytterligare <xliff:g id="NUMBER_1">%2$d</xliff:g> försök måste du låsa upp telefonen med hjälp av ett e-postkonto.\n\n Försök igen om <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunder."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefonen stängdes av p.g.a. värme"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Enheten stängdes av p.g.a. värme"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Surfplattan stängdes av p.g.a. värme"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefonen fungerar nu som vanligt.\nTryck för mer information"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Enheten fungerar nu som vanligt.\nTryck för mer information"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Surfplattan fungerar nu som vanligt.\nTryck för mer information"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefonen var för varm och stängdes av för att svalna. Den fungerar nu som vanligt.\n\nTelefonen kan bli för varm om du\n • använder resurskrävande appar (till exempel spel-, video- eller navigeringsappar)\n • laddar ned eller laddar upp stora filer\n • använder telefonen vid höga temperaturer."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Enheten var för varm och stängdes av för att svalna. Den fungerar nu som vanligt.\n\nEnheten kan bli för varm om du\n • använder resurskrävande appar (till exempel spel-, video- eller navigeringsappar)\n • laddar ned eller laddar upp stora filer\n • använder enheten vid höga temperaturer."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Surfplattan var för varm och stängdes av för att svalna. Den fungerar nu som vanligt.\n\nSurfplattan kan bli för varm om du\n • använder resurskrävande appar (till exempel spel-, video- eller navigeringsappar)\n • laddar ned eller laddar upp stora filer\n • använder surfplattan vid höga temperaturer."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefonen börjar bli varm"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Enheten börjar bli varm"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Surfplattan börjar bli varm"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Vissa funktioner är begränsade medan telefonen svalnar.\nTryck för mer information"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Vissa funktioner är begränsade medan enheten svalnar.\nTryck för mer information"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Vissa funktioner är begränsade medan surfplattan svalnar.\nTryck för mer information"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefonen försöker svalna automatiskt. Du kan fortfarande använda telefonen, men den kan vara långsammare än vanligt.\n\nTelefonen fungerar som vanligt när den har svalnat."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Enheten försöker svalna automatiskt. Du kan fortfarande använda enheten, men den kan vara långsammare än vanligt.\n\nEnheten fungerar som vanligt när den har svalnat."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Surfplattan försöker svalna automatiskt. Du kan fortfarande använda surfplattan, men den kan vara långsammare än vanligt.\n\nSurfplattan fungerar som vanligt när den har svalnat."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Fingeravtryckssensorn sitter på av/på-knappen. Det är den platta knappen bredvid den upphöjda volymknappen på surfplattans kant."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Fingeravtryckssensorn sitter på av/på-knappen. Det är den platta knappen bredvid den upphöjda volymknappen på enhetens kant."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Fingeravtryckssensorn sitter på av/på-knappen. Det är den platta knappen bredvid den upphöjda volymknappen på telefonens kant."</string> diff --git a/packages/SystemUI/res-product/values-sw/strings.xml b/packages/SystemUI/res-product/values-sw/strings.xml index 2ebc3ebe3ca2..44e95de78e3d 100644 --- a/packages/SystemUI/res-product/values-sw/strings.xml +++ b/packages/SystemUI/res-product/values-sw/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Umejaribu kufungua simu mara <xliff:g id="NUMBER">%d</xliff:g> bila mafanikio. Wasifu wa kazini utaondolewa, hatua itakayofuta data yote ya wasifu."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Umeweka mchoro usio sahihi wa kufungua skrini mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%2$d</xliff:g> zaidi bila mafanikio, utaombwa ufungue kompyuta yako kibao kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Umeweka mchoro usio sahihi wa kufungua skrini mara <xliff:g id="NUMBER_0">%1$d</xliff:g>. Ukikosea mara nyingine <xliff:g id="NUMBER_1">%2$d</xliff:g>, utaombwa ufungue simu yako kwa kutumia akaunti ya barua pepe.\n\n Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%3$d</xliff:g>."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Simu imezimika kwa sababu ya joto"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Kifaa kimezimika kwa sababu ya joto"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Kishikwambi kimezimika kutokana na joto"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Simu yako sasa inafanya kazi inavyostahili.\nGusa ili upate maelezo zaidi"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Kifaa chako sasa kinafanya kazi inavyostahili.\nGusa ili upate maelezo zaidi"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Kishikwambi chako sasa kinafanya kazi inavyostahili.\nGusa ili upate maelezo zaidi"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Simu yako ilikuwa na joto jingi mno, kwa hivyo imezimika ili ipoe. Simu yako sasa inafanya kazi inavyostahili.\n\nHuenda simu yako ikawa na joto jingi mno:\n • Ukitumia programu zinazoendesha nyenzo nyingi (kama vile michezo ya video, video au programu za uelekezaji)\n • Ukipakua au ukipakia faili kubwa\n • Ukitumia simu mahali palipo na joto jingi"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Kifaa chako kilikuwa na joto jingi mno, kwa hivyo kimezimika ili kipoe. Kifaa chako sasa kinafanya kazi inavyostahili.\n\nHuenda kifaa chako kikawa na joto jingi mno:\n • Ukitumia programu zinazoendesha nyenzo nyingi (kama vile michezo ya video, video au programu za uelekezaji)\n • Ukipakua au ukipakia faili kubwa\n • Ukitumia kifaa mahali palipo na joto jingi"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Kishikwambi chako kilikuwa na joto jingi mno, kwa hivyo kimezimika ili kipoe. Kishikwambi chako sasa kinafanya kazi inavyostahili.\n\nHuenda kishikwambi chako kikawa na joto jingi mno:\n • Ukitumia programu zinazoendesha nyenzo nyingi (kama vile michezo ya video, video au programu za uelekezaji)\n • Ukipakua au ukipakia faili kubwa\n • Ukitumia kishikwambi mahali palipo na joto jingi"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Simu inapata joto"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Kifaa kinapata joto"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Kishikwambi kinapata joto"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Huenda usiweze kutumia baadhi ya vipengele wakati simu inapoa.\nGusa ili upate maelezo zaidi"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Huenda usiweze kutumia baadhi ya vipengele wakati kifaa kinapoa.\nGusa ili upate maelezo zaidi"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Huenda usiweze kutumia baadhi ya vipengele wakati kishikwambi kinapoa.\nGusa ili upate maelezo zaidi"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Simu yako itajaribu kupoa kiotomatiki. Bado unaweza kutumia simu yako, lakini huenda ikafanya kazi polepole.\n\nSimu yako ikipoa, itaendelea kufanya kazi inavyostahili."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Kifaa chako kitajaribu kupoa kiotomatiki. Bado unaweza kutumia kifaa chako, lakini huenda kikafanya kazi polepole.\n\nKifaa chako kikipoa, kitaendelea kufanya kazi inavyostahili."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Kishikwambi chako kitajaribu kupoa kiotomatiki. Bado unaweza kutumia kishikwambi chako, lakini huenda kikafanya kazi polepole.\n\nKishikwambi chako kikipoa, kitaendelea kufanya kazi inavyostahili."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Kitambuzi cha alama ya kidole kinapatikana kwenye kitufe cha kuwasha/kuzima. Ni kitufe bapa pembeni pa kitufe cha sauti kilichoinuka kwenye ukingo wa kompyuta kibao."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Kitambuzi cha alama ya kidole kinapatikana kwenye kitufe cha kuwasha/kuzima. Ni kitufe bapa pembeni pa kitufe cha sauti kilichoinuka kwenye ukingo wa kifaa."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Kitambuzi cha alama ya kidole kinapatikana kwenye kitufe cha kuwasha/kuzima. Ni kitufe bapa pembeni pa kitufe cha sauti kilichoinuka kwenye ukingo wa simu."</string> diff --git a/packages/SystemUI/res-product/values-ta/strings.xml b/packages/SystemUI/res-product/values-ta/strings.xml index 967afedf5309..774134e6ee77 100644 --- a/packages/SystemUI/res-product/values-ta/strings.xml +++ b/packages/SystemUI/res-product/values-ta/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"மொபைலை அன்லாக் செய்ய, <xliff:g id="NUMBER">%d</xliff:g> முறை தவறாக முயன்றுவிட்டதனால் பணிக் கணக்கு அகற்றப்படும். இதனால் அதிலுள்ள அனைத்துச் சுயவிவரத் தரவும் நீக்கப்படும்."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"அன்லாக் பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி டேப்லெட்டை அன்லாக் செய்யும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"அன்லாக் பேட்டர்னை, <xliff:g id="NUMBER_0">%1$d</xliff:g> முறை தவறாக வரைந்துவிட்டீர்கள். இன்னும் <xliff:g id="NUMBER_1">%2$d</xliff:g> முறை தவறாக வரைந்தால், மின்னஞ்சல் கணக்கைப் பயன்படுத்தி மொபைலை அன்லாக் செய்யும்படி கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> வினாடிகளில் மீண்டும் முயலவும்."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"மொபைல் சூடானதால் அணைக்கப்பட்டது"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"சாதனம் சூடானதால் அணைக்கப்பட்டது"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"டேப்லெட் சூடானதால் அணைக்கப்பட்டது"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"இப்போது உங்கள் மொபைல் இயல்புநிலையில் இயங்குகிறது.\nமேலும் தகவலுக்குத் தட்டவும்."</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"இப்போது உங்கள் சாதனம் இயல்புநிலையில் இயங்குகிறது.\nமேலும் தகவலுக்குத் தட்டவும்."</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"இப்போது உங்கள் டேப்லெட் இயல்புநிலையில் இயங்குகிறது.\nமேலும் தகவலுக்குத் தட்டவும்."</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"உங்கள் மொபைல் அதிக சூடானதால் அதன் சூட்டைக் குறைக்க அணைக்கப்பட்டது. இப்போது உங்கள் மொபைல் இயல்புநிலையில் இயங்குகிறது.\n\nபின்வருபவற்றைச் செய்தால், உங்கள் மொபைல் சூடாகலாம்:\n • அதிகளவு தரவைப் பயன்படுத்தும் ஆப்ஸை (கேமிங், வீடியோ, வழிகாட்டுதல் ஆப்ஸ் போன்றவை) பயன்படுத்துதல்\n • பெரிய ஃபைல்களைப் பதிவிறக்குதல்/பதிவேற்றுதல்\n • அதிக வெப்பநிலையில் மொபைலைப் பயன்படுத்துதல்"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"உங்கள் சாதனம் அதிக சூடானதால் அதன் சூட்டைக் குறைக்க அணைக்கப்பட்டது. இப்போது உங்கள் சாதனம் இயல்புநிலையில் இயங்குகிறது.\n\nபின்வருபவற்றைச் செய்தால், உங்கள் சாதனம் சூடாகலாம்:\n • அதிகளவு தரவைப் பயன்படுத்தும் ஆப்ஸை (கேமிங், வீடியோ, வழிகாட்டுதல் ஆப்ஸ் போன்றவை) பயன்படுத்துதல்\n • பெரிய ஃபைல்களைப் பதிவிறக்குதல்/பதிவேற்றுதல்\n • அதிக வெப்பநிலையில் சாதனத்தைப் பயன்படுத்துதல்"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"உங்கள் டேப்லெட் அதிக சூடானதால் அதன் சூட்டைக் குறைக்க அணைக்கப்பட்டது. இப்போது உங்கள் டேப்லெட் இயல்புநிலையில் இயங்குகிறது.\n\nபின்வருபவற்றைச் செய்தால், உங்கள் டேப்லெட் சூடாகலாம்:\n • அதிகளவு தரவைப் பயன்படுத்தும் ஆப்ஸை (கேமிங், வீடியோ, வழிகாட்டுதல் ஆப்ஸ் போன்றவை) பயன்படுத்துதல்\n • பெரிய ஃபைல்களைப் பதிவிறக்குதல்/பதிவேற்றுதல்\n • அதிக வெப்பநிலையில் டேப்லெட்டைப் பயன்படுத்துதல்"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"மொபைல் சூடாகிறது"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"சாதனம் சூடாகிறது"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"டேப்லெட் சூடாகிறது"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"மொபைலின் சூடு குறையும் வரை சில அம்சங்களைப் பயன்படுத்த முடியாது.\nமேலும் தகவலுக்குத் தட்டவும்."</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"சாதனத்தின் சூடு குறையும் வரை சில அம்சங்களைப் பயன்படுத்த முடியாது.\nமேலும் தகவலுக்குத் தட்டவும்."</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"டேப்லெட்டின் சூடு குறையும் வரை சில அம்சங்களைப் பயன்படுத்த முடியாது.\nமேலும் தகவலுக்குத் தட்டவும்."</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"உங்கள் மொபைல் தானாகவே அதன் சூட்டைக் குறைக்க முயலும். தொடர்ந்து மொபைலை உங்களால் பயன்படுத்த முடியும். ஆனால் அது மெதுவாக இயங்கக்கூடும்.\n\nஉங்கள் மொபைலின் சூடு குறைந்தவுடன் அது இயல்பாக இயங்கும்."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"உங்கள் சாதனம் தானாகவே அதன் சூட்டைக் குறைக்க முயலும். தொடர்ந்து சாதனத்தை உங்களால் பயன்படுத்த முடியும். ஆனால் அது மெதுவாக இயங்கக்கூடும்.\n\nஉங்கள் சாதனத்தின் சூடு குறைந்தவுடன் அது இயல்பாக இயங்கும்."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"உங்கள் டேப்லெட் தானாகவே அதன் சூட்டைக் குறைக்க முயலும். தொடர்ந்து டேப்லெட்டை உங்களால் பயன்படுத்த முடியும். ஆனால் அது மெதுவாக இயங்கக்கூடும்.\n\nஉங்கள் டேப்லெட்டின் சூடு குறைந்தவுடன் அது இயல்பாக இயங்கும்."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"\'கைரேகை சென்சார்\' பவர் பட்டனில் உள்ளது. இது டேப்லெட்டின் விளிம்பில் சற்று மேலெழும்பிய ஒலியளவு பட்டனுக்கு அடுத்துள்ள தட்டையான பட்டனாகும்."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"\'கைரேகை சென்சார்\' பவர் பட்டனில் உள்ளது. இது சாதனத்தின் விளிம்பில் சற்று மேலெழும்பிய ஒலியளவு பட்டனுக்கு அடுத்துள்ள தட்டையான பட்டனாகும்."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"\'கைரேகை சென்சார்\' பவர் பட்டனில் உள்ளது. இது மொபைலின் விளிம்பில் சற்று மேலெழும்பிய ஒலியளவு பட்டனுக்கு அடுத்துள்ள தட்டையான பட்டனாகும்."</string> diff --git a/packages/SystemUI/res-product/values-te/strings.xml b/packages/SystemUI/res-product/values-te/strings.xml index 80622f5eb8cd..357b2747b90a 100644 --- a/packages/SystemUI/res-product/values-te/strings.xml +++ b/packages/SystemUI/res-product/values-te/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"మీరు ఫోన్ను అన్లాక్ చేయడానికి <xliff:g id="NUMBER">%d</xliff:g> సార్లు తప్పు ప్రయత్నాలు చేశారు. కార్యాలయ ప్రొఫైల్ తీసివేయబడుతుంది, దీని వలన ప్రొఫైల్ డేటా మొత్తం తొలగించబడుతుంది."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%1$d</xliff:g> సార్లు తప్పుగా గీసారు. మరో <xliff:g id="NUMBER_1">%2$d</xliff:g> ప్రయత్నాలలో విఫలమైతే, మీరు ఈమెయిల్ ఖాతాను ఉపయోగించి మీ టాబ్లెట్ను అన్లాక్ చేయాల్సి వస్తుంది.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> సెకన్లలో మళ్లీ ట్రై చేయండి."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"మీరు మీ అన్లాక్ నమూనాను <xliff:g id="NUMBER_0">%1$d</xliff:g> సార్లు తప్పుగా గీసారు. మరో <xliff:g id="NUMBER_1">%2$d</xliff:g> ప్రయత్నాలలో విఫలమైతే, మీరు ఈమెయిల్ ఖాతాను ఉపయోగించి మీ ఫోన్ను అన్లాక్ చేయాల్సి వస్తుంది.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> సెకన్లలో మళ్లీ ట్రై చేయండి."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"వేడెక్కినందుకు పరికరం ఆఫ్ చేయబడింది"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"వేడెక్కినందుకు టాబ్లెట్ ఆఫ్ చేయబడింది"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తోంది.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"మీ పరికరం ఇప్పుడు సాధారణంగా పని చేస్తోంది.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"మీ టాబ్లెట్ ఇప్పుడు సాధారణంగా పని చేస్తోంది.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • రిసోర్స్-ఆధారిత యాప్లు (వీడియో గేమ్లు, వీడియో లేదా నావిగేషన్ వంటి యాప్లు) ఉపయోగించడం\n • పెద్ద ఫైల్స్ను డౌన్లోడ్ లేదా అప్లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్ని ఉపయోగించడం"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"మీ పరికరం చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ పరికరం ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ పరికరం చాలా వేడెక్కవచ్చు:\n • రిసోర్స్-ఆధారిత యాప్లు (వీడియో గేమ్లు, వీడియో లేదా నావిగేషన్ వంటి యాప్లు) ఉపయోగించడం\n • పెద్ద ఫైల్స్ను డౌన్లోడ్ లేదా అప్లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ పరికరాన్ని ఉపయోగించడం"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"మీ టాబ్లెట్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ టాబ్లెట్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ టాబ్లెట్ చాలా వేడెక్కవచ్చు:\n • రిసోర్స్-ఆధారిత యాప్లు (వీడియో గేమ్లు, వీడియో లేదా నావిగేషన్ వంటి యాప్లు) ఉపయోగించడం\n • పెద్ద ఫైల్స్ను డౌన్లోడ్ లేదా అప్లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ టాబ్లెట్ను ఉపయోగించడం"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"ఫోన్ వేడెక్కుతోంది"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"పరికరం వేడెక్కుతోంది"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"టాబ్లెట్ వేడెక్కుతోంది"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ఫోన్ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"పరికరాన్ని చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"టాబ్లెట్ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"మీ ఫోన్ ఆటోమేటిక్గా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"మీ పరికరం ఆటోమేటిక్గా చల్లబరచడానికి ట్రై చేస్తుంది. మీరు ఇప్పటికీ మీ పరికరాన్ని ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ పరికరం చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"మీ టాబ్లెట్ ఆటోమేటిక్గా చల్లబరచడానికి ట్రై చేస్తుంది. మీరు ఇప్పటికీ మీ టాబ్లెట్ని ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ టాబ్లెట్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"వేలిముద్ర సెన్సార్ పవర్ బటన్పై ఉంది. ఇది, ఈ టాబ్లెట్ అంచున ఉబ్బెత్తుగా ఉన్న వాల్యూమ్ బటన్ పక్కన ఉన్న ఫ్లాట్ బటన్."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"వేలిముద్ర సెన్సార్ పవర్ బటన్పై ఉంది. ఇది, ఈ పరికరం అంచున ఉబ్బెత్తుగా ఉన్న వాల్యూమ్ బటన్ పక్కన ఉన్న ఫ్లాట్ బటన్."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"వేలిముద్ర సెన్సార్ పవర్ బటన్పై ఉంది. ఇది, ఈ ఫోన్ అంచున ఉబ్బెత్తుగా ఉన్న వాల్యూమ్ బటన్ పక్కన ఉన్న ఫ్లాట్ బటన్."</string> diff --git a/packages/SystemUI/res-product/values-th/strings.xml b/packages/SystemUI/res-product/values-th/strings.xml index e3d5640b3981..ae1f3ed3018d 100644 --- a/packages/SystemUI/res-product/values-th/strings.xml +++ b/packages/SystemUI/res-product/values-th/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"คุณปลดล็อกโทรศัพท์ไม่ถูกต้อง <xliff:g id="NUMBER">%d</xliff:g> ครั้งแล้ว ระบบจะนำโปรไฟล์งานออก ซึ่งจะเป็นการลบข้อมูลทั้งหมดในโปรไฟล์"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%1$d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%2$d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกแท็บเล็ตโดยใช้บัญชีอีเมล\n\n โปรดลองอีกครั้งใน <xliff:g id="NUMBER_2">%3$d</xliff:g> วินาที"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"คุณวาดรูปแบบการปลดล็อกไม่ถูกต้อง <xliff:g id="NUMBER_0">%1$d</xliff:g> ครั้งแล้ว หากทำไม่สำเร็จอีก <xliff:g id="NUMBER_1">%2$d</xliff:g> ครั้ง ระบบจะขอให้คุณปลดล็อกโทรศัพท์โดยใช้บัญชีอีเมล\n\n โปรดลองอีกครั้งในอีก <xliff:g id="NUMBER_2">%3$d</xliff:g> วินาที"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"โทรศัพท์ปิดไปเพราะร้อนมาก"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"อุปกรณ์ปิดไปเพราะร้อนมาก"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"แท็บเล็ตปิดไปเพราะร้อนมาก"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"ขณะนี้โทรศัพท์ทำงานเป็นปกติ\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"ขณะนี้อุปกรณ์ทำงานเป็นปกติ\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"ขณะนี้แท็บเล็ตทำงานเป็นปกติ\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"โทรศัพท์ร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้โทรศัพท์ทำงานเป็นปกติ\n\nโทรศัพท์อาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้โทรศัพท์ในอุณหภูมิที่สูง"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"อุปกรณ์ร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้อุปกรณ์ทำงานเป็นปกติ\n\nอุปกรณ์อาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้อุปกรณ์ในอุณหภูมิที่สูง"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"แท็บเล็ตร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้แท็บเล็ตทำงานเป็นปกติ\n\nแท็บเล็ตอาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้แท็บเล็ตในอุณหภูมิที่สูง"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"โทรศัพท์เริ่มร้อน"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"อุปกรณ์เริ่มร้อน"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"แท็บเล็ตเริ่มร้อน"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์เย็นลง\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะอุปกรณ์เย็นลง\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะแท็บเล็ตเย็นลง\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"โทรศัพท์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้โทรศัพท์ได้ แต่อาจทำงานช้าลง\n\nโทรศัพท์จะทำงานตามปกติเมื่อเย็นลงแล้ว"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"อุปกรณ์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้อุปกรณ์ได้ แต่อาจทำงานช้าลง\n\nอุปกรณ์จะทำงานตามปกติเมื่อเย็นลงแล้ว"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"แท็บเล็ตจะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้แท็บเล็ตได้ แต่อาจทำงานช้าลง\n\nแท็บเล็ตจะทำงานตามปกติเมื่อเย็นลงแล้ว"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"เซ็นเซอร์ลายนิ้วมืออยู่ที่ปุ่มเปิด/ปิด ซึ่งเป็นปุ่มแบนข้างปุ่มนูนที่ใช้ปรับระดับเสียงตรงบริเวณขอบของแท็บเล็ต"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"เซ็นเซอร์ลายนิ้วมืออยู่ที่ปุ่มเปิด/ปิด ซึ่งเป็นปุ่มแบนข้างปุ่มนูนที่ใช้ปรับระดับเสียงตรงบริเวณขอบของอุปกรณ์"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"เซ็นเซอร์ลายนิ้วมืออยู่ที่ปุ่มเปิด/ปิด ซึ่งเป็นปุ่มแบนข้างปุ่มนูนที่ใช้ปรับระดับเสียงตรงบริเวณขอบของโทรศัพท์"</string> diff --git a/packages/SystemUI/res-product/values-tl/strings.xml b/packages/SystemUI/res-product/values-tl/strings.xml index 4c286eb4d81b..74f30ae44dc0 100644 --- a/packages/SystemUI/res-product/values-tl/strings.xml +++ b/packages/SystemUI/res-product/values-tl/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"<xliff:g id="NUMBER">%d</xliff:g> (na) beses mo nang sinubukang i-unlock ang telepono gamit ang maling password. Aalisin ang profile sa trabaho, na magiging dahilan para ma-delete ang lahat ng data sa profile."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses kang nagkamali sa pagguhit ng iyong pattern sa pag-unlock. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, hihilingin sa iyong i-unlock ang tablet mo gamit ang isang email account.\n\n Subukan ulit sa loob ng <xliff:g id="NUMBER_2">%3$d</xliff:g> (na) segundo."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"<xliff:g id="NUMBER_0">%1$d</xliff:g> (na) beses kang nagkamali sa pagguhit ng iyong pattern sa pag-unlock. Pagkatapos ng <xliff:g id="NUMBER_1">%2$d</xliff:g> pang hindi matagumpay na pagsubok, hihilingin sa iyong i-unlock ang telepono mo gamit ang isang email account.\n\n Subukan ulit sa loob ng <xliff:g id="NUMBER_2">%3$d</xliff:g> (na) segundo."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Na-off ang telepono dahil sa init"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Na-off ang device dahil sa init"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Na-off ang tablet dahil sa init"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Maayos na ngayong gumagana ang iyong telepono.\nMag-tap para sa higit pang impormasyon"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Maayos na ngayong gumagana ang iyong device.\nMag-tap para sa higit pang impormasyon"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Maayos na ngayong gumagana ang iyong tablet.\nMag-tap para sa higit pang impormasyon"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Napakainit ng telepono mo, kaya nag-off ito para magpalamig. Maayos na itong gumagana.\n\nPosibleng lubos na uminit ang iyong telepono kapag:\n • Gumagamit ka ng mga resource-intensive na app (gaya ng app para sa gaming, video, o pag-navigate)\n • Nagda-download o nag-a-upload ka ng malalaking file\n • Ginagamit mo ang iyong telepono sa maiinit na lugar"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Napakainit ng device mo, kaya nag-off ito para magpalamig. Maayos na itong gumagana.\n\nPosibleng lubos na uminit ang iyong device kapag:\n • Gumagamit ka ng mga resource-intensive na app (gaya ng app para sa gaming, video, o pag-navigate)\n • Nagda-download o nag-a-upload ka ng malalaking file\n • Ginagamit mo ang iyong device sa maiinit na lugar"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Napakainit ng tablet mo, kaya nag-off ito para magpalamig. Maayos na itong gumagana.\n\nPosibleng lubos na uminit ang iyong tablet kapag:\n • Gumagamit ka ng mga resource-intensive na app (gaya ng app para sa gaming, video, o pag-navigate)\n • Nagda-download o nag-a-upload ka ng malalaking file\n • Ginagamit mo ang iyong tablet sa maiinit na lugar"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Umiinit ang telepono"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Umiinit ang device"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Umiinit ang tablet"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Limitado ang ilang feature habang nagpapalamig ang telepono.\nMag-tap para sa higit pang impormasyon"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Limitado ang ilang feature habang nagpapalamig ang device.\nMag-tap para sa higit pang impormasyon"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Limitado ang ilang feature habang nagpapalamig ang tablet.\nMag-tap para sa higit pang impormasyon"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Awtomatikong susubukan ng iyong telepono na magpalamig. Magagamit mo pa rin ang iyong telepono, pero posibleng mas mabagal ang paggana nito.\n\nKapag lumamig na ang telepono mo, gagana ito gaya ng karaniwan."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Awtomatikong susubukan ng iyong device na magpalamig. Magagamit mo pa rin ang iyong device, pero posibleng mas mabagal ang paggana nito.\n\nKapag lumamig na ang device mo, gagana ito gaya ng karaniwan."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Awtomatikong susubukan ng iyong tablet na magpalamig. Magagamit mo pa rin ang iyong tablet, pero posibleng mas mabagal ang paggana nito.\n\nKapag lumamig na ang tablet mo, gagana ito gaya ng karaniwan."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Nasa power button ang sensor para sa fingerprint. Ito ang flat na button sa tabi ng nakaangat na button ng volume sa gilid ng tablet."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Nasa power button ang sensor para sa fingerprint. Ito ang flat na button sa tabi ng nakaangat na button ng volume sa gilid ng device."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Nasa power button ang sensor para sa fingerprint. Ito ang flat na button sa tabi ng nakaangat na button ng volume sa gilid ng telepono."</string> diff --git a/packages/SystemUI/res-product/values-tr/strings.xml b/packages/SystemUI/res-product/values-tr/strings.xml index b376e9806c0e..68183e4d2ca8 100644 --- a/packages/SystemUI/res-product/values-tr/strings.xml +++ b/packages/SystemUI/res-product/values-tr/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Telefonun kilidini <xliff:g id="NUMBER">%d</xliff:g> kez hatalı bir şekilde açmayı denediniz. İş profili kaldırılacak ve tüm profil verileri silinecektir."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%1$d</xliff:g> kez hatalı çizdiniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız tabletinizin kilidini bir e-posta hesabı kullanarak açmanız istenir.\n<xliff:g id="NUMBER_2">%3$d</xliff:g>\n saniye içinde tekrar deneyin."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Kilit açma deseninizi <xliff:g id="NUMBER_0">%1$d</xliff:g> kez yanlış çizdiniz. <xliff:g id="NUMBER_1">%2$d</xliff:g> başarısız deneme daha yaparsanız telefonunuzu bir e-posta hesabı kullanarak açmanız istenir.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> saniye içinde tekrar deneyin."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon ısındığından kapatıldı"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Cihaz ısındığından kapatıldı"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Tablet ısındığından kapatıldı"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Telefonunuz şu anda normal bir şekilde çalışıyor.\nDaha fazla bilgi için dokunun"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Cihazınız şu anda normal bir şekilde çalışıyor.\nDaha fazla bilgi için dokunun"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Tabletiniz şu anda normal bir şekilde çalışıyor.\nDaha fazla bilgi için dokunun"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefonunuz çok ısındığından soğuması için kapatıldı ve şu anda normal bir şekilde çalışıyor.\n\nTelefonunuz şu koşullarda çok ısınabilir:\n • Yoğun kaynak gerektiren uygulamalar (oyun, video veya gezinme uygulamaları gibi) kullanma\n • Büyük dosyalar indirme veya yükleme\n • Telefonunuzu sıcak yerlerde kullanma"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Cihazınız çok ısındığından soğuması için kapatıldı ve şu anda normal bir şekilde çalışıyor.\n\nAygıtınız şu koşullarda çok ısınabilir:\n • Yoğun kaynak gerektiren uygulamalar (oyun, video veya gezinme uygulamaları gibi) kullanma\n • Büyük dosyalar indirme veya yükleme\n • Cihazınızı sıcak yerlerde kullanma"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Tabletiniz çok ısındığından soğuması için kapatıldı ve şu anda normal bir şekilde çalışıyor.\n\nTabletiniz şu koşullarda çok ısınabilir:\n • Yoğun kaynak gerektiren uygulamalar (oyun, video veya gezinme uygulamaları gibi) kullanma\n • Büyük dosyalar indirme veya yükleme\n • Tabletinizi sıcak yerlerde kullanma"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon ısınıyor"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Cihaz ısınıyor"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Tablet ısınıyor"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Telefon soğurken bazı özellikler sınırlı olarak kullanılabilir.\nDaha fazla bilgi için dokunun"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Telefon soğurken bazı özellikler sınırlı olarak kullanılabilir.\nDaha fazla bilgi için dokunun"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Tablet soğurken bazı özellikler sınırlı olarak kullanılabilir.\nDaha fazla bilgi için dokunun"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefonunuz otomatik olarak soğumaya çalışacak. Bu sırada telefonunuzu kullanmaya devam edebilirsiniz ancak uygulamalar daha yavaş çalışabilir.\n\nTelefonunuz soğuduktan sonra normal şekilde çalışacaktır."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Cihazınız otomatik olarak soğumaya çalışacak. Cihazınız bu sırada kullanılabilir ancak daha yavaş çalışabilir.\n\nCihazınız soğuduktan sonra normal şekilde çalışacaktır."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Tabletiniz otomatik olarak soğumaya çalışacak. Tabletiniz bu sırada kullanılabilir ancak daha yavaş çalışabilir.\n\nTabletiniz soğuduktan sonra normal şekilde çalışacaktır."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Parmak izi sensörü güç düğmesinin üzerindedir. Bu sensör, tabletin kenarındaki standart ses düğmesinin yanında bulunan düz düğmedir."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Parmak izi sensörü güç düğmesinin üzerindedir. Bu sensör, cihazın kenarındaki standart ses düğmesinin yanında bulunan düz düğmedir."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Parmak izi sensörü güç düğmesinin üzerindedir. Bu sensör, telefonun kenarındaki standart ses düğmesinin yanında bulunan düz düğmedir."</string> diff --git a/packages/SystemUI/res-product/values-uk/strings.xml b/packages/SystemUI/res-product/values-uk/strings.xml index ed0762b1b936..e0aff9e87464 100644 --- a/packages/SystemUI/res-product/values-uk/strings.xml +++ b/packages/SystemUI/res-product/values-uk/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Кількість невдалих спроб розблокувати телефон: <xliff:g id="NUMBER">%d</xliff:g>. Буде видалено робочий профіль і всі його дані."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Залишилося спроб: <xliff:g id="NUMBER_1">%2$d</xliff:g>. У разі невдачі з\'явиться запит розблокувати планшет за допомогою облікового запису електронної пошти.\n\n Повторіть спробу за <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ключ розблокування неправильно намальовано стільки разів: <xliff:g id="NUMBER_0">%1$d</xliff:g>. Залишилося спроб: <xliff:g id="NUMBER_1">%2$d</xliff:g>. У разі невдачі з\'явиться запит розблокувати телефон за допомогою облікового запису електронної пошти.\n\n Повторіть спробу за <xliff:g id="NUMBER_2">%3$d</xliff:g> с."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Телефон перегрівся й вимкнувся"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Пристрій перегрівся й вимкнувся"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Планшет перегрівся й вимкнувся"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Зараз телефон працює як зазвичай.\nНатисніть, щоб дізнатися більше"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Зараз пристрій працює як зазвичай.\nНатисніть, щоб дізнатися більше"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Зараз планшет працює як зазвичай.\nНатисніть, щоб дізнатися більше"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Телефон перегрівся, тому вимкнувся, щоб охолонути. Зараз він працює як зазвичай.\n\nТелефон може перегріватися, якщо ви:\n • використовуєте ресурсомісткі додатки (наприклад, ігри, додатки з відео чи для навігації);\n • завантажуєте великі файли на телефон або з нього;\n • використовуєте телефон за високої температури."</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Пристрій перегрівся, тому вимкнувся, щоб охолонути. Зараз він працює як зазвичай.\n\nПристрій може перегріватися, якщо ви:\n • використовуєте ресурсомісткі додатки (наприклад, ігри, додатки з відео чи для навігації);\n • завантажуєте великі файли на пристрій або з нього;\n • використовуєте пристрій за високої температури."</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Планшет перегрівся, тому вимкнувся, щоб охолонути. Зараз він працює як зазвичай.\n\nПланшет може перегріватися, якщо ви:\n • використовуєте ресурсомісткі додатки (наприклад, ігри, додатки з відео чи для навігації);\n • завантажуєте великі файли на планшет або з нього;\n • використовуєте планшет за високої температури."</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Телефон нагрівається"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Пристрій нагрівається"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Планшет нагрівається"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Під час охолодження телефона деякі функції обмежуються.\nНатисніть, щоб дізнатися більше"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Під час охолодження пристрою деякі функції обмежуються.\nНатисніть, щоб дізнатися більше"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Під час охолодження планшета деякі функції обмежуються.\nНатисніть, щоб дізнатися більше"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Ваш телефон автоматично спробує охолодитися. Ви можете й далі користуватися ним, але він може працювати повільніше.\n\nКоли телефон охолоне, він знову працюватиме як зазвичай."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Ваш пристрій автоматично спробує охолодитися. Ви можете й далі користуватися ним, але він може працювати повільніше.\n\nКоли пристрій охолоне, він знову працюватиме як зазвичай."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Ваш планшет автоматично спробує охолодитися. Ви можете й далі користуватися ним, але він може працювати повільніше.\n\nКоли планшет охолоне, він знову працюватиме як зазвичай."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Сканер відбитків пальців розташовано на кнопці живлення. Це плоска кнопка поруч із випуклою кнопкою гучності на бічній крайці планшета."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Сканер відбитків пальців розташовано на кнопці живлення. Це плоска кнопка поруч із випуклою кнопкою гучності на бічній крайці пристрою."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Сканер відбитків пальців розташовано на кнопці живлення. Це плоска кнопка поруч із випуклою кнопкою гучності на бічній крайці телефона."</string> diff --git a/packages/SystemUI/res-product/values-ur/strings.xml b/packages/SystemUI/res-product/values-ur/strings.xml index c706aba42a70..98fe163cc98f 100644 --- a/packages/SystemUI/res-product/values-ur/strings.xml +++ b/packages/SystemUI/res-product/values-ur/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"آپ نے فون کو غیر مقفل کرنے کیلئے <xliff:g id="NUMBER">%d</xliff:g> بار غلط طریقے سے کوشش کی ہے۔ دفتری پروفائل ہٹا دی جائے گی، جس سے پروفائل کا سبھی ڈیٹا حذف ہو جائے گا۔"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%1$d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%2$d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے ایک ای میل اکاؤنٹ استعمال کر کے اپنا ٹیبلیٹ غیر مقفل کرنے کو کہا جائے گا۔\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%1$d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%2$d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے ایک ای میل اکاؤنٹ استعمال کر کے اپنا فون غیر مقفل کرنے کو کہا جائے گا۔\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"گرم ہونے کی وجہ سے فون آف ہو گیا"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"گرم ہونے کی وجہ سے آلہ آف ہو گیا"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"گرم ہونے کی وجہ سے ٹیبلیٹ آف ہو گیا"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"آپ کا فون اب حسب معمول چل رہا ہے۔\nمزید معلومات کیلئے تھپتھپائیں"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"آپ کا آلہ اب حسب معمول چل رہا ہے۔\nمزید معلومات کیلئے تھپتھپائیں"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"آپ کا ٹیبلیٹ اب حسب معمول چل رہا ہے۔\nمزید معلومات کیلئے تھپتھپائیں"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"آپ کا فون کافی گرم ہو گيا تھا، اس لئے ٹھنڈا ہونے کیلئے یہ آف ہو گیا۔ اب آپ کا فون حسب معمول کام کر رہا ہے۔\n\nمندرجہ ذیل چیزیں کرنے پر آپ کا فون کافی گرم ہو سکتا ہے:\n • ماخذ کا زیادہ استعمال کرنے والی ایپس (جیسے کہ گیمنگ، ویڈیو، یا نیویگیشن ایپس) کا استعمال کرنا\n • بڑی فائلز ڈاؤن لوڈ یا اپ لوڈ کرنا\n • اعلی درجہ حرارت میں فون کا استعمال کرنا"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"آپ کا آلہ کافی گرم ہو گيا تھا، اس لئے ٹھنڈا ہونے کیلئے یہ آف ہو گیا۔ اب آپ کا آلہ حسب معمول کام کر رہا ہے۔\n\nمندرجہ ذیل چیزیں کرنے پر آپ کا آلہ کافی گرم ہو سکتا ہے:\n • ماخذ کا زیادہ استعمال کرنے والی ایپس (جیسے کہ گیمنگ، ویڈیو، یا نیویگیشن ایپس) کا استعمال کرنا\n • بڑی فائلز ڈاؤن لوڈ یا اپ لوڈ کرنا\n • اعلی درجہ حرارت میں آلہ کا استعمال کرنا"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"آپ کا ٹیبلیٹ کافی گرم ہو گيا تھا، اس لئے ٹھنڈا ہونے کیلئے یہ آف ہو گیا۔ اب آپ کا ٹیبلیٹ حسب معمول کام کر رہا ہے۔\n\nمندرجہ ذیل چیزیں کرنے پر آپ کا ٹیبلیٹ کافی گرم ہو سکتا ہے:\n • ماخذ کا زیادہ استعمال کرنے والی ایپس (جیسے کہ گیمنگ، ویڈیو، یا نیویگیشن ایپس) کا استعمال کرنا\n • بڑی فائلز ڈاؤن لوڈ یا اپ لوڈ کرنا\n • اعلی درجہ حرارت میں اپنے ٹیبلیٹ کا استعمال کرنا"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"فون گرم ہو رہا ہے"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"آلہ گرم ہو رہا ہے"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"ٹیبلیٹ گرم ہو رہا ہے"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"فون کے ٹھنڈا ہونے تک کچھ خصوصیات محدود ہیں۔\nمزید معلومات کیلئے تھپتھپائیں"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"آلہ کے ٹھنڈا ہونے تک کچھ خصوصیات محدود ہیں۔\nمزید معلومات کیلئے تھپتھپائیں"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"ٹیبلیٹ کے ٹھنڈا ہونے تک کچھ خصوصیات محدود ہیں۔\nمزید معلومات کیلئے تھپتھپائیں"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"آپ کا فون خودکار طور پر ٹھنڈا ہونے کی کوشش کرے گا۔ آپ ابھی بھی اپنا فون استعمال کر سکتے ہیں، مگر ہو سکتا ہے یہ سست چلے۔\n\nآپ کا فون ٹھنڈا ہونے کے بعد، یہ حسب معمول چلے گا۔"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"آپ کا آلہ خودکار طور پر ٹھنڈا ہونے کی کوشش کرے گا۔ آپ اب بھی اپنا آلہ استعمال کر سکتے ہیں، لیکن یہ آہستہ چل سکتا ہے۔\n\nآپ کا آلہ ٹھنڈا ہونے کے بعد، یہ حسب معمول چلے گا۔"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"آپ کا ٹیبلیٹ خودکار طور پر ٹھنڈا ہونے کی کوشش کرے گا۔ آپ اب بھی اپنا ٹیبلیٹ استعمال کر سکتے ہیں، لیکن یہ آہستہ چل سکتا ہے۔\n\nآپ کا ٹیبلیٹ ٹھنڈا ہونے کے بعد، یہ حسب معمول چلے گا۔"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"فنگر پرنٹ سینسر پاور بٹن پر موجود ہے۔ یہ ٹیبلیٹ کے کنارے پر ابھرے ہوئے والیوم بٹن کے آگے والا ہموار بٹن ہے۔"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"فنگر پرنٹ سینسر پاور بٹن پر موجود ہے۔ یہ آلے کے کنارے پر ابھرے ہوئے والیوم بٹن کے آگے والا ہموار بٹن ہے۔"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"فنگر پرنٹ سینسر پاور بٹن پر موجود ہے۔ یہ فون کے کنارے پر ابھرے ہوئے والیوم بٹن کے آگے والا ہموار بٹن ہے۔"</string> diff --git a/packages/SystemUI/res-product/values-uz/strings.xml b/packages/SystemUI/res-product/values-uz/strings.xml index 3afa1592747c..38f9ebbd9752 100644 --- a/packages/SystemUI/res-product/values-uz/strings.xml +++ b/packages/SystemUI/res-product/values-uz/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta xato urinish qildingiz. Endi ish profili oʻchirib tashlanadi va undagi barcha maʼlumotlar ham oʻchib ketadi."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin sizdan emailingizdan foydalanib, planshet qulfini ochishingiz soʻraladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin yana urinib koʻring."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Grafik kalit <xliff:g id="NUMBER_0">%1$d</xliff:g> marta xato chizildi. <xliff:g id="NUMBER_1">%2$d</xliff:g> marta muvaffaqiyatsiz urinishdan keyin sizdan emailngizdan foydalanib, telefon qulfini ochishingiz soʻraladi.\n\n <xliff:g id="NUMBER_2">%3$d</xliff:g> soniyadan keyin qayta urinib koʻring."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Telefon isib ketgani sababli oʻchirildi"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Qurilma isib ketgani sababli oʻchirildi"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Planshet isib ketgani sababli oʻchirildi"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Endi telefoningiz normal holatda ishlayapti.\nBatafsil axborot uchun bosing"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Endi qurilmangiz normal holatda ishlayapti.\nBatafsil axborot uchun bosing"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Endi planshetingiz normal holatda ishlayapti.\nBatafsil axborot uchun bosing"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Telefon qizib ketganligi sababli sovitish uchun oʻchirilgan edi. Endi telefoningiz normal holatda ishlayapti.\n\nTelefon quyidagi hollarda qizib ketishi mumkin:\n • Resurstalab ilovalar ishlatilganda (masalan, oʻyin, video yoki navigatsiya ilovalari)\n • Katta faylni yuklab olishda yoki yuklashda\n • Telefondan yuqori haroratda foydalanganda"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Qurilma qizib ketganligi sababli sovitish uchun oʻchirilgan edi. Endi qurilmangiz normal holatda ishlayapti.\n\nQurilma quyidagi hollarda qizib ketishi mumkin:\n • Resurstalab ilovalar ishlatilganda (masalan, oʻyin, video yoki navigatsiya ilovalari)\n • Katta faylni yuklab olishda yoki yuklashda\n • Qurilmadan yuqori haroratda foydalanganda"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Planshet qizib ketganligi sababli sovitish uchun oʻchirilgan edi. Endi planshetingiz normal holatda ishlayapti.\n\nPlanshet quyidagi hollarda qizib ketishi mumkin:\n • Resurstalab ilovalar ishlatilganda (masalan, oʻyin, video yoki navigatsiya ilovalari)\n • Katta faylni yuklab olishda yoki yuklashda\n • Planshetdan yuqori haroratda foydalanganda"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Telefon qizimoqda"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Qurilma qizimoqda"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Planshet qizimoqda"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Telefon sovib olishi uchun ayrim funksiyalar cheklanadi.\nBatafsil axborot uchun bosing"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Qurilma sovib olishi uchun ayrim funksiyalar cheklanadi.\nBatafsil axborot uchun bosing"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Planshet sovib olishi uchun ayrim funksiyalar cheklanadi.\nBatafsil axborot uchun bosing"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Telefoningiz avtomatik ravishda oʻzini sovitadi. Telefondan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nTelefon sovishi bilan normal holatda ishlashni boshlaydi."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Qurilmangiz avtomatik ravishda oʻzini sovitadi. Qurilmadan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nQurilma sovishi bilan normal holatda ishlashni boshlaydi."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Planshetingiz avtomatik ravishda oʻzini sovitadi. Planshetdan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nPlanshet sovishi bilan normal holatda ishlashni boshlaydi."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Barmoq izi sensori quvvat tugmasida joylashgan. U tekis tugma planshetning yon chekkasida tovush balandligi tugmasining yonida joylashgan."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Barmoq izi sensori quvvat tugmasida joylashgan. U tekis tugma qurilmaning yon chekkasida tovush balandligi tugmasining yonida joylashgan."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Barmoq izi sensori quvvat tugmasida joylashgan. U tekis tugma telefonning yon chekkasida tovush balandligi tugmasining yonida joylashgan."</string> diff --git a/packages/SystemUI/res-product/values-vi/strings.xml b/packages/SystemUI/res-product/values-vi/strings.xml index 6e121c611fcf..fb3f86242b26 100644 --- a/packages/SystemUI/res-product/values-vi/strings.xml +++ b/packages/SystemUI/res-product/values-vi/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Bạn đã mở khóa điện thoại sai <xliff:g id="NUMBER">%d</xliff:g> lần. Hồ sơ công việc sẽ bị xóa, tức là tất cả dữ liệu hồ sơ sẽ bị xóa."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Bạn đã vẽ không chính xác hình mở khóa <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa máy tính bảng bằng tài khoản email.\n\n Hãy thử lại sau <xliff:g id="NUMBER_2">%3$d</xliff:g> giây."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Bạn đã vẽ không chính xác hình mở khóa <xliff:g id="NUMBER_0">%1$d</xliff:g> lần. Sau <xliff:g id="NUMBER_1">%2$d</xliff:g> lần thử không thành công nữa, bạn sẽ được yêu cầu mở khóa điện thoại bằng tài khoản email.\n\n Hãy thử lại sau <xliff:g id="NUMBER_2">%3$d</xliff:g> giây."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Điện thoại đã tắt do quá nóng"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Thiết bị đã tắt do quá nóng"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Máy tính bảng đã tắt do quá nóng"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Hiện điện thoại của bạn đang chạy bình thường.\nHãy nhấn để biết thêm thông tin"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Hiện thiết bị của bạn đang chạy bình thường.\nHãy nhấn để biết thêm thông tin"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Hiện máy tính bảng của bạn đang chạy bình thường.\nHãy nhấn để biết thêm thông tin"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Do quá nóng nên điện thoại đã tắt để hạ nhiệt. Hiện điện thoại của bạn đang chạy bình thường.\n\nĐiện thoại có thể bị quá nóng nếu bạn:\n • Dùng các ứng dụng tốn nhiều tài nguyên (như ứng dụng trò chơi, video hoặc chỉ đường)\n • Tải xuống hoặc tải lên tệp có dung lượng lớn\n • Dùng điện thoại ở nhiệt độ cao"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Do quá nóng nên thiết bị đã tắt để hạ nhiệt. Hiện thiết bị của bạn đang chạy bình thường.\n\nThiết bị có thể bị quá nóng nếu bạn:\n • Dùng các ứng dụng tốn nhiều tài nguyên (như ứng dụng trò chơi, video hoặc chỉ đường)\n • Tải xuống hoặc tải lên tệp có dung lượng lớn\n • Dùng thiết bị ở nhiệt độ cao"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Do quá nóng nên máy tính bảng đã tắt để hạ nhiệt. Hiện máy tính bảng của bạn đang chạy bình thường.\n\nMáy tính bảng có thể bị quá nóng nếu bạn:\n • Dùng các ứng dụng tốn nhiều tài nguyên (như ứng dụng trò chơi, video hoặc chỉ đường)\n • Tải xuống hoặc tải lên tệp có dung lượng lớn\n • Dùng máy tính bảng ở nhiệt độ cao"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Điện thoại đang nóng lên"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Thiết bị đang nóng lên"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Máy tính bảng đang nóng lên"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Một số tính năng bị hạn chế trong khi điện thoại nguội dần.\nHãy nhấn để biết thêm thông tin"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Một số tính năng bị hạn chế trong khi thiết bị nguội dần.\nHãy nhấn để biết thêm thông tin"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Một số tính năng bị hạn chế trong khi máy tính bảng nguội dần.\nHãy nhấn để biết thêm thông tin"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Điện thoại của bạn sẽ tự động nguội dần. Bạn vẫn sẽ sử dụng được điện thoại, nhưng điện thoại có thể chạy chậm hơn.\n\nSau khi đã nguội, điện thoại sẽ chạy bình thường."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Thiết bị của bạn sẽ tự động nguội dần. Bạn vẫn sẽ sử dụng được thiết bị, nhưng thiết bị có thể chạy chậm hơn.\n\nSau khi đã nguội, thiết bị sẽ chạy bình thường."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Máy tính bảng của bạn sẽ tự động nguội dần. Bạn vẫn sẽ sử dụng được máy tính bảng, nhưng máy tính bảng có thể chạy chậm hơn.\n\nSau khi đã nguội, máy tính bảng sẽ chạy bình thường."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Cảm biến vân tay nằm trên nút nguồn. Đó là nút phẳng cạnh nút âm lượng nhô lên trên cạnh của máy tính bảng."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Cảm biến vân tay nằm trên nút nguồn. Đó là nút phẳng cạnh nút âm lượng nhô lên trên cạnh của thiết bị."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Cảm biến vân tay nằm trên nút nguồn. Đó là nút phẳng cạnh nút âm lượng nhô lên trên cạnh của điện thoại."</string> diff --git a/packages/SystemUI/res-product/values-zh-rCN/strings.xml b/packages/SystemUI/res-product/values-zh-rCN/strings.xml index a60982f8982a..de308ddb726a 100644 --- a/packages/SystemUI/res-product/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-product/values-zh-rCN/strings.xml @@ -38,8 +38,26 @@ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="3280816298678433681">"您尝试解锁手机后失败的次数已达 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统将移除此工作资料,而这将删除所有的工作资料数据。"</string> <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4417100487251371559">"您尝试解锁平板电脑后失败的次数已达 <xliff:g id="NUMBER">%d</xliff:g> 次。系统将移除此工作资料,而这将删除所有的工作资料数据。"</string> <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"您尝试解锁手机后失败的次数已达 <xliff:g id="NUMBER">%d</xliff:g> 次。系统将移除此工作资料,而这将删除所有的工作资料数据。"</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"您已 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁平板电脑。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"您已 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"您已 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件账号解锁平板电脑。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"您已 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件账号解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"手机先前因过热而关机"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"设备先前因过热而关机"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"平板电脑先前因过热而关机"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"现在,您的手机已恢复正常运行。\n点按即可了解详情"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"现在,您的设备已恢复正常运行。\n点按即可了解详情"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"现在,您的平板电脑已恢复正常运行。\n点按即可了解详情"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"您的手机先前因过热而关机降温。现已恢复正常运行。\n\n以下情况可能会导致您的手机过热:\n • 使用占用大量资源的应用(例如游戏、视频或导航应用)\n • 下载或上传大型文件\n • 在高温环境下使用手机"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"您的设备先前因过热而关机降温。现已恢复正常运行。\n\n以下情况可能会导致您的设备过热:\n • 使用占用大量资源的应用(例如游戏、视频或导航应用)\n • 下载或上传大型文件\n • 在高温环境下使用设备"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"您的平板电脑先前因过热而关机降温。现已恢复正常运行。\n\n以下情况可能会导致您的平板电脑过热:\n • 使用占用大量资源的应用(例如游戏、视频或导航应用)\n • 下载或上传大型文件\n • 在高温环境下使用平板电脑"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"手机温度上升中"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"设备温度上升中"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"平板电脑温度上升中"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"手机降温期间,部分功能的使用会受限制。\n点按即可了解详情"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"设备降温期间,部分功能的使用会受限制。\n点按即可了解详情"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"平板电脑降温期间,部分功能的使用会受限制。\n点按即可了解详情"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"您的手机将自动尝试降温。您依然可以使用您的手机,但是它的运行速度可能会较慢。\n\n手机降温完毕后,就会恢复正常的运行速度。"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"您的设备将自动尝试降温。您依然可以使用您的设备,但是它的运行速度可能会较慢。\n\n设备降温完毕后,就会恢复正常的运行速度。"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"您的平板电脑将自动尝试降温。您依然可以使用您的平板电脑,但是它的运行速度可能会较慢。\n\n平板电脑降温完毕后,就会恢复正常的运行速度。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"指纹传感器在电源按钮上。电源按钮是一个扁平按钮,位于平板电脑边缘凸起的音量按钮旁边。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"指纹传感器在电源按钮上。电源按钮是一个扁平按钮,位于设备边缘凸起的音量按钮旁边。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"指纹传感器在电源按钮上。电源按钮是一个扁平按钮,位于手机边缘凸起的音量按钮旁边。"</string> diff --git a/packages/SystemUI/res-product/values-zh-rHK/strings.xml b/packages/SystemUI/res-product/values-zh-rHK/strings.xml index 85f482aa87d6..6bcb0481173f 100644 --- a/packages/SystemUI/res-product/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-product/values-zh-rHK/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"你嘗試解鎖手機已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次。系統將移除此工作設定檔,而所有設定檔資料亦會一併刪除。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"你已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果之後再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統會要求你透過電郵帳戶解鎖平板電腦。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"你已畫錯解鎖圖案 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次。如果之後再嘗試 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次仍未成功,系統會要求你透過電郵帳戶解鎖手機。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"手機因過熱而關機"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"裝置因過熱而關機"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"平板電腦因過熱而關機"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"你的手機現已正常運作。\n輕按即可瞭解詳情"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"你的裝置現已正常運作。\n輕按即可瞭解詳情"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"你的平板電腦現已正常運作。\n輕按即可瞭解詳情"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"你的手機之前因過熱而關機降溫。手機現已正常運作。\n\n以下情況可能會導致手機過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用手機"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"你的裝置之前因過熱而關機降溫。裝置現已正常運作。\n\n以下情況可能會導致裝置過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用裝置"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"你的平板電腦之前因過熱而關機降溫。平板電腦現已正常運作。\n\n以下情況可能會導致平板電腦過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用平板電腦"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"手機溫度正在上升"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"裝置溫度正在上升"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"平板電腦溫度正在上升"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"手機降溫時,部分功能會受限制。\n輕按即可瞭解詳情"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"裝置降溫時,部分功能會受限制。\n輕按即可瞭解詳情"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"平板電腦降溫時,部分功能會受限制。\n輕按即可瞭解詳情"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"手機會自動嘗試降溫。你仍可以使用手機,但手機的運作速度可能較慢。\n\n手機降溫後便會正常運作。"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"裝置會自動嘗試降溫。你仍可以使用裝置,但裝置的運作速度可能較慢。\n\n裝置降溫後便會正常運作。"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"平板電腦會自動嘗試降溫。你仍可以使用平板電腦,但平板電腦的運作速度可能較慢。\n\n平板電腦降溫後便會正常運作。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"指紋感應器位於開關按鈕上,開關按鈕形狀扁平,位於平板電腦邊緣凸起的音量按鈕旁。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"指紋感應器位於開關按鈕上,開關按鈕形狀扁平,位於裝置邊緣凸起的音量按鈕旁。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"指紋感應器位於開關按鈕上,開關按鈕形狀扁平,位於手機邊緣凸起的音量按鈕旁。"</string> diff --git a/packages/SystemUI/res-product/values-zh-rTW/strings.xml b/packages/SystemUI/res-product/values-zh-rTW/strings.xml index c0f75c7bb785..f40780304f68 100644 --- a/packages/SystemUI/res-product/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-product/values-zh-rTW/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"你嘗試解鎖手機已失敗 <xliff:g id="NUMBER">%d</xliff:g> 次。你的工作資料夾將遭到移除,所有設定檔資料也會一併遭到刪除。"</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,系統會要求你透過電子郵件帳戶將平板電腦解鎖。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"你的解鎖圖案已畫錯 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次,目前還剩 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次機會。如果失敗次數超過限制,系統會要求你透過電子郵件帳戶將手機解鎖。\n\n請在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒後再試一次。"</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"手機因過熱而關機"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"裝置因過熱而關機"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"平板電腦因過熱而關機"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"手機現在已恢復正常運作。\n輕觸即可瞭解詳情"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"裝置現在已恢復正常運作。\n輕觸即可瞭解詳情"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"平板電腦現在已恢復正常運作。\n輕觸即可瞭解詳情"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"手機先前過熱,因此關機降溫,現在已恢復正常運作。\n\n以下狀況可能會導致手機過熱:\n • 使用的應用程式需要大量資源,例如遊戲、影片或導航應用程式\n • 下載或上傳大型檔案\n • 在高溫下使用手機"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"裝置先前過熱,因此關機降溫,現在已恢復正常運作。\n\n以下狀況可能會導致裝置過熱:\n • 使用的應用程式需要大量資源,例如遊戲、影片或導航應用程式\n • 下載或上傳大型檔案\n • 在高溫下使用裝置"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"平板電腦先前過熱,因此關機降溫,現在已恢復正常運作。\n\n以下狀況可能會導致平板電腦過熱:\n • 使用的應用程式需要大量資源,例如遊戲、影片或導航應用程式\n • 下載或上傳大型檔案\n • 在高溫下使用平板電腦"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"手機溫度上升"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"裝置溫度上升"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"平板電腦溫度上升"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"手機降溫期間,某些功能會受到限制。\n輕觸即可瞭解詳情"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"裝置降溫時,某些功能會受到限制。\n輕觸即可瞭解詳情"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"平板電腦降溫時,某些功能會受到限制。\n輕觸即可瞭解詳情"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"手機會自動嘗試降溫。你仍可繼續使用手機,但運作速度可能會變慢。\n\n手機降溫後就會恢復正常運作。"</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"裝置會自動嘗試降溫。你仍可繼續使用裝置,但運作速度可能會變慢。\n\n裝置降溫後就會恢復正常運作。"</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"平板電腦會自動嘗試降溫。你仍可繼續使用平板電腦,但運作速度可能會變慢。\n\n平板電腦降溫後就會恢復正常運作。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"指紋感應器在電源鍵上。電源鍵的形狀是扁平的,位在平板電腦側邊凸起的音量按鈕旁。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"指紋感應器在電源鍵上。電源鍵的形狀是扁平的,位在裝置側邊凸起的音量按鈕旁。"</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"指紋感應器在電源鍵上。電源鍵的形狀是扁平的,位在手機側邊凸起的音量鍵旁。"</string> diff --git a/packages/SystemUI/res-product/values-zu/strings.xml b/packages/SystemUI/res-product/values-zu/strings.xml index 6b20014c17b8..89d4264a3144 100644 --- a/packages/SystemUI/res-product/values-zu/strings.xml +++ b/packages/SystemUI/res-product/values-zu/strings.xml @@ -40,6 +40,24 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Udwebe ngokungalungile iphethini yakho yokuvula ngezikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphumelelanga kaningi engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuthi uvule ithebulethi yakho usebenzisa i-akhawunti ye-imeyili.\n\nZama futhi kumasekhondi angu-<xliff:g id="NUMBER_2">%3$d</xliff:g>."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%1$d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%3$d</xliff:g> imizuzwana."</string> + <string name="thermal_shutdown_title" product="default" msgid="8039593017174903505">"Ifoni ivaliwe ngenxa yokushisa"</string> + <string name="thermal_shutdown_title" product="device" msgid="2954206342842856379">"Idivayisi ivaliwe ngenxa yokushisa"</string> + <string name="thermal_shutdown_title" product="tablet" msgid="8941033526856177533">"Ithebulethi ivaliwe ngenxa yokushisa"</string> + <string name="thermal_shutdown_message" product="default" msgid="6685194547904051408">"Ifoni yakho manje isebenza ngokuvamile.\nThepha ukuze uthole ulwazi olungeziwe"</string> + <string name="thermal_shutdown_message" product="device" msgid="3039675532521590478">"Idivayisi yakho manje isebenza ngokuvamile.\nThepha ukuze uthole ulwazi olwengeziwe"</string> + <string name="thermal_shutdown_message" product="tablet" msgid="5285898074484811386">"Ithebulethi yakho manje isebenza ngokuvamile.\nThepha ukuze uthole ulwazi olwengeziwe"</string> + <string name="thermal_shutdown_dialog_message" product="default" msgid="6145923570358574186">"Ifoni yakho ibishisa kakhulu, ngakho-ke yacisha ukuze iphole. Ifoni yakho manje isebenza ngokuvamile.\n\nIfoni yakho ingashisa kakhulu uma:\n • Usebenzisa izinhlelo zokusebenza ezinkulu (njegegeyimu, ividiyo, noma ama-app okufuna)\n • Landa noma layisha amafayela amakhulu\n • Sebenzisa ifoni yakho kumazinga okushisa aphezulu"</string> + <string name="thermal_shutdown_dialog_message" product="device" msgid="3647879000909527365">"Idivayisi yakho ibishisa kakhulu, ngakho-ke yacisha ukuze iphole. Idivayisi yakho manje isebenza ngokuvamile.\n\nIdivayisi yakho ingashisa kakhulu uma:\n • Usebenzisa ama-app wensiza enamandla (njegegeyimu, ividiyo, noma ama-app wokufuna)\n • Dawuniloda noma layisha amafayela amakhulu\n • Sebenzisa idivayisi yakho kumazinga wokushisa aphezulu"</string> + <string name="thermal_shutdown_dialog_message" product="tablet" msgid="8274487811928782165">"Ithebulethi yakho ibishisa kakhulu, ngakho-ke yacisha ukuze iphole. Ithebulethi yakho manje isebenza ngokuvamile.\n\nIthebulethi yakho ingashisa kakhulu uma:\n • Usebenzisa ama-app wensiza enamandla (njegegeyimu, ividiyo, noma ama-app wokufuna)\n • Dawuniloda noma layisha amafayela amakhulu\n • Sebenzisa ithebulethi yakho kumazinga wokushisa aphezulu kakhulu"</string> + <string name="high_temp_title" product="default" msgid="5365000411304924115">"Ifoni iyafudumala"</string> + <string name="high_temp_title" product="device" msgid="6622009907401563664">"Idivayisi iyafudumala"</string> + <string name="high_temp_title" product="tablet" msgid="9039733706606446616">"Ithebulethi iyafudumala"</string> + <string name="high_temp_notif_message" product="default" msgid="3928947950087257452">"Ezinye izakhi zikhawulelwe ngenkathi ifoni iphola.\nThepha mayelana nolwazi olwengeziwe"</string> + <string name="high_temp_notif_message" product="device" msgid="6105125771372547292">"Ezinye izakhi zikhawulelwe ngenkathi idivayisi iphola.\nThepha mayelana nolwazi olwengeziwe"</string> + <string name="high_temp_notif_message" product="tablet" msgid="7799279192797476850">"Ezinye izakhi zikhawulelwe ngenkathi ithebulethi iphola.\nThepha mayelana nolwazi olwengeziwe"</string> + <string name="high_temp_dialog_message" product="default" msgid="4272882413847595625">"Ifoni yakho izozama ngokuzenzakalela ukuphola. Ungasasebenzisa ifoni yakho, kodwa ingasebenza ngokungasheshi.\n\nUma ifoni yakho isipholile, izosebenza ngokuvamile."</string> + <string name="high_temp_dialog_message" product="device" msgid="263861943935989046">"Idivayisi yakho izozama ukupholisa ngokuzenzekelayo. Usengasebenzisa idivayisi yakho, kodwa ingase isebenze ngokunensayo.\n\nLapho idivayisi yakho isipholile, izosebenza ngokuvamile."</string> + <string name="high_temp_dialog_message" product="tablet" msgid="5613713326841935537">"Ithebulethi yakho izozama ukupholisa. Usengasebenzisa ithebulethi yakho, kodwa ingase isebenze ngokunensayo.\n\nLapho ithebulethi yakho isipholile, izosebenza ngokuvamile."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="3726972508570143945">"Inzwa yesigxivizo somunwe esenkinobhweni yamandla. Inkinobho eyisicaba eduze kwenkinobho yevolumu ephakanyisiwe emaphethelweni wethebulethi."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="2929467060295094725">"Inzwa yesigxivizo somunwe esenkinobhweni yamandla. Inkinobho eyisicaba eduze kwenkinobho yevolumu ephakanyisiwe emaphethelweni edivayisi."</string> <string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="8582726566542997639">"Inzwa yesigxivizo somunwe esenkinobhweni yamandla. Inkinobho eyisicaba eduze kwenkinobho yevolumu ephakanyisiwe emaphethelweni efoni."</string> diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index 331307a0d9f4..6b8f3cf9f44b 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -80,7 +80,7 @@ android:layout_width="match_parent" android:clipChildren="false"> <ViewStub - android:id="@+id/operator_name" + android:id="@+id/operator_name_stub" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout="@layout/operator_name" /> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index a307aeeac187..08326cea5327 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktiveer USB"</string> <string name="learn_more" msgid="4690632085667273811">"Kom meer te wete"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skermkiekie"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Verleng Ontsluiting is gedeaktiveer"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Hou Ontsluit is gedeaktiveer"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"het \'n prent gestuur"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Stoor tans skermkiekie..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Stoor tans skermskoot in werkprofiel …"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aan/af-kieslys"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Bladsy <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Sluitskerm"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Foon afgeskakel weens hitte"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Jou foon werk nou normaal.\nTik vir meer inligting"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Jou foon was te warm en dit het afgeskakel om af te koel. Jou foon werk nou normaal.\n\nJou foon kan dalk te warm word as jy:\n • Hulpbron-intensiewe programme (soos dobbel-, video- of navigasieprogramme) gebruik\n • Groot lêers af- of oplaai\n • Jou foon in hoë temperature gebruik"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Sien versorgingstappe"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Foon raak warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Sommige kenmerke is beperk terwyl foon afkoel.\nTik vir meer inligting"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Jou foon sal outomaties probeer om af te koel. Jy kan steeds jou foon gebruik, maar dit sal dalk stadiger wees.\n\nJou foon sal normaalweg werk nadat dit afgekoel het."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Sien versorgingstappe"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Prop jou toestel uit"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Jou toestel word tans warm naby die laaipoort. Prop dit uit as dit aan ’n laaier of USB-bykomstigheid gekoppel is. Wees versigtig, aangesien die kabel dalk ook warm is."</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 869f582e6548..e0a5566ac784 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -68,14 +68,14 @@ <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="global_action_screenshot" msgid="2760267567509131654">"ቅጽበታዊ ገፅ እይታ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"መክፈትን አራዝም ተሰናክሏል"</string> + <string name="global_action_screenshot" msgid="2760267567509131654">"ቅጽበታዊ ገፅ ዕይታ"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock ተሰናክሏል"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ምስል ተልኳል"</string> - <string name="screenshot_saving_title" msgid="2298349784913287333">"ቅጽበታዊ ገፅ እይታ በማስቀመጥ ላይ..."</string> + <string name="screenshot_saving_title" msgid="2298349784913287333">"ቅጽበታዊ ገፅ ዕይታ በማስቀመጥ ላይ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ቅጽበታዊ ገፅ እይታን ወደ የስራ መገለጫ በማስቀመጥ ላይ…"</string> - <string name="screenshot_saved_title" msgid="8893267638659083153">"ቅጽበታዊ ገፅ እይታ ተቀምጧል"</string> + <string name="screenshot_saved_title" msgid="8893267638659083153">"ቅጽበታዊ ገፅ ዕይታ ተቀምጧል"</string> <string name="screenshot_failed_title" msgid="3259148215671936891">"ቅጽበታዊ ገፅ ዕይታን ማስቀመጥ አልተቻለም"</string> - <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"ቅጽበታዊ ገፅ እይታ ከመቀመጡ በፊት መሣሪያ መከፈት አለበት"</string> + <string name="screenshot_failed_to_save_user_locked_text" msgid="6156607948256936920">"ቅጽበታዊ ገፅ ዕይታ ከመቀመጡ በፊት መሣሪያ መከፈት አለበት"</string> <string name="screenshot_failed_to_save_unknown_text" msgid="1506621600548684129">"ቅጽበታዊ ገፅ ዕይታን እንደገና ማንሳት ይሞክሩ"</string> <string name="screenshot_failed_to_save_text" msgid="7232739948999195960">"ቅጽበታዊ ገፅ እይታን ማስቀመጥ አልተቻለም"</string> <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"ቅጽበታዊ ገፅ እይታዎችን ማንሳት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string> @@ -93,8 +93,8 @@ <string name="screenshot_right_boundary_pct" msgid="1201150713021779321">"የቀኝ ወሰን <xliff:g id="PERCENT">%1$d</xliff:g> በመቶ"</string> <string name="screenshot_work_profile_notification" msgid="203041724052970693">"<xliff:g id="APP">%1$s</xliff:g> ውስጥ የስራ መገለጫው ውስጥ ተቀምጧል"</string> <string name="screenshot_default_files_app_name" msgid="8721579578575161912">"ፋይሎች"</string> - <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> ይህን ቅጽበታዊ ገፅ እይታ ለይቷል።"</string> - <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> እና ሌሎች ክፍት መተግበሪያዎች ይህን ቅጽበታዊ ገፅ እይታ ለይተዋል።"</string> + <string name="screenshot_detected_template" msgid="7940376642921719915">"<xliff:g id="APPNAME">%1$s</xliff:g> ይህን ቅጽበታዊ ገፅ ዕይታ ለይቷል።"</string> + <string name="screenshot_detected_multiple_template" msgid="7644827792093819241">"<xliff:g id="APPNAME">%1$s</xliff:g> እና ሌሎች ክፍት መተግበሪያዎች ይህን ቅጽበታዊ ገፅ ዕይታ ለይተዋል።"</string> <string name="app_clips_save_add_to_note" msgid="3460200751278069445">"ወደ ማስታወሻ አክል"</string> <string name="screenrecord_title" msgid="4257171601439507792">"የማያ መቅረጫ"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"የማያ ገፅ ቀረጻን በማሰናዳት ላይ"</string> @@ -281,7 +281,7 @@ <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"ውሂብ ቆጣቢ በርቷል"</string> <string name="quick_settings_hotspot_secondary_label_num_devices" msgid="7536823087501239457">"{count,plural, =1{# መሣሪያ}one{# መሣሪያዎች}other{# መሣሪያዎች}}"</string> <string name="quick_settings_flashlight_label" msgid="4904634272006284185">"የባትሪ ብርሃን"</string> - <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"ካሜራ ስራ ላይ ነው"</string> + <string name="quick_settings_flashlight_camera_in_use" msgid="4820591564526512571">"ካሜራ ሥራ ላይ ነው"</string> <string name="quick_settings_cellular_detail_title" msgid="792977203299358893">"የተንቀሳቃሽ ስልክ ውሂብ"</string> <string name="quick_settings_cellular_detail_data_usage" msgid="6105969068871138427">"የውሂብ አጠቃቀም"</string> <string name="quick_settings_cellular_detail_remaining_data" msgid="1136599216568805644">"ቀሪ ውሂብ"</string> @@ -649,11 +649,11 @@ <string name="keyboard_shortcut_search_category_open_apps" msgid="1450959949739257562">"መተግበሪያዎችን ይክፈቱ"</string> <string name="keyboard_shortcut_search_category_current_app" msgid="2011953559133734491">"የአሁኑ መተግበሪያ"</string> <string name="group_system_access_notification_shade" msgid="7116898151485382275">"የማሳወቂያ ጥላ መዳረሻ"</string> - <string name="group_system_full_screenshot" msgid="7389040853798023211">"ሙሉ ቅጽበታዊ ገፅ እይታ ያነሳል"</string> + <string name="group_system_full_screenshot" msgid="7389040853798023211">"ሙሉ ቅጽበታዊ ገፅ ዕይታ ያነሳል"</string> <string name="group_system_access_system_app_shortcuts" msgid="4421497579210445641">"የሥርዓት / የመተግበሪያ አቋራጮች ዝርዝር መዳረሻ"</string> <string name="group_system_go_back" msgid="8838454003680364227">"ተመለስ፦ ወደ ቀዳሚው ሁኔታ ይመለሳል (ተመለስ አዝራር)"</string> <string name="group_system_access_home_screen" msgid="1857344316928441909">"የመነሻ ማያ ገፅ መዳረሻ"</string> - <string name="group_system_overview_open_apps" msgid="6897128761003265350">"የክፍት መተግበሪያዎች አጠቃላይ እይታ"</string> + <string name="group_system_overview_open_apps" msgid="6897128761003265350">"የክፍት መተግበሪያዎች አጠቃላይ ዕይታ"</string> <string name="group_system_cycle_forward" msgid="9202444850838205990">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ፊት)"</string> <string name="group_system_cycle_back" msgid="5163464503638229131">"የቅርብ ጊዜ መተግበሪያዎች ላይ ዑደት ያደርጋል (ወደ ኋላ)"</string> <string name="group_system_access_all_apps_search" msgid="488070738028991753">"የሁሉም መተግበሪያዎች ዝርዝር እና ፍለጋ መዳረሻ (ማለትም ፍለጋ/ማስጀመሪያ)"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"የኃይል ምናሌ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ገፅ <xliff:g id="ID_1">%1$d</xliff:g> ከ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ማያ ገፅ ቁልፍ"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ስልክ በሙቀት ምክንያት ጠፍቷል"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"የእርስዎ ስልክ በመደበኛ ሁኔታ እየሠራ ነው።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"የእርስዎ ስልክ በጣም ግሎ ነበር፣ ስለዚህ እንዲቀዘቅዝ ጠፍቷል። የእርስዎ ስልክ አሁን በመደበኝነት እያሄደ ነው።\n\nየሚከተሉትን ካደረጉ የእርስዎ በጣም ሊግል ይችላል፦\n • ኃይል በጣም የሚጠቀሙ መተግበሪያዎችን (እንደ ጨዋታ፣ ቪዲዮ ወይም የአሰሳ መተግበሪያዎች ያሉ) ከተጠቀሙ\n • ትላልቅ ፋይሎችን ካወረዱ ወይም ከሰቀሉ\n • ስልክዎን በከፍተኛ ሙቀት ውስጥ ከተጠቀሙ"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"የእንክብካቤ ደረጃዎችን ይመልከቱ"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ስልኩ እየሞቀ ነው"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"አንዳንድ ባሕሪያት ስልኩ እየቀዘቀዘ እያለ ውስን ይሆናሉ።\nለተጨማሪ መረጃ መታ ያድርጉ"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"የእርስዎ ስልክ በራስ-ሰር ለመቀዝቀዝ ይሞክራል። አሁንም ስልክዎን መጠቀም ይችላሉ፣ ነገር ግን ሊንቀራፈፍ ይችላል።\n\nአንዴ ስልክዎ ከቀዘቀዘ በኋላ በመደበኝነት ያሄዳል።"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"የእንክብካቤ ደረጃዎችን ይመልከቱ"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"መሣሪያዎን ይንቀሉ"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"መሣሪያዎ ከኃይል መሙያ ወደቡ አቅራቢያ እየሞቀ ነው። ከኃይል መሙያ ወይም ከዩኤስቢ ተጨማሪ መሣሪያ ጋር ከተገናኘ ይንቀሉት እና ገመዱ የሞቀ ሊሆን ስለሚችል ጥንቃቄ ያድርጉ።"</string> @@ -831,9 +825,9 @@ <string name="ongoing_privacy_chip_content_multiple_apps" msgid="8341216022442383954">"መተግበሪያዎች የእርስዎን <xliff:g id="TYPES_LIST">%s</xliff:g> እየተጠቀሙ ነው።"</string> <string name="ongoing_privacy_dialog_separator" msgid="1866222499727706187">"፣ "</string> <string name="ongoing_privacy_dialog_last_separator" msgid="5615876114268009767">" እና "</string> - <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ስራ ላይ እየዋለ ነው"</string> - <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"በቅርብ ጊዜ በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ስራ ላይ ውሏል"</string> - <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(ስራ)"</string> + <string name="ongoing_privacy_dialog_using_op" msgid="426635338010011796">"በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ሥራ ላይ እየዋለ ነው"</string> + <string name="ongoing_privacy_dialog_recent_op" msgid="2736290123662790026">"በቅርብ ጊዜ በ<xliff:g id="APPLICATION_NAME">%1$s</xliff:g> ሥራ ላይ ውሏል"</string> + <string name="ongoing_privacy_dialog_enterprise" msgid="3003314125311966061">"(ሥራ)"</string> <string name="ongoing_privacy_dialog_phonecall" msgid="4487370562589839298">"የስልክ ጥሪ"</string> <string name="ongoing_privacy_dialog_attribution_text" msgid="4738795925380373994">"(በ<xliff:g id="APPLICATION_NAME_S_">%s</xliff:g> በኩል)"</string> <string name="ongoing_privacy_dialog_attribution_label" msgid="3385241594101496292">"(<xliff:g id="ATTRIBUTION_LABEL">%s</xliff:g>)"</string> @@ -987,7 +981,7 @@ <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"ለኦዲዮ ውጽዓት ተገኚ የሆኑ መሣሪያዎች"</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"የድምጽ መጠን"</string> <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> - <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ድምጽ ማውጫዎች እና ማሳያዎች"</string> + <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"ድምፅ ማውጫዎች እና ማሳያዎች"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"የተጠቆሙ መሣሪያዎች"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"ሚዲያን ወደ ሌላ መሣሪያ ለማንቀሳቀስ የተጋራውን ክፍለ ጊዜዎን ያቁሙ"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"አቁም"</string> @@ -1093,7 +1087,7 @@ <string name="clipboard_content_copied" msgid="144452398567828145">"ይዘት ተቀድቷል"</string> <string name="clipboard_editor" msgid="2971197550401892843">"የቅንጥብ ሰሌዳ አርታዒ"</string> <string name="clipboard_overlay_window_name" msgid="6450043652167357664">"የቅንጥብ ሰሌዳ"</string> - <string name="clipboard_image_preview" msgid="2156475174343538128">"የምስል ቅድመ-እይታ"</string> + <string name="clipboard_image_preview" msgid="2156475174343538128">"የምስል ቅድመ-ዕይታ"</string> <string name="clipboard_edit" msgid="4500155216174011640">"አርትዕ"</string> <string name="add" msgid="81036585205287996">"አክል"</string> <string name="manage_users" msgid="1823875311934643849">"ተጠቃሚዎችን ያስተዳድሩ"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index fa9146ee546d..b68567c0f771 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"تفعيل USB"</string> <string name="learn_more" msgid="4690632085667273811">"مزيد من المعلومات"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"لقطة شاشة"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"تم إيقاف ميزة Extend Unlock."</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"تم إيقاف ميزة \"إبقاء الجهاز مفتوحًا\"."</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"أرسَل صورة"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"جارٍ حفظ لقطة الشاشة..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"جارٍ حفظ لقطة الشاشة في الملف الشخصي للعمل…"</string> @@ -349,7 +349,7 @@ <string name="zen_silence_introduction" msgid="6117517737057344014">"سيؤدي هذا إلى حظر جميع الأصوات والاهتزازات، بما في ذلك ما يرد من التنبيهات والموسيقى والفيديو والألعاب."</string> <string name="notification_tap_again" msgid="4477318164947497249">"انقر مرة أخرى للفتح"</string> <string name="tap_again" msgid="1315420114387908655">"انقر مرة أخرى"</string> - <string name="keyguard_unlock" msgid="8031975796351361601">"يمكنك الفتح بالتمرير سريعًا لأعلى."</string> + <string name="keyguard_unlock" msgid="8031975796351361601">"التمرير إلى الأعلى لفتح القفل"</string> <string name="keyguard_unlock_press" msgid="9140109453735019209">"اضغط على رمز فتح القفل لفتح قفل الشاشة."</string> <string name="keyguard_face_successful_unlock_swipe" msgid="6180997591385846073">"تم فتح قفل جهازك عند تقريبه من وجهك. مرِّر سريعًا للأعلى لفتح الجهاز."</string> <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"تم فتح القفل بالتعرّف على وجهك. لفتح الجهاز، اضغط على رمز فتح القفل."</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"قائمة زر التشغيل"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"الصفحة <xliff:g id="ID_1">%1$d</xliff:g> من <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"شاشة القفل"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"تم إيقاف الهاتف بسبب الحرارة"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"يعمل هاتفك الآن بشكل طبيعي.\nانقر للحصول على مزيد من المعلومات."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ارتفعت درجة حرارة هاتفك بشدة، لذا تم إيقاف تشغيله لخفض درجة حرارته. يعمل هاتفك الآن بشكل طبيعي.\n\nقد ترتفع بشدة درجة حرارة هاتفك إذا:\n • استخدمت تطبيقات كثيفة الاستخدام لموارد الجهاز (مثل الألعاب أو الفيديو أو تطبيقات التنقل)\n • نزَّلت أو حمَّلت ملفات كبيرة الحجم\n • استخدمت هاتفك وسط أجواء مرتفعة الحرارة"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"الاطّلاع على خطوات العناية"</string> - <string name="high_temp_title" msgid="2218333576838496100">"تزداد درجة حرارة الهاتف"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"يتم تقييد عمل بعض الميزات إلى أن تنخفض درجة حرارة الهاتف.\nانقر للحصول على مزيد من المعلومات."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"سيحاول الهاتف تخفيض درجة حرارته تلقائيًا. سيظل بإمكانك استخدام هاتفك، ولكن قد يعمل بشكل أبطأ.\n\nبعد أن تنخفض درجة حرارة الهاتف، سيستعيد سرعته المعتادة."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"الاطّلاع على خطوات العناية"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"افصِل جهازك"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"تزداد حرارة الجهاز بالقرب من منفذ الشحن. إذا كان الجهاز متصلاً بشاحن أو ملحق USB، عليك فصله وتوخي الحذر لأن درجة حرارة الكابل قد تكون مرتفعة أيضًا."</string> @@ -943,7 +937,7 @@ <string name="controls_media_settings_button" msgid="5815790345117172504">"الإعدادات"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"يتم تشغيل <xliff:g id="SONG_NAME">%1$s</xliff:g> للفنان <xliff:g id="ARTIST_NAME">%2$s</xliff:g> من تطبيق <xliff:g id="APP_LABEL">%3$s</xliff:g>."</string> <string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> من إجمالي <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string> - <string name="controls_media_empty_title" msgid="8296102892421573325">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قيد التشغيل"</string> + <string name="controls_media_empty_title" msgid="8296102892421573325">"\"<xliff:g id="APP_NAME">%1$s</xliff:g>\" قيد التشغيل"</string> <string name="controls_media_button_play" msgid="2705068099607410633">"تشغيل"</string> <string name="controls_media_button_pause" msgid="8614887780950376258">"إيقاف مؤقت"</string> <string name="controls_media_button_prev" msgid="8126822360056482970">"المقطع الصوتي السابق"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 85214bf362f8..b11f8cc13830 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB সক্ষম কৰক"</string> <string name="learn_more" msgid="4690632085667273811">"অধিক জানক"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"স্ক্ৰীনশ্বট"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock অক্ষম কৰা আছে"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"এক্সটেণ্ড আনলক অক্ষম কৰা আছে"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"এখন প্ৰতিচ্ছবি পঠিয়াইছে"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"স্ক্ৰীনশ্বট ছেভ কৰি থকা হৈছে…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"কৰ্মস্থানৰ প্ৰ’ফাইলত স্ক্ৰীনশ্বট ছেভ কৰি থকা হৈছে…"</string> @@ -415,7 +415,7 @@ <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"আপোনাৰ আইটি প্ৰশাসকে অৱৰোধ কৰিছে"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"ডিভাইচ সম্পৰ্কীয় নীতিয়ে স্ক্ৰীন কেপশ্বাৰ কৰাটো অক্ষম কৰিছে"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"আটাইবোৰ মচক"</string> - <string name="manage_notifications_text" msgid="6885645344647733116">"পৰিচালনা"</string> + <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> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"পাৱাৰ মেনু"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>ৰ পৃষ্ঠা <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"লক স্ক্ৰীন"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"আপোনাৰ ফ\'নটো গৰম হোৱাৰ কাৰণে অফ কৰা হৈছিল"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"আপোনাৰ ফ’নটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\nঅধিক তথ্যৰ বাবে টিপক"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"আপোনাৰ ফ\'নটো অত্যধিক গৰম হোৱাৰ বাবে ইয়াক ঠাণ্ডা কৰিবলৈ অফ কৰা হৈছিল। আপোনাৰ ফ\'নটো এতিয়া স্বাভাৱিকভাৱে চলি আছে।\n\nআপোনাৰ ফ\'নটো গৰম হ\'ব পাৰে, যদিহে আপুনি:\n • ফ\'নটোৰ হাৰ্ডৱেৰ অত্যধিক মাত্ৰাত ব্যৱহাৰ কৰা এপ্সমূহ চলালে (যেনে, ভিডিঅ\' গেইম, ভিডিঅ\', দিক্-নিৰ্দেশনা এপ্সমূহ)\n • খুউব ডাঙৰ আকাৰৰ ফাইল আপল\'ড বা ডাউনল’ড কৰিলে\n • আপোনাৰ ফ\'নটো উচ্চ তাপমাত্ৰাৰ পৰিৱেশত ব্যৱহাৰ কৰিলে"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ফ\'নটো গৰম হ\'বলৈ ধৰিছে"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ফ’নটো ঠাণ্ডা হৈ থকাৰ সময়ত কিছুমান সুবিধা উপলব্ধ নহয়।\nঅধিক তথ্যৰ বাবে টিপক"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পাছত ই আগৰ নিচিনাকৈয়েই চলিব।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"যত্ন লোৱাৰ পদক্ষেপসমূহ চাওক"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"আপোনাৰ ডিভাইচটো আনপ্লাগ কৰক"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"আপোনাৰ ডিভাইচটো চাৰ্জিং প’ৰ্টৰ ওচৰত গৰম হৈছে। যদি এইটো কোনো চার্জাৰ অথবা ইউএছবিৰ সহায়ক সামগ্ৰীৰ সৈতে সংযুক্ত হৈ আছে, ইয়াক আনপ্লাগ কৰক আৰু কে’বলডালো গৰম হ\'ব পাৰে, গতিকে যত্ন লওক।"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index 10097b8d268b..ad0bd433e129 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB-ni aktiv edin"</string> <string name="learn_more" msgid="4690632085667273811">"Ətraflı məlumat"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skrinşot"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock deaktiv edilib"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Uzaqdan kiliddən çıxarma deaktiv edilib"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"şəkil göndərdi"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skrinşot yadda saxlanır..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"İş profili skrinşotu saxlanılır…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Qidalanma düyməsi menyusu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> səhifədən <xliff:g id="ID_1">%1$d</xliff:g> səhifə"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekran kilidi"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"İstiliyə görə telefon söndü"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefonunuz indi normal işləyir.\nƏtraflı məlumat üçün toxunun"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon çox isti idi və soyumaq üçün söndü. Hazırda telefon normal işləyir.\n\n Telefon bu hallarda çox isti ola bilər:\n • Çox resurslu tətbiq istifadə etsəniz (oyun, video və ya naviqasiya tətbiqi kimi)\n • Böyük həcmli fayl endirsəniz və ya yükləsəniz\n • Telefonu yüksək temperaturda istifadə etsəniz"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Ehtiyat tədbiri mərhələlərinə baxın"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon qızmağa başlayır"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Telefon soyuyana kimi bəzi funksiyalar məhdudlaşdırılır.\nƏtraflı məlumat üçün toxunun"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonunuz avtomatik olaraq soyumağa başlayacaq. Telefon istifadəsinə davam edə bilərsiniz, lakin sürəti yavaşlaya bilər.\n\nTelefonunuz soyuduqdan sonra normal işləyəcək."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ehtiyat tədbiri mərhələlərinə baxın"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Cihazınızı ayırın"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Cihazınız şarj portunun yaxınlığında qızmağa başlayır. Şarj cihazına və ya USB aksesuarına qoşulubsa, onu ayırın və diqqətli olun, çünki kabel də qıza bilə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 74d16a457732..559cedf83b3f 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -415,7 +415,7 @@ <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Blokira IT administrator"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Snimanje ekrana je onemogućeno smernicama za uređaj"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Obriši sve"</string> - <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljajte"</string> + <string name="manage_notifications_text" msgid="6885645344647733116">"Upravljaj"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Istorija"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"Novo"</string> <string name="notification_section_header_gentle" msgid="6804099527336337197">"Nečujno"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni dugmeta za uključivanje"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. strana od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaključan ekran"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon se isključio zbog toplote"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefon sada normalno radi.\nDodirnite za više informacija"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon je bio prevruć, pa se isključio da se ohladi. Sada radi normalno.\n\nTelefon može previše da se ugreje ako:\n • Koristite aplikacije koje zahtevaju puno resursa (npr. video igre, video ili aplikacije za navigaciju)\n • Preuzimate/otpremate velike datoteke\n • Koristite telefon na visokoj temperaturi"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Pogledajte upozorenja"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon se zagrejao"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Neke funkcije su ograničene dok se telefon ne ohladi.\nDodirnite za više informacija"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon će automatski pokušati da se ohladi. I dalje ćete moći da koristite telefon, ali će sporije reagovati.\n\nKada se telefon ohladi, normalno će raditi."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Pogledajte upozorenja"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Isključite uređaj"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Uređaj se zagreva u blizini porta za punjenje. Ako je povezan sa punjačem ili USB opremom, isključite je i budite pažljivi jer i kabl može da bude vruć."</string> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 57e6d9237c99..455059f954f0 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Уключыць USB"</string> <string name="learn_more" msgid="4690632085667273811">"Даведацца больш"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Здымак экрана"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Функцыя падоўжанай разблакіроўкі адключана"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Функцыя працяглай разблакіроўкі адключана"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"адпраўлены відарыс"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Захаванне скрыншота..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Захаванне здымка экрана ў працоўны профіль…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопкі сілкавання"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Старонка <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Экран блакіроўкі"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"З-за перагрэву тэл. выключыўся"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Ваш тэлефон працуе нармальна.\nНацісніце, каб даведацца больш"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Ваш тэлефон пераграваўся, таму ён выключыўся, каб астыць. Зараз тэлефон працуе нармальна.\n\nТэлефон можа перагравацца пры:\n • Выкарыстанні рэсурсаёмістых праграм (напрыклад, гульняў, відэа або праграм навігацыі)\n • Спампоўцы або запампоўцы вялікіх файлаў\n • Выкарыстанні тэлефона пры высокіх тэмпературах"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Глядзець паэтапную дапамогу"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Тэлефон награваецца"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Некаторыя функцыі абмежаваны, пакуль тэлефон не астыне.\nНацісніце, каб даведацца больш"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ваш тэлефон аўтаматычна паспрабуе астыць. Вы можаце па-ранейшаму карыстацца сваім тэлефонам, але ён можа працаваць больш павольна.\n\nПасля таго як ваш тэлефон астыне, ён будзе працаваць у звычайным рэжыме."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Глядзець паэтапную дапамогу"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Адключыце прыладу"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Ваша прылада моцна награваецца ў месцы, дзе знаходзіцца зарадны порт. Калі яна падключана да зараднай прылады ці USB-прылады, адключыце яе і будзьце асцярожнымі з кабелем, які таксама можа награвацца."</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index d3733944154f..eb9735837747 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню за включване/изключване"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Страница <xliff:g id="ID_1">%1$d</xliff:g> от <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заключен екран"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Тел. се изкл. поради загряване"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Телефонът ви вече работи нормално.\nДокоснете за още информация"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Телефонът ви бе твърде горещ, затова се изключи с цел охлаждане. Вече работи нормално.\n\nТелефонът ви може да стане твърде горещ, ако:\n • използвате приложения, които ползват голям обем ресурси (като например игри, видеосъдържание или приложения за навигация);\n • изтегляте или качвате големи файлове;\n • използвате устройството си при високи температури."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Вижте стъпките, които да предприемете"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Телефонът загрява"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Някои функции са ограничени, докато телефонът се охлажда.\nДокоснете за още информация"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефонът ви автоматично ще направи опит за охлаждане. Пак можете да го използвате, но той може да работи по-бавно.\n\nСлед като се охлади, ще работи нормално."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Вижте стъпките, които да предприемете"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Изключете устройството си"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Устройството ви се загрява до порта за зареждане. Ако е свързано със зарядно устройство или аксесоар за USB, изключете го и внимавайте, тъй като и кабелът може да е топъл."</string> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index aa0a7a7e0e2d..8d0d57415458 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -424,7 +424,7 @@ <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="empty_shade_text" msgid="8935967157319717412">"কোনো বিজ্ঞপ্তি নেই"</string> + <string name="empty_shade_text" msgid="8935967157319717412">"কোনও বিজ্ঞপ্তি নেই"</string> <string name="no_unseen_notif_text" msgid="395512586119868682">"নতুন কোনও বিজ্ঞপ্তি নেই"</string> <string name="unlock_to_see_notif_text" msgid="7439033907167561227">"পুরনো বিজ্ঞপ্তি দেখতে আনলক করুন"</string> <string name="quick_settings_disclosure_parental_controls" msgid="2114102871438223600">"আপনার অভিভাবক এই ডিভাইস ম্যানেজ করেন"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"পাওয়ার মেনু"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>টির মধ্যে <xliff:g id="ID_1">%1$d</xliff:g> নং পৃষ্ঠা"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"লক স্ক্রিন"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"আপনার ফোন গরম হওয়ার জন্য বন্ধ হয়ে গেছে"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"আপনার ফোন এখন ভালভাবে কাজ করছে।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"আপনার ফোন খুব বেশি গরম হয়েছিল বলে ঠাণ্ডা হওয়ার জন্য বন্ধ হয়ে গেছে। আপনার ফোন ঠিক-ঠাক ভাবে চলছে না।\n\nআপনার ফোন খুব বেশি গরম হয়ে যাবে যদি আপনি:\n •এমন অ্যাপ ব্যবহার করলে যেটি আপনার ডিভাইসের রিসোর্স বেশি ব্যবহার করে (যেমন গেমিং, ভিডিও বা নেভিগেশন অ্যাপ)\n • বড় ফাইল ডাউনলোড বা আপলোড করলে\n • বেশি তাপমাত্রায় আপনার ফোন ব্যবহার করলে"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"ডিভাইস রক্ষণাবেক্ষণের ধাপগুলি দেখুন"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ফোনটি গরম হচ্ছে"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ফোন ঠাণ্ডা না হওয়া পর্যন্ত কিছু ফিচার কাজ করে না।\nআরও তথ্যের জন্য ট্যাপ করুন"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"আপনার ফোনটি নিজে থেকেই ঠাণ্ডা হওয়ার চেষ্টা করবে৷ আপনি তবুও আপনার ফোন ব্যবহার করতে পারেন, কিন্তু এটি একটু ধীরে চলতে পারে৷\n\nআপনার ফোনটি পুরোপুরি ঠাণ্ডা হয়ে গেলে এটি স্বাভাবিকভাবে চলবে৷"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ডিভাইস রক্ষণাবেক্ষণের ধাপগুলি দেখুন"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"আপনার ডিভাইস আনপ্লাগ করা"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"চার্জিং পোর্টের কাছে আপনার ডিভাইসটি গরম হচ্ছে। এটি চার্জার বা ইউএসবি অ্যাক্সেসরির সাথে কানেক্ট করা থাকলে, আনপ্লাগ করুন এবং সতর্ক থাকুন কারণ কেবেলটিও গরম হতে পারে।"</string> @@ -943,7 +937,7 @@ <string name="controls_media_settings_button" msgid="5815790345117172504">"সেটিংস"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="ARTIST_NAME">%2$s</xliff:g>-এর <xliff:g id="SONG_NAME">%1$s</xliff:g> গানটি <xliff:g id="APP_LABEL">%3$s</xliff:g> অ্যাপে চলছে"</string> <string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="TOTAL_TIME">%2$s</xliff:g>টির মধ্যে <xliff:g id="ELAPSED_TIME">%1$s</xliff:g>টি"</string> - <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> চলছে"</string> + <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> এখন চালু রয়েছে"</string> <string name="controls_media_button_play" msgid="2705068099607410633">"চালান"</string> <string name="controls_media_button_pause" msgid="8614887780950376258">"পজ করুন"</string> <string name="controls_media_button_prev" msgid="8126822360056482970">"আগের ট্র্যাক"</string> @@ -987,7 +981,7 @@ <string name="media_output_dialog_accessibility_title" msgid="4681741064190167888">"অডিও আউটপুটের জন্য উপলভ্য ডিভাইস।"</string> <string name="media_output_dialog_accessibility_seekbar" msgid="5332843993805568978">"ভলিউম"</string> <string name="media_output_dialog_volume_percentage" msgid="1613984910585111798">"<xliff:g id="PERCENTAGE">%1$d</xliff:g>%%"</string> - <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"স্পিকার & ডিসপ্লে"</string> + <string name="media_output_group_title_speakers_and_displays" msgid="7169712332365659820">"স্পিকার ও ডিসপ্লে"</string> <string name="media_output_group_title_suggested_device" msgid="4157186235837903826">"সাজেস্ট করা ডিভাইস"</string> <string name="media_output_end_session_dialog_summary" msgid="5954520685989877347">"অন্য ডিভাইসে মিডিয়া সরাতে আপনার শেয়ার করা সেশন বন্ধ করুন"</string> <string name="media_output_end_session_dialog_stop" msgid="208189434474624412">"বন্ধ করুন"</string> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 2c13d16adc78..4792c3691877 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni napajanja"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaključani ekran"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon se isključio zbog pregrijavanja"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Vaš telefon sada radi normalno.\nDodirnite za više informacija"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Vaš telefon se pregrijao, pa se isključio da se ohladi. Telefon sada radi normalno.\n\nTelefon se može pregrijati ako:\n • Koristite aplikacije koje troše puno resursa (kao što su aplikacije za igranje, videozapise ili navigaciju)\n • Preuzimate ili otpremate velike fajlove\n • Koristite telefon na visokim temperaturama"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Pogledajte korake za zaštitu"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon se pregrijava"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Neke funkcije su ograničene dok se telefon hladi.\nDodirnite za više informacija"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Vaš telefon će se automatski pokušati ohladiti. I dalje možete koristi telefon, ali će možda raditi sporije.\n\nNakon što se ohladi, telefon će normalno raditi."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Pogledajte korake za zaštitu"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Iskopčajte uređaj"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Uređaj se zagrijava u blizini priključka za punjenje. Ako je povezan s punjačem ili USB dodatkom, iskopčajte ga i vodite računa jer i kabl može biti topao."</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index a4cb466211f2..b66d235cfba1 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activa l\'USB"</string> <string name="learn_more" msgid="4690632085667273811">"Més informació"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de pantalla"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock desactivat"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desbloqueig ampliat desactivat"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ha enviat una imatge"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"S\'està desant la captura de pantalla..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"S\'està desant la captura al perfil de treball…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú d\'engegada"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pàgina <xliff:g id="ID_1">%1$d</xliff:g> (<xliff:g id="ID_2">%2$d</xliff:g> en total)"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueig"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telèfon apagat per la calor"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Ara el telèfon funciona correctament.\nToca per obtenir més informació"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"El telèfon s\'havia sobreescalfat i s\'ha apagat per refredar-se. Ara funciona amb normalitat.\n\nEs pot sobreescalfar si:\n • utilitzes aplicacions que consumeixen molts recursos (com ara, videojocs, vídeos o aplicacions de navegació);\n • baixes o penges fitxers grans;\n • l\'utilitzes amb temperatures altes."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Mostra els passos de manteniment"</string> - <string name="high_temp_title" msgid="2218333576838496100">"El telèfon s\'està escalfant"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Algunes funcions estan limitades mentre el telèfon es refreda.\nToca per obtenir més informació"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"El telèfon provarà de refredar-se automàticament. Podràs continuar utilitzant-lo, però és possible que funcioni més lentament.\n\nUn cop s\'hagi refredat, funcionarà amb normalitat."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Mostra els passos de manteniment"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desconnecta el dispositiu"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"El dispositiu s\'està escalfant a prop del port de càrrega. Si està connectat a un carregador o a un accessori USB, desconnecta\'l. Ves amb compte perquè el cable també pot haver-se escalfat."</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 53e47e3be96a..a509b877d50f 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivovat USB"</string> <string name="learn_more" msgid="4690632085667273811">"Další informace"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snímek obrazovky"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Prodloužení odemknutí deaktivováno"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Rozšíření odemknutí deaktivováno"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"odesílá obrázek"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ukládání snímku obrazovky..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ukládání snímku obrazovky do pracovního profilu…"</string> @@ -111,7 +111,7 @@ <string name="screenrecord_continue" msgid="4055347133700593164">"Začít"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Nahrávání obrazovky"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Nahrávání obrazovky a zvuku"</string> - <string name="screenrecord_taps_label" msgid="1595690528298857649">"Zobrazovat klepnutí na obrazovku"</string> + <string name="screenrecord_taps_label" msgid="1595690528298857649">"Zobrazovat klepnutí na displej"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Zastavit"</string> <string name="screenrecord_share_label" msgid="5025590804030086930">"Sdílet"</string> <string name="screenrecord_save_title" msgid="1886652605520893850">"Nahrávka obrazovky se uložila"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Nabídka vypínače"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Stránka <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Obrazovka uzamčení"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon se vypnul z důvodu zahřátí"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Nyní telefon funguje jako obvykle.\nKlepnutím zobrazíte další informace"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon byl příliš zahřátý, proto se vypnul, aby vychladl. Nyní telefon funguje jako obvykle.\n\nTelefon se může příliš zahřát v těchto případech:\n • používání náročných aplikací (např. her, videí nebo navigace),\n • stahování nebo nahrávání velkých souborů,\n • používání telefonu při vysokých teplotách."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Zobrazit pokyny, co dělat"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon se zahřívá"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Některé funkce jsou při chladnutí telefonu omezeny.\nKlepnutím zobrazíte další informace"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon se automaticky pokusí vychladnout. Lze jej nadále používat, ale může být pomalejší.\n\nAž telefon vychladne, bude fungovat normálně."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Zobrazit pokyny, co dělat"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Odpojte zařízení"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Zařízení se zahřívá v oblasti nabíjecího portu. Pokud je připojeno k nabíječce nebo příslušenství USB, odpojte ho (dejte pozor, kabel také může být zahřátý)."</string> @@ -1148,7 +1142,7 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Přepnout na pracovní profil"</string> <string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"Nainstalovat pracovní telefonní aplikaci"</string> <string name="call_from_work_profile_close" msgid="5830072964434474143">"Zrušit"</string> - <string name="lock_screen_settings" msgid="6152703934761402399">"Přizpůsobit zámek obrazovky"</string> + <string name="lock_screen_settings" msgid="6152703934761402399">"Přizpůsobit obrazovku uzamčení"</string> <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Pokud chcete upravit obrazovku uzamčení, odemkněte zařízení"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Síť Wi-Fi není dostupná"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera je blokována"</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index bc700e159068..ecb55414f55a 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivér USB"</string> <string name="learn_more" msgid="4690632085667273811">"Få flere oplysninger"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Hold oplåst er deaktiveret"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Hold ulåst er deaktiveret"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sendte et billede"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Gemmer screenshot..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Gemmer screenshot på din arbejdsprofil…"</string> @@ -168,24 +168,24 @@ <string name="biometric_re_enroll_dialog_confirm" msgid="3049858021857801836">"Konfigurer"</string> <string name="biometric_re_enroll_dialog_cancel" msgid="93760939407091417">"Ikke nu"</string> <string name="biometric_re_enroll_notification_content" msgid="8685925877186288180">"Dette er påkrævet for at forbedre sikkerheden og ydeevnen"</string> - <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"Konfigurer oplåsning med fingeraftryk igen"</string> - <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"Oplåsning med fingeraftryk"</string> - <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Konfigurer oplåsning med fingeraftryk"</string> - <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"Hvis du vil konfigurere oplåsning med fingeraftryk igen, bliver dine nuværende fingeraftryksbilleder og -modeller slettet.\n\nNår de er slettet, skal du konfigurere oplåsning med fingeraftryk igen for at bruge dit fingeraftryk til at låse din telefon op eller verificere din identitet."</string> - <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"Hvis du vil konfigurere oplåsning med fingeraftryk igen, bliver dine nuværende fingeraftryksbilleder og -modeller slettet.\n\nNår de er slettet, skal du konfigurere oplåsning med fingeraftryk igen for at bruge dit fingeraftryk til at låse din telefon op eller verificere din identitet."</string> - <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Oplåsning med fingeraftryk kunne ikke konfigureres. Gå til Indstillinger for at prøve igen."</string> - <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Konfigurer ansigtslås igen"</string> - <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Ansigtslås"</string> - <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Konfigurer ansigtslås"</string> - <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"Hvis du vil konfigurere ansigtslås igen, bliver din nuværende ansigtsmodel slettet.\n\nDu skal konfigurere funktionen igen for at bruge ansigtsgenkendelse til at låse din telefon op."</string> - <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Ansigtslås kunne ikke konfigureres. Gå til Indstillinger for at prøve igen."</string> + <string name="fingerprint_re_enroll_notification_title" msgid="4539432429683916604">"Konfigurer fingeroplåsning igen"</string> + <string name="fingerprint_re_enroll_notification_name" msgid="630798657797645704">"Fingeroplåsning"</string> + <string name="fingerprint_re_enroll_dialog_title" msgid="3526033128113925780">"Konfigurer fingeroplåsning"</string> + <string name="fingerprint_re_enroll_dialog_content" msgid="4866561176695984879">"Hvis du vil konfigurere fingeroplåsning igen, bliver dine nuværende fingeraftryksbilleder og -modeller slettet.\n\nNår de er slettet, skal du konfigurere fingeroplåsning igen for at bruge dit fingeraftryk til at låse din telefon op eller verificere din identitet."</string> + <string name="fingerprint_re_enroll_dialog_content_singular" msgid="3083663339787381218">"Hvis du vil konfigurere fingeroplåsning igen, bliver dine nuværende fingeraftryksbilleder og -modeller slettet.\n\nNår de er slettet, skal du konfigurere fingeroplåsning igen for at bruge dit fingeraftryk til at låse din telefon op eller verificere din identitet."</string> + <string name="fingerprint_reenroll_failure_dialog_content" msgid="4733768492747300666">"Fingeroplåsning kunne ikke konfigureres. Gå til Indstillinger for at prøve igen."</string> + <string name="face_re_enroll_notification_title" msgid="1850838867718410520">"Konfigurer ansigtsoplåsning igen"</string> + <string name="face_re_enroll_notification_name" msgid="7384545252206120659">"Ansigtsoplåsning"</string> + <string name="face_re_enroll_dialog_title" msgid="6392173708176069994">"Konfigurer ansigtsoplåsning"</string> + <string name="face_re_enroll_dialog_content" msgid="7353502359464038511">"Hvis du vil konfigurere ansigtsoplåsning igen, bliver din nuværende ansigtsmodel slettet.\n\nDu skal konfigurere funktionen igen for at bruge ansigtsgenkendelse til at låse din telefon op."</string> + <string name="face_reenroll_failure_dialog_content" msgid="7073947334397236935">"Ansigtsoplåsning kunne ikke konfigureres. Gå til Indstillinger for at prøve igen."</string> <string name="fingerprint_dialog_touch_sensor" msgid="2817887108047658975">"Sæt fingeren på fingeraftrykssensoren"</string> <string name="fingerprint_dialog_use_fingerprint_instead" msgid="6178228876763024452">"Ansigtet kan ikke genkendes. Brug fingeraftryk i stedet."</string> <!-- no translation found for keyguard_face_failed_use_fp (7140293906176164263) --> <skip /> <string name="keyguard_face_failed" msgid="9044619102286917151">"Ansigt kan ikke genkendes"</string> <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Brug fingeraftryk i stedet"</string> - <string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ansigtslås er utilgængelig"</string> + <string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Ansigtsoplåsning er utilgængelig"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth tilsluttet."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Batteriniveauet er ukendt."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Tilsluttet <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -661,12 +661,12 @@ <string name="group_system_access_system_settings" msgid="7961639365383008053">"Åbn systemindstillinger"</string> <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Åbn Google Assistent"</string> <string name="group_system_lock_screen" msgid="7391191300363416543">"Lås skærm"</string> - <string name="group_system_quick_memo" msgid="2914234890158583919">"Hent appen Notes for at skrive et hurtigt notat"</string> + <string name="group_system_quick_memo" msgid="2914234890158583919">"Åbn appen Notes for at skrive et hurtigt notat"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Systemmultitasking"</string> <string name="system_multitasking_rhs" msgid="6593269428880305699">"Start opdelt skærm med aktuel app til højre"</string> <string name="system_multitasking_lhs" msgid="8839380725557952846">"Start opdelt skærm med aktuel app til venstre"</string> <string name="system_multitasking_full_screen" msgid="1962084334200006297">"Skift fra opdelt skærm til fuld skærm"</string> - <string name="system_multitasking_replace" msgid="844285282472557186">"Ved opdelt skærm: Erstat en app med én app ad gangen"</string> + <string name="system_multitasking_replace" msgid="844285282472557186">"Ved opdelt skærm: Erstat en app med en anden app"</string> <string name="keyboard_shortcut_group_input" msgid="6888282716546625610">"Input"</string> <string name="input_switch_input_language_next" msgid="3394291576873633793">"Skift inputsprog (næste sprog)"</string> <string name="input_switch_input_language_previous" msgid="8823659252918609216">"Skift inputsprog (forrige sprog)"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu for afbryderknappen"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Side <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Låseskærm"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefonen slukkede pga. varme"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Din telefon kører nu normalt.\nTryk for at få flere oplysninger"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Din telefon var blevet for varm, så den slukkede for at køle ned. Din telefon kører nu igen normalt. \n\nDin telefon kan blive for varm, hvis du:\n • Bruger ressourcekrævende apps (f.eks. spil, video eller navigation)\n • Downloader eller uploader store filer\n • Bruger din telefon i varme omgivelser"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Se håndteringsvejledning"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefonen er ved at blive varm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Nogle funktioner er begrænsede, mens telefonen køler ned.\nTryk for at få flere oplysninger"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Din telefon forsøger automatisk at køle ned. Du kan stadig bruge telefonen, men den kører muligvis langsommere.\n\nNår din telefon er kølet ned, fungerer den normalt igen."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Se håndteringsvejledning"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Træk stikket ud af din enhed"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Din enhed er ved at blive varm i nærheden af opladningsporten. Hvis enheden er tilsluttet en oplader eller USB-enhed, skal du trække stikket ud. Vær opmærksom på, at stikket også kan være varmt."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 98a1d67d655f..1f26dae0089b 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Ein-/Aus-Menü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Seite <xliff:g id="ID_1">%1$d</xliff:g> von <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Sperrbildschirm"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Ausgeschaltet, da zu heiß"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Dein Smartphone funktioniert jetzt wieder normal.\nFür mehr Informationen tippen."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Dein Smartphone war zu heiß und wurde zum Abkühlen ausgeschaltet. Nun funktioniert es wieder normal.\n\nMögliche Ursachen:\n • Verwendung ressourcenintensiver Apps (z. B. Spiele-, Video- oder Navigations-Apps)\n • Download oder Upload großer Dateien \n • Verwendung des Smartphones bei hohen Temperaturen"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Schritte zur Abkühlung des Geräts ansehen"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Smartphone wird warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Einige Funktionen sind während der Abkühlphase des Smartphones eingeschränkt.\nFür mehr Informationen tippen."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Dein Smartphone kühlt sich automatisch ab. Du kannst dein Smartphone weiterhin nutzen, aber es reagiert möglicherweise langsamer.\n\nSobald dein Smartphone abgekühlt ist, funktioniert es wieder normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Schritte zur Abkühlung des Geräts ansehen"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Gerät vom Stromnetz trennen"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Dein Gerät erwärmt sich am Ladeanschluss. Trenne das Gerät vom Stromnetz, wenn es an ein Ladegerät oder USB-Zubehör angeschlossen ist. Sei vorsichtig, denn das Kabel könnte ebenfalls heiß sein."</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 9425b2142e83..f80fb0d34feb 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Ενεργοποίηση USB"</string> <string name="learn_more" msgid="4690632085667273811">"Μάθετε περισσότερα"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Στιγμιότυπο οθόνης"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Το εκτεταμένο ξεκλείδωμα είναι απενεργοποιημένο"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Η Επέκταση ξεκλειδώματος είναι απενεργοποιημένη"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"έστειλε μια εικόνα"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Αποθήκευση στιγμιότυπου οθόνης..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Αποθήκευση στιγμιότ. οθόνης στο προφίλ εργασίας…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Μενού λειτουργίας"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Σελίδα <xliff:g id="ID_1">%1$d</xliff:g> από <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Οθόνη κλειδώματος"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Το τηλέφωνο απεν. λόγω ζέστης"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Το τηλέφωνο λειτουργεί πλέον κανονικά.\nΠατήστε για περισσότερες πληροφορίες."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Η θερμοκρασία του τηλεφώνου είναι πολύ υψηλή και απενεργοποιήθηκε για να κρυώσει. Πλέον, λειτουργεί κανονικά.\n\nΗ θερμοκρασία ενδέχεται να ανέβει κατά τη:\n • Χρήση εφαρμογών υψηλής κατανάλωσης πόρων (όπως gaming, βίντεο ή περιήγησης)\n • Λήψη/μεταφόρτωση μεγάλων αρχείων\n • Χρήση σε υψηλές θερμοκρασίες"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Δείτε βήματα αντιμετώπισης."</string> - <string name="high_temp_title" msgid="2218333576838496100">"Αύξηση θερμοκρασίας τηλεφώνου"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Ορισμένες λειτουργίες περιορίζονται κατά τη μείωση της θερμοκρασίας.\nΠατήστε για περισσότερες πληροφορίες."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Το τηλέφωνό σας θα προσπαθήσει να μειώσει αυτόματα τη θερμοκρασία. Μπορείτε να εξακολουθήσετε να το χρησιμοποιείτε, αλλά είναι πιθανό να λειτουργεί πιο αργά.\n\nΜόλις μειωθεί η θερμοκρασία του τηλεφώνου σας, θα λειτουργεί ξανά κανονικά."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Δείτε βήματα αντιμετώπισης."</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Αποσυνδέστε τη συσκευή"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Η συσκευή έχει αρχίσει να ζεσταίνεται κοντά στη θύρα φόρτισης. Αν είναι συνδεδεμένη σε φορτιστή ή αξεσουάρ USB, αποσυνδέστε την και προσέξτε γιατί και το καλώδιο μπορεί να έχει ζεσταθεί."</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index ddd54c02e538..27c50d6c5130 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -586,8 +586,8 @@ <string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string> <string name="notification_channel_dialog_title" msgid="6856514143093200019">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string> <string name="see_more_title" msgid="7409317011708185729">"See more"</string> - <string name="feedback_alerted" msgid="5192459808484271208">"This notification was automatically <b>promoted to default</b> by the system."</string> - <string name="feedback_silenced" msgid="9116540317466126457">"This notification was automatically <b>demoted to silent</b> by the system."</string> + <string name="feedback_alerted" msgid="5192459808484271208">"This notification was automatically <b>promoted to Default</b> by the system."</string> + <string name="feedback_silenced" msgid="9116540317466126457">"This notification was automatically <b>demoted to Silent</b> by the system."</string> <string name="feedback_promoted" msgid="2125562787759780807">"This notification was automatically <b>ranked higher</b> in your shade."</string> <string name="feedback_demoted" msgid="951884763467110604">"This notification was automatically <b>ranked lower</b> in your shade."</string> <string name="feedback_prompt" msgid="3656728972307896379">"Let the developer know your feedback. Was this correct?"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Phone turned off due to heat"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Your phone is now running normally.\nTap for more info"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"See care steps"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Phone is getting warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features are limited while phone cools down.\nTap for more info"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it and take care as the cable may also be warm."</string> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 4f46c007ef1b..f10386b914e4 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Phone turned off due to heat"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Your phone is now running normally.\nTap for more info"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"See care steps"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Phone is getting warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features limited while phone cools down.\nTap for more info"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it, and take care as the cable may also be warm."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index ddd54c02e538..27c50d6c5130 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -586,8 +586,8 @@ <string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string> <string name="notification_channel_dialog_title" msgid="6856514143093200019">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string> <string name="see_more_title" msgid="7409317011708185729">"See more"</string> - <string name="feedback_alerted" msgid="5192459808484271208">"This notification was automatically <b>promoted to default</b> by the system."</string> - <string name="feedback_silenced" msgid="9116540317466126457">"This notification was automatically <b>demoted to silent</b> by the system."</string> + <string name="feedback_alerted" msgid="5192459808484271208">"This notification was automatically <b>promoted to Default</b> by the system."</string> + <string name="feedback_silenced" msgid="9116540317466126457">"This notification was automatically <b>demoted to Silent</b> by the system."</string> <string name="feedback_promoted" msgid="2125562787759780807">"This notification was automatically <b>ranked higher</b> in your shade."</string> <string name="feedback_demoted" msgid="951884763467110604">"This notification was automatically <b>ranked lower</b> in your shade."</string> <string name="feedback_prompt" msgid="3656728972307896379">"Let the developer know your feedback. Was this correct?"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Phone turned off due to heat"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Your phone is now running normally.\nTap for more info"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"See care steps"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Phone is getting warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features are limited while phone cools down.\nTap for more info"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it and take care as the cable may also be warm."</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index ddd54c02e538..27c50d6c5130 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -586,8 +586,8 @@ <string name="notification_delegate_header" msgid="1264510071031479920">"Proxied notification"</string> <string name="notification_channel_dialog_title" msgid="6856514143093200019">"All <xliff:g id="APP_NAME">%1$s</xliff:g> notifications"</string> <string name="see_more_title" msgid="7409317011708185729">"See more"</string> - <string name="feedback_alerted" msgid="5192459808484271208">"This notification was automatically <b>promoted to default</b> by the system."</string> - <string name="feedback_silenced" msgid="9116540317466126457">"This notification was automatically <b>demoted to silent</b> by the system."</string> + <string name="feedback_alerted" msgid="5192459808484271208">"This notification was automatically <b>promoted to Default</b> by the system."</string> + <string name="feedback_silenced" msgid="9116540317466126457">"This notification was automatically <b>demoted to Silent</b> by the system."</string> <string name="feedback_promoted" msgid="2125562787759780807">"This notification was automatically <b>ranked higher</b> in your shade."</string> <string name="feedback_demoted" msgid="951884763467110604">"This notification was automatically <b>ranked lower</b> in your shade."</string> <string name="feedback_prompt" msgid="3656728972307896379">"Let the developer know your feedback. Was this correct?"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Phone turned off due to heat"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Your phone is now running normally.\nTap for more info"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"See care steps"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Phone is getting warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features are limited while phone cools down.\nTap for more info"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run more slowly.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it and take care as the cable may also be warm."</string> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index c95d6aa8b466..530474bded94 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Phone turned off due to heat"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Your phone is now running normally.\nTap for more info"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Your phone was too hot, so it turned off to cool down. Your phone is now running normally.\n\nYour phone may get too hot if you:\n • Use resource-intensive apps (such as gaming, video, or navigation apps)\n • Download or upload large files\n • Use your phone in high temperatures"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"See care steps"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Phone is getting warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Some features limited while phone cools down.\nTap for more info"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Your phone will automatically try to cool down. You can still use your phone, but it may run slower.\n\nOnce your phone has cooled down, it will run normally."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"See care steps"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Unplug your device"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Your device is getting warm near the charging port. If it’s connected to a charger or USB accessory, unplug it, and take care as the cable may also be warm."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index e2ac0ff7c47c..98f8c1de8bdf 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -414,7 +414,7 @@ <string name="media_projection_entry_generic_permission_dialog_continue" msgid="8640381403048097116">"Iniciar"</string> <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Bloqueada por tu administrador de TI"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"La captura de pantalla está inhabilitada debido a la política del dispositivo"</string> - <string name="clear_all_notifications_text" msgid="348312370303046130">"Borrar todo"</string> + <string name="clear_all_notifications_text" msgid="348312370303046130">"Cerrar todo"</string> <string name="manage_notifications_text" msgid="6885645344647733116">"Administrar"</string> <string name="manage_notifications_history_text" msgid="57055985396576230">"Historial"</string> <string name="notification_section_header_incoming" msgid="850925217908095197">"Nuevo"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de encendido"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueo"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"El teléfono se apagó por calor"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Tu teléfono ahora se ejecuta con normalidad.\nPresiona para obtener más información"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Tu teléfono estaba muy caliente y se apagó para enfriarse. Ya funciona correctamente.\n\nTu teléfono puede calentarse en estos casos:\n • Usas apps que consumen muchos recursos (como juegos, videos o navegación).\n • Subes o descargas archivos grandes.\n • Usas el teléfono en condiciones de temperatura alta."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Ver pasos de mantenimiento"</string> - <string name="high_temp_title" msgid="2218333576838496100">"El teléfono se está calentando"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Algunas funciones se limitan durante el enfriamiento del teléfono.\nPresiona para obtener más información"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Tu teléfono intentará enfriarse automáticamente. Podrás usarlo, pero es posible que funcione más lento.\n\nUna vez que se haya enfriado, volverá a funcionar correctamente."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver pasos de mantenimiento"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desenchufa el dispositivo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"El puerto de carga del dispositivo se está calentando. Si está conectado a un cargador o accesorio USB, desenchúfalo con cuidado, ya que el cable también puede estar caliente."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 76428b7a8a50..729d63455971 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Habilitar USB"</string> <string name="learn_more" msgid="4690632085667273811">"Más información"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de pantalla"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock inhabilitado"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Prolongar Desbloqueo inhabilitado"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ha enviado una imagen"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Guardando captura..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Guardando captura en el perfil de trabajo…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de encendido"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueo"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Teléfono apagado por calor"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"El teléfono ya funciona con normalidad.\nToca para ver más información"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"El teléfono se había calentado demasiado y se ha apagado para enfriarse. Ahora funciona con normalidad.\n\nPuede calentarse demasiado si:\n • Usas aplicaciones que consumen muchos recursos (p. ej., apps de juegos, vídeos o navegación)\n • Descargas o subes archivos grandes\n • Lo usas a altas temperaturas"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Ver pasos de mantenimiento"</string> - <string name="high_temp_title" msgid="2218333576838496100">"El teléfono se está calentando"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Se han limitado algunas funciones mientras el teléfono se enfría.\nToca para ver más información"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"El teléfono intentará enfriarse. Puedes seguir utilizándolo, pero es posible que funcione con mayor lentitud.\n\nUna vez que se haya enfriado, funcionará con normalidad."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver pasos de mantenimiento"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desenchufa tu dispositivo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Tu dispositivo se está calentando cerca del puerto de carga. Si está conectado a un cargador o a un accesorio USB, desenchúfalo con cuidado, ya que el cable también puede estar caliente."</string> @@ -1035,7 +1029,7 @@ <string name="status_before_loading" msgid="1500477307859631381">"El contenido se mostrará en breve"</string> <string name="missed_call" msgid="4228016077700161689">"Llamada perdida"</string> <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string> - <string name="people_tile_description" msgid="8154966188085545556">"Consulta los mensajes recientes, las llamadas perdidas y los cambios de estado"</string> + <string name="people_tile_description" msgid="8154966188085545556">"Consulta mensajes recientes, llamadas perdidas y cambios de estado"</string> <string name="people_tile_title" msgid="6589377493334871272">"Conversación"</string> <string name="paused_by_dnd" msgid="7856941866433556428">"Pausado por No molestar"</string> <string name="new_notification_text_content_description" msgid="2915029960094389291">"<xliff:g id="NAME">%1$s</xliff:g> ha enviado un mensaje: <xliff:g id="NOTIFICATION">%2$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index 16a624521aa5..edb38307a175 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Luba USB"</string> <string name="learn_more" msgid="4690632085667273811">"Lisateave"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekraanipilt"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock on keelatud"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Avatuna hoidmine on keelatud"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"saatis kujutise"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Kuvatõmmise salvestamine ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ekraanipildi salvestamine tööprofiilile …"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Toitemenüü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Leht <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lukustuskuva"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Tel. lül. kuumuse tõttu välja"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefon töötab nüüd tavapäraselt.\nPuudutage lisateabe saamiseks."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon oli liiga kuum, seetõttu lülitus see jahtumiseks välja. Telefon töötab nüüd tavapäraselt.\n\nTelefon võib kuumaks minna:\n • ressursse koormavate rakenduste kasutamisel (nt mängu-, video- või navigatsioonirakendused)\n • suurte failide alla-/üleslaadimisel\n • telefoni kasutamisel kõrgel temperatuuril"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Vaadake hooldusjuhiseid"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon soojeneb"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Mõned funktsioonid on piiratud, kuni telefon jahtub.\nPuudutage lisateabe saamiseks."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Teie telefon proovib automaatselt maha jahtuda. Saate telefoni ikka kasutada, kuid see võib olla aeglasem.\n\nKui telefon on jahtunud, töötab see tavapäraselt."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Vaadake hooldusjuhiseid"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Eemaldage seade"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Teie seade läheb laadimispordi juurest soojaks. Kui see on ühendatud laadija või USB-tarvikuga, eemaldage see ja olge ettevaatlik, kuna kaabel võib samuti soe olla."</string> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 3ef0b28d0273..4389ccec20a7 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Gaitu USB ataka"</string> <string name="learn_more" msgid="4690632085667273811">"Lortu informazio gehiago"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Pantaila-argazkia"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desgaitu da desblokeatze luzatua"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desgaitu da desblokeatuta mantentzeko eginbidea"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"erabiltzaileak irudi bat bidali du"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Pantaila-argazkia gordetzen…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Pantaila-argazkia laneko profilean gordetzen…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Itzaltzeko menua"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g> orria"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantaila blokeatua"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Beroegi egoteagatik itzali da"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Ohi bezala ari da funtzionatzen telefonoa orain.\nInformazio gehiago lortzeko, sakatu hau."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefonoa gehiegi berotu da, eta itzali egin da tenperatura jaisteko. Orain, ohiko moduan dabil.\n\nBerotzearen zergati posibleak:\n • Baliabide asko behar dituzten aplikazioak erabiltzea (adib., bideojokoak, bideoak edo nabigazio-aplikazioak).\n • Fitxategi handiak deskargatu edo kargatzea.\n • Telefonoa giro beroetan erabiltzea."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Ikusi zaintzeko urratsak"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Berotzen ari da telefonoa"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Eginbide batzuk ezingo dira erabili telefonoa hoztu arte.\nInformazio gehiago lortzeko, sakatu hau."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonoa automatikoki saiatuko da hozten. Hoztu bitartean, telefonoa erabiltzen jarrai dezakezu, baina mantsoago funtziona lezake.\n\nTelefonoaren tenperatura jaitsi bezain laster, ohi bezala funtzionatzen jarraituko du."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ikusi zaintzeko urratsak"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Deskonektatu gailua"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Gailua berotzen ari da kargatzeko atakaren inguruan. Kargagailu edo USB bidezko osagarri batera konektatuta badago, deskonekta ezazu kontuz, kablea ere beroa egongo baita agian."</string> @@ -1068,7 +1062,7 @@ <string name="wifi_wont_autoconnect_for_now" msgid="5782282612749867762">"Oraingoz ez da automatikoki konektatuko wifira"</string> <string name="see_all_networks" msgid="3773666844913168122">"Ikusi guztiak"</string> <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Sarea aldatzeko, deskonektatu Etherneta"</string> - <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Gailuaren funtzionamendua hobetzeko, aplikazioek eta zerbitzuek wifi-sareak bilatzen jarraituko dute, baita wifi-konexioa desaktibatuta dagoenean ere. Aukera hori aldatzeko, joan wifi-sareen bilaketaren ezarpenetara. "<annotation id="link">"Aldatu"</annotation></string> + <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Gailuaren funtzionamendua hobetzeko, aplikazioek eta zerbitzuek wifi-sareak bilatzen jarraituko dute, baita wifi-konexioa desaktibatuta dagoenean ere. Aukera hori aldatzeko, joan wifi-sareak bilatzeko eginbidearen ezarpenetara. "<annotation id="link">"Aldatu"</annotation></string> <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Desaktibatu hegaldi modua"</string> <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"<xliff:g id="APPNAME">%1$s</xliff:g> aplikazioak lauza hau gehitu nahi du Ezarpen bizkorrak menuan:"</string> <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Gehitu lauza"</string> @@ -1119,7 +1113,7 @@ <string name="log_access_confirmation_title" msgid="4843557604739943395">"Gailuko erregistro guztiak erabiltzeko baimena eman nahi diozu <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> aplikazioari?"</string> <string name="log_access_confirmation_allow" msgid="752147861593202968">"Eman behin erabiltzeko baimena"</string> <string name="log_access_confirmation_deny" msgid="2389461495803585795">"Ez eman baimenik"</string> - <string name="log_access_confirmation_body" msgid="6883031912003112634">"Gailuko erregistroetan gailuan gertatzen den guztia gordetzen da. Arazoak bilatu eta konpontzeko erabil ditzakete aplikazioek erregistro horiek.\n\nBaliteke erregistro batzuek kontuzko informazioa edukitzea. Beraz, eman gailuko erregistro guztiak erabiltzeko baimena fidagarritzat jotzen dituzun aplikazioei bakarrik. \n\nNahiz eta gailuko erregistro guztiak erabiltzeko baimena ez eman aplikazio honi, aplikazioak hari dagozkion erregistroak atzitu ahalko ditu. Gainera, baliteke gailuaren fabrikatzaileak gailuko erregistro edo datu batzuk atzitu ahal izatea."</string> + <string name="log_access_confirmation_body" msgid="6883031912003112634">"Gailuko erregistroetan gailuan gertatzen den guztia gordetzen da. Arazoak bilatu eta konpontzeko erabil ditzakete aplikazioek erregistro horiek.\n\nBaliteke erregistro batzuek kontuzko informazioa edukitzea. Beraz, eman gailuko erregistro guztiak erabiltzeko baimena fidagarritzat jotzen dituzun aplikazioei bakarrik. \n\nNahiz eta gailuko erregistro guztiak erabiltzeko baimena ez eman aplikazio honi, aplikazioak hari dagozkion erregistroak erabili ahalko ditu. Gainera, baliteke gailuaren fabrikatzaileak gailuko erregistro edo datu batzuk erabili ahal izatea."</string> <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Lortu informazio gehiago"</string> <string name="log_access_confirmation_learn_more_at" msgid="5635666259505215905">"Lortu informazio gehiago <xliff:g id="URL">%s</xliff:g> helbidean"</string> <string name="keyguard_affordance_enablement_dialog_action_template" msgid="8164857863036314664">"Ireki <xliff:g id="APPNAME">%1$s</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 456d91fc2f46..5af33437c89b 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"منوی روشن/خاموش"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"صفحه <xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"صفحه قفل"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"تلفن به علت گرم شدن خاموش شد"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"اکنون عملکرد تلفنتان به حالت عادی برگشته است.\nبرای اطلاعات بیشتر ضربه بزنید"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"تلفنتان خیلی گرم شده بود، بنابراین خاموش شد تا خنک شود. اکنون تلفنتان عملکرد معمولش را دارد.\n\nتلفنتان خیلی گرم میشود، اگر:\n • از برنامههای نیازمند پردازش زیاد (مانند بازی، برنامههای ویدیویی یا پیمایشی) استفاده کنید\n • فایلهای بزرگ بارگیری یا بارگذاری کنید\n • در دماهای بالا از تلفنتان استفاده کنید"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"دیدن اقدامات محافظتی"</string> - <string name="high_temp_title" msgid="2218333576838496100">"تلفن درحال گرم شدن است"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"وقتی تلفن درحال خنک شدن است، بعضی از ویژگیها محدود میشوند.\nبرای اطلاعات بیشتر ضربه بزنید"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"تلفنتان بهطور خودکار سعی میکند خنک شود. همچنان میتوانید از تلفنتان استفاده کنید، اما ممکن است کندتر عمل کند.\n\nوقتی تلفن خنک شد، عملکرد عادیاش از سرگرفته میشود."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"دیدن اقدامات محافظتی"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"دستگاه را جدا کنید"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"دستگاهتان کنار درگاه شارژ گرم شده است. اگر دستگاهتان به شارژر یا لوازم جانبی USB متصل است، آن را جدا کنید و مراقب باشید چون ممکن است کابل هم گرم باشد."</string> @@ -899,7 +893,7 @@ <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> میتواند انتخاب کند چه کنترلها و محتوایی اینجا نشان داده شود."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"کنترلهای <xliff:g id="APPNAME">%s</xliff:g> برداشته شود؟"</string> <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_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_unfavorite" msgid="6997408061750740327">"حذف کردن از موارد دلخواه"</string> @@ -943,7 +937,7 @@ <string name="controls_media_settings_button" msgid="5815790345117172504">"تنظیمات"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="SONG_NAME">%1$s</xliff:g> از <xliff:g id="ARTIST_NAME">%2$s</xliff:g> ازطریق <xliff:g id="APP_LABEL">%3$s</xliff:g> پخش میشود"</string> <string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> از <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string> - <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> در حال اجرا است"</string> + <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> درحال اجرا است"</string> <string name="controls_media_button_play" msgid="2705068099607410633">"پخش"</string> <string name="controls_media_button_pause" msgid="8614887780950376258">"توقف موقت"</string> <string name="controls_media_button_prev" msgid="8126822360056482970">"آهنگ قبلی"</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 673f9c29abfe..1a941c75e577 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Ota USB käyttöön"</string> <string name="learn_more" msgid="4690632085667273811">"Lue lisää"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Kuvakaappaus"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock poistettu käytöstä"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Lukitsematon tila poistettu käytöstä"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"lähetti kuvan"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Tallennetaan kuvakaappausta..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Kuvakaappausta tallennetaan työprofiiliin…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Virtavalikko"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Sivu <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lukitusnäyttö"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Puhelin sammui kuumuuden takia"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Puhelimesi toimii nyt normaalisti.\nLue lisää napauttamalla"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Puhelimesi oli liian kuuma, joten se sammui. Puhelimesi toimii nyt normaalisti.\n\nPuhelimesi voi kuumentua liikaa, jos\n • käytät paljon resursseja vaativia sovelluksia (esim. pelejä, videoita tai navigointisovelluksia)\n • lataat tai lähetät suuria tiedostoja\n • käytät puhelintasi korkeissa lämpötiloissa."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Katso huoltovaiheet"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Puhelin lämpenee"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Joidenkin ominaisuuksien käyttöä on rajoitettu puhelimen jäähtymisen aikana.\nLue lisää napauttamalla"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Puhelimesi yrittää automaattisesti jäähdyttää itsensä. Voit silti käyttää puhelinta, mutta se voi toimia hitaammin.\n\nKun puhelin on jäähtynyt, se toimii normaalisti."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Katso huoltovaiheet"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Irrota laite"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Laite lämpenee latausportin lähellä. Jos laite on yhdistetty laturiin tai USB-lisälaitteeseen, irrota se varoen, sillä johtokin voi olla lämmin."</string> @@ -1148,7 +1142,7 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"Vaihda työprofiiliin"</string> <string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"Asenna työpuhelinsovellus"</string> <string name="call_from_work_profile_close" msgid="5830072964434474143">"Peruuta"</string> - <string name="lock_screen_settings" msgid="6152703934761402399">"Customize lukitusnäyttöä"</string> + <string name="lock_screen_settings" msgid="6152703934761402399">"Muokkaa lukitusnäyttöä"</string> <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"Avaa lukitus muokataksesi lukitusnäyttöä"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"Wi-Fi-yhteys ei ole käytettävissä"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"Kamera estetty"</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 23403258edb4..5a629bc85b16 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activer l\'USB"</string> <string name="learn_more" msgid="4690632085667273811">"En savoir plus"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capture d\'écran"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock désactivée"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Déverrouillage prolongé désactivé"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a envoyé une image"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Enregistrement capture écran…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Sauv. de la capture dans le profil prof. en cours…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu de l\'interrupteur"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Écran de verrouillage"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Tél. éteint car il surchauffait"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Votre téléphone fonctionne maintenant de manière normale.\nTouchez pour en savoir plus"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Votre téléphone s\'est éteint, car il surchauffait. Il s\'est refroidi et fonctionne normalement.\n\nIl peut surchauffer si vous :\n • Util. des applis utilisant beaucoup de ressources (jeux, vidéo, navigation, etc.)\n • Téléchargez ou téléversez de gros fichiers\n • Utilisez téléphone dans des températures élevées"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Afficher les étapes d\'entretien"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Le téléphone commence à chauffer"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Certaines fonctionnalités sont limitées pendant que le téléphone refroidit.\nTouchez pour en savoir plus"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Afficher les étapes d\'entretien"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Débranchez votre appareil"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Votre appareil chauffe près du port de recharge. S\'il est connecté à un chargeur ou à un accessoire USB, débranchez-le en faisant attention : le câble pourrait également être chaud."</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index f0c0fdce200b..dc3bd0d3a8f8 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activer le port USB"</string> <string name="learn_more" msgid="4690632085667273811">"En savoir plus"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capture d\'écran"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Déverrouillage étendu désactivé"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock désactivé"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a envoyé une image"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Enregistrement de la capture d\'écran…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Enregistrement de capture d\'écran dans profil pro…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu Marche/Arrêt"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Écran de verrouillage"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Tél. éteint car il surchauffait"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"À présent, votre téléphone fonctionne normalement.\nAppuyer pour en savoir plus"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Votre téléphone s\'est éteint, car il surchauffait. Il s\'est refroidi et fonctionne normalement.\n\nIl peut surchauffer si vous :\n • exécutez applis utilisant beaucoup de ressources (jeux, vidéo, navigation, etc.) ;\n • téléchargez ou importez gros fichiers ;\n • utilisez téléphone à des températures élevées."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Afficher les étapes d\'entretien"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Le téléphone chauffe"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Fonctionnalités limitées pendant le refroidissement du téléphone.\nAppuyer pour en savoir plus"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Votre téléphone va essayer de se refroidir automatiquement. Vous pouvez toujours l\'utiliser, mais il risque d\'être plus lent.\n\nUne fois refroidi, il fonctionnera normalement."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Afficher les étapes d\'entretien"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Débrancher votre appareil"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Votre appareil se réchauffe près du port de recharge. S\'il est connecté à un chargeur ou un accessoire USB, débranchez-le en faisant attention, car le câble peut lui aussi être chaud."</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index b4a866347d47..453849a4d610 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activar USB"</string> <string name="learn_more" msgid="4690632085667273811">"Máis información"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Facer captura"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desactivouse o desbloqueo ampliado"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desactivouse Desbloqueo extra"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou unha imaxe"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Gardando captura de pantalla…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Gardando captura de pantalla no perfil de traballo"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menú de acendido"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Páxina <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Pantalla de bloqueo"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"O teléfono apagouse pola calor"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"O teléfono funciona con normalidade.\nToca para obter máis información"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"O teléfono estaba moi quente, apagouse para que arrefríe e agora funciona con normalidade.\n\nÉ posible que estea moi quente se:\n • Usas aplicacións que requiren moitos recursos (como aplicacións de navegación, vídeos e xogos)\n • Descargas/cargas ficheiros grandes\n • Usas o teléfono a alta temperatura"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Ver pasos de mantemento"</string> - <string name="high_temp_title" msgid="2218333576838496100">"O teléfono está quentando"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"O uso dalgunhas funcións é limitado mentres o teléfono arrefría.\nToca para obter máis información"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"O teléfono tentará arrefriar automaticamente. Podes utilizalo, pero é probable que funcione máis lento.\n\nUnha vez que arrefríe, funcionará con normalidade."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver pasos de mantemento"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desconectar o dispositivo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"O dispositivo estase quentando cerca do porto de carga. Se está conectado a un cargador ou a un accesorio USB, desconéctao con coidado, xa que o cable tamén podería estar quente."</string> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 639c6c3c8cea..ea4f871b4910 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ચાલુ કરો"</string> <string name="learn_more" msgid="4690632085667273811">"વધુ જાણો"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"સ્ક્રીનશૉટ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlockની સુવિધા બંધ કરવામાં આવી"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"એક્સટેન્ડ અનલૉકની સુવિધા બંધ કરવામાં આવી"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"છબી મોકલી"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"સ્ક્રીનશોટ સાચવી રહ્યું છે…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ઑફિસની પ્રોફાઇલમાં સ્ક્રીનશૉટ સાચવી રહ્યાં છીએ…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"પાવર મેનૂ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> માંથી <xliff:g id="ID_1">%1$d</xliff:g> પૃષ્ઠ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"લૉક સ્ક્રીન"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ફોન વધુ પડતી ગરમીને લીધે બંધ થઇ ગયો છે"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"તમારો ફોન અત્યંત ગરમ હતો, તેથી તે ઠંડો થવા ઑટોમૅટિક રીતે બંધ થઈ ગયો છે. તમારો ફોન હવે સામાન્યપણે કાર્ય કરી રહ્યો છે.\n\nતમારો ફોન અત્યંત ગરમ થઈ શકે છે, જો તમે:\n • એવી ઍપ વાપરતા હો જે સંસાધન સઘન રીતે વાપરતી હોય (જેમ કે ગેમિંગ, વીડિયો, અથવા નેવિગેટ કરતી ઍપ)\n • મોટી ફાઇલો અપલોડ અથવા ડાઉનલોડ કરતા હો\n • તમારા ફોનનો ઉપયોગ ઉચ્ચ તાપમાનમાં કરતા હો"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"સારસંભાળના પગલાં જુઓ"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ફોન ગરમ થઈ રહ્યો છે"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ફોન ઠંડો થાય ત્યાં સુધી અમુક સુવિધાઓ મર્યાદિત હોય છે.\nવધુ માહિતી માટે ટૅપ કરો"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"તમારો ફોન ઑટોમૅટિક રીતે ઠંડો થવાનો પ્રયાસ કરશે. તમે હજી પણ તમારા ફોનનો ઉપયોગ કરી શકો છો, પરંતુ તે કદાચ થોડો ધીમો ચાલે.\n\nતમારો ફોન ઠંડો થઈ જવા પર, તે સામાન્ય રીતે ચાલશે."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"સારસંભાળના પગલાં જુઓ"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"તમારા ડિવાઇસને અનપ્લગ કરો"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"તમારું ડિવાઇસ ચાર્જિંગ પોર્ટની પાસે ગરમ થઈ રહ્યું છે. જો તે કોઈ ચાર્જર અથવા USB ઍક્સેસરી સાથે કનેક્ટેડ હોય, તો તેને અનપ્લગ કરો અને ધ્યાન રાખો, કારણ કે કેબલ ગરમ પણ હોઈ શકે છે."</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 1d70a2a073e2..e6a134b645c9 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पावर मेन्यू"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"पेज <xliff:g id="ID_2">%2$d</xliff:g> में से <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"लॉक स्क्रीन"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"गर्म होने की वजह से फ़ोन बंद हुआ"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"आपका फ़ोन सामान्य रूप से काम कर रहा है.\nज़्यादा जानकारी के लिए टैप करें"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"फ़ोन बहुत गर्म हो गया था, इसलिए ठंडा होने के लिए बंद हो गया. फ़ोन अब अच्छे से चल रहा है.\n\nफ़ोन तब बहुत गर्म हो सकता है जब आप:\n • ज़्यादा रिसॉर्स का इस्तेमाल करने वाले ऐप्लिकेशन चलाते हैं (जैसे गेमिंग, वीडियो या नेविगेशन ऐप्लिकेशन)\n • बड़ी फ़ाइलें डाउनलोड या अपलोड करते हैं\n • ज़्यादा तापमान में फ़ोन का इस्तेमाल करते हैं"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"डिवाइस के रखरखाव के तरीके देखें"</string> - <string name="high_temp_title" msgid="2218333576838496100">"फ़ोन गर्म हो रहा है"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"फ़ोन के ठंडा होने तक कुछ सुविधाएं काम नहीं करतीं.\nज़्यादा जानकारी के लिए टैप करें"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"आपका फ़ोन अपने आप ठंडा होने की कोशिश करेगा. आप अब भी अपने फ़ोन का उपयोग कर सकते हैं, लेकिन हो सकता है कि यह धीमी गति से चले.\n\nठंडा हो जाने पर आपका फ़ोन सामान्य रूप से चलेगा."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"डिवाइस के रखरखाव के तरीके देखें"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"डिवाइस को अनप्लग करें"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"आपका डिवाइस चार्जिंग पोर्ट के पास गर्म हो रहा है. अगर डिवाइस चार्जर या यूएसबी ऐक्सेसरी से कनेक्ट है, तो उसे अनप्लग करें. साथ ही, ध्यान रखें कि केबल भी गर्म हो सकती है."</string> @@ -1148,7 +1142,7 @@ <string name="call_from_work_profile_action" msgid="2937701298133010724">"वर्क प्रोफ़ाइल पर स्विच करें"</string> <string name="install_dialer_on_work_profile_action" msgid="2014659711597862506">"वर्क प्रोफ़ाइल वाला फ़ोन ऐप्लिकेशन इंस्टॉल करें"</string> <string name="call_from_work_profile_close" msgid="5830072964434474143">"रद्द करें"</string> - <string name="lock_screen_settings" msgid="6152703934761402399">"लॉक स्क्रीन को कस्टमाइज़ करें"</string> + <string name="lock_screen_settings" msgid="6152703934761402399">"लॉक स्क्रीन को पसंद के मुताबिक बनाएं"</string> <string name="keyguard_unlock_to_customize_ls" msgid="2068542308086253819">"लॉक स्क्रीन को पसंद के मुताबिक बनाने के लिए अनलॉक करें"</string> <string name="wifi_unavailable_dream_overlay_content_description" msgid="2024166212194640100">"वाई-फ़ाई उपलब्ध नहीं है"</string> <string name="camera_blocked_dream_overlay_content_description" msgid="4074759493559418130">"कैमरे का ऐक्सेस नहीं है"</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 66c75c355a82..c9b5d3551702 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Izbornik tipke za uključivanje/isključivanje"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaključani zaslon"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon se isključio zbog vrućine"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefon sad radi normalno.\nDodirnite za više informacija"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon se pregrijao, stoga se isključio kako bi se ohladio Telefon sada radi normalno.\n\nTelefon se može pregrijati ako:\n • upotrebljavate zahtjevne aplikacije (kao što su igre, aplikacije za videozapise ili navigaciju)\n • preuzimate ili prenosite velike datoteke\n • upotrebljavate telefon na visokim temperaturama."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Pročitajte upute za održavanje"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon se zagrijava"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Neke su značajke ograničene dok se telefon ne ohladi.\nDodirnite za više informacija"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon će se automatski pokušati ohladiti. Možete ga nastaviti koristiti, no mogao bi raditi sporije.\n\nKad se ohladi, radit će normalno."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Pročitajte upute za održavanje"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Iskopčajte uređaj"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Vaš se uređaj zagrijava u blizini priključka za punjenje. Ako je priključen u punjač ili USB uređaj, iskopčajte ga. Pazite jer se i kabel možda zagrijao."</string> @@ -943,7 +937,7 @@ <string name="controls_media_settings_button" msgid="5815790345117172504">"Postavke"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="SONG_NAME">%1$s</xliff:g>, <xliff:g id="ARTIST_NAME">%2$s</xliff:g> reproducira se putem aplikacije <xliff:g id="APP_LABEL">%3$s</xliff:g>"</string> <string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> od <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string> - <string name="controls_media_empty_title" msgid="8296102892421573325">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string> + <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> se izvodi"</string> <string name="controls_media_button_play" msgid="2705068099607410633">"Reproduciraj"</string> <string name="controls_media_button_pause" msgid="8614887780950376258">"Pauziraj"</string> <string name="controls_media_button_prev" msgid="8126822360056482970">"Prethodni zapis"</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 7b5c9433d25c..065a1db54435 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB engedélyezése"</string> <string name="learn_more" msgid="4690632085667273811">"Részletek"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Képernyőkép"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock letiltva"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Tartós feloldás letiltva"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"képet küldött"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Képernyőkép mentése..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Képernyőkép mentése a munkaprofilba…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Bekapcsológombhoz tartozó menü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. oldal, összesen: <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lezárási képernyő"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"A meleg miatt kikapcsolt"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefonja most már megfelelően működik.\nKoppintson, ha további információra van szüksége."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefonja túlmelegedett, így kikapcsolt, hogy lehűlhessen. Most már megfelelően működik.\n\nA telefon akkor melegedhet túl, ha Ön:\n • Energiaigényes alkalmazásokat használ (például játékokat, videókat vagy navigációs alkalmazásokat)\n • Nagy fájlokat tölt le vagy fel\n • Melegben használja a telefonját"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Olvassa el a kímélő használat lépéseit"</string> - <string name="high_temp_title" msgid="2218333576838496100">"A telefon melegszik"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Bizonyos funkciók korlátozottan működnek a telefon lehűlése közben.\nKoppintson, ha további információra van szüksége."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"A telefon automatikusan megpróbál lehűlni. Továbbra is tudja használni a telefont, de elképzelhető, hogy működése lelassul.\n\nAmint a telefon lehűl, újra a szokásos módon működik majd."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Olvassa el a kímélő használat lépéseit"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Húzza ki az eszközt"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Eszköze kezd melegedni a töltőport közelében. Ha töltő vagy USB-s kiegészítő van csatlakoztatva hozzá, húzza ki, és legyen óvatos, mert a kábel is meleg lehet."</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 85ad88482bf1..0f72f07f1ac0 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Միացնել USB-ն"</string> <string name="learn_more" msgid="4690632085667273811">"Իմանալ ավելին"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Սքրինշոթ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"«Երկարացնել կողպումը» գործառույթն անջատված է"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"«Հետաձգված ապակողպում» գործառույթն անջատված է"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"պատկեր է ուղարկվել"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Սքրինշոթը պահվում է..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Սքրինշոթը պահվում է աշխատանքային պրոֆիլում…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Սնուցման կոճակի ընտրացանկ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Էջ <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Կողպէկրան"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Հեռախոսն անջատվել էր տաքանալու պատճառով"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Հեռախոսն այժմ նորմալ է աշխատում։\nՀպեք՝ ավելին իմանալու համար։"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Ձեր հեռախոսը չափազանց տաք էր, այդ պատճառով այն անջատվել է՝ հովանալու համար: Հեռախոսն այժմ նորմալ աշխատում է:\n\nՀեռախոսը կարող է տաքանալ, եթե՝\n • Օգտագործում եք ռեսուրսատար հավելվածներ (օրինակ՝ խաղեր, տեսանյութեր կամ նավիգացիայի հավելվածներ)\n • Ներբեռնում կամ վերբեռնում եք ծանր ֆայլեր\n • Օգտագործում եք ձեր հեռախոսը բարձր ջերմային պայմաններում"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Քայլեր գերտաքացման ահազանգի դեպքում"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Հեռախոսը տաքանում է"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Հովանալու ընթացքում հեռախոսի որոշ գործառույթներ սահմանափակ են։\nՀպեք՝ ավելին իմանալու համար։"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ձեր հեռախոսն ավտոմատ կերպով կփորձի hովանալ: Կարող եք շարունակել օգտագործել հեռախոսը, սակայն հնարավոր է, որ այն ավելի դանդաղ աշխատի:\n\nՀովանալուց հետո հեռախոսը կաշխատի կանոնավոր կերպով:"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Քայլեր գերտաքացման ահազանգի դեպքում"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Անջատեք սարքը"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Լիցքավորման միացքի հատվածում սարքը տաքանում է։ Եթե լիցքավորիչի կամ USB լրասարքի է միացված սարքը, անջատեք այն և զգույշ եղեք, քանի որ մալուխը ևս կարող է տաքացած լինել։"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index dd426c76ec32..928fd0b0ced1 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -695,7 +695,7 @@ <string name="switch_bar_off" msgid="5669805115416379556">"Nonaktif"</string> <string name="tile_unavailable" msgid="3095879009136616920">"Tidak tersedia"</string> <string name="accessibility_tile_disabled_by_policy_action_description" msgid="6958422730461646926">"pelajari lebih lanjut"</string> - <string name="nav_bar" msgid="4642708685386136807">"Bilah navigasi"</string> + <string name="nav_bar" msgid="4642708685386136807">"Menu navigasi"</string> <string name="nav_bar_layout" msgid="4716392484772899544">"Tata letak"</string> <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Jenis tombol ekstra kiri"</string> <string name="right_nav_bar_button_type" msgid="4472566498647364715">"Jenis tombol ekstra kanan"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu daya"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> dari <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Layar kunci"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Ponsel dimatikan karena panas"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Ponsel kini berfungsi normal.\nKetuk untuk info selengkapnya"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Ponsel menjadi terlalu panas, jadi dimatikan untuk mendinginkan. Ponsel kini berfungsi normal.\n\nPonsel dapat menjadi terlalu panas jika Anda:\n • Menggunakan aplikasi yang menggunakan sumber daya secara intensif (seperti aplikasi game, video, atau navigasi)\n • Mendownload atau mengupload file besar\n • Menggunakan ponsel dalam suhu tinggi"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Lihat langkah-langkah perawatan"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Ponsel menjadi hangat"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Beberapa fitur dibatasi saat ponsel mendingin.\nKetuk untuk info selengkapnya"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ponsel akan otomatis mencoba mendingin. Anda tetap dapat menggunakan ponsel, tetapi mungkin berjalan lebih lambat.\n\nSetelah dingin, ponsel akan berjalan seperti biasa."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Lihat langkah-langkah perawatan"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Cabut perangkat"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Perangkat menjadi panas saat di dekat port pengisi daya. Jika perangkat terhubung ke pengisi daya atau aksesori USB, cabutlah dan berhati-hatilah karena suhu kabel mungkin juga panas."</string> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 838fd5bdff42..7de8cd11efec 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Virkja USB"</string> <string name="learn_more" msgid="4690632085667273811">"Frekari upplýsingar"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skjámynd"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Slökkt á Extend Unlock"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Slökkt á Lengri opnun"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"sendi mynd"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Vistar skjámynd…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Vistar skjámynd á vinnusnið…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aflrofavalmynd"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Blaðsíða <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lásskjár"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Slökkt var á símanum vegna hita"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Síminn virkar nú eins og venjulega.\nÝttu til að fá frekari upplýsingar"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Síminn varð of heitur og því var slökkt á honum til að kæla hann. Síminn virkar núna sem skyldi.\n\nSíminn getur orðið of heitur ef þú:\n • Notar plássfrek forrit (t.d. leikja-, myndbands- eða leiðsagnarforrit\n • Sækir eða hleður upp stórum skrám\n • Notar símann í miklum hita"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Sjá varúðarskref"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Síminn er að hitna"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Sumir eiginleikar eru takmarkaðir meðan síminn kælir sig.\nÝttu til að fá frekari upplýsingar"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Síminn reynir sjálfkrafa að kæla sig. Þú getur enn notað símann en hann gæti verið hægvirkari.\n\nEftir að síminn hefur kælt sig niður virkar hann eðlilega."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Sjá varúðarskref"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Taktu tækið úr sambandi"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Tækið er að hitna nálægt hleðslutenginu. Ef það er tengt við hleðslutæki eða USB-aukahlut skaltu taka það úr sambandi og hafa í huga að snúran gæti einnig verið heit."</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 9c784b6370a2..b190eff297f7 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Attiva USB"</string> <string name="learn_more" msgid="4690632085667273811">"Scopri di più"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Screenshot"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Funzionalità Extend Unlock disattivata"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Sblocco avanzato disattivato"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"è stata inviata un\'immagine"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvataggio screenshot…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Salvataggio screenshot nel profilo di lavoro…"</string> @@ -249,7 +249,7 @@ <string name="accessibility_quick_settings_rotation" msgid="4800050198392260738">"Rotazione automatica dello schermo"</string> <string name="quick_settings_location_label" msgid="2621868789013389163">"Geolocalizzazione"</string> <string name="quick_settings_screensaver_label" msgid="1495003469366524120">"Salvaschermo"</string> - <string name="quick_settings_camera_label" msgid="5612076679385269339">"Accesso alla fotocamera"</string> + <string name="quick_settings_camera_label" msgid="5612076679385269339">"Accesso alla videocamera"</string> <string name="quick_settings_mic_label" msgid="8392773746295266375">"Accesso al microfono"</string> <string name="quick_settings_camera_mic_available" msgid="1453719768420394314">"Disponibile"</string> <string name="quick_settings_camera_mic_blocked" msgid="4710884905006788281">"Bloccato"</string> @@ -510,14 +510,14 @@ <string name="stream_accessibility" msgid="3873610336741987152">"Accessibilità"</string> <string name="volume_ringer_status_normal" msgid="1339039682222461143">"Attiva suoneria"</string> <string name="volume_ringer_status_vibrate" msgid="6970078708957857825">"Attiva vibrazione"</string> - <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Disattiva suoneria"</string> + <string name="volume_ringer_status_silent" msgid="3691324657849880883">"Silenzia"</string> <string name="volume_stream_content_description_unmute" msgid="7729576371406792977">"%1$s. Tocca per riattivare l\'audio."</string> <string name="volume_stream_content_description_vibrate" msgid="4858111994183089761">"%1$s. Tocca per attivare la vibrazione. L\'audio dei servizi di accessibilità può essere disattivato."</string> <string name="volume_stream_content_description_mute" msgid="4079046784917920984">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="2742330052979397471">"%1$s. Tocca per attivare la vibrazione."</string> <string name="volume_stream_content_description_mute_a11y" msgid="5743548478357238156">"%1$s. Tocca per disattivare l\'audio."</string> <string name="volume_ringer_change" msgid="3574969197796055532">"Tocca per cambiare la modalità della suoneria"</string> - <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"disattiva l\'audio"</string> + <string name="volume_ringer_hint_mute" msgid="4263821214125126614">"silenzia"</string> <string name="volume_ringer_hint_unmute" msgid="6119086890306456976">"riattiva l\'audio"</string> <string name="volume_ringer_hint_vibrate" msgid="6211609047099337509">"vibrazione"</string> <string name="volume_dialog_title" msgid="6502703403483577940">"Controlli del volume %s"</string> @@ -661,7 +661,7 @@ <string name="group_system_access_system_settings" msgid="7961639365383008053">"Accedi alle impostazioni di sistema"</string> <string name="group_system_access_google_assistant" msgid="1186152943161483864">"Accedi all\'Assistente Google"</string> <string name="group_system_lock_screen" msgid="7391191300363416543">"Blocca lo schermo"</string> - <string name="group_system_quick_memo" msgid="2914234890158583919">"Visualizza l\'app Note per rapidi appunti"</string> + <string name="group_system_quick_memo" msgid="2914234890158583919">"Visualizza l\'app Note per appunti rapidi"</string> <string name="keyboard_shortcut_group_system_multitasking" msgid="1065232949510862593">"Multitasking di sistema"</string> <string name="system_multitasking_rhs" msgid="6593269428880305699">"Attiva lo schermo diviso con l\'app corrente a destra"</string> <string name="system_multitasking_lhs" msgid="8839380725557952846">"Attiva lo schermo diviso con l\'app corrente a sinistra"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu del tasto di accensione"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> di <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Schermata di blocco"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Il telefono si è spento perché surriscaldato"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Ora il telefono funziona normalmente.\nTocca per ulteriori informazioni"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Il telefono era surriscaldato e si è spento per raffreddarsi. Ora funziona normalmente.\n\nIl telefono può surriscaldarsi se:\n • Utilizzi app che consumano molte risorse (ad esempio app di navigazione, giochi o video)\n • Scarichi o carichi grandi file\n • Lo utilizzi in presenza di alte temperature"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Leggi le misure da adottare"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Il telefono si sta scaldando"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Alcune funzionalità limitate durante il raffreddamento del telefono.\nTocca per ulteriori informazioni"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Il telefono cercherà automaticamente di raffreddarsi. Puoi comunque usarlo, ma potrebbe essere più lento.\n\nUna volta raffreddato, il telefono funzionerà normalmente."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Leggi le misure da adottare"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Scollega il dispositivo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Il tuo dispositivo si sta scaldando vicino alla porta di ricarica. Se è collegato a un caricabatterie o a un accessorio USB, scollegalo e fai attenzione perché il cavo potrebbe essere caldo."</string> @@ -1074,7 +1068,7 @@ <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Aggiungi riquadro"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Non aggiungerlo"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Seleziona utente"</string> - <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{C\'è # app attiva}many{Ci sono # app attive}other{Ci sono # app attive}}"</string> + <string name="fgs_manager_footer_label" msgid="8276763570622288231">"{count,plural, =1{# app è attiva}many{# di app sono attive}other{# app sono attive}}"</string> <string name="fgs_dot_content_description" msgid="2865071539464777240">"Nuove informazioni"</string> <string name="fgs_manager_dialog_title" msgid="5879184257257718677">"App attive"</string> <string name="fgs_manager_dialog_message" msgid="2670045017200730076">"Queste app sono attive e in esecuzione, anche quando non le utilizzi. Questo migliora la loro funzionalità, ma influisce sulla durata della batteria."</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index c836388950b2..4226d92e58b6 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"הפעלת USB"</string> <string name="learn_more" msgid="4690632085667273811">"מידע נוסף"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"צילום מסך"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"התכונה \'הרחבה של ביטול הנעילה\' מושבתת"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"התכונה Extend Unlock מושבתת"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"נשלחה תמונה"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"המערכת שומרת את צילום המסך..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"צילום המסך נשמר בפרופיל העבודה…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"תפריט הפעלה"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"דף <xliff:g id="ID_1">%1$d</xliff:g> מתוך <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"מסך נעילה"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"הטלפון כבה עקב התחממות"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"הטלפון פועל כרגיל עכשיו.\nיש להקיש כדי להציג מידע נוסף"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"הטלפון שלך התחמם יותר מדי וכבה כדי להתקרר. הטלפון פועל כרגיל עכשיו.\n\nייתכן שהטלפון יתחמם יותר מדי אם:\n • משתמשים באפליקציות עתירות משאבים (כגון משחקים, אפליקציות וידאו או אפליקציות ניווט)\n • מורידים או מעלים קבצים גדולים\n • משתמשים בטלפון בסביבה עם טמפרטורות גבוהות"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"לצפייה בשלבי הטיפול"</string> - <string name="high_temp_title" msgid="2218333576838496100">"הטלפון מתחמם"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"חלק מהתכונות מוגבלות כל עוד הטלפון מתקרר.\nיש להקיש כדי להציג מידע נוסף"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"קירור הטלפון ייעשה באופן אוטומטי. ניתן עדיין להשתמש בטלפון, אבל ייתכן שהוא יפעל לאט יותר.\n\nהטלפון יחזור לפעול כרגיל לאחר שיתקרר."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"לצפייה בשלבי הטיפול"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ניתוק המכשיר"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"המכשיר שלך מתחמם בקרבת יציאת הטעינה. אם המכשיר מחובר למטען או לאביזר בחיבור USB, צריך לנתק אותו בזהירות כיוון שגם הכבל עלול להיות חם."</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index f100299ea367..182dab4cb83a 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB を有効にする"</string> <string name="learn_more" msgid="4690632085667273811">"詳細"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"スクリーンショット"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock は無効です"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ロック解除延長は無効です"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"画像を送信しました"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"スクリーンショットを保存しています..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"スクリーンショットを仕事用プロファイルに保存中…"</string> @@ -654,7 +654,7 @@ <string name="group_system_go_back" msgid="8838454003680364227">"戻る: 前の状態に戻る([戻る] ボタン)"</string> <string name="group_system_access_home_screen" msgid="1857344316928441909">"ホーム画面にアクセス"</string> <string name="group_system_overview_open_apps" msgid="6897128761003265350">"開いているアプリの概要"</string> - <string name="group_system_cycle_forward" msgid="9202444850838205990">"最近使ったアプリを切り替え(進)"</string> + <string name="group_system_cycle_forward" msgid="9202444850838205990">"最近使ったアプリを切り替え(進む)"</string> <string name="group_system_cycle_back" msgid="5163464503638229131">"最近使ったアプリを切り替え(戻る)"</string> <string name="group_system_access_all_apps_search" msgid="488070738028991753">"すべてのアプリの一覧にアクセスして検索(検索 / ランチャー)"</string> <string name="group_system_hide_reshow_taskbar" msgid="3809304065624351131">"タスクバーを非表示 /(再)表示"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源ボタン メニュー"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ページ <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ロック画面"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"高熱で電源が OFF になりました"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"お使いのスマートフォンは現在、正常に動作しています。\nタップして詳細を表示"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"スマートフォンが熱すぎたため電源が OFF になりました。現在は正常に動作しています。\n\nスマートフォンは以下の場合に熱くなる場合があります。\n • リソースを集中的に使用する機能やアプリ(ゲームアプリ、動画アプリ、ナビアプリなど)を使用\n • サイズの大きいファイルをダウンロードまたはアップロード\n • 高温の場所で使用"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"取り扱いに関する手順をご覧ください"</string> - <string name="high_temp_title" msgid="2218333576838496100">"スマートフォンの温度が上昇中"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"スマートフォンのクールダウン中は一部の機能が制限されます。\nタップして詳細を表示"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"スマートフォンは自動的にクールダウンを行います。その間もスマートフォンを使用できますが、動作が遅くなる可能性があります。\n\nクールダウンが完了すると、通常どおり動作します。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"取り扱いに関する手順をご覧ください"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"デバイスを電源から外します"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"充電ポートの近くにデバイスを置くと、本体が熱くなります。デバイスが充電器や USB アクセサリに接続されている場合は外してください。ケーブルが熱くなっていることもあるので注意してください。"</string> @@ -943,7 +937,7 @@ <string name="controls_media_settings_button" msgid="5815790345117172504">"設定"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="SONG_NAME">%1$s</xliff:g>(アーティスト名: <xliff:g id="ARTIST_NAME">%2$s</xliff:g>)が <xliff:g id="APP_LABEL">%3$s</xliff:g> で再生中"</string> <string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g>/<xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string> - <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> を実行しています"</string> + <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> を実行中"</string> <string name="controls_media_button_play" msgid="2705068099607410633">"再生"</string> <string name="controls_media_button_pause" msgid="8614887780950376258">"一時停止"</string> <string name="controls_media_button_prev" msgid="8126822360056482970">"前のトラック"</string> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 8ed9c431eaf9..7caf1703cdb4 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB-ის ჩართვა"</string> <string name="learn_more" msgid="4690632085667273811">"შეიტყვეთ მეტი"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ეკრანის ანაბეჭდი"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"გაფართოებული განბლოკვა გაითიშა"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ხანგრძლივი განბლოკვა გაითიშა"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"გაიგზავნა სურათი"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ეკრანის სურათის შენახვა…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"მიმდინარეობს ეკრანის ანაბეჭდის შენახვა სამუშაო პროფილში…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ჩართვის მენიუ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"გვერდი <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>-დან"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ჩაკეტილი ეკრანი"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ტელეფონი გამოირთო გაცხელების გამო"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"თქვენი ტელეფონი უკვე ნორმალურად მუშაობს.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"თქვენი ტელეფონი გამოირთო გასაგრილებლად, რადგან ის მეტისმეტად გაცხელდა. ახლა ის ჩვეულებრივად მუშაობს.\n\nტელეფონის გაცხელების მიზეზებია:\n • რესურსტევადი აპების გამოყენება (მაგ. სათამაშო, ვიდეო ან ნავიგაციის აპების)\n • დიდი ფაილების ჩამოტვირთვა ან ატვირთვა\n • ტელეფონის გამოყენება მაღალი ტემპერატურისას"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"მისაღები ზომების გაცნობა"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ტელეფონი ცხელდება"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ზოგიერთი ფუნქცია შეზღუდული იქნება, სანამ ტელეფონი გაგრილდება.\nშეეხეთ დამატებითი ინფორმაციის მისაღებად"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"თქვენი ტელეფონი გაგრილებას ავტომატურად შეეცდება. შეგიძლიათ გააგრძელოთ მისით სარგებლობა, თუმცა ტელეფონმა შეიძლება უფრო ნელა იმუშაოს.\n\nგაგრილების შემდგომ ის ჩვეულებრივად იმუშავებს."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"მისაღები ზომების გაცნობა"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"გამოაერᲗეᲗ Თქვენი მოწყობილობა"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"თქვენი მოწყობილობა ხურდება დამტენის პორტთან ახლოს. თუ ის დაკავშირებულია დამტენთან ან USB აქსესუართან, გამორთეთ იგი და იზრუნეთ, რადგან შესაძლოა კაბელიც გახურებული იყოს."</string> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index b131ceb38317..8f60d73c3964 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -301,8 +301,8 @@ <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> <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> дейін"</string> - <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Ұйқы уақытында"</string> - <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Ұйқы уақыты аяқталғанға дейін"</string> + <string name="quick_settings_dark_mode_secondary_label_on_at_bedtime" msgid="2274300599408864897">"Ұйқы режимінде"</string> + <string name="quick_settings_dark_mode_secondary_label_until_bedtime_ends" msgid="1790772410777123685">"Ұйқы режимі аяқталғанға дейін"</string> <string name="quick_settings_nfc_label" msgid="1054317416221168085">"NFC"</string> <string name="quick_settings_nfc_off" msgid="3465000058515424663">"NFC өшірулі"</string> <string name="quick_settings_nfc_on" msgid="1004976611203202230">"NFC қосулы"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Қуат мәзірі"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ішінен <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Құлыптаулы экран"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Телефон қызып кеткендіктен өшірілді"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Телефоныңыз қалыпты жұмыс істеп тұр.\nТолығырақ ақпарат алу үшін түртіңіз."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Телефоныңыз қатты қызып кеткендіктен өшірілді. Телефоныңыз қазір қалыпты жұмыс істеп тұр.\n\nТелефоныңыз мына жағдайларда ыстық болуы мүмкін:\n • Ресурстар талап ететін қолданбаларды пайдалану (ойын, бейне немесе навигация қолданбалары)\n • Үлкен көлемді файлдарды жүктеу немесе жүктеп салу\n • Телефонды жоғары температурада пайдалану"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Пайдалану нұсқаулығын қараңыз"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Телефон қызуда"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Телефон толық суығанға дейін, кейбір функциялардың жұмысы шектеледі.\nТолығырақ ақпарат үшін түртіңіз."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефон автоматты түрде суи бастайды. Оны пайдалана бере аласыз, бірақ ол баяуырақ жұмыс істеуі мүмкін.\n\nТелефон суығаннан кейін, оның жұмысы қалпына келеді."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Пайдалану нұсқаулығын қараңыз"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Құрылғыны ажыратыңыз"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Құрылғының зарядтау ұяшығы тұрған бөлігі қызып келеді. Зарядтағышқа немесе USB құрылғысына жалғанған болса, оны ажыратыңыз. Абайлаңыз, кабель де ыстық болуы мүмкін."</string> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 02a05e93cf57..097fc17a4557 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"បើក USB"</string> <string name="learn_more" msgid="4690632085667273811">"ស្វែងយល់បន្ថែម"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"រូបថតអេក្រង់"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"បានបិទការដោះសោបន្ថែម"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"បានបិទ Extend Unlock"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"បានផ្ញើរូបភាព"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"កំពុងរក្សាទុករូបថតអេក្រង់..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"កំពុងរក្សាទុករូបថតអេក្រង់ទៅកម្រងព័ត៌មានការងារ…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ម៉ឺនុយថាមពល"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ទំព័រ <xliff:g id="ID_1">%1$d</xliff:g> នៃ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"អេក្រង់ចាក់សោ"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ទូរសព្ទបានបិទដោយសារវាឡើងកម្តៅ"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"ឥឡូវនេះ ទូរសព្ទរបស់អ្នកកំពុងដំណើរការជាធម្មតា។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ទូរសព្ទរបស់អ្នកក្តៅពេក ដូច្នេះវាបានបិទដើម្បីបន្ថយកម្តៅ។ ឥឡូវនេះ ទូរសព្ទរបស់អ្នកកំពុងដំណើរការធម្មតា។\n\nទូរសព្ទរបស់អ្នកអាចនឹងឡើងកម្តៅខ្លាំងជ្រុល ប្រសិនបើអ្នក៖\n • ប្រើប្រាស់កម្មវិធីដែលប្រើប្រាស់ទិន្នន័យច្រើនក្នុងរយៈពេលខ្លី (ដូចជាហ្គេម វីដេអូ ឬកម្មវិធីរុករក)\n • ទាញយក ឬបង្ហោះឯកសារដែលមានទំហំធំ\n • ប្រើប្រាស់ទូរសព្ទរបស់អ្នកនៅកន្លែងមានសីតុណ្ហភាពខ្ពស់"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"មើលជំហានថែទាំ"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ទូរសព្ទនេះកំពុងកើនកម្តៅ"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"មុខងារមួយចំនួននឹងមិនអាចប្រើបានពេញលេញនោះទេ ខណៈពេលដែលទូរសព្ទកំពុងបញ្ចុះកម្ដៅ។\nសូមចុចដើម្បីទទួលបានព័ត៌មានបន្ថែម"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"ទូរសព្ទរបស់អ្នកនឹងព្យាយាមបញ្ចុះកម្តៅដោយស្វ័យប្រវត្តិ។ អ្នកនៅតែអាចប្រើទូរសព្ទរបស់អ្នកបានដដែល ប៉ុន្តែវានឹងដំណើរការយឺតជាងមុន។\n\nបន្ទាប់ពីទូរសព្ទរបស់អ្នកត្រជាក់ជាងមុនហើយ វានឹងដំណើរការដូចធម្មតា។"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"មើលជំហានថែទាំ"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ដកឧបករណ៍របស់អ្នក"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ឧបករណ៍របស់អ្នកកំពុងឡើងកម្ដៅនៅជិតរន្ធសាកថ្ម។ ប្រសិនបើឧបករណ៍នេះត្រូវបានភ្ជាប់ទៅឆ្នាំងសាក ឬគ្រឿងបរិក្ខារ USB សូមដកវា និងមានការប្រុងប្រយ័ត្ន ដោយសារខ្សែក៏អាចក្ដៅផងដែរ។"</string> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 6d3a9883373a..6c82ddfe4c5a 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -225,7 +225,7 @@ <string name="data_usage_disabled_dialog_mobile_title" msgid="2286843518689837719">"ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="data_usage_disabled_dialog_title" msgid="9131615296036724838">"ಡೇಟಾ ವಿರಾಮಗೊಳಿಸಲಾಗಿದೆ"</string> <string name="data_usage_disabled_dialog" msgid="7933201635215099780">"ಡೇಟಾ ಬಳಕೆಯು ನೀವು ಹೊಂದಿಸಿರುವ ಮಿತಿಯನ್ನು ತಲುಪಿದೆ. ಹೀಗಾಗಿ ನೀವು ಈಗ ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸುತ್ತಿಲ್ಲ.\n\nನೀವು ಮುಂದುವರಿದರೆ, ಡೇಟಾ ಬಳಕೆಗೆ ಶುಲ್ಕ ತೆರಬೇಕಾಗಬಹುದು."</string> - <string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"ಮುಂದುವರಿಸು"</string> + <string name="data_usage_disabled_dialog_enable" msgid="2796648546086408937">"ಮುಂದುವರಿಸಿ"</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> @@ -490,7 +490,7 @@ <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_exposes_personal_data" msgid="8189852022981524789">"ವೈಯಕ್ತಿಕ ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು (ಉದಾ, ಸಂಪರ್ಕಗಳು ಮತ್ತು ಇಮೇಲ್ ವಿಷಯ)."</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> @@ -637,7 +637,7 @@ <string name="keyboard_shortcut_group_system_home" msgid="7465138628692109907">"ಮುಖಪುಟ"</string> <string name="keyboard_shortcut_group_system_recents" msgid="8628108256824616927">"ಇತ್ತೀಚಿನವುಗಳು"</string> <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_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_clear_text" msgid="4679927133259287577">"ಪಠ್ಯ ತೆರವುಗೊಳಿಸಿ"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ಪವರ್ ಮೆನು"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="ID_1">%1$d</xliff:g> ಪುಟ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ಲಾಕ್ ಪರದೆ"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ಫೋನ್ ಬಿಸಿಯಾಗಿದ್ದರಿಂದ ಆಫ್ ಆಗಿದೆ"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"ನಿಮ್ಮ ಫೋನ್ ಈಗ ಎಂದಿನಂತೆ ರನ್ ಆಗುತ್ತಿದೆ.\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ನಿಮ್ಮ ಫೋನ್ ತುಂಬಾ ಬಿಸಿಯಾಗಿತ್ತು, ತಣ್ಣಗಾಗಲು ಅದು ತಾನಾಗಿ ಆಫ್ ಆಗಿದೆ. ಈಗ ನಿಮ್ಮ ಫೋನ್ ಎಂದಿನಂತೆ ಕೆಲಸ ಮಾಡುತ್ತಿದೆ.\n\nನಿಮ್ಮ ಫೋನ್ ಬಿಸಿಯಾಗಲು ಕಾರಣಗಳು:\n • ಹೆಚ್ಚು ಸಂಪನ್ಮೂಲ ಉಪಯೋಗಿಸುವ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಬಳಕೆ (ಉದಾ, ಗೇಮಿಂಗ್, ವೀಡಿಯೊ/ನ್ಯಾವಿಗೇಶನ್ ಅಪ್ಲಿಕೇಶನ್ಗಳು)\n • ದೊಡ್ಡ ಫೈಲ್ಗಳ ಡೌನ್ಲೋಡ್ ಅಥವಾ ಅಪ್ಲೋಡ್\n • ಅಧಿಕ ಉಷ್ಣಾಂಶದಲ್ಲಿ ಫೋನಿನ ಬಳಕೆ"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"ಕಾಳಜಿಯ ಹಂತಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ಫೋನ್ ಬಿಸಿಯಾಗುತ್ತಿದೆ"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ಫೋನ್ ತಣ್ಣಗಾಗುವವರೆಗೂ ಕೆಲವು ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸೀಮಿತಗೊಳಿಸಲಾಗುತ್ತದೆ\nಇನ್ನಷ್ಟು ಮಾಹಿತಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"ನಿಮ್ಮ ಫೋನ್ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ತಣ್ಣಗಾಗಲು ಪ್ರಯತ್ನಿಸುತ್ತದೆ. ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ನೀವು ಈಗಲೂ ಬಳಸಬಹುದಾಗಿರುತ್ತದೆ, ಆದರೆ ಇದು ನಿಧಾನವಾಗಿರಬಹುದು.\n\nಒಮ್ಮೆ ನಿಮ್ಮ ಫೋನ್ ತಣ್ಣಗಾದ ನಂತರ ಇದು ಸಾಮಾನ್ಯ ರೀತಿಯಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ಕಾಳಜಿಯ ಹಂತಗಳನ್ನು ವೀಕ್ಷಿಸಿ"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ಅನ್ಪ್ಲಗ್ ಮಾಡಿ"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ಚಾರ್ಜಿಂಗ್ ಪೋರ್ಟ್ ಸಮೀಪದಲ್ಲಿ ನಿಮ್ಮ ಸಾಧನವು ಬಿಸಿಯಾಗುತ್ತಿದೆ. ಅದನ್ನು ಚಾರ್ಜರ್ ಅಥವಾ USB ಪರಿಕರಕ್ಕೆ ಕನೆಕ್ಟ್ ಮಾಡಿದ್ದರೆ, ಅದನ್ನು ಅನ್ಪ್ಲಗ್ ಮಾಡಿ ಹಾಗೂ ಕೇಬಲ್ ಕೂಡ ಬಿಸಿಯಾಗಿರಬಹುದು ಆದ್ದರಿಂದ ಎಚ್ಚರಿಕೆ ವಹಿಸಿ."</string> @@ -1032,7 +1026,7 @@ <string name="game_status" msgid="1340694320630973259">"ಪ್ಲೇ ಮಾಡಲಾಗುತ್ತಿದೆ"</string> <string name="empty_user_name" msgid="3389155775773578300">"ಸ್ನೇಹಿತರು"</string> <string name="empty_status" msgid="5938893404951307749">"ರಾತ್ರಿ ಚಾಟ್ ಮಾಡೋಣ!"</string> - <string name="status_before_loading" msgid="1500477307859631381">"ವಿಷಯ ಶೀಘ್ರದಲ್ಲೇ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ"</string> + <string name="status_before_loading" msgid="1500477307859631381">"ಕಂಟೆಂಟ್ ಶೀಘ್ರದಲ್ಲೇ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ"</string> <string name="missed_call" msgid="4228016077700161689">"ಮಿಸ್ಡ್ ಕಾಲ್"</string> <string name="messages_count_overflow_indicator" msgid="7850934067082006043">"<xliff:g id="NUMBER">%d</xliff:g>+"</string> <string name="people_tile_description" msgid="8154966188085545556">"ಇತ್ತೀಚಿನ ಸಂದೇಶಗಳು, ಮಿಸ್ಡ್ ಕಾಲ್ಗಳು ಮತ್ತು ಸ್ಥಿತಿ ಅಪ್ಡೇಟ್ಗಳು"</string> @@ -1116,7 +1110,7 @@ <string name="bt_le_audio_broadcast_dialog_unknown_name" msgid="3791472237793443044">"ಅಪರಿಚಿತ"</string> <string name="dream_time_complication_12_hr_time_format" msgid="4691197486690291529">"h:mm"</string> <string name="dream_time_complication_24_hr_time_format" msgid="6248280719733640813">"kk:mm"</string> - <string name="log_access_confirmation_title" msgid="4843557604739943395">"ಎಲ್ಲಾ ಸಾಧನದ ಲಾಗ್ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ಗೆ ಅನುಮತಿಸುವುದೇ?"</string> + <string name="log_access_confirmation_title" msgid="4843557604739943395">"ಎಲ್ಲಾ ಸಾಧನದ ಲಾಗ್ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಲು <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> ಗೆ ಅನುಮತಿಸಬೇಕೆ?"</string> <string name="log_access_confirmation_allow" msgid="752147861593202968">"ಒಂದು ಬಾರಿಯ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ"</string> <string name="log_access_confirmation_deny" msgid="2389461495803585795">"ಅನುಮತಿಸಬೇಡಿ"</string> <string name="log_access_confirmation_body" msgid="6883031912003112634">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿನ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಸಾಧನದ ಲಾಗ್ಗಳು ರೆಕಾರ್ಡ್ ಮಾಡುತ್ತವೆ. ಸಮಸ್ಯೆಗಳನ್ನು ಪತ್ತೆಹಚ್ಚಲು ಮತ್ತು ಪರಿಹರಿಸಲು ಆ್ಯಪ್ಗಳು ಈ ಲಾಗ್ ಅನ್ನು ಬಳಸಬಹುದು.\n\nಕೆಲವು ಲಾಗ್ಗಳು ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರಬಹುದು, ಆದ್ದರಿಂದ ನಿಮ್ಮ ವಿಶ್ವಾಸಾರ್ಹ ಆ್ಯಪ್ಗಳಿಗೆ ಮಾತ್ರ ಸಾಧನದ ಎಲ್ಲಾ ಲಾಗ್ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸಿ. \n\nಎಲ್ಲಾ ಸಾಧನ ಲಾಗ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಈ ಆ್ಯಪ್ಗೆ ಅನುಮತಿಸದಿದ್ದರೆ, ಅದು ಆಗಲೂ ತನ್ನದೇ ಆದ ಲಾಗ್ಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು. ನಿಮ್ಮ ಸಾಧನ ತಯಾರಕರಿಗೆ ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿನ ಕೆಲವು ಲಾಗ್ಗಳು ಅಥವಾ ಮಾಹಿತಿಯನ್ನು ಪ್ರವೇಶಿಸಲು ಈಗಲೂ ಸಾಧ್ಯವಾಗುತ್ತದೆ."</string> diff --git a/packages/SystemUI/res/values-kn/strings_tv.xml b/packages/SystemUI/res/values-kn/strings_tv.xml index cfcc89642948..f1087aafd6c2 100644 --- a/packages/SystemUI/res/values-kn/strings_tv.xml +++ b/packages/SystemUI/res/values-kn/strings_tv.xml @@ -22,7 +22,7 @@ <string name="notification_vpn_connected" msgid="3891023882833274730">"VPN ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="notification_vpn_disconnected" msgid="7150747626448044843">"VPN ಕನೆಕ್ಷನ್ ಕಡಿತಗೊಂಡಿದೆ"</string> <string name="notification_disclosure_vpn_text" msgid="3873532735584866236">"<xliff:g id="VPN_APP">%1$s</xliff:g> ಮೂಲಕ"</string> - <string name="tv_notification_panel_title" msgid="5311050946506276154">"ಅಧಿಸೂಚನೆಗಳು"</string> + <string name="tv_notification_panel_title" msgid="5311050946506276154">"ನೋಟಿಫಿಕೇಶನ್ಗಳು"</string> <string name="tv_notification_panel_no_notifications" msgid="9115191912267270678">"ಯಾವುದೇ ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"</string> <string name="mic_recording_announcement" msgid="7587123608060316575">"ಮೈಕ್ರೊಫೋನ್ ರೆಕಾರ್ಡಿಂಗ್ ಆಗುತ್ತಿದೆ"</string> <string name="camera_recording_announcement" msgid="7240177719403759112">"ಕ್ಯಾಮರಾ ರೆಕಾರ್ಡಿಂಗ್ ಆಗುತ್ತಿದೆ"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 373f84e0b402..db9ffcf12cd5 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB 사용"</string> <string name="learn_more" msgid="4690632085667273811">"자세히 알아보기"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"스크린샷"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"잠금 해제 연장 사용 중지됨"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"잠금 해제 유지 사용 중지됨"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"이미지 보냄"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"캡쳐화면 저장 중..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"직장 프로필에 스크린샷 저장 중…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"전원 메뉴"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>페이지 중 <xliff:g id="ID_1">%1$d</xliff:g>페이지"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"잠금 화면"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"발열로 인해 휴대전화 전원이 종료됨"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"이제 휴대전화가 정상적으로 작동합니다.\n자세히 알아보려면 탭하세요."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"휴대전화가 과열되어 온도를 낮추기 위해 전원이 종료되었습니다. 지금은 휴대전화가 정상적으로 실행 중입니다.\n\n휴대전화가 과열되는 이유는 다음과 같습니다.\n • 리소스를 많이 사용하는 앱 사용(예: 게임, 동영상 또는 내비게이션 앱)\n • 대용량 파일을 다운로드 또는 업로드\n • 온도가 높은 곳에서 휴대폰 사용"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"해결 방법 확인하기"</string> - <string name="high_temp_title" msgid="2218333576838496100">"휴대전화 온도가 높음"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"휴대전화 온도를 낮추는 동안 일부 기능이 제한됩니다.\n자세히 알아보려면 탭하세요."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"휴대전화 온도를 자동으로 낮추려고 시도합니다. 휴대전화를 계속 사용할 수는 있지만 작동이 느려질 수도 있습니다.\n\n휴대전화 온도가 낮아지면 정상적으로 작동됩니다."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"해결 방법 확인하기"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"기기 분리하기"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"기기의 충전 포트 주변 온도가 상승하고 있습니다. 충전기나 USB 액세서리가 연결된 상태라면 분리하세요. 이때 케이블도 뜨거울 수 있으므로 주의하시기 바랍니다."</string> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 6d7632df310c..63ac78958b57 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB’ни иштетүү"</string> <string name="learn_more" msgid="4690632085667273811">"Кененирээк"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"\"Кулпуну ачуу\" функциясы өчүрүлдү"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Кулпуланбаган режим өчүрүлдү"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"сүрөт жөнөттү"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Скриншот сакталууда..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Скриншот жумуш профилине сакталууда…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Кубат баскычынын менюсу"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ичинен <xliff:g id="ID_1">%1$d</xliff:g>-бет"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Кулпуланган экран"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Телефон ысыгандыктан өчүрүлдү"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Телефонуңуз кадимкидей иштеп жатат.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Телефонуңуз өтө ысып кеткендиктен, аны муздатуу үчүн өчүрүлдү. Эми телефонуңуз кадимкидей иштеп жатат.\n\nТелефонуңуз төмөнкү шарттарда ысып кетиши мүмкүн:\n • Ашыкча ресурс короткон колдонмолорду (оюндар, видео же чабыттоо колдонмолору) пайдалансаңыз \n • Ири көлөмдөгү файлдарды жүктөп алсаңыз же берсеңиз\n • Телефонуңузду жогорку температураларда пайдалансаңыз"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Тейлөө кадамдарын көрүңүз"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Телефонуңуз ысып баратат"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Телефон сууганча айрым элементтердин иши чектелген.\nКеңири маалымат алуу үчүн таптап коюңуз"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефонуңуз автоматтык түрдө сууйт. Аны колдоно берсеңиз болот, бирок ал жайыраак иштеп калат.\n\nТелефонуңуз суугандан кийин адаттагыдай эле иштеп баштайт."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Тейлөө кадамдарын көрүңүз"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Түзмөктү сууруп коюңуз"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Түзмөгүңүздүн кубаттоо порту жылып баратат. Эгер түзмөгүңүз кубаттагычка же USB кабелине туташып турса, аны сууруп коюңуз. Абайлаңыз, кабель да жылуу болушу мүмкүн."</string> @@ -896,7 +890,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# көзөмөл кошулду.}other{# көзөмөл кошулду.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Өчүрүлдү"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"<xliff:g id="APPNAME">%s</xliff:g> кошулсунбу?"</string> - <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> бул жерде көрсөтүлө турган башкаруу элементтерин жана контентти тандай алат."</string> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> бул жерде көрүнө турган нерселерди тандайт."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"<xliff:g id="APPNAME">%s</xliff:g> башкаруу элементтери өчүрүлсүнбү?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Сүйүктүүлөргө кошулду"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Сүйүктүүлөргө <xliff:g id="NUMBER">%d</xliff:g>-позицияга кошулду"</string> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 1ea2b5f2e3e9..e2d90d9fa981 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"ເປີດໃຊ້ USB"</string> <string name="learn_more" msgid="4690632085667273811">"ສຶກສາເພີ່ມເຕີມ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ພາບໜ້າຈໍ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ຂະຫຍາຍການປົດລັອກຖືກປິດການນຳໃຊ້ແລ້ວ"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ຄຸນສົມບັດການປົດລັອກດົນຂຶ້ນຖືກປິດການນຳໃຊ້ແລ້ວ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ສົ່ງຮູບແລ້ວ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ກຳລັງບັນທຶກພາບໜ້າຈໍ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ກຳລັງບັນທຶກຮູບໜ້າຈໍໃສ່ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ເມນູເປີດປິດ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ໜ້າຈໍລັອກ"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ປິດໂທລະສັບເນື່ອງຈາກຮ້ອນເກີນໄປ"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"ໂທລະສັບຂອງທ່ານຕອນນີ້ເຮັດວຽກປົກກະຕິແລ້ວ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ໂທລະສັບຂອງທ່ານຮ້ອນເກີນໄປ, ດັ່ງນັ້ນມັນຈຶ່ງຖືກປິດໄວ້ເພື່ອໃຫ້ເຢັນກ່ອນ. ໂທລະສັບຂອງທ່ານຕອນນີ້ເຮັດວຽກປົກກະຕິແລ້ວ.\n\nໂທລະສັບຂອງທ່ານອາດຮ້ອນຫາກວ່າທ່ານ:\n • ໃຊ້ແອັບທີ່ກິນຊັບພະຍາກອນຫຼາຍ (ເຊັ່ນ: ເກມ, ວິດີໂອ ຫຼື ແອັບການນຳທາງ)\n • ດາວໂຫລດ ຫຼື ອັບໂຫລດຮູບພາບຂະໜາດໃຫຍ່\n • ໃຊ້ໂທລະສັບຂອງທ່ານໃນບ່ອນທີ່ມີອຸນຫະພູມສູງ"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"ເບິ່ງຂັ້ນຕອນການເບິ່ງແຍງ"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ໂທລະສັບກຳລັງຮ້ອນຂຶ້ນ"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ຄຸນສົມບັດບາງຢ່າງຖືກຈຳກັດໄວ້ໃນເວລາຫຼຸດອຸນຫະພູມຂອງໂທລະສັບ.\nແຕະເພື່ອເບິ່ງຂໍ້ມູນເພີ່ມເຕີມ"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"ໂທລະສັບຂອງທ່ານຈະພະຍາຍາມລົດອຸນຫະພູມລົງ. ທ່ານຍັງຄົງສາມາດໃຊ້ໂທລະສັບຂອງທ່ານໄດ້ຢູ່, ແຕ່ມັນຈະເຮັດວຽກຊ້າລົງ.\n\nເມື່ອໂທລະສັບຂອງທ່ານບໍ່ຮ້ອນຫຼາຍແລ້ວ, ມັນຈະກັບມາເຮັດວຽກຕາມປົກກະຕິ."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ເບິ່ງຂັ້ນຕອນການເບິ່ງແຍງ"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ຖອດອຸປະກອນຂອງທ່ານອອກ"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ອຸປະກອນຂອງທ່ານຈະອຸ່ນຂຶ້ນເມື່ອຢູ່ໃກ້ຊ່ອງສາກໄຟ. ຫາກມັນເຊື່ອມຕໍ່ຫາສາຍສາກ ຫຼື ອຸປະກອນເສີມ USB ໃດໜຶ່ງຢູ່, ໃຫ້ຖອດມັນອອກ ແລະ ລະວັງເນື່ອງຈາກສາຍກໍອາດຈະອຸ່ນເຊັ່ນກັນ."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index c0526f395fdb..a338e09f12ca 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Įjungimo meniu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g> psl. iš <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Užrakinimo ekranas"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefonas išjungt., nes įkaito"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefonas dabar veikia normaliai.\nPalietę gausite daugiau informacijos"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefonas per daug įkaito, todėl buvo išj., kad atvėstų. Dabar telefonas veikia įprastai.\n\nTelefonas gali per daug įkaisti, jei:\n • esate įjungę daug išteklių naudoj. progr. (pvz., žaidimų, vaizdo įr. arba navig. progr.);\n • atsis. arba įkeliate didelius failus;\n • telefoną naudojate aukštoje temper."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Žr. priežiūros veiksmus"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefonas kaista"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Kai kurios funkcijos gali neveikti, kol telefonas vėsta.\nPalietę gausite daugiau informacijos"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonas automatiškai bandys atvėsti. Telefoną vis tiek galėsite naudoti, tačiau jis gali veikti lėčiau.\n\nKai telefonas atvės, jis veiks įprastai."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Žr. priežiūros veiksmus"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Atjunkite įrenginį"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Įrenginys kaista šalia įkrovimo prievado. Jei jis prijungtas prie kroviklio ar USB priedo, atjunkite jį ir patikrinkite, nes laidas taip pat gali būti įkaitęs."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 2022d7ffee3b..053e984694eb 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Barošanas izvēlne"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. lpp. no <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Bloķēšanas ekrāns"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Tālrunis izslēgts karstuma dēļ"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Tagad jūsu tālrunis darbojas normāli.\nPieskarieties, lai uzzinātu vairāk."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Jūsu tālrunis bija pārkarsis un tika izslēgts. Tagad tas darbojas normāli.\n\nTālrunis var sakarst, ja:\n • tiek izmantotas lietotnes, kas patērē daudz enerģijas (piem., spēles, video lietotnes vai navigācija);\n • tiek lejupielādēti/augšupielādēti lieli faili;\n • tālrunis tiek lietots augstā temperatūrā."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Skatīt apkopes norādījumus"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Tālrunis kļūst silts"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Dažas funkcijas ir ierobežotas, kamēr notiek tālruņa atdzišana.\nPieskarieties, lai uzzinātu vairāk."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Jūsu tālrunis automātiski mēģinās atdzist. Jūs joprojām varat izmantot tālruni, taču tas, iespējams, darbosies lēnāk.\n\nTiklīdz tālrunis būs atdzisis, tas darbosies normāli."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Skatīt apkopes norādījumus"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Atvienojiet savu ierīci"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Jūsu ierīce uzkarst, atrodoties uzlādes pieslēgvietas tuvumā. Ja ierīce ir pievienota lādētājam vai USB piederumam, uzmanīgi atvienojiet to, jo arī vads var būt uzkarsis."</string> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 13fd1904ee20..68fade419ea0 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -291,13 +291,13 @@ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Предупредување: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Работни апликации"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Ноќно светло"</string> - <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Вклуч. на зајдисонце"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"На зајдисонце"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"До изгрејсонце"</string> <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_on_at_sunset" msgid="6017379738102015710">"Вклуч. на зајдисонце"</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> <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"До <xliff:g id="TIME">%s</xliff:g>"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Мени на копчето за вклучување"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Страница <xliff:g id="ID_1">%1$d</xliff:g> од <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заклучен екран"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Телефонот се исклучи поради загреаност"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Сега телефонот работи нормално.\nДопрете за повеќе информации"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Телефонот беше премногу загреан, така што се исклучи за да се олади. Сега работи нормално.\n\nТелефонот може премногу да се загрее ако:\n • користите апликации што работат со многу ресурси (како што се, на пример, апликациите за видеа, навигација или игри)\n • преземате или поставувате големи датотеки\n •го користите телефонот на високи температури"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Прикажи ги чекорите за грижа за уредот"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Телефонот се загрева"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Некои функции се ограничени додека телефонот се лади.\nДопрете за повеќе информации"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефонот автоматски ќе се обиде да се олади. Вие сепак ќе може да го користите, но тој може да работи побавно.\n\nОткако ќе се олади, ќе работи нормално."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Прикажи ги чекорите за грижа за уредот"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Исклучете го уредот од кабел"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Вашиот уред се загрева во близина на портата за полнење. Ако е поврзан со полнач или USB-додаток, исклучете го од него и внимавајте бидејќи кабелот може да е топол."</string> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index ec1d42cfb9d3..39b456f9eb48 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB പ്രവർത്തനക്ഷമമാക്കുക"</string> <string name="learn_more" msgid="4690632085667273811">"കൂടുതലറിയുക"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"സ്ക്രീൻഷോട്ട്"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock പ്രവർത്തനരഹിതമാക്കി"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"എക്സ്റ്റൻഡ് അൺലോക്ക് പ്രവർത്തനരഹിതമാക്കി"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ചിത്രം അയച്ചു"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ഔദ്യോഗിക പ്രൊഫൈലിലേക്ക് സ്ക്രീൻഷോട്ട് സംരക്ഷിക്കുന്നു…"</string> @@ -291,7 +291,7 @@ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> മുന്നറിയിപ്പ്"</string> <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"ഔദ്യോഗിക ആപ്പുകൾ"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"നൈറ്റ് ലൈറ്റ്"</string> - <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"സൂര്യാസ്തമയത്തിന്"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"അസ്തമയത്തിന്"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"സൂര്യോദയം വരെ"</string> <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> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"പവർ മെനു"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"പേജ് <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ലോക്ക് സ്ക്രീൻ"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ചൂട് കൂടിയതിനാൽ ഫോൺ ഓഫാക്കി"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"നിങ്ങളുടെ ഫോൺ ഇപ്പോൾ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കുന്നു.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ഫോൺ ചൂടായിരിക്കുന്നതിനാൽ തണുക്കാൻ ഓഫാക്കിയിരിക്കുന്നു. ഫോൺ ഇപ്പോൾ സാധാരണഗതിയിൽ പ്രവർത്തിക്കുന്നു.\n\nഫോണിന് ചൂട് കൂടാൻ കാരണം:\n • ഗെയിമിംഗ്, വീഡിയോ അല്ലെങ്കിൽ നാവിഗേഷൻ തുടങ്ങിയ റിസോഴ്സ്-ഇന്റൻസീവായ ആപ്പുകൾ ഉപയോഗിക്കുന്നത്\n • വലിയ ഫയലുകൾ അപ്ലോഡോ ഡൗൺലോഡോ ചെയ്യുന്നത്\n • ഉയർന്ന താപനിലയിൽ ഫോൺ ഉപയോഗിക്കുന്നത്"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"പരിപാലന നിർദ്ദേശങ്ങൾ കാണുക"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ഫോൺ ചൂടായിക്കൊണ്ടിരിക്കുന്നു"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ഫോൺ തണുത്തുകൊണ്ടിരിക്കുമ്പോൾ ചില ഫീച്ചറുകൾ പരിമിതപ്പെടുത്തപ്പെടും.\nകൂടുതൽ വിവരങ്ങൾക്ക് ടാപ്പ് ചെയ്യുക"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"നിങ്ങളുടെ ഫോൺ സ്വയമേവ തണുക്കാൻ ശ്രമിക്കും. നിങ്ങൾക്ക് അപ്പോഴും ഫോൺ ഉപയോഗിക്കാമെങ്കിലും പ്രവർത്തനം മന്ദഗതിയിലായിരിക്കും.\n\nതണുത്തുകഴിഞ്ഞാൽ, ഫോൺ സാധാരണ ഗതിയിൽ പ്രവർത്തിക്കും."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"പരിപാലന നിർദ്ദേശങ്ങൾ കാണുക"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ഉപകരണം അൺപ്ലഗ് ചെയ്യുക"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ചാർജിംഗ് പോർട്ടിന് സമീപം നിങ്ങളുടെ ഉപകരണം ചൂടാകുന്നുണ്ട്. ഇത് ചാർജറിലേക്കോ USB ആക്സസറിയിലേക്കോ കണക്റ്റ് ചെയ്തിട്ടുണ്ടെങ്കിൽ അൺപ്ലഗ് ചെയ്യുക, കേബിളും ചൂടായിരിക്കാമെന്നതിനാൽ ശ്രദ്ധിക്കണം."</string> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index c81542ad1063..927dbdf6137b 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB-г идэвхжүүлэх"</string> <string name="learn_more" msgid="4690632085667273811">"Нэмэлт мэдээлэл авах"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Дэлгэцийн зураг дарах"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock-г идэвхгүй болгосон"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Түгжээгүй байлгахыг идэвхгүй болгосон"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"зураг илгээсэн"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Дэлгэцийн агшинг хадгалж байна…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Дэлгэцийн агшныг ажлын профайлд хадгалж байна…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Асаах/унтраах цэс"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>-н <xliff:g id="ID_1">%1$d</xliff:g>-р хуудас"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Түгжээтэй дэлгэц"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Халснаас үүдэн утас унтарсан"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Таны утас одоо хэвийн ажиллаж байна.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Таны утас хэт халсан тул хөргөхөөр унтраасан болно. Таны утас одоо хэвийн ажиллаж байна.\n\nХэрэв та дараахыг хийвэл таны утас хэт халж болзошгүй:\n • Их хэмжээний нөөц хэрэглээний апп (тоглоом, видео эсвэл шилжилтийн апп зэрэг)\n • Багтаамж ихтэй файл татах, байршуулах\n • Утсаа өндөр температурт ашиглах"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Хянамж болгоомжийн алхмыг харах"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Утас халж эхэлж байна"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Утсыг хөрөх үед зарим онцлогийг хязгаарлана.\nДэлгэрэнгүй мэдээлэл авах бол товшино уу"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Таны утас автоматаар хөрөх болно. Та утсаа ашиглаж болох хэдий ч удаан ажиллаж болзошгүй.\n\nТаны утас хөрсний дараагаар хэвийн ажиллана."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Хянамж болгоомжийн алхмыг харах"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Төхөөрөмжөө салгана уу"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Таны төхөөрөмж цэнэглэх портын ойролцоо халж байна. Хэрэв төхөөрөмжийг цэнэглэгч эсвэл USB дагалдах хэрэгсэлд холбосон бол төхөөрөмжийг салгаж, кабель нь халуун байж болзошгүй тул болгоомжтой байгаарай."</string> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index ace116c08f23..e54bcfc67c10 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पॉवर मेनू"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> पैकी <xliff:g id="ID_1">%1$d</xliff:g> पेज"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"लॉक स्क्रीन"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"तापल्यामुळे फोन बंद झाला"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"तुमचा फोन आता नेहमीप्रमाणे काम करत आहे.\nअधिक माहितीसाठी टॅप करा"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तुमचा फोन खूप तापलाय, म्हणून तो थंड होण्यासाठी बंद झाला आहे. तुमचा फोन आता व्यवस्थित सुरू आहे.\n\nतुम्ही असे केल्यास तुमचा फोन खूप तापेल:\n •संसाधन केंद्रित अॅप वापरणे (गेमिंग, व्हिडिओ किंवा नेव्हिगेशन अॅप यासारखे)\n •मोठ्या फाइल डाउनलोड किंवा अपलोड करणे\n •उच्च तापमानामध्ये तुमचा फोन वापरणे"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"काय काळजी घ्यावी ते पहा"</string> - <string name="high_temp_title" msgid="2218333576838496100">"फोन ऊष्ण होत आहे"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"फोन थंड होईपर्यंत काही वैशिष्ट्ये मर्यादित केली.\nअधिक माहितीसाठी टॅप करा"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"तुमचा फोन स्वयंचलितपणे थंड होईल. तुम्ही अद्यापही तुमचा फोन वापरू शकता परंतु तो कदाचित धीमेपणे कार्य करेल.\n\nतुमचा फोन एकदा थंड झाला की, तो सामान्यपणे कार्य करेल."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"काय काळजी घ्यावी ते पहा"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"तुमचे डिव्हाइस अनप्लग करा"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"तुमचे डिव्हाइस हे चार्जिंग पोर्टच्या जवळ गरम होत आहे. हे चार्जर किंवा USB अॅक्सेसरी यांच्याशी कनेक्ट केलेले असल्यास, ते अनप्लग करा आणि काळजी घ्या कारण केबलदेखील गरम असू शकते."</string> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 9153f1f5a884..18d3d042c351 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Dayakan USB"</string> <string name="learn_more" msgid="4690632085667273811">"Ketahui lebih lanjut"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Tangkapan skrin"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Lanjutkan Buka Kunci dilumpuhkan"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Buka Kunci Berterusan dilumpuhkan"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"menghantar imej"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Menyimpan tangkapan skrin..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Menyimpan tangkapan skrin ke profil kerja…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu kuasa"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> daripada <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Kunci skrin"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon dimatikan kerana panas"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefon anda kini berjalan seperti biasa.\nKetik untuk mendapatkan maklumat lanjut"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon anda terlalu panas, jadi telefon itu telah dimatikan untuk menyejuk. Sekarang, telefon anda berjalan seperti biasa.\n\nTelefon anda mungkin menjadi terlalu panas jika anda:\n • Menggunakan apl intensif sumber (seperti permainan, video atau apl navigasi)\n • Memuat turun atau memuat naik fail besar\n • Menggunakan telefon anda dalam suhu tinggi"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Lihat langkah penjagaan"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon semakin panas"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Sesetengah ciri adalah terhad semasa telefon menyejuk.\nKetik untuk mendapatkan maklumat lanjut"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon anda akan cuba menyejuk secara automatik. Anda masih dapat menggunakan telefon itu tetapi telefon tersebut mungkin berjalan lebih perlahan.\n\nSetelah telefon anda sejuk, telefon itu akan berjalan seperti biasa."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Lihat langkah penjagaan"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Cabut palam peranti anda"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Peranti anda menjadi panas berdekatan port pengecasan. Jika peranti anda disambungkan ke pengecas atau aksesori USB, cabut palam peranti dan berhati-hati kerana kabel juga mungkin panas."</string> @@ -896,7 +890,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# kawalan ditambah.}other{# kawalan ditambah.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Dialih keluar"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Tambahkan <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g>boleh memilih kawalan dan kandungan yang dipaparkan di sini."</string> + <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> boleh memilih kawalan dan kandungan yang dipaparkan di sini."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Alih keluar kawalan untuk <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Digemari"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Digemari, kedudukan <xliff:g id="NUMBER">%d</xliff:g>"</string> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 729ff60df5e5..44053dd327c6 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ကို ဖွင့်ရန်"</string> <string name="learn_more" msgid="4690632085667273811">"ပိုမိုလေ့လာရန်"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ဖန်သားပြင်ဓာတ်ပုံ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"‘တိုးချဲ့ဖွင့်ခြင်း’ ပိတ်ထားသည်"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"‘လော့ခ်ဖွင့်ချိန်တိုးခြင်း’ ပိတ်ထားသည်"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ပုံပို့ထားသည်"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ဖန်သားပြင်ဓါတ်ပုံရိုက်ခြင်းအား သိမ်းဆည်းပါမည်"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"အလုပ်ပရိုဖိုင်တွင် ဖန်သားပြင်ဓာတ်ပုံ သိမ်းနေသည်…"</string> @@ -99,7 +99,7 @@ <string name="screenrecord_title" msgid="4257171601439507792">"ဖန်သားပြင်ရိုက်ကူးစက်"</string> <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"စကရင်ရိုက်ကူးမှု အပြီးသတ်နေသည်"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"ဖန်သားပြင် ရိုက်ကူးသည့် စက်ရှင်အတွက် ဆက်တိုက်လာနေသော အကြောင်းကြားချက်"</string> - <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"စတင် ရိုက်သံဖမ်းမလား။"</string> + <string name="screenrecord_permission_dialog_title" msgid="303380743267672953">"ရိုက်သံဖမ်းခြင်း စတင်မလား။"</string> <string name="screenrecord_permission_dialog_warning_entire_screen" msgid="4152602778470789965">"ရုပ်သံဖမ်းနေစဉ် Android သည် သင့်ဖန်သားပြင်တွင် မြင်နိုင်သည့် (သို့) သင့်စက်တွင် ဖွင့်ထားသည့် အရာအားလုံးကို တွေ့နိုင်သည်။ စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။"</string> <string name="screenrecord_permission_dialog_warning_single_app" msgid="6818309727772146138">"အက်ပ်တစ်ခုကို ရုပ်သံဖမ်းနေစဉ် Android သည် ယင်းအက်ပ်တွင် ပြထားသည့် (သို့) ဖွင့်ထားသည့် အရာအားလုံးကို တွေ့နိုင်သည်။ ထို့ကြောင့် စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။"</string> <string name="screenrecord_permission_dialog_continue" msgid="5811122652514424967">"ရုပ်သံ စဖမ်းရန်"</string> @@ -134,7 +134,7 @@ <string name="accessibility_scanning_face" msgid="3093828357921541387">"မျက်နှာ စကင်ဖတ်နေသည်"</string> <string name="accessibility_send_smart_reply" msgid="8885032190442015141">"ပို့ရန်"</string> <string name="cancel" msgid="1089011503403416730">"မလုပ်တော့"</string> - <string name="biometric_dialog_confirm" msgid="2005978443007344895">"အတည်ပြုပါ"</string> + <string name="biometric_dialog_confirm" msgid="2005978443007344895">"အတည်ပြုရန်"</string> <string name="biometric_dialog_try_again" msgid="8575345628117768844">"ထပ်စမ်းကြည့်ရန်"</string> <string name="biometric_dialog_empty_space_description" msgid="3330555462071453396">"အထောက်အထားစိစစ်ခြင်းကို ပယ်ဖျက်ရန် တို့ပါ"</string> <string name="biometric_dialog_face_icon_description_idle" msgid="4351777022315116816">"ထပ်စမ်းကြည့်ပါ"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ပါဝါမီနူး"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"စာမျက်နှာ <xliff:g id="ID_2">%2$d</xliff:g> အနက်မှ စာမျက်နှာ <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"လော့ခ်ချထားချိန် မျက်နှာပြင်"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"အပူရှိန်ကြောင့်ဖုန်းပိတ်ထားသည်"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"သင့်ဖုန်းသည် ယခု ပုံမှန်အလုပ်လုပ်နေပါပြီ။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"သင့်ဖုန်းအလွန်ပူနေသည့်အတွက် အေးသွားစေရန် ပိတ်ထားပါသည်။ ယခုပုံမှန် အလုပ်လုပ်ပါပြီ။\n\nအောက်ပါတို့ကိုသုံးလျှင် ပူလာပါမည်-\n • အရင်းအမြစ်များသောအက်ပ်ကို သုံးခြင်း (ဥပမာ ဂိမ်းကစားခြင်း၊ ဗီဒီယိုကြည့်ခြင်း (သို့) လမ်းညွှန်အက်ပ်)\n • ကြီးမားသောဖိုင်များ ဒေါင်းလုဒ် (သို့) အပ်လုဒ်လုပ်ခြင်း\n • အပူရှိန်မြင့်သောနေရာတွင် သုံးခြင်း"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"ဂရုပြုစရာ အဆင့်များ ကြည့်ရန်"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ဖုန်း ပူနွေးလာပါပြီ"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ဖုန်းကို အေးအောင်ပြုလုပ်နေစဉ်တွင် အချို့ဝန်ဆောင်မှုများကို ကန့်သတ်ထားပါသည်။\nနောက်ထပ်အချက်အလက်များအတွက် တို့ပါ"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"သင့်ဖုန်းသည် အလိုအလျောက် ပြန်အေးသွားပါလိမ့်မည်။ ဖုန်းကို အသုံးပြုနိုင်ပါသေးသည် သို့သော် ပိုနှေးနိုင်ပါသည်။\n\nသင့်ဖုန်း အေးသွားသည်နှင့် ပုံမှန်အတိုင်း ပြန်အလုပ်လုပ်ပါလိမ့်မည်။"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ဂရုပြုစရာ အဆင့်များ ကြည့်ရန်"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"သင့်စက်ကို ပလတ်ဖြုတ်ပါ"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"သင့်စက်သည် အားသွင်းပို့တ်အနီးတွင် ပူနွေးလာသည်။ ၎င်းကို အားသွင်းကိရိယာ (သို့) USB ဆက်စပ်ပစ္စည်းနှင့် ချိတ်ဆက်ထားပါက ပလတ်ဖြုတ်ပါ။ ကြိုးကလည်း ပူနွေးနေနိုင်သဖြင့် ဂရုပြုပါ။"</string> @@ -943,7 +937,7 @@ <string name="controls_media_settings_button" msgid="5815790345117172504">"ဆက်တင်များ"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="ARTIST_NAME">%2$s</xliff:g> ၏ <xliff:g id="SONG_NAME">%1$s</xliff:g> ကို <xliff:g id="APP_LABEL">%3$s</xliff:g> တွင် ဖွင့်ထားသည်"</string> <string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="TOTAL_TIME">%2$s</xliff:g> အနက် <xliff:g id="ELAPSED_TIME">%1$s</xliff:g>"</string> - <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> ပွင့်နေပါသည်"</string> + <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> လုပ်ဆောင်နေသည်"</string> <string name="controls_media_button_play" msgid="2705068099607410633">"ဖွင့်ရန်"</string> <string name="controls_media_button_pause" msgid="8614887780950376258">"ခဏရပ်ရန်"</string> <string name="controls_media_button_prev" msgid="8126822360056482970">"ယခင် တစ်ပုဒ်"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index e5e90724f1c4..682b4a0f2364 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Slå på USB"</string> <string name="learn_more" msgid="4690632085667273811">"Finn ut mer"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skjermdump"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock er slått av"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Hold ulåst er slått av"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"har sendt et bilde"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Lagrer skjermdumpen …"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Lagrer skjermdumpen i jobbprofilen …"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Av/på-meny"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Side <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Låseskjerm"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon ble slått av pga varme"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefonen kjører nå som normalt.\nTrykk for å se mer informasjon"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefonen din var for varm, så den ble slått av for å kjøles ned. Telefonen din kjører nå som normalt.\n\nTelefonen kan blir for varm hvis du:\n • bruker ressurskrevende apper (for eksempel spill-, video- eller navigeringsapper)\n • laster store filer opp eller ned\n • bruker telefonen ved høy temperatur"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Se vedlikeholdstrinnene"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefonen begynner å bli varm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Enkelte funksjoner er begrenset mens telefonen kjøles ned.\nTrykk for å se mer informasjon"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonen din kommer til å prøve å kjøle seg ned automatisk. Du kan fremdeles bruke telefonen, men den kjører muligens saktere.\n\nTelefonen kommer til å kjøre som normalt, når den har kjølt seg ned."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Se vedlikeholdstrinnene"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Koble fra enheten"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Enheten begynner å bli varm nær ladeporten. Hvis den er koblet til en lader eller et USB-tilbehør, må du koble den fra. Vær forsiktig da kabelen også kan være varm."</string> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index f21d9c2d9f7f..117e69342353 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB सक्षम पार्नुहोस्"</string> <string name="learn_more" msgid="4690632085667273811">"थप जान्नुहोस्"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"स्क्रिनसट"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock अफ गरिएको छ"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"एक्स्टेन्ड अनलक अफ गरिएको छ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"कुनै छवि पठाइयो"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"स्क्रिनसट बचत गर्दै…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"कार्य प्रोफाइलमा स्क्रिनसट सेभ गरिँदै छ…"</string> @@ -291,13 +291,13 @@ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"<xliff:g id="DATA_LIMIT">%s</xliff:g> चेतावनी दिँदै"</string> <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"कामसम्बन्धी एपहरू"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Night Light"</string> - <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"सूर्यास्तमा सक्रिय"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"सर्यास्त हुँदा अन हुन्छ"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"सूर्योदयसम्म"</string> <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_on_at_sunset" msgid="6017379738102015710">"सूर्यास्तमा सक्रिय"</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> <string name="quick_settings_dark_mode_secondary_label_until" msgid="2289774641256492437">"<xliff:g id="TIME">%s</xliff:g> सम्म"</string> @@ -387,7 +387,7 @@ <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"हो, जारी राख्नुहोस्"</string> <string name="guest_notification_app_name" msgid="2110425506754205509">"अतिथि मोड"</string> <string name="guest_notification_session_active" msgid="5567273684713471450">"तपाईं अतिथि मोड चलाउँदै हुनुहुन्छ"</string> - <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"तपाईंले नयाँ प्रयोगकर्ता थप्नुभयो भने तपाईं अतिथि मोडबाट बाहिरिनु हुने छ र हालको अतिथि सत्रका सबै एप तथा डेटा मेटिने छ।"</string> + <string name="user_add_user_message_guest_remove" msgid="5589286604543355007">\n\n"तपाईंले नयाँ प्रयोगकर्ता हाल्नुभयो भने तपाईं अतिथि मोडबाट बाहिरिनु हुने छ र हालको अतिथि सत्रका सबै एप तथा डेटा मेटिने छ।"</string> <string name="user_limit_reached_title" msgid="2429229448830346057">"प्रयोगकर्ताको सीमा पुग्यो"</string> <string name="user_limit_reached_message" msgid="1070703858915935796">"{count,plural, =1{एउटा प्रोफाइल मात्र बनाउन सकिन्छ।}other{तपाईं बढीमा # जना प्रयोगकर्ता सामेल गराउन सक्नुहुन्छ।}}"</string> <string name="user_remove_user_title" msgid="9124124694835811874">"प्रयोगकर्ता हटाउन चाहनुहुन्छ?"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"पावर मेनु"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> मध्ये पृष्ठ <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"लक स्क्रिन"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"फोन अति नै तातिएकाले चिसिन बन्द भयो"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"तपाईंको फोन अहिले सामान्य रूपमा चलिरहेको छ।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"तपाईंको फोन अति नै तातिएकाले चिसिन बन्द भयो। तपाईंको फोन अब सामान्य ढंगले चल्दै छ।\n\nतपाईंले निम्न कुराहरू गर्नुभयो भने तपाईंको फोन अत्यन्त तातो हुनसक्छ:\n • धेरै संसाधन खपत गर्ने एपहरूको प्रयोग (जस्तै गेमिङ, भिडियो वा नेभिगेसन एपहरू)\n • ठूला फाइलहरूको डाउनलोड वा अपलोड\n • उच्च तापक्रममा फोनको प्रयोग"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"डिभाइसको हेरचाह गर्ने तरिका हेर्नुहोस्"</string> - <string name="high_temp_title" msgid="2218333576838496100">"फोन तातो भइरहेको छ"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"फोन नचिस्सिँदासम्म केही सुविधाहरू उपलब्ध हुने छैनन्।\nथप जानकारीका लागि ट्याप गर्नुहोस्"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"तपाईंको फोन स्वतः चिसो हुने प्रयास गर्ने छ। तपाईं अझै पनि आफ्नो फोनको प्रयोग गर्न सक्नुहुन्छ तर त्यो अझ ढिलो चल्न सक्छ।\n\nचिसो भएपछि तपाईंको फोन सामान्य गतिमा चल्नेछ।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"डिभाइसको हेरचाह गर्ने तरिका हेर्नुहोस्"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"डिभाइस बिजुलीको स्रोतबाट निकाल्नुहोस्"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"तपाईंको डिभाइसको चार्जिङ पोर्टतिरको भाग तातीरहेको छ। तपाईंको डिभाइस चार्जर वा USB एक्सेसरीमा जोडिएको गरिएको छ भने त्यसलाई निकाल्नुहोस्। यसका साथै सो केबल तातो हुन सक्ने भएकाले ख्याल गर्नुहोला।"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 5e66b1c27b74..70c746ccc36f 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Aan/uit-menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Vergrendelscherm"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefoon uitgezet wegens hitte"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Je telefoon functioneert nu weer zoals gebruikelijk.\nTik voor meer informatie"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Je telefoon was te warm en is uitgezet om af te koelen. Je telefoon presteert nu weer zoals gebruikelijk.\n\nJe telefoon kan warm worden als je:\n • bronintensieve apps gebruikt (zoals game-, video-, of navigatie-apps),\n • grote bestanden up- of downloadt,\n • je telefoon gebruikt bij hoge temperaturen."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Onderhoudsstappen bekijken"</string> - <string name="high_temp_title" msgid="2218333576838496100">"De telefoon wordt warm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Bepaalde functies zijn beperkt terwijl de telefoon afkoelt.\nTik voor meer informatie"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Je telefoon probeert automatisch af te koelen. Je kunt je telefoon nog steeds gebruiken, maar deze kan langzamer werken.\n\nZodra de telefoon is afgekoeld, werkt deze weer normaal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Onderhoudsstappen bekijken"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Je apparaat loskoppelen"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Je apparaat wordt warm in de buurt van de oplaadpoort. Als het apparaat is aangesloten op een oplader of USB-poort, koppel je het los. Wees voorzichtig: de kabel kan warm zijn."</string> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 95d16e0dce41..192aee7518bc 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ସକ୍ଷମ କରନ୍ତୁ"</string> <string name="learn_more" msgid="4690632085667273811">"ଅଧିକ ଜାଣନ୍ତୁ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ସ୍କ୍ରିନ୍ସଟ୍ ନିଅନ୍ତୁ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlockକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ଏକ୍ସଟେଣ୍ଡ ଅନଲକକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ଏକ ଛବି ପଠାଯାଇଛି"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ୱାର୍କ ପ୍ରୋଫାଇଲରେ ସ୍କ୍ରିନସଟ ସେଭ କରାଯାଉଛି…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ପାୱାର ମେନୁ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"ପୃଷ୍ଠା <xliff:g id="ID_1">%1$d</xliff:g> ମୋଟ <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"ଲକ ସ୍କ୍ରିନ"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ଗରମ ହେତୁ ଫୋନ୍ ଅଫ୍ କରିଦିଆଗଲା"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"ଆପଣଙ୍କ ଫୋନ୍ ବର୍ତ୍ତମାନ ସାମାନ୍ୟ ରୂପେ ଚାଲୁଛି।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ଆପଣଙ୍କ ଫୋନ୍ ବହୁତ ଗରମ ଥିଲା, ତେଣୁ ଏହାକୁ ଥଣ୍ଡା କରାଯିବାକୁ ଅଫ୍ କରିଦିଆଗଲା। ଆପଣଙ୍କ ଫୋନ୍ ବର୍ତ୍ତମାନ ସାମାନ୍ୟ ଅବସ୍ଥାରେ ଚାଲୁଛି।\n\nଆପଣଙ୍କ ଫୋନ୍ ଅଧିକ ଗରମ ହୋଇଯାଇପାରେ ଯଦି ଆପଣ:\n • ରିସୋର୍ସ-ଇଣ୍ଟେନସିଭ୍ ଆପ୍ (ଯେପରିକି ଗେମିଙ୍ଗ, ଭିଡିଓ, କିମ୍ବା ନେଭିଗେସନ୍ ଆପ୍) ବ୍ୟବହାର କରନ୍ତି\n • ବଡ ଫାଇଲ୍ ଡାଉନଲୋଡ କିମ୍ବା ଅପଲୋଡ୍ କରନ୍ତି\n • ଅଧିକ ତାପମାତ୍ରାରେ ଆପଣଙ୍କ ଫୋନ୍ ବ୍ୟବହାର କରନ୍ତି"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"ଯତ୍ନ ନେବା ପାଇଁ ଷ୍ଟେପଗୁଡ଼ିକ ଦେଖନ୍ତୁ"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ଫୋନ୍ ଗରମ ହୋଇଯାଉଛି"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ଫୋନ୍ ଥଣ୍ଡା ହେବା ସମୟରେ କିଛି ଫିଚର୍ ଠିକ ଭାବେ କାମ କରିନଥାଏ।\nଅଧିକ ସୂଚନା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"ଆପଣଙ୍କ ଫୋନ୍ ସ୍ୱଚାଳିତ ଭାବେ ଥଣ୍ଡା ହେବାକୁ ଚେଷ୍ଟା କରିବ। ଆପଣ ତଥାପି ନିଜ ଫୋନ୍ ବ୍ୟବହାର କରିପାରିବେ, କିନ୍ତୁ ଏହା ଧୀରେ ଚାଲିପାରେ।\n\nଆପଣଙ୍କ ଫୋନ୍ ଥଣ୍ଡା ହୋଇଯିବାପରେ, ଏହା ସାମାନ୍ୟ ଭାବେ ଚାଲିବ।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ଯତ୍ନ ନେବା ପାଇଁ ଷ୍ଟେପଗୁଡ଼ିକ ଦେଖନ୍ତୁ"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ଆପଣଙ୍କ ଡିଭାଇସକୁ ଅନପ୍ଲଗ କରନ୍ତୁ"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ଚାର୍ଜିଂ ପୋର୍ଟ ନିକଟରେ ଆପଣଙ୍କ ଡିଭାଇସ ଗରମ ହୋଇଯାଉଛି। ଯଦି ଏହା ଏକ ଚାର୍ଜର କିମ୍ବା USB ଆକସେସୋରୀ ସହ କନେକ୍ଟ କରାଯାଇଥାଏ ତେବେ ଏହାକୁ ଅନପ୍ଲଗ କରନ୍ତୁ ଏବଂ ଧ୍ୟାନ ରଖନ୍ତୁ କାରଣ କେବୁଲ ମଧ୍ୟ ଗରମ ହୋଇପାରେ।"</string> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 858ed8614b09..4f1960a32eb6 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB ਚਾਲੂ ਕਰੋ"</string> <string name="learn_more" msgid="4690632085667273811">"ਹੋਰ ਜਾਣੋ"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ਐਕਸਟੈਂਡ ਅਣਲਾਕ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ਚਿੱਤਰ ਭੇਜਿਆ ਗਿਆ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਸੁਰੱਖਿਅਤ ਕਰ ਰਿਹਾ ਹੈ…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"ਸਕ੍ਰੀਨਸ਼ਾਟ ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ \'ਤੇ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"ਪਾਵਰ ਮੀਨੂ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> ਦਾ <xliff:g id="ID_1">%1$d</xliff:g> ਪੰਨਾ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">" ਲਾਕ ਸਕ੍ਰੀਨ"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"ਗਰਮ ਹੋਣ ਕਾਰਨ ਫ਼ੋਨ ਬੰਦ ਹੋ ਗਿਆ"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\nਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">\n"ਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਸੀ, ਇਸ ਲਈ ਇਹ ਠੰਡਾ ਹੋਣ ਵਾਸਤੇ ਬੰਦ ਹੋ ਗਿਆ ਸੀ। ਤੁਹਾਡਾ ਫ਼ੋਨ ਹੁਣ ਸਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।\n\nਤੁਹਾਡਾ ਫ਼ੋਨ ਬਹੁਤ ਗਰਮ ਹੋ ਸਕਦਾ ਹੈ ਜੇ:\n • ਤੁਸੀਂ ਸਰੋਤਾਂ ਦੀ ਵੱਧ ਵਰਤੋਂ ਵਾਲੀਆਂ ਐਪਾਂ (ਜਿਵੇਂ ਗੇਮਿੰਗ, ਵੀਡੀਓ, ਜਾਂ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ ਐਪਾਂ) ਵਰਤਦੇ ਹੋ • ਵੱਡੀਆਂ ਫ਼ਾਈਲਾਂ ਡਾਊਨਲੋਡ ਜਾਂ ਅੱਪਲੋਡ ਕਰਦੇ ਹੋ\n • ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਉੱਚ ਤਾਪਮਾਨਾਂ ਵਿੱਚ ਵਰਤਦੇ ਹੋ"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"ਦੇਖਭਾਲ ਦੇ ਪੜਾਅ ਦੇਖੋ"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ਫ਼ੋਨ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ਫ਼ੋਨ ਦੇ ਠੰਡਾ ਹੋਣ ਦੇ ਦੌਰਾਨ ਕੁਝ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸੀਮਤ ਹੁੰਦੀਆਂ ਹਨ।\nਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ ਟੈਪ ਕਰੋ"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਵੈਚਲਿਤ ਰੂਪ ਵਿੱਚ ਠੰਡਾ ਹੋਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੇਗਾ। ਤੁਸੀਂ ਹਾਲੇ ਵੀ ਆਪਣੇ ਫ਼ੋਨ ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ, ਪਰੰਤੂ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਹ ਵਧੇਰੇ ਹੌਲੀ ਚੱਲੇ।\n\nਇੱਕ ਵਾਰ ਠੰਡਾ ਹੋਣ ਤੋਂ ਬਾਅਦ ਤੁਹਾਡਾ ਫ਼ੋਨ ਸਧਾਰਨ ਤੌਰ \'ਤੇ ਚੱਲੇਗਾ।"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ਦੇਖਭਾਲ ਦੇ ਪੜਾਅ ਦੇਖੋ"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ਆਪਣਾ ਡੀਵਾਈਸ ਅਣਪਲੱਗ ਕਰੋ"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਚਾਰਜਿੰਗ ਪੋਰਟ ਦੇ ਨੇੜੇ ਗਰਮ ਹੋ ਰਿਹਾ ਹੈ। ਜੇ ਇਹ ਕਿਸੇ ਚਾਰਜਰ ਜਾਂ USB ਐਕਸੈਸਰੀ ਨਾਲ ਕਨੈਕਟ ਹੈ, ਤਾਂ ਇਸਨੂੰ ਅਣਪਲੱਗ ਕਰੋ ਅਤੇ ਸਾਵਧਾਨ ਰਹੋ, ਕਿਉਂਕਿ ਕੇਬਲ ਵੀ ਗਰਮ ਹੋ ਸਕਦੀ ਹੈ।"</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 101f05b5dd22..a98616cdd349 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Włącz USB"</string> <string name="learn_more" msgid="4690632085667273811">"Więcej informacji"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Zrzut ekranu"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Wyłączono Extend Unlock"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Wyłączono rozszerzone odblokowanie"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"wysłano obraz"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Zapisywanie zrzutu ekranu..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Zapisuję zrzut ekranu w profilu służbowym…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu zasilania"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Strona <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekran blokady"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon wyłączony: przegrzanie"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefon działa teraz normalnie\nKliknij, by dowiedzieć się więcej"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon był zbyt gorący i wyłączył się, by obniżyć temperaturę. Urządzenie działa teraz normalnie.\n\nTelefon może się przegrzać, gdy:\n • Używasz aplikacji zużywających dużo zasobów (np. gier, nawigacji czy odtwarzaczy filmów)\n • Pobierasz lub przesyłasz duże pliki\n • Używasz telefonu w wysokiej temperaturze"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Zobacz instrukcję postępowania"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon się nagrzewa"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Podczas obniżania temperatury telefonu niektóre funkcje są ograniczone\nKliknij, by dowiedzieć się więcej"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon automatycznie podejmie próbę obniżenia temperatury. Możesz go wciąż używać, ale telefon może działać wolniej.\n\nGdy temperatura się obniży, telefon będzie działał normalnie."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Zobacz instrukcję postępowania"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Odłącz urządzenie"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Urządzenie za bardzo się nagrzewa w okolicy gniazda ładowania. Jeśli jest podłączone do ładowarki albo akcesorium USB, odłącz je. Uważaj, bo kabel również może być nagrzany."</string> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 579a9bdfdf8c..601b7057abd9 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Ativar USB"</string> <string name="learn_more" msgid="4690632085667273811">"Saiba mais"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capturar tela"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock desativado"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desbloqueio extra desativado"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou uma imagem"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvando captura de tela..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Salvando captura de tela no perfil de trabalho…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu liga/desliga"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Tela de bloqueio"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"O smartphone foi desligado devido ao aquecimento"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"O smartphone está funcionando normalmente agora.\nToque para saber mais"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"O smartphone estava muito quente e foi desligado para resfriar. Agora, ele está sendo executado normalmente.\n\nO smartphone pode ficar quente demais se você:\n • usar apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • fizer o download ou upload de arquivos grandes;\n • usar o smartphone em temperaturas altas."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Ver etapas de cuidado"</string> - <string name="high_temp_title" msgid="2218333576838496100">"O smartphone está esquentando"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Alguns recursos ficam limitados enquanto o smartphone é resfriado.\nToque para saber mais"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver etapas de cuidado"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desconecte seu dispositivo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Seu dispositivo está ficando quente perto da porta de carregamento. Desconecte qualquer carregador ou acessório USB que esteja conectado, mas tome cuidado, porque o cabo também pode estar quente."</string> @@ -896,7 +890,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Adicionar o app <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> pode escolher quais controles e conteúdos aparecem aqui."</string> + <string name="controls_panel_authorization" msgid="7045551688535104194">"O app <xliff:g id="APPNAME">%s</xliff:g> pode escolher quais controles e conteúdos aparecem aqui."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remover controles do app <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado como favorito"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionado como favorito (posição <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -1117,7 +1111,7 @@ <string name="dream_time_complication_12_hr_time_format" msgid="4691197486690291529">"h:mm"</string> <string name="dream_time_complication_24_hr_time_format" msgid="6248280719733640813">"kk:mm"</string> <string name="log_access_confirmation_title" msgid="4843557604739943395">"Permitir que o app <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> acesse todos os registros do dispositivo?"</string> - <string name="log_access_confirmation_allow" msgid="752147861593202968">"Permitir o acesso único"</string> + <string name="log_access_confirmation_allow" msgid="752147861593202968">"Permitir acesso único"</string> <string name="log_access_confirmation_deny" msgid="2389461495803585795">"Não permitir"</string> <string name="log_access_confirmation_body" msgid="6883031912003112634">"Os registros do dispositivo gravam o que acontece nele. Os apps podem usar esses registros para encontrar e corrigir problemas.\n\nAlguns registros podem conter informações sensíveis, então autorize o acesso a eles apenas para os apps em que você confia. \n\nSe você não permitir que esse app acesse todos os registros do dispositivo, ele ainda vai poder acessar os dele. O fabricante do dispositivo também pode ter acesso a alguns registros ou informações."</string> <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Saiba mais"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index aca644fa3f85..c9e41766a2f0 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -39,9 +39,9 @@ <string name="usb_audio_device_prompt_warn" msgid="2504972133361130335">"Esta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB. A utilização da app <xliff:g id="APPLICATION">%1$s</xliff:g> neste dispositivo pode impedir a audição de chamadas, notificações e alarmes."</string> <string name="usb_audio_device_prompt" msgid="7944987408206252949">"A utilização da app <xliff:g id="APPLICATION">%1$s</xliff:g> neste dispositivo pode impedir a audição de chamadas, notificações e alarmes."</string> <string name="usb_accessory_permission_prompt" msgid="717963550388312123">"Permitir que a app <xliff:g id="APPLICATION">%1$s</xliff:g> aceda ao acessório <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string> - <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"Pretende abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string> - <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"Pretende abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nEsta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB."</string> - <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"Pretende abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string> + <string name="usb_device_confirm_prompt" msgid="4091711472439910809">"Quer abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?"</string> + <string name="usb_device_confirm_prompt_warn" msgid="990208659736311769">"Quer abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_DEVICE">%2$s</xliff:g>?\nEsta app não recebeu autorização de gravação, mas pode capturar áudio através deste dispositivo USB."</string> + <string name="usb_accessory_confirm_prompt" msgid="5728408382798643421">"Quer abrir a app <xliff:g id="APPLICATION">%1$s</xliff:g> para controlar o acessório <xliff:g id="USB_ACCESSORY">%2$s</xliff:g>?"</string> <string name="usb_accessory_uri_prompt" msgid="6756649383432542382">"Nenhuma das aplicações instaladas funciona com o acessório USB. Saiba mais acerca do acessório em <xliff:g id="URL">%1$s</xliff:g>"</string> <string name="title_usb_accessory" msgid="1236358027511638648">"Acessório USB"</string> <string name="label_view" msgid="6815442985276363364">"Ver"</string> @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Ativar USB"</string> <string name="learn_more" msgid="4690632085667273811">"Saiba mais"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captura de ecrã"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desbloqueio prolongado desativado"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desbloqueio extra desativado"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou uma imagem"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"A guardar captura de ecrã..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"A guardar captura de ecrã no perfil de trabalho…"</string> @@ -316,7 +316,7 @@ <string name="quick_settings_contrast_high" msgid="656049259587494499">"Alto"</string> <string name="sensor_privacy_start_use_mic_dialog_title" msgid="563796653825944944">"Desbloquear o microfone do dispositivo?"</string> <string name="sensor_privacy_start_use_camera_dialog_title" msgid="8807639852654305227">"Desbloquear a câmara do dispositivo?"</string> - <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Pretende desbloquear a câmara e o microfone?"</string> + <string name="sensor_privacy_start_use_mic_camera_dialog_title" msgid="4316471859905020023">"Quer desbloquear a câmara e o microfone?"</string> <string name="sensor_privacy_start_use_mic_dialog_content" msgid="1624701280680913717">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar o seu microfone."</string> <string name="sensor_privacy_start_use_camera_dialog_content" msgid="4704948062372435963">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara."</string> <string name="sensor_privacy_start_use_mic_camera_dialog_content" msgid="3577642558418404919">"Isto desbloqueia o acesso a todas as apps e serviços com autorização para utilizar a sua câmara ou microfone."</string> @@ -382,7 +382,7 @@ <string name="accessibility_multi_user_list_switcher" msgid="8574105376229857407">"menu pendente"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Todas as apps e dados desta sessão serão eliminados."</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"Bem-vindo de volta, convidado!"</string> - <string name="guest_wipe_session_message" msgid="3393823610257065457">"Pretende continuar a sessão?"</string> + <string name="guest_wipe_session_message" msgid="3393823610257065457">"Quer continuar a sessão?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Recomeçar"</string> <string name="guest_wipe_session_dontwipe" msgid="3211052048269304205">"Sim, continuar"</string> <string name="guest_notification_app_name" msgid="2110425506754205509">"Modo convidado"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu ligar/desligar"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ecrã de bloqueio"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telem. deslig. devido ao calor"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"O seu telemóvel já está a funcionar normalmente.\nToque para obter mais informações."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"O telemóvel estava muito quente, por isso desligou-se para arrefecer. Agora funciona normalmente.\n\nO telemóvel pode sobreaquecer se:\n • Usar aplicações que utilizam mais recursos (jogos, vídeo ou aplicações de navegação)\n • Transferir ou carregar ficheiros grandes\n • Usar em altas temperaturas"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Veja os passos de manutenção"</string> - <string name="high_temp_title" msgid="2218333576838496100">"O telemóvel está a aquecer"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Algumas funcionalidades são limitadas enquanto o telemóvel arrefece.\nToque para obter mais informações."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"O telemóvel tenta arrefecer automaticamente. Pode continuar a utilizá-lo, mas este poderá funcionar mais lentamente.\n\nAssim que o telemóvel tiver arrefecido, funcionará normalmente."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Veja os passos de manutenção"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desligue o dispositivo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"O dispositivo está a ficar quente perto da porta de carregamento. Se estiver ligado a um carregador ou um acessório USB, desligue-o e tenha cuidado, uma vez que o cabo também pode estar quente."</string> @@ -1070,7 +1064,7 @@ <string name="to_switch_networks_disconnect_ethernet" msgid="6698111101156951955">"Para mudar de rede, desligue a Ethernet"</string> <string name="wifi_scan_notify_message" msgid="3753839537448621794">"Para melhorar a experiência do dispositivo, as apps e os serviços podem continuar a procurar redes Wi-Fi em qualquer altura, mesmo quando o Wi-Fi está desativado. Pode alterar esta opção nas definições de procura de Wi-Fi. "<annotation id="link">"Alterar"</annotation></string> <string name="turn_off_airplane_mode" msgid="8425587763226548579">"Desativar o modo de avião"</string> - <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"A app <xliff:g id="APPNAME">%1$s</xliff:g> pretende adicionar o seguinte mosaico às Definições rápidas"</string> + <string name="qs_tile_request_dialog_text" msgid="3501359944139877694">"A app <xliff:g id="APPNAME">%1$s</xliff:g> quer adicionar o seguinte mosaico às Definições rápidas"</string> <string name="qs_tile_request_dialog_add" msgid="4888460910694986304">"Adicionar mosaico"</string> <string name="qs_tile_request_dialog_not_add" msgid="4168716573114067296">"Não adicion. mosaico"</string> <string name="qs_user_switch_dialog_title" msgid="3045189293587781366">"Selecione utilizador"</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 579a9bdfdf8c..601b7057abd9 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Ativar USB"</string> <string name="learn_more" msgid="4690632085667273811">"Saiba mais"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Capturar tela"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock desativado"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Desbloqueio extra desativado"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"enviou uma imagem"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Salvando captura de tela..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Salvando captura de tela no perfil de trabalho…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menu liga/desliga"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Tela de bloqueio"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"O smartphone foi desligado devido ao aquecimento"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"O smartphone está funcionando normalmente agora.\nToque para saber mais"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"O smartphone estava muito quente e foi desligado para resfriar. Agora, ele está sendo executado normalmente.\n\nO smartphone pode ficar quente demais se você:\n • usar apps que consomem muitos recursos (como apps de jogos, vídeos ou navegação);\n • fizer o download ou upload de arquivos grandes;\n • usar o smartphone em temperaturas altas."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Ver etapas de cuidado"</string> - <string name="high_temp_title" msgid="2218333576838496100">"O smartphone está esquentando"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Alguns recursos ficam limitados enquanto o smartphone é resfriado.\nToque para saber mais"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Seu smartphone tentará se resfriar automaticamente. Você ainda poderá usá-lo, mas talvez ele fique mais lento.\n\nQuando o smartphone estiver resfriado, ele voltará ao normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Ver etapas de cuidado"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Desconecte seu dispositivo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Seu dispositivo está ficando quente perto da porta de carregamento. Desconecte qualquer carregador ou acessório USB que esteja conectado, mas tome cuidado, porque o cabo também pode estar quente."</string> @@ -896,7 +890,7 @@ <string name="controls_number_of_favorites" msgid="4481806788981836355">"{count,plural, =1{# controle adicionado.}one{# controle adicionado.}many{# de controles adicionados.}other{# controles adicionados.}}"</string> <string name="controls_removed" msgid="3731789252222856959">"Removido"</string> <string name="controls_panel_authorization_title" msgid="267429338785864842">"Adicionar o app <xliff:g id="APPNAME">%s</xliff:g>?"</string> - <string name="controls_panel_authorization" msgid="7045551688535104194">"<xliff:g id="APPNAME">%s</xliff:g> pode escolher quais controles e conteúdos aparecem aqui."</string> + <string name="controls_panel_authorization" msgid="7045551688535104194">"O app <xliff:g id="APPNAME">%s</xliff:g> pode escolher quais controles e conteúdos aparecem aqui."</string> <string name="controls_panel_remove_app_authorization" msgid="5920442084735364674">"Remover controles do app <xliff:g id="APPNAME">%s</xliff:g>?"</string> <string name="accessibility_control_favorite" msgid="8694362691985545985">"Adicionado como favorito"</string> <string name="accessibility_control_favorite_position" msgid="54220258048929221">"Adicionado como favorito (posição <xliff:g id="NUMBER">%d</xliff:g>)"</string> @@ -1117,7 +1111,7 @@ <string name="dream_time_complication_12_hr_time_format" msgid="4691197486690291529">"h:mm"</string> <string name="dream_time_complication_24_hr_time_format" msgid="6248280719733640813">"kk:mm"</string> <string name="log_access_confirmation_title" msgid="4843557604739943395">"Permitir que o app <xliff:g id="LOG_ACCESS_APP_NAME">%s</xliff:g> acesse todos os registros do dispositivo?"</string> - <string name="log_access_confirmation_allow" msgid="752147861593202968">"Permitir o acesso único"</string> + <string name="log_access_confirmation_allow" msgid="752147861593202968">"Permitir acesso único"</string> <string name="log_access_confirmation_deny" msgid="2389461495803585795">"Não permitir"</string> <string name="log_access_confirmation_body" msgid="6883031912003112634">"Os registros do dispositivo gravam o que acontece nele. Os apps podem usar esses registros para encontrar e corrigir problemas.\n\nAlguns registros podem conter informações sensíveis, então autorize o acesso a eles apenas para os apps em que você confia. \n\nSe você não permitir que esse app acesse todos os registros do dispositivo, ele ainda vai poder acessar os dele. O fabricante do dispositivo também pode ter acesso a alguns registros ou informações."</string> <string name="log_access_confirmation_learn_more" msgid="3134565480986328004">"Saiba mais"</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 39e618273d3a..95ac2233b8af 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Activează USB"</string> <string name="learn_more" msgid="4690632085667273811">"Mai multe"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Captură de ecran"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Funcția Extend Unlock este dezactivată"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Funcția Prelungirea deblocării este dezactivată"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"a trimis o imagine"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Se salvează captura de ecran..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Se salvează captura în profilul de serviciu…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meniul de pornire"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> din <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ecran de blocare"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefonul s-a oprit din cauza încălzirii"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Acum telefonul funcționează normal.\nAtinge pentru mai multe informații"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefonul se încălzise prea mult și s-a oprit pentru a se răci. Acum telefonul funcționează normal.\n\nTelefonul s-ar putea încălzi prea mult dacă:\n • folosești aplicații care consumă multe resurse (de ex., jocuri, aplicații video/de navigare);\n • descarci/încarci fișiere mari;\n • folosești telefonul la temperaturi ridicate."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Vezi pașii pentru îngrijire"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefonul se încălzește"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Anumite funcții sunt limitate în timp ce telefonul se răcește.\nAtinge pentru mai multe informații."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonul va încerca automat să se răcească. Îl poți folosi în continuare, dar e posibil să funcționeze mai lent.\n\nDupă ce se răcește, telefonul va funcționa normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Vezi pașii pentru îngrijire"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Deconectează dispozitivul"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Dispozitivul se încălzește lângă portul de încărcare. Dacă este conectat la un încărcător sau accesoriu USB, deconectează-l și ai grijă, deoarece și cablul poate fi cald."</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 44df74288b65..182fe52db22b 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Включить USB-порт"</string> <string name="learn_more" msgid="4690632085667273811">"Подробнее"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Скриншот"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Функция \"Отложить блокировку\" отключена"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Отложенная блокировка отключена"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"отправлено изображение"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Сохранение..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Сохранение скриншота в рабочем профиле…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопки питания"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Страница <xliff:g id="ID_1">%1$d</xliff:g> из <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заблокированный экран"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Телефон выключился из-за перегрева"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Сейчас телефон работает нормально.\nНажмите, чтобы получить дополнительную информацию"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Ваш телефон выключился из-за перегрева. Сейчас он работает нормально.\n\nВозможные причины перегрева телефона:\n • использование ресурсоемких игр и приложений, связанных с видео или навигацией);\n • скачивание или загрузка больших файлов;\n • высокая температура окружающей среды."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Подробнее о действиях при перегреве…"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Телефон нагревается"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Пока телефон не остынет, некоторые функции могут быть недоступны.\nНажмите, чтобы получить дополнительную информацию"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ваш телефон остынет автоматически.\n\nОбратите внимание, что до тех пор он может работать медленнее, чем обычно."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Подробнее о действиях при перегреве…"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Отключите устройство"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Устройство нагревается в районе зарядного порта. Если оно подключено к зарядному или USB-устройству, отключите его. Будьте осторожны: кабель тоже мог нагреться."</string> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 5669e0ea8e49..a83ac866acf7 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"බල මෙනුව"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g> න් <xliff:g id="ID_1">%1$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"අගුලු තිරය"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"දුරකථනය රත් වීම නිසා ක්රියාවිරහිත කරන ලදී"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"ඔබගේ දුරකථනය දැන් සාමාන්ය ලෙස ධාවනය වේ.\nතව තතු සඳහා තට්ටු කරන්න"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"ඔබේ දුරකථනය ඉතාම උණුසුම්ය, එම නිසා එය සිසිල් වීමට ක්රියාවිරහිත කරන ලදී. ධැන් ඔබේ දුරකථනය සාමාන්ය පරිදි ධාවනය වේ.\n\nඔබ පහත දේවල් සිදු කළහොත් ඔබේ දුරකථනය ඉතාම උණුසුම් විය හැකිය:\n • සම්පත්-දැඩි සත්කාරක යෙදුම් භාවිතය (ක්රීඩා, වීඩියෝ, හෝ සංචලන යෙදුම් යනාදී)\n • විශාල ගොනු බාගැනීම හෝ උඩුගත කිරීම\n • ඔබේ දුරකථනය අධික උෂ්ණත්වයේදී භාවිත කිරීම"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"රැකවරණ පියවර බලන්න"</string> - <string name="high_temp_title" msgid="2218333576838496100">"දුරකථනය උණුසුම් වෙමින්"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"දුරකථනය සිසිල් වන අතරතුර සමහර විශේෂාංග සීමිත විය හැකිය.\nතව තතු සඳහා තට්ටු කරන්න"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"ඔබගේ දුරකථනය ස්වයංක්රියව සිසිල් වීමට උත්සාහ කරනු ඇත. ඔබට තවම ඔබේ දුරකථනය භාවිත කළ හැකිය, නමුත් එය සෙමින් ධාවනය විය හැකිය.\n\nඔබේ දුරකථනය සිසිල් වූ පසු, එය සාමාන්ය ලෙස ධාවනය වනු ඇත."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"රැකවරණ පියවර බලන්න"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ඔබේ උපාංගය ගලවන්න"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ඔබේ උපාංගය ආරෝපණ කවුළුව අවට උණුසුම් වෙමින් පවතී. එය චාජරයකට හෝ USB උපාංගයකට සම්බන්ධ කර ඇත්නම්, එය ගලවා, කේබලය උණුසුම් විය හැකි බැවින් ප්රවේශම් වන්න."</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 8950d22f22f9..ef963ead9dfd 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Povoliť USB"</string> <string name="learn_more" msgid="4690632085667273811">"Ďalšie informácie"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Snímka obrazovky"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Predĺžené odomknutie je vypnuté"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Rozšírené odomknutie je vypnuté"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"odoslal(a) obrázok"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Prebieha ukladanie snímky obrazovky..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ukladá sa snímka obrazovky do pracovného profilu…"</string> @@ -291,7 +291,7 @@ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Upozornenie pri <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Pracovné aplikácie"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Nočný režim"</string> - <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Zapne sa pri západe slnka"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Zap. pri záp. slnka"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Do východu slnka"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Od <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Do <xliff:g id="TIME">%s</xliff:g>"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Ponuka vypínača"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Strana <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Uzamknutá obrazovka"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefón sa vypol z dôvodu prehriatia"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Teraz telefón funguje ako obvykle.\nViac sa dozviete po klepnutí."</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefón bol príliš horúci, preto sa vypol, aby vychladol. Teraz funguje ako obvykle.\n\nTelefón sa môže príliš zahriať v týchto prípadoch:\n • používanie náročných aplikácií (napr. hier, videí alebo navigácie);\n • sťahovanie alebo nahrávanie veľkých súborov;\n • používanie telefónu pri vysokých teplotách."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Zobraziť opatrenia"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Teplota telefónu stúpa"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Niektoré funkcie budú obmedzené, dokým neklesne teplota telefónu.\nViac sa dozviete po klepnutí."</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Váš telefón sa automaticky pokúsi schladiť. Môžete ho naďalej používať, ale môže fungovať pomalšie.\n\nPo poklese teploty bude telefón fungovať ako normálne."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Zobraziť opatrenia"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Odpojte zariadenie"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Zariadenie sa zahrieva pri nabíjacom porte. Ak je pripojené k nabíjačke alebo príslušenstvu USB, odpojte ho a dajte pozor, lebo môže byť horúci aj kábel."</string> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 96ad5baab5ab..a1e62d240ccc 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Omogoči USB"</string> <string name="learn_more" msgid="4690632085667273811">"Več o tem"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Posnetek zaslona"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Podaljšanje časa odklenjenosti je onemogočeno"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Razširjeno odklepanje je onemogočeno"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"je poslal(-a) sliko"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Shranjevanje posnetka zaslona ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Shranjevanje posnetka zaslona v delovni profil …"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Meni za vklop/izklop"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. stran od <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Zaklenjen zaslon"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Tel. izklopljen zaradi vročine"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefon zdaj deluje normalno.\nDotaknite se za več informacij"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon je bil prevroč, zato se je izklopil, da se ohladi. Zdaj normalno deluje.\n\nTelefon lahko postane prevroč ob:\n • uporabi aplikacij, ki intenzivno porabljajo sredstva (npr. za igranje iger, videoposnetke ali navigacijo)\n • prenosu ali nalaganju velikih datotek\n • uporabi telefona pri visokih temp."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Oglejte si navodila za ukrepanje"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon se segreva"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Nekatere funkcije bodo med ohlajanjem telefona omejene.\nDotaknite se za več informacij"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon se bo samodejno poskusil ohladiti. Še naprej ga lahko uporabljate, vendar bo morda deloval počasneje.\n\nKo se telefon ohladi, bo zopet deloval kot običajno."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Oglejte si navodila za ukrepanje"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Odklopite napravo"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Naprava se segreva pri vratih za polnjenje. Če je priključena na polnilnik ali dodatek USB, ga odklopite in bodite tem previdni, saj je tudi kabel lahko topel."</string> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index e700944655fa..579e2388cc0f 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivizo USB-në"</string> <string name="learn_more" msgid="4690632085667273811">"Mëso më shumë"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Pamja e ekranit"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"\"Shkyçja e zgjeruar\" u çaktivizua"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"\"Shkyçja e zgjatur\" u çaktivizua"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"dërgoi një imazh"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Po ruan pamjen e ekranit…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Pamja e ekranit po ruhet te profili i punës…"</string> @@ -291,7 +291,7 @@ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Paralajmërim për kufirin prej <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Aplikacionet e punës"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Drita e natës"</string> - <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Në perëndim të diellit"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Aktiv në perëndim"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"Deri në lindje të diellit"</string> <string name="quick_settings_night_secondary_label_on_at" msgid="3584738542293528235">"Aktive në <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_secondary_label_until" msgid="1883981263191927372">"Deri në <xliff:g id="TIME">%s</xliff:g>"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menyja e energjisë"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Faqja <xliff:g id="ID_1">%1$d</xliff:g> nga <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekrani i kyçjes"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefoni u fik për shkak të nxehtësisë"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefoni tani punon normalisht.\nTrokit për më shumë informacione"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefoni yt ishte tepër i nxehtë, prandaj u fik për t\'u ftohur. Telefoni tani punon normalisht.\n\nTelefoni mund të nxehet së tepërmi nëse ti:\n • Përdor aplikacione intensive për burimet (siç janë aplikacionet e lojërave, videove apo aplikacionet e navigimit)\n • Shkarkon ose ngarkon skedarë të mëdhenj\n • E përdor telefonin në temperatura të larta"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Shiko hapat për kujdesin"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefoni po bëhet i ngrohtë"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Disa veçori janë të kufizuara kur telefoni është duke u ftohur.\nTrokit për më shumë informacione"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefoni yt do të përpiqet automatikisht që të ftohet. Mund ta përdorësh përsëri telefonin, por ai mund të punojë më ngadalë.\n\nPasi telefoni të jetë ftohur, ai do të punojë si normalisht."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Shiko hapat për kujdesin"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Shkëpute pajisjen"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Pajisja jote po nxehet pranë portës së karikimit. Nëse është lidhur me një karikues ose një aksesor USB, shkëpute dhe trego kujdes pasi kablloja mund të jetë e nxehtë po ashtu."</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index af8174ee9171..f3d1c1bd63b0 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -415,7 +415,7 @@ <string name="screen_capturing_disabled_by_policy_dialog_title" msgid="2113331792064527203">"Блокира ИТ администратор"</string> <string name="screen_capturing_disabled_by_policy_dialog_description" msgid="6015975736747696431">"Снимање екрана је онемогућено смерницама за уређај"</string> <string name="clear_all_notifications_text" msgid="348312370303046130">"Обриши све"</string> - <string name="manage_notifications_text" msgid="6885645344647733116">"Управљајте"</string> + <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> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Мени дугмета за укључивање"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>. страна од <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Закључан екран"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Телефон се искључио због топлоте"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Телефон сада нормално ради.\nДодирните за више информација"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Телефон је био преврућ, па се искључио да се охлади. Сада ради нормално.\n\nТелефон може превише да се угреје ако:\n • Користите апликације које захтевају пуно ресурса (нпр. видео игре, видео или апликације за навигацију)\n • Преузимате/отпремате велике датотеке\n • Користите телефон на високој температури"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Погледајте упозорења"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Телефон се загрејао"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Неке функције су ограничене док се телефон не охлади.\nДодирните за више информација"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Телефон ће аутоматски покушати да се охлади. И даље ћете моћи да користите телефон, али ће спорије реаговати.\n\nКада се телефон охлади, нормално ће радити."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Погледајте упозорења"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Искључите уређај"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Уређај се загрева у близини порта за пуњење. Ако је повезан са пуњачем или USB опремом, искључите је и будите пажљиви јер и кабл може да буде врућ."</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index 1368794834cf..3d07826d804c 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Aktivera USB"</string> <string name="learn_more" msgid="4690632085667273811">"Läs mer"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skärmbild"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock har inaktiverats"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Håll olåst har inaktiverats"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"har skickat en bild"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skärmbilden sparas ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Sparar skärmbild i jobbprofilen …"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Startmeny"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Sida <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Låsskärm"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Mobilen stängdes av pga. värme"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefonen fungerar nu som vanligt.\nTryck för mer information"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Mobilen var för varm och stängdes av för att kylas ned. Den fungerar nu som vanligt.\n\nMobilen kan bli för varm om du\n • använder resurskrävande appar (till exempel spel-, video- eller navigeringsappar)\n • laddar ned eller laddar upp stora filer\n • använder mobilen vid höga temperaturer."</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Visa alla skötselråd"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Mobilen börjar bli varm"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Vissa funktioner är begränsade medan telefonen svalnar.\nTryck för mer information"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Mobilen försöker svalna automatiskt. Du kan fortfarande använda mobilen, men den kan vara långsammare än vanligt.\n\nMobilen fungerar som vanligt när den har svalnat."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Visa alla skötselråd"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Koppla ur enheten"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Enheten börjar bli varm vid laddningsporten. Om den är ansluten till en laddare eller ett USB-tillbehör kopplar du ur den. Var försiktigt eftersom kabeln också kan vara varm."</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index e4d3e56ae119..055540a563a0 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Washa kipengele cha USB"</string> <string name="learn_more" msgid="4690632085667273811">"Pata maelezo zaidi"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Picha ya skrini"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Kipengele cha Kuongeza muda wa Kutofunga Skrini kimezimwa"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Kiongeza Muda wa Kutofunga Skrini kimezimwa"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"imetuma picha"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Inahifadhi picha ya skrini..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Inahifadhi picha ya skrini kwenye wasifu wa kazini…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Menyu ya kuzima/kuwasha"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Ukurasa wa <xliff:g id="ID_1">%1$d</xliff:g> kati ya <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Skrini iliyofungwa"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Simu ilizima kutokana na joto"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Simu yako sasa inafanya kazi ipasavyo.\nGusa ili upate maelezo zaidi"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Simu yako ilikuwa moto sana, kwa hivyo ilijizima ili ipoe. Simu yako sasa inafanya kazi ipasavyo.\n\nSimu yako inaweza kuwa moto sana ikiwa:\n • Unatumia programu zinazotumia vipengee vingi (kama vile michezo ya video, video au programu za uelekezaji)\n • Unapakua au upakie faili kubwa\n • Unatumia simu yako katika maeneo yenye halijoto ya juu"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Angalia hatua za utunzaji"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Joto la simu linaongezeka"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Baadhi ya vipengele havitatumika kwenye simu wakati inapoa.\nGusa ili upate maelezo zaidi"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Simu yako itajaribu kupoa kiotomatiki. Bado unaweza kutumia simu yako, lakini huenda ikafanya kazi polepole. \n\nPindi simu yako itakapopoa, itaendelea kufanya kazi kama kawaida."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Angalia hatua za utunzaji"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Chomoa kifaa chako"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Kifaa chako kinapata joto karibu na mlango wa kuchaji. Ikiwa kimeunganishwa kwenye chaja au kifuasi cha USB, kichomoe na uwe makini kwani kebo inaweza kuwa imepata joto."</string> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index a7e3efb53ef0..72b3598f4a98 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USBயை இயக்கு"</string> <string name="learn_more" msgid="4690632085667273811">"மேலும் அறிக"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ஸ்கிரீன்ஷாட்"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"நீண்டநேர அன்லாக் அம்சம் முடக்கப்பட்டது"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"அன்லாக் நீட்டிப்பு அம்சம் முடக்கப்பட்டது"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"படம் அனுப்பப்பட்டது"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"ஸ்க்ரீன் ஷாட்டைச் சேமிக்கிறது…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"பணிக் கணக்கில் ஸ்கிரீன்ஷாட் சேமிக்கப்படுகிறது…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"பவர் மெனு"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"பக்கம் <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"லாக் ஸ்கிரீன்"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"வெப்பத்தினால் ஃபோன் ஆஃப் செய்யப்பட்டது"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"இப்போது உங்கள் மொபைல் இயல்புநிலையில் இயங்குகிறது.\nமேலும் தகவலுக்கு தட்டவும்"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"உங்கள் ஃபோன் அதிகமாகச் சூடானதால், அதன் சூட்டைக் குறைக்க, ஆஃப் செய்யப்பட்டது. இப்போது உங்கள் ஃபோன் இயல்புநிலையில் இயங்குகிறது.\n\nபின்வருவனவற்றைச் செய்தால், ஃபோன் சூடாகலாம்:\n • அதிகளவு தரவைப் பயன்படுத்தும் ஆப்ஸை (எ.கா: கேமிங், வீடியோ (அ) வழிகாட்டுதல் ஆப்ஸ்) பயன்படுத்துவது\n • பெரிய ஃபைல்களைப் பதிவிறக்குவது/பதிவேற்றுவது\n • அதிக வெப்பநிலையில் ஃபோனைப் பயன்படுத்துவது"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"மேலும் விவரங்களுக்கு இதைப் பார்க்கவும்"</string> - <string name="high_temp_title" msgid="2218333576838496100">"மொபைல் சூடாகிறது"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"மொபைலின் வெப்ப அளவு குறையும் வரை சில அம்சங்களைப் பயன்படுத்த முடியாது.\nமேலும் தகவலுக்கு தட்டவும்"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"உங்கள் மொபைலின் வெப்ப அளவு தானாகவே குறையும். தொடர்ந்து நீங்கள் மொபைலைப் பயன்படுத்தலாம், ஆனால் அதன் வேகம் குறைவாக இருக்கக்கூடும்.\n\nமொபைலின் வெப்ப அளவு குறைந்தவுடன், அது இயல்பு நிலையில் இயங்கும்."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"மேலும் விவரங்களுக்கு இதைப் பார்க்கவும்"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"சாதன இணைப்பைத் துண்டித்தல்"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"சார்ஜிங் போர்ட்டிற்கு அருகே உங்கள் சாதனம் சூடாகிறது. சார்ஜருடனோ USB உபகரணத்துடனோ சாதனம் இணைக்கப்பட்டிருந்தால் அதன் இணைப்பைத் துண்டிக்கவும். கேபிளும் சூடாக இருக்கக்கூடும் என்பதால் கவனத்துடன் கையாளவும்."</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 25bf52817ffd..832499331650 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USBని ప్రారంభించండి"</string> <string name="learn_more" msgid="4690632085667273811">"మరింత తెలుసుకోండి"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"స్క్రీన్షాట్"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"అన్లాక్ను పొడిగించడం డిజేబుల్ చేయబడింది"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ఎక్స్టెండ్ అన్లాక్ డిజేబుల్ చేయబడింది"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ఇమేజ్ను పంపారు"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"స్క్రీన్షాట్ను సేవ్ చేస్తోంది…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"స్క్రీన్షాట్ను వర్క్ ప్రొఫైల్కు సేవ్ చేస్తోంది…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"పవర్ మెనూ"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_2">%2$d</xliff:g>లో <xliff:g id="ID_1">%1$d</xliff:g>వ పేజీ"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"లాక్ స్క్రీన్"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"వేడెక్కినందుకు ఫోన్ ఆఫ్ చేయబడింది"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తోంది.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"మీ ఫోన్ చాలా వేడిగా ఉంది, కనుక చల్లబర్చడానికి ఆఫ్ చేయబడింది. మీ ఫోన్ ఇప్పుడు సాధారణంగా పని చేస్తుంది.\n\nమీరు ఇలా చేస్తే మీ ఫోన్ చాలా వేడెక్కవచ్చు:\n • వనరు-ఆధారిత యాప్లు (గేమింగ్, వీడియో లేదా నావిగేషన్ వంటి యాప్లు) ఉపయోగించడం\n • పెద్ద ఫైళ్లను డౌన్లోడ్ లేదా అప్లోడ్ చేయడం\n • అధిక ఉష్ణోగ్రతలలో మీ ఫోన్ని ఉపయోగించడం"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి"</string> - <string name="high_temp_title" msgid="2218333576838496100">"ఫోన్ వేడెక్కుతోంది"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ఫోన్ను చల్లబరిచే క్రమంలో కొన్ని ఫీచర్లు పరిమితం చేయబడ్డాయి.\nమరింత సమాచారం కోసం ట్యాప్ చేయండి"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"మీ ఫోన్ ఆటోమేటిక్గా చల్లబడటానికి ప్రయత్నిస్తుంది. మీరు ఇప్పటికీ మీ ఫోన్ను ఉపయోగించవచ్చు, కానీ దాని పనితీరు నెమ్మదిగా ఉండవచ్చు.\n\nమీ ఫోన్ చల్లబడిన తర్వాత, అది సాధారణ రీతిలో పని చేస్తుంది."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"తీసుకోవాల్సిన జాగ్రత్తలు ఏమిటో చూడండి"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"మీ పరికరాన్ని అన్ప్లగ్ చేయండి"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"ఛార్జింగ్ పోర్ట్ దగ్గర ఉంచినప్పుడు మీ పరికరం వేడెక్కుతోంది. ఇది ఛార్జర్ లేదా USB యాక్సెసరీకి కనెక్ట్ చేసి ఉంటే, దాన్ని అన్ప్లగ్ చేసి, కేబుల్ వేడెక్కే అవకాశం కూడా ఉన్నందున జాగ్రత్త వహించండి."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 578c843f1258..698d52e4c349 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"เปิดใช้ USB"</string> <string name="learn_more" msgid="4690632085667273811">"ดูข้อมูลเพิ่มเติม"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"ภาพหน้าจอ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ปิดใช้ฟีเจอร์ขยายเวลาปลดล็อกอยู่"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"ปิดใช้ฟีเจอร์ปลดล็อกต่อเนื่องอยู่"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ส่งรูปภาพ"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"กำลังบันทึกภาพหน้าจอ..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"กำลังบันทึกภาพหน้าจอไปยังโปรไฟล์งาน…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"เมนูเปิด/ปิด"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"หน้า <xliff:g id="ID_1">%1$d</xliff:g> จาก <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"หน้าจอล็อก"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"โทรศัพท์ปิดไปเพราะร้อนมาก"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"ขณะนี้โทรศัพท์ทำงานเป็นปกติ\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"โทรศัพท์ร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้โทรศัพท์ทำงานเป็นปกติ\n\nโทรศัพท์อาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้โทรศัพท์ในอุณหภูมิที่สูง"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"ดูขั้นตอนในการดูแลรักษา"</string> - <string name="high_temp_title" msgid="2218333576838496100">"โทรศัพท์เริ่มเครื่องร้อน"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์เย็นลง\nแตะเพื่อดูข้อมูลเพิ่มเติม"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"โทรศัพท์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้โทรศัพท์ได้ แต่โทรศัพท์อาจทำงานช้าลง\n\nโทรศัพท์จะทำงานตามปกติเมื่อเย็นลงแล้ว"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"ดูขั้นตอนในการดูแลรักษา"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"ถอดปลั๊กอุปกรณ์"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"บริเวณพอร์ตชาร์จของอุปกรณ์เริ่มจะร้อนแล้ว หากมีที่ชาร์จหรืออุปกรณ์เสริม USB เสียบอยู่ ให้ถอดออกอย่างระมัดระวังเพราะสายเส้นนั้นก็อาจจะร้อนด้วยเช่นกัน"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 81a78c9c11c4..412bbb4dd234 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Power menu"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Page <xliff:g id="ID_1">%1$d</xliff:g> ng <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Lock screen"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Na-off ang telepono dahil sa init"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Maayos na ngayong gumagana ang iyong telepono.\nMag-tap para sa higit pang impormasyon"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Napakainit ng telepono, kaya nag-off ito para lumamig. Maayos na itong gumagana.\n\nMaaaring lubos na uminit ang telepono kapag:\n • Gumamit ka ng resource-intensive na app (gaya ng app para sa gaming, video, o navigation)\n • Nag-download o nag-upload ka ng malaking file\n • Ginamit mo ito sa mainit na lugar"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Tingnan ang mga hakbang sa pangangalaga"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Umiinit ang telepono"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Limitado ang ilang feature habang nagku-cool down ang telepono.\nMag-tap para sa higit pang impormasyon"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Awtomatikong susubukan ng iyong telepono na mag-cool down. Magagamit mo pa rin ang iyong telepono, ngunit maaaring mas mabagal ang paggana nito.\n\nKapag nakapag-cool down na ang iyong telepono, gagana na ito nang normal."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Tingnan ang mga hakbang sa pangangalaga"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Bunutin sa saksakan ang device"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Umiinit ang iyong device malapit sa charging port. Kung nakakonekta ito sa charger o USB accessory, bunutin ito sa saksakan, at mag-ingat dahil posibleng mainit din ang cable."</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 83b1f1691d5b..9a00c073f428 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB\'yi etkinleştir"</string> <string name="learn_more" msgid="4690632085667273811">"Daha fazla bilgi"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Ekran görüntüsü"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock devre dışı"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Artırılmış Kilit Açma devre dışı"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"bir resim gönderildi"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Ekran görüntüsü kaydediliyor..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Ekran görüntüsü iş profiline kaydediliyor…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Güç menüsü"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Sayfa <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Kilit ekranı"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Telefon ısındığından kapatıldı"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Telefonunuz şu anda normal bir şekilde çalışıyor.\nDaha fazla bilgi için dokunun"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefonunuz çok ısındığından soğuması için kapatıldı ve şu anda normal bir şekilde çalışıyor.\n\nTelefon şu koşullarda çok ısınabilir:\n • Yoğun kaynak gerektiren uygulamalar (oyun, video veya gezinme uygulamaları gibi) kullanma\n • Büyük dosyalar indirme veya yükleme\n • Telefonu sıcak yerlerde kullanma"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Bakımla ilgili adımlara bakın"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon ısınıyor"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Telefon soğurken bazı özellikler sınırlı olarak kullanılabilir.\nDaha fazla bilgi için dokunun"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefonunuz otomatik olarak soğumaya çalışacak. Bu sırada telefonunuzu kullanmaya devam edebilirsiniz ancak uygulamalar daha yavaş çalışabilir.\n\nTelefonunuz soğuduktan sonra normal şekilde çalışacaktır."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Bakımla ilgili adımlara bakın"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Cihazınızın fişini çekin"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Cihazınız, şarj yuvasının yakınındayken ısınıyor. Şarj cihazına veya USB aksesuarına bağlıysa cihazı çıkarın. Ayrıca, kablo sıcak olabileceği için dikkatli olun."</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 6df0774d82ce..b87cce92e667 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Увімкнути USB"</string> <string name="learn_more" msgid="4690632085667273811">"Докладніше"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Знімок екрана"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock вимкнено"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Відкладене блокування вимкнено"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"надіслане зображення"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Збереження знімка екрана..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Зберігання знімка екрана в робочому профілі…"</string> @@ -143,7 +143,7 @@ <string name="biometric_dialog_face_icon_description_confirmed" msgid="7918067993953940778">"Підтверджено"</string> <string name="biometric_dialog_tap_confirm" msgid="9166350738859143358">"Щоб завершити, натисніть \"Підтвердити\""</string> <string name="biometric_dialog_tap_confirm_with_face" msgid="2378151312221818694">"Розблоковано (фейс-контроль)"</string> - <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Розблоковано (фейсконтроль). Натисніть, щоб продовжити."</string> + <string name="biometric_dialog_tap_confirm_with_face_alt_1" msgid="439152621640507113">"Розблоковано (фейс-контроль). Натисніть, щоб продовжити."</string> <string name="biometric_dialog_tap_confirm_with_face_alt_2" msgid="8586608186457385108">"Обличчя розпізнано. Натисніть, щоб продовжити."</string> <string name="biometric_dialog_tap_confirm_with_face_alt_3" msgid="2192670471930606539">"Обличчя розпізнано. Натисніть значок розблокування."</string> <string name="biometric_dialog_authenticated" msgid="7337147327545272484">"Автентифіковано"</string> @@ -185,7 +185,7 @@ <skip /> <string name="keyguard_face_failed" msgid="9044619102286917151">"Обличчя не розпізнано"</string> <string name="keyguard_suggest_fingerprint" msgid="8742015961962702960">"Скористайтеся відбитком"</string> - <string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Фейсконтроль недоступний"</string> + <string name="keyguard_face_unlock_unavailable" msgid="1581949044193418736">"Фейс-контроль недоступний"</string> <string name="accessibility_bluetooth_connected" msgid="4745196874551115205">"Bluetooth під’єднано."</string> <string name="accessibility_battery_unknown" msgid="1807789554617976440">"Відсоток заряду акумулятора невідомий."</string> <string name="accessibility_bluetooth_name" msgid="7300973230214067678">"Підключено до <xliff:g id="BLUETOOTH">%s</xliff:g>."</string> @@ -291,7 +291,7 @@ <string name="quick_settings_cellular_detail_data_warning" msgid="7957253810481086455">"Застереження: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_work_mode_label" msgid="6440531507319809121">"Робочі додатки"</string> <string name="quick_settings_night_display_label" msgid="8180030659141778180">"Нічний екран"</string> - <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Вмикається ввечері"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="3358706312129866626">"Запуск увечері"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4063448287758262485">"До сходу сонця"</string> <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> @@ -351,12 +351,12 @@ <string name="tap_again" msgid="1315420114387908655">"Натисніть знову"</string> <string name="keyguard_unlock" msgid="8031975796351361601">"Проведіть пальцем угору, щоб відкрити"</string> <string name="keyguard_unlock_press" msgid="9140109453735019209">"Щоб відкрити, натисніть значок розблокування."</string> - <string name="keyguard_face_successful_unlock_swipe" msgid="6180997591385846073">"Розблоковано (фейсконтроль). Відкрити: проведіть угору."</string> - <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Розблоковано (фейсконтроль). Натисніть значок розблокування."</string> - <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Розблоковано (фейсконтроль). Натисніть, щоб відкрити."</string> + <string name="keyguard_face_successful_unlock_swipe" msgid="6180997591385846073">"Розблоковано (фейс-контроль). Відкрити: проведіть угору."</string> + <string name="keyguard_face_successful_unlock_press" msgid="25520941264602588">"Розблоковано (фейс-контроль). Натисніть значок розблокування."</string> + <string name="keyguard_face_successful_unlock_press_alt_1" msgid="5715461103913071474">"Розблоковано (фейс-контроль). Натисніть, щоб відкрити."</string> <string name="keyguard_face_successful_unlock_press_alt_2" msgid="8310787946357120406">"Обличчя розпізнано. Натисніть, щоб відкрити."</string> <string name="keyguard_face_successful_unlock_press_alt_3" msgid="7219030481255573962">"Обличчя розпізнано. Натисніть значок розблокування."</string> - <string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Розблоковано (фейсконтроль)"</string> + <string name="keyguard_face_successful_unlock" msgid="4203999851465708287">"Розблоковано (фейс-контроль)"</string> <string name="keyguard_face_successful_unlock_alt1" msgid="5853906076353839628">"Обличчя розпізнано"</string> <string name="keyguard_retry" msgid="886802522584053523">"Проведіть пальцем угору, щоб повторити спробу"</string> <string name="require_unlock_for_nfc" msgid="1305686454823018831">"Розблокуйте екран, щоб скористатись NFC"</string> @@ -740,7 +740,7 @@ <string name="accessibility_qs_edit_remove_tile_action" msgid="775511891457193480">"вилучити опцію"</string> <string name="accessibility_qs_edit_tile_add_action" msgid="5051211910345301833">"додати опцію в кінець"</string> <string name="accessibility_qs_edit_tile_start_move" msgid="2009373939914517817">"Перемістити опцію"</string> - <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Додати опцію"</string> + <string name="accessibility_qs_edit_tile_start_add" msgid="7560798153975555772">"Додати панель"</string> <string name="accessibility_qs_edit_tile_move_to_position" msgid="5198161544045930556">"Перемістити на позицію <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_tile_add_to_position" msgid="9029163095148274690">"Додати на позицію <xliff:g id="POSITION">%1$d</xliff:g>"</string> <string name="accessibility_qs_edit_position" msgid="4509277359815711830">"Позиція <xliff:g id="POSITION">%1$d</xliff:g>"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Меню кнопки живлення"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Сторінка <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Заблокований екран"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Телефон перегрівся й вимкнувся"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Зараз телефон працює як зазвичай.\nНатисніть, щоб дізнатися більше"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Телефон перегрівся, тому вимкнувся, щоб охолонути. Зараз він працює, як зазвичай.\n\nТелефон перегрівається, якщо ви:\n • використовуєте ресурсомісткі додатки (ігри, відео, навігація)\n • завантажуєте великі файли на телефон або з нього\n • використовуєте телефон за високої температури"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Переглянути запобіжні заходи"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Телефон нагрівається"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Під час охолодження деякі функції обмежуються.\nНатисніть, щоб дізнатися більше"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ваш телефон охолоджуватиметься автоматично. Ви можете далі користуватися телефоном, але він може працювати повільніше.\n\nКоли телефон охолоне, він працюватиме належним чином."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Переглянути запобіжні заходи"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Від’єднайте пристрій"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Пристрій нагрівається біля зарядного порту. Якщо він під’єднаний до зарядного пристрою або USB-аксесуара, від’єднайте його, однак будьте обережні, оскільки кабель також може бути гарячий."</string> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 715ec916e33b..253e50471fc0 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB پورٹ فعال کریں"</string> <string name="learn_more" msgid="4690632085667273811">"مزید جانیں"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"اسکرین شاٹ"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"اَن لاک کی توسیع کو غیر فعال کیا گیا"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"اَن لاک کا دورانیہ بڑھائیں کو غیر فعال کیا گیا"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"ایک تصویر بھیجی"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"اسکرین شاٹ محفوظ ہو رہا ہے…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"اسکرین شاٹ دفتری پروفائل میں محفوظ کیا جا رہا ہے…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"پاور مینیو"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"صفحہ <xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"مقفل اسکرین"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"حرارت کی وجہ سے فون آف ہو گیا"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"آپ کا فون اب حسب معمول چل رہا ہے۔\nمزید معلومات کیلئے تھپتھپائیں"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"آپ کا فون کافی گرم ہو گيا تھا، اس لئے سرد ہونے کیلئے یہ آف ہو گیا۔ اب آپ کا فون حسب معمول کام کر رہا ہے۔\n\nمندرجہ ذیل چیزیں کرنے پر آپ کا فون کافی گرم ہو سکتا ہے:\n • ماخذ کا زیادہ استعمال کرنے والی ایپس (جیسے کہ گیمنگ، ویڈیو، یا نیویگیشن ایپس) کا استعمال کرنا\n • بڑی فائلز ڈاؤن لوڈ یا اپ لوڈ کرنا\n • اعلی درجہ حرارت میں فون کا استعمال کرنا"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"نگہداشت کے اقدامات ملاحظہ کریں"</string> - <string name="high_temp_title" msgid="2218333576838496100">"فون گرم ہو رہا ہے"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"فون کے ٹھنڈے ہو جانے تک کچھ خصوصیات محدود ہیں۔\nمزید معلومات کیلئے تھپتھپائیں"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"آپ کا فون خودکار طور پر ٹھنڈا ہونے کی کوشش کرے گا۔ آپ ابھی بھی اپنا فون استعمال کر سکتے ہیں، مگر ہو سکتا ہے یہ سست چلے۔\n\nایک بار آپ کا فون ٹھنڈا ہوجائے تو یہ معمول کے مطابق چلے گا۔"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"نگہداشت کے اقدامات ملاحظہ کریں"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"اپنے آلہ کو ان پلگ کریں"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"آپ کا آلہ چارجنگ پورٹ کے قریب گرم ہو رہا ہے۔ اگر یہ چارجر یا USB لوازمات سے منسلک ہے تو اسے ان پلگ کریں اور خیال رکھیں کہ کیبل بھی گرم ہو سکتی ہے۔"</string> @@ -943,7 +937,7 @@ <string name="controls_media_settings_button" msgid="5815790345117172504">"ترتیبات"</string> <string name="controls_media_playing_item_description" msgid="4531853311504359098">"<xliff:g id="APP_LABEL">%3$s</xliff:g> سے <xliff:g id="ARTIST_NAME">%2$s</xliff:g> کا <xliff:g id="SONG_NAME">%1$s</xliff:g> چل رہا ہے"</string> <string name="controls_media_seekbar_description" msgid="4389621713616214611">"<xliff:g id="ELAPSED_TIME">%1$s</xliff:g> از <xliff:g id="TOTAL_TIME">%2$s</xliff:g>"</string> - <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> چل رہی ہے"</string> + <string name="controls_media_empty_title" msgid="8296102892421573325">"<xliff:g id="APP_NAME">%1$s</xliff:g> چل رہی ہے"</string> <string name="controls_media_button_play" msgid="2705068099607410633">"چلائیں"</string> <string name="controls_media_button_pause" msgid="8614887780950376258">"روکیں"</string> <string name="controls_media_button_prev" msgid="8126822360056482970">"پچھلا ٹریک"</string> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 968be5174f31..d44054130a79 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"USB xususiyatini yoqish"</string> <string name="learn_more" msgid="4690632085667273811">"Batafsil"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Skrinshot"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Kengaytirilgan ochish yoniq emas"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Extend Unlock yoniq emas"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"rasm yuborildi"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Skrinshot saqlanmoqda…"</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Skrinshot ish profiliga saqlanmoqda…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Quvvat menyusi"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"<xliff:g id="ID_1">%1$d</xliff:g>-sahifa, jami: <xliff:g id="ID_2">%2$d</xliff:g> ta sahifa"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Ekran qulfi"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Qizigani uchun o‘chirildi"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Endi telefoningiz normal holatda ishlayapti.\nBatafsil axborot uchun bosing"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Telefon qizib ketganligi sababli sovitish uchun o‘chirib qo‘yilgan. Endi telefoningiz normal holatda ishlayapti.\n\nTelefon bu hollarda qizib ketishi mumkin:\n • Resurstalab ilovalar ishlatilganda (masalan, o‘yin, video yoki navigatsiya ilovalari)\n • Katta faylni yuklab olishda yoki yuklashda\n • Telefondan yuqori haroratda foydalanganda"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Batafsil axborot"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Telefon qizib ketdi"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Telefon sovib qolganda ayrim funksiyalari ishlamasligi mumkin.\nBatafsil axborot uchun bosing"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Telefon avtomatik ravishda o‘zini sovitadi. Telefoningizdan foydalanishda davom etishingiz mumkin, lekin u sekinroq ishlashi mumkin.\n\nTelefon sovishi bilan normal holatda ishlashni boshlaydi."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Batafsil axborot"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Qurilmani uzing"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Qurilmangiz quvvatlash porti yaqinida qizib ketmoqda. Agar quvvatlagich yoki USB aksessuarga ulangan boʻlsa, kabel qizib ketmasidan uni darhol uzing."</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 23fa188f796c..9938783408fb 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -69,7 +69,7 @@ <string name="usb_disable_contaminant_detection" msgid="3827082183595978641">"Bật USB"</string> <string name="learn_more" msgid="4690632085667273811">"Tìm hiểu thêm"</string> <string name="global_action_screenshot" msgid="2760267567509131654">"Chụp ảnh màn hình"</string> - <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Đã tắt tính năng Luôn mở khoá"</string> + <string name="global_action_smart_lock_disabled" msgid="6286551337177954859">"Đã tắt tính năng Kéo dài trạng thái mở khoá"</string> <string name="remote_input_image_insertion_text" msgid="4850791636452521123">"đã gửi hình ảnh"</string> <string name="screenshot_saving_title" msgid="2298349784913287333">"Đang lưu ảnh chụp màn hình..."</string> <string name="screenshot_saving_work_profile_title" msgid="5332829607308450880">"Đang lưu ảnh chụp màn hình vào hồ sơ công việc…"</string> @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Trình đơn nguồn"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Trang <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Màn hình khóa"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Điện thoại đã tắt do nhiệt"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Điện thoại của bạn đang chạy bình thường.\nHãy nhấn để biết thêm thông tin"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Do quá nóng nên điện thoại đã tắt để hạ nhiệt. Hiện điện thoại của bạn đang chạy bình thường.\n\nĐiện thoại có thể bị quá nóng nếu bạn:\n • Dùng các ứng dụng tốn nhiều tài nguyên (như ứng dụng trò chơi, video hoặc điều hướng)\n • Tải xuống hoặc tải lên tệp có dung lượng lớn\n • Dùng điện thoại ở nhiệt độ cao"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Xem các bước chăm sóc"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Điện thoại đang nóng lên"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Một số tính năng bị hạn chế trong khi điện thoại nguội dần.\nHãy nhấn để biết thêm thông tin"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Điện thoại của bạn sẽ tự động nguội dần. Bạn vẫn có thể sử dụng điện thoại, nhưng điện thoại có thể chạy chậm hơn. \n\nSau khi đã nguội, điện thoại sẽ chạy bình thường."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Xem các bước chăm sóc"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Rút thiết bị ra"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Phần gần cổng sạc của thiết bị đang nóng lên. Nếu thiết bị kết nối với bộ sạc hoặc phụ kiện USB, hãy rút ra một cách thận trọng vì cáp có thể cũng đang nóng."</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 18fc39692b82..f6c189c8ccef 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"电源菜单"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"第 <xliff:g id="ID_1">%1$d</xliff:g> 页,共 <xliff:g id="ID_2">%2$d</xliff:g> 页"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"锁定屏幕"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"手机因严重发热而自动关机"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"现在,您的手机已恢复正常运行。\n点按即可了解详情"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"由于发热严重,因此您的手机执行了自动关机以降温。现在,您的手机已恢复正常运行。\n\n以下情况可能会导致您的手机严重发热:\n • 使用占用大量资源的应用(例如游戏、视频或导航应用)\n • 下载或上传大型文件\n • 在高温环境下使用手机"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"查看处理步骤"</string> - <string name="high_temp_title" msgid="2218333576838496100">"手机温度上升中"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"手机降温时,部分功能的使用会受限制。\n点按即可了解详情"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"您的手机将自动尝试降温。您依然可以使用您的手机,但是手机运行速度可能会更慢。\n\n手机降温后,就会恢复正常的运行速度。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"查看处理步骤"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"拔出设备"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"设备的充电接口附近在发热。如果该设备已连接到充电器或 USB 配件,请立即拔掉,并注意充电线也可能会发热。"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index d222b7564242..8fb4e81bd81a 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源選單"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"第 <xliff:g id="ID_1">%1$d</xliff:g> 頁 (共 <xliff:g id="ID_2">%2$d</xliff:g> 頁)"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"螢幕鎖定"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"手機因過熱而關上"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"你的手機現已正常運作。\n輕按即可瞭解詳情"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"你的手機之前因過熱而關上降溫。手機現已正常運作。\n\n以下情況可能會導致手機過熱:\n • 使用耗用大量資源的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上載大型檔案\n • 在高溫環境下使用手機"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"查看保養步驟"</string> - <string name="high_temp_title" msgid="2218333576838496100">"手機溫度正在上升"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"手機降溫時,部分功能會受限制。\n輕按即可瞭解詳情"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"手機會自動嘗試降溫。你仍可以使用手機,但手機的運作速度可能較慢。\n\n手機降溫後便會恢復正常。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"查看保養步驟"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"拔除裝置"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"充電埠附近的裝置溫度正在上升。如裝置正連接充電器或 USB 配件,請拔除裝置並小心安全,因為電線的溫度可能也偏高。"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index e2f9c9ecc868..c09bb42fb776 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"電源鍵選單"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"第 <xliff:g id="ID_1">%1$d</xliff:g> 頁,共 <xliff:g id="ID_2">%2$d</xliff:g> 頁"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"鎖定畫面"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"手機先前過熱,因此關閉電源"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"手機現在已恢復正常運作。\n輕觸即可瞭解詳情"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"手機先前的溫度過高,因此關閉了電源以進行降溫。手機現在已恢復正常運作。\n\n以下情況可能會導致你的手機溫度過高:\n • 使用需要密集處理資料的應用程式 (例如遊戲、影片或導航應用程式)\n • 下載或上傳大型檔案\n • 在高溫環境下使用手機"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"查看處理步驟"</string> - <string name="high_temp_title" msgid="2218333576838496100">"手機變熱"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"手機降溫時,某些功能會受限。\n輕觸即可瞭解詳情"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"手機會自動嘗試降溫。你仍可繼續使用手機,但是手機的運作速度可能會較慢。\n\n手機降溫完畢後,就會恢復正常的運作速度。"</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"查看處理步驟"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"拔除裝置"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"裝置的充電埠附近越來越熱。如果裝置已連接充電器或 USB 配件,請立即拔除。此外,電線也可能會變熱,請特別留意。"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 74a688407b5a..35c8a2b5b855 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -759,13 +759,7 @@ <string name="accessibility_quick_settings_power_menu" msgid="6820426108301758412">"Imenyu yamandla"</string> <string name="accessibility_quick_settings_page" msgid="7506322631645550961">"Ikhasi <xliff:g id="ID_1">%1$d</xliff:g> kwangu-<xliff:g id="ID_2">%2$d</xliff:g>"</string> <string name="tuner_lock_screen" msgid="2267383813241144544">"Khiya isikrini"</string> - <string name="thermal_shutdown_title" msgid="2702966892682930264">"Ifoni ivaliwe ngenxa yokushisa"</string> - <string name="thermal_shutdown_message" msgid="6142269839066172984">"Ifoni yakho manje isebenza ngokuvamile.\nThepha ukuze uthole ulwazi olungeziwe"</string> - <string name="thermal_shutdown_dialog_message" msgid="6745684238183492031">"Ifoni yakho ibishisa kakhulu, ngakho-ke yacisha ukuze iphole. Ifoni yakho manje isebenza ngokuvamile.\n\nIfoni yakho ingashisa kakhulu uma:\n • Usebenzisa izinhlelo zokusebenza ezinkulu (njegegeyimu, ividiyo, noma izinhlelo zokusebenza zokuzula)\n • Landa noma layisha amafayela amakhulu\n • Sebenzisa ifoni yakho kumathempelesha aphezulu"</string> <string name="thermal_shutdown_dialog_help_text" msgid="6413474593462902901">"Bona izinyathelo zokunakekelwa"</string> - <string name="high_temp_title" msgid="2218333576838496100">"Ifoni iyafudumala"</string> - <string name="high_temp_notif_message" msgid="1277346543068257549">"Ezinye izici zikhawulelwe ngenkathi ifoni iphola.\nThepha mayelana nolwazi olwengeziwe"</string> - <string name="high_temp_dialog_message" msgid="3793606072661253968">"Ifoni yakho izozama ngokuzenzakalela ukuphola. Ungasasebenzisa ifoni yakho, kodwa ingasebenza ngokungasheshi.\n\nUma ifoni yakho isipholile, izosebenza ngokuvamile."</string> <string name="high_temp_dialog_help_text" msgid="7380171287943345858">"Bona izinyathelo zokunakekelwa"</string> <string name="high_temp_alarm_title" msgid="8654754369605452169">"Khipha idivayisi yakho"</string> <string name="high_temp_alarm_notify_message" msgid="3917622943609118956">"Idivayisi yakho iqala ukufudumala eduze kwembobo yokushaja. Uma ixhunywe kushaja noma insiza ye-USB, yikhiphe, futhi uqaphele njengoba ikhebuli ingase ifudumale."</string> diff --git a/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt b/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt index 070a45170d04..bca9c31052b9 100644 --- a/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt +++ b/packages/SystemUI/screenshot/src/com/android/systemui/testing/screenshot/ViewScreenshotTestRule.kt @@ -145,6 +145,7 @@ open class ViewScreenshotTestRule( activityRule.scenario.onActivity { activity -> dialog = dialogProvider(activity).apply { + val window = checkNotNull(window) // Make sure that the dialog draws full screen and fits the whole display // instead of the system bars. window.setDecorFitsSystemWindows(false) @@ -175,7 +176,7 @@ open class ViewScreenshotTestRule( } private fun Dialog.toBitmap(): Bitmap { - val window = window + val window = checkNotNull(window) return window.decorView.toBitmap(window) } diff --git a/packages/SystemUI/shared/Android.bp b/packages/SystemUI/shared/Android.bp index 28e786b71874..ca30e159a0ff 100644 --- a/packages/SystemUI/shared/Android.bp +++ b/packages/SystemUI/shared/Android.bp @@ -65,7 +65,7 @@ android_library { ], min_sdk_version: "current", plugins: ["dagger2-compiler"], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], } java_library { diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerKt.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerKt.kt index c1429335292f..5edd283bf131 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerKt.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerKt.kt @@ -27,6 +27,6 @@ object ActivityManagerKt { */ fun ActivityManager.isInForeground(packageName: String): Boolean { val tasks: List<ActivityManager.RunningTaskInfo> = getRunningTasks(1) - return tasks.isNotEmpty() && packageName == tasks[0].topActivity.packageName + return tasks.isNotEmpty() && packageName == tasks[0].topActivity?.packageName } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.kt b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.kt index d7e61d60aa55..ebc57d2f8af7 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/smartspace/SmartspaceState.kt @@ -31,15 +31,15 @@ class SmartspaceState() : Parcelable { var visibleOnScreen = false constructor(parcel: Parcel) : this() { - this.boundsOnScreen = parcel.readParcelable(Rect::javaClass.javaClass.classLoader) + this.boundsOnScreen = parcel.readParcelable(Rect::javaClass.javaClass.classLoader) ?: Rect() this.selectedPage = parcel.readInt() this.visibleOnScreen = parcel.readBoolean() } - override fun writeToParcel(dest: Parcel?, flags: Int) { - dest?.writeParcelable(boundsOnScreen, 0) - dest?.writeInt(selectedPage) - dest?.writeBoolean(visibleOnScreen) + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeParcelable(boundsOnScreen, 0) + dest.writeInt(selectedPage) + dest.writeBoolean(visibleOnScreen) } override fun describeContents(): Int { diff --git a/packages/SystemUI/shared/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProvider.kt b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProvider.kt index aca9907fec1b..dac130d684bd 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProvider.kt +++ b/packages/SystemUI/shared/src/com/android/systemui/unfold/util/NaturalRotationUnfoldProgressProvider.kt @@ -39,7 +39,7 @@ class NaturalRotationUnfoldProgressProvider( fun init() { rotationChangeProvider.addCallback(rotationListener) - rotationListener.onRotationChanged(context.display.rotation) + context.display?.rotation?.let { rotationListener.onRotationChanged(it) } } private val rotationListener = RotationListener { rotation -> diff --git a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt index 084295343bb0..734df940fd37 100644 --- a/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt +++ b/packages/SystemUI/src/com/android/keyguard/BouncerKeyguardMessageArea.kt @@ -105,7 +105,7 @@ open class BouncerKeyguardMessageArea(context: Context?, attrs: AttributeSet?) : hideAnimator.addListener( object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { super@BouncerKeyguardMessageArea.setMessage(msg, animate) } } @@ -118,7 +118,7 @@ open class BouncerKeyguardMessageArea(context: Context?, attrs: AttributeSet?) : showAnimator.addListener( object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { textAboutToShow = null } } diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt index 8ea4c31a5ac9..e393e60e87a7 100644 --- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt @@ -30,7 +30,7 @@ import android.view.ViewTreeObserver import androidx.annotation.VisibleForTesting import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle -import com.android.systemui.R +import com.android.systemui.customization.R import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main @@ -110,20 +110,20 @@ constructor( } value.smallClock.view.addOnAttachStateChangeListener( object : OnAttachStateChangeListener { - override fun onViewAttachedToWindow(p0: View?) { + override fun onViewAttachedToWindow(p0: View) { value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context)) } - override fun onViewDetachedFromWindow(p0: View?) { + override fun onViewDetachedFromWindow(p0: View) { } }) value.largeClock.view.addOnAttachStateChangeListener( object : OnAttachStateChangeListener { - override fun onViewAttachedToWindow(p0: View?) { + override fun onViewAttachedToWindow(p0: View) { value.events.onTimeFormatChanged(DateFormat.is24HourFormat(context)) } - override fun onViewDetachedFromWindow(p0: View?) { + override fun onViewDetachedFromWindow(p0: View) { } }) } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index ca4f2d389703..b4fb88701634 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -68,7 +68,9 @@ public class KeyguardClockSwitch extends RelativeLayout { int largeClockTopMargin = parent.getResources() .getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin); int targetHeight = parent.getResources() - .getDimensionPixelSize(R.dimen.large_clock_text_size) * 2; + .getDimensionPixelSize( + com.android.systemui.customization.R.dimen.large_clock_text_size) + * 2; int top = parent.getHeight() / 2 - targetHeight / 2 + largeClockTopMargin / 2; return new Rect( @@ -81,7 +83,8 @@ public class KeyguardClockSwitch extends RelativeLayout { /** Returns a region for the small clock to position itself, based on the given parent. */ public static Rect getSmallClockRegion(ViewGroup parent) { int targetHeight = parent.getResources() - .getDimensionPixelSize(R.dimen.small_clock_text_size); + .getDimensionPixelSize( + com.android.systemui.customization.R.dimen.small_clock_text_size); return new Rect( parent.getLeft(), parent.getTop(), diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 9ff338e8d5ab..f446e523afa9 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -1160,7 +1160,8 @@ public class KeyguardSecurityContainer extends ConstraintLayout { } drawable.setTint(iconColor); - Drawable bg = context.getDrawable(R.drawable.user_avatar_bg); + Drawable bg = context.getDrawable( + com.android.settingslib.R.drawable.user_avatar_bg); bg.setTintBlendMode(BlendMode.DST); bg.setTint(Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.colorSurfaceVariant)); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java index 61280affc29e..886a1b5f84cb 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java @@ -53,7 +53,7 @@ public class KeyguardSimPinViewController private ProgressDialog mSimUnlockProgressDialog; private CheckSimPin mCheckSimPinThread; - private int mRemainingAttempts; + private int mRemainingAttempts = -1; // Below flag is set to true during power-up or when a new SIM card inserted on device. // When this is true and when SIM card is PIN locked state, on PIN lock screen, message would // be displayed to inform user about the number of remaining PIN attempts left. diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java index 6854c97c3415..de33a308bd28 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusViewController.java @@ -23,6 +23,7 @@ import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_CL import android.animation.Animator; import android.animation.ValueAnimator; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.res.Configuration; import android.graphics.Rect; @@ -443,7 +444,8 @@ public class KeyguardStatusViewController extends ViewController<KeyguardStatusV @Nullable @Override - public Animator createAnimator(ViewGroup sceneRoot, @Nullable TransitionValues startValues, + public Animator createAnimator(@NonNull ViewGroup sceneRoot, + @Nullable TransitionValues startValues, @Nullable TransitionValues endValues) { if (startValues == null || endValues == null) { return null; diff --git a/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java b/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java index fa9a83ec9913..7a6b1c372a24 100644 --- a/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java +++ b/packages/SystemUI/src/com/android/systemui/GuestSessionNotification.java @@ -64,12 +64,15 @@ public final class GuestSessionNotification { } String contentText; if (userInfo.isEphemeral()) { - contentText = mContext.getString(R.string.guest_notification_ephemeral); + contentText = mContext.getString( + com.android.settingslib.R.string.guest_notification_ephemeral); } else if (isGuestFirstLogin) { - contentText = mContext.getString(R.string.guest_notification_non_ephemeral); + contentText = mContext.getString( + com.android.settingslib.R.string.guest_notification_non_ephemeral); } else { contentText = mContext.getString( - R.string.guest_notification_non_ephemeral_non_first_login); + com.android.settingslib.R.string + .guest_notification_non_ephemeral_non_first_login); } final Intent guestExitIntent = new Intent( @@ -89,7 +92,7 @@ public final class GuestSessionNotification { Notification.Builder builder = new Notification.Builder(mContext, NotificationChannels.ALERTS) - .setSmallIcon(R.drawable.ic_account_circle) + .setSmallIcon(com.android.settingslib.R.drawable.ic_account_circle) .setContentTitle(mContext.getString(R.string.guest_notification_session_active)) .setContentText(contentText) .setPriority(Notification.PRIORITY_DEFAULT) diff --git a/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java b/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java index 45077d2333b6..6f99a24b7312 100644 --- a/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java +++ b/packages/SystemUI/src/com/android/systemui/SlicePermissionActivity.java @@ -51,7 +51,11 @@ public class SlicePermissionActivity extends Activity implements OnClickListener super.onCreate(savedInstanceState); // Verify intent is valid - mUri = getIntent().getParcelableExtra(SliceProvider.EXTRA_BIND_URI); + try { + mUri = getIntent().getParcelableExtra(SliceProvider.EXTRA_BIND_URI); + } catch (Exception e) { + Log.w(TAG, "Failed to getParcelableExtra", e); + } mCallingPkg = getIntent().getStringExtra(SliceProvider.EXTRA_PKG); if (mUri == null || !SliceProvider.SLICE_TYPE.equals(getContentResolver().getType(mUri)) diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java index 7f4e78445759..c0fe0c160a36 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/floatingmenu/DismissAnimationController.java @@ -24,7 +24,6 @@ import android.view.MotionEvent; import androidx.annotation.NonNull; import androidx.dynamicanimation.animation.DynamicAnimation; -import com.android.systemui.R; import com.android.wm.shell.bubbles.DismissView; import com.android.wm.shell.common.magnetictarget.MagnetizedObject; @@ -157,9 +156,9 @@ class DismissAnimationController { void updateResources() { final float maxDismissSize = mDismissView.getResources().getDimensionPixelSize( - R.dimen.dismiss_circle_size); + com.android.wm.shell.R.dimen.dismiss_circle_size); mMinDismissSize = mDismissView.getResources().getDimensionPixelSize( - R.dimen.dismiss_circle_small); + com.android.wm.shell.R.dimen.dismiss_circle_small); mSizePercent = mMinDismissSize / maxDismissSize; } diff --git a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java index 263df3357d67..7f8b2509d857 100644 --- a/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/battery/BatteryMeterView.java @@ -106,7 +106,7 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView, defStyle, 0); final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor, - context.getColor(R.color.meter_background_color)); + context.getColor(com.android.settingslib.R.color.meter_background_color)); mPercentageStyleId = atts.getResourceId(R.styleable.BatteryMeterView_textAppearance, 0); mDrawable = new AccessorizedBatteryDrawable(context, frameColor); atts.recycle(); @@ -331,7 +331,9 @@ public class BatteryMeterView extends LinearLayout implements DarkReceiver { // TODO(b/140051051) final boolean systemSetting = 0 != whitelistIpcs(() -> Settings.System .getIntForUser(getContext().getContentResolver(), - SHOW_BATTERY_PERCENT, 0, UserHandle.USER_CURRENT)); + SHOW_BATTERY_PERCENT, getContext().getResources().getBoolean( + com.android.internal.R.bool.config_defaultBatteryPercentageSetting) + ? 1 : 0, UserHandle.USER_CURRENT)); boolean shouldShow = (mShowPercentAvailable && systemSetting && mShowPercentMode != MODE_OFF) || mShowPercentMode == MODE_ON diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index 6f0f6331ef50..66689250e95f 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -230,7 +230,7 @@ class AuthRippleController @Inject constructor( lightRevealScrim.revealAmount = animator.animatedValue as Float } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { // Reset light reveal scrim to the default, so the CentralSurfaces // can handle any subsequent light reveal changes // (ie: from dozing changes) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt index 5ede16d221b7..4c2dc41fb759 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt @@ -147,12 +147,12 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at retractDwellAnimator = AnimatorSet().apply { playTogether(retractDwellRippleAnimator, retractAlphaAnimator) addListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { dwellPulseOutAnimator?.cancel() drawDwell = true } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { drawDwell = false resetDwellAlpha() } @@ -182,13 +182,13 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at invalidate() } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { retractDwellAnimator?.cancel() dwellPulseOutAnimator?.cancel() drawDwell = true } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { drawDwell = false resetDwellAlpha() } @@ -239,14 +239,14 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at expandDwellRippleAnimator ) addListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { retractDwellAnimator?.cancel() fadeDwellAnimator?.cancel() visibility = VISIBLE drawDwell = true } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { drawDwell = false } }) @@ -273,12 +273,12 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at unlockedRippleAnimator = rippleAnimator.apply { addListener(object : AnimatorListenerAdapter() { - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { drawRipple = true visibility = VISIBLE } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { onAnimationEnd?.run() drawRipple = false visibility = GONE @@ -327,7 +327,7 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at } } - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { // To reduce overdraw, we mask the effect to a circle whose radius is big enough to cover // the active effect area. Values here should be kept in sync with the // animation implementation in the ripple shader. (Twice bigger) diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt index 54aef00a5a8c..449c00e55f65 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/SideFpsController.kt @@ -117,7 +117,7 @@ constructor( private var overlayView: View? = null set(value) { field?.let { oldView -> - val lottie = oldView.findViewById(R.id.sidefps_animation) as LottieAnimationView + val lottie = oldView.requireViewById(R.id.sidefps_animation) as LottieAnimationView lottie.pauseAnimation() windowManager.removeView(oldView) orientationListener.disable() @@ -262,7 +262,7 @@ constructor( } overlayOffsets = offsets - val lottie = view.findViewById(R.id.sidefps_animation) as LottieAnimationView + val lottie = view.requireViewById(R.id.sidefps_animation) as LottieAnimationView view.rotation = display.asSideFpsAnimationRotation( offsets.isYAligned(), @@ -434,7 +434,7 @@ private fun LottieAnimationView.addOverlayDynamicColor( for (key in listOf(".blue600", ".blue400")) { addValueCallback(KeyPath(key, "**"), LottieProperty.COLOR_FILTER) { PorterDuffColorFilter( - context.getColor(R.color.settingslib_color_blue400), + context.getColor(com.android.settingslib.R.color.settingslib_color_blue400), PorterDuff.Mode.SRC_ATOP ) } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt index 8352d0aeab35..5dafa61f9a27 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsFpmEmptyView.kt @@ -38,7 +38,8 @@ class UdfpsFpmEmptyView( override fun getDrawable(): UdfpsDrawable = fingerprintDrawable fun updateAccessibilityViewLocation(sensorBounds: Rect) { - val fingerprintAccessibilityView: View = findViewById(R.id.udfps_enroll_accessibility_view) + val fingerprintAccessibilityView: View = + requireViewById(R.id.udfps_enroll_accessibility_view) val params: ViewGroup.LayoutParams = fingerprintAccessibilityView.layoutParams params.width = sensorBounds.width() params.height = sensorBounds.height() diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractor.kt index 1f1a1b5c83bd..2a026675adcb 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/CredentialInteractor.kt @@ -89,7 +89,7 @@ constructor( ) val hat = gkResponse.gatekeeperHAT lockPatternUtils.removeGatekeeperPasswordHandle(pwHandle) - emit(CredentialStatus.Success.Verified(hat)) + emit(CredentialStatus.Success.Verified(checkNotNull(hat))) } else if (response.timeout > 0) { // if requests are being throttled, update the error message every // second until the temporary lock has expired @@ -226,8 +226,7 @@ private fun Context.getLastAttemptBeforeWipeProfileMessage( is BiometricPromptRequest.Credential.Password -> DevicePolicyResources.Strings.SystemUi.BIOMETRIC_DIALOG_WORK_PASSWORD_LAST_ATTEMPT } - return devicePolicyManager.resources.getString(id) { - // use fallback a string if not found + val getFallbackString = { val defaultId = when (request) { is BiometricPromptRequest.Credential.Pin -> @@ -239,6 +238,8 @@ private fun Context.getLastAttemptBeforeWipeProfileMessage( } getString(defaultId) } + + return devicePolicyManager.resources?.getString(id, getFallbackString) ?: getFallbackString() } private fun Context.getLastAttemptBeforeWipeUserMessage( @@ -266,8 +267,8 @@ private fun Context.getNowWipingMessage( DevicePolicyResources.Strings.SystemUi.BIOMETRIC_DIALOG_WORK_LOCK_FAILED_ATTEMPTS else -> DevicePolicyResources.UNDEFINED } - return devicePolicyManager.resources.getString(id) { - // use fallback a string if not found + + val getFallbackString = { val defaultId = when (userType) { UserType.PRIMARY -> @@ -279,4 +280,6 @@ private fun Context.getNowWipingMessage( } getString(defaultId) } + + return devicePolicyManager.resources?.getString(id, getFallbackString) ?: getFallbackString() } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt index a3f34ce7471d..b940ec85efbf 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/CredentialPasswordView.kt @@ -122,7 +122,7 @@ class CredentialPasswordView(context: Context, attrs: AttributeSet?) : titleView.ellipsize = TextUtils.TruncateAt.MARQUEE titleView.marqueeRepeatLimit = -1 // select to enable marquee unless a screen reader is enabled - titleView.isSelected = accessibilityManager.shouldMarquee() + titleView.isSelected = accessibilityManager?.shouldMarquee() ?: false } else { titleView.isSingleLine = false titleView.ellipsize = null diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt index 8486c3f96b21..a881c07021fc 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt @@ -88,27 +88,27 @@ object BiometricViewBinder { val textColorHint = view.resources.getColor(R.color.biometric_dialog_gray, view.context.theme) - val titleView = view.findViewById<TextView>(R.id.title) - val subtitleView = view.findViewById<TextView>(R.id.subtitle) - val descriptionView = view.findViewById<TextView>(R.id.description) + val titleView = view.requireViewById<TextView>(R.id.title) + val subtitleView = view.requireViewById<TextView>(R.id.subtitle) + val descriptionView = view.requireViewById<TextView>(R.id.description) // set selected for marquee titleView.isSelected = true subtitleView.isSelected = true descriptionView.movementMethod = ScrollingMovementMethod() - val iconViewOverlay = view.findViewById<LottieAnimationView>(R.id.biometric_icon_overlay) - val iconView = view.findViewById<LottieAnimationView>(R.id.biometric_icon) - val indicatorMessageView = view.findViewById<TextView>(R.id.indicator) + val iconViewOverlay = view.requireViewById<LottieAnimationView>(R.id.biometric_icon_overlay) + val iconView = view.requireViewById<LottieAnimationView>(R.id.biometric_icon) + val indicatorMessageView = view.requireViewById<TextView>(R.id.indicator) // Negative-side (left) buttons - val negativeButton = view.findViewById<Button>(R.id.button_negative) - val cancelButton = view.findViewById<Button>(R.id.button_cancel) - val credentialFallbackButton = view.findViewById<Button>(R.id.button_use_credential) + val negativeButton = view.requireViewById<Button>(R.id.button_negative) + val cancelButton = view.requireViewById<Button>(R.id.button_cancel) + val credentialFallbackButton = view.requireViewById<Button>(R.id.button_use_credential) // Positive-side (right) buttons - val confirmationButton = view.findViewById<Button>(R.id.button_confirm) - val retryButton = view.findViewById<Button>(R.id.button_try_again) + val confirmationButton = view.requireViewById<Button>(R.id.button_confirm) + val retryButton = view.requireViewById<Button>(R.id.button_try_again) // TODO(b/251476085): temporary workaround for the unsafe callbacks & legacy controllers val adapter = diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt index 1dffa80a084f..2b06f3aa4df3 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt @@ -71,7 +71,7 @@ object BiometricViewSizeBinder { } } - val iconHolderView = view.findViewById<View>(R.id.biometric_icon_frame) + val iconHolderView = view.requireViewById<View>(R.id.biometric_icon_frame) val iconPadding = view.resources.getDimension(R.dimen.biometric_dialog_icon_padding) val fullSizeYOffset = view.resources.getDimension(R.dimen.biometric_dialog_medium_to_large_translation_offset) @@ -198,7 +198,7 @@ object BiometricViewSizeBinder { } private fun View.isLandscape(): Boolean { - val r = context.display.rotation + val r = context.display?.rotation return r == Surface.ROTATION_90 || r == Surface.ROTATION_270 } diff --git a/packages/SystemUI/src/com/android/systemui/charging/WiredChargingRippleController.kt b/packages/SystemUI/src/com/android/systemui/charging/WiredChargingRippleController.kt index 5ca36ab39dba..ddb097491988 100644 --- a/packages/SystemUI/src/com/android/systemui/charging/WiredChargingRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/charging/WiredChargingRippleController.kt @@ -156,9 +156,9 @@ class WiredChargingRippleController @Inject constructor( } windowLayoutParams.packageName = context.opPackageName rippleView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener { - override fun onViewDetachedFromWindow(view: View?) {} + override fun onViewDetachedFromWindow(view: View) {} - override fun onViewAttachedToWindow(view: View?) { + override fun onViewAttachedToWindow(view: View) { layoutRipple() rippleView.startRipple(Runnable { windowManager.removeView(rippleView) @@ -176,7 +176,7 @@ class WiredChargingRippleController @Inject constructor( val height = bounds.height() val maxDiameter = Integer.max(width, height) * 2f rippleView.setMaxSize(maxDiameter, maxDiameter) - when (context.display.rotation) { + when (context.display?.rotation) { Surface.ROTATION_0 -> { rippleView.setCenter( width * normalizedPortPosX, height * normalizedPortPosY) diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingA11yDelegate.kt b/packages/SystemUI/src/com/android/systemui/classifier/FalsingA11yDelegate.kt index 63d57cc3fc8d..a9f3b77ceb5e 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingA11yDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingA11yDelegate.kt @@ -29,7 +29,7 @@ import javax.inject.Inject */ class FalsingA11yDelegate @Inject constructor(private val falsingCollector: FalsingCollector) : View.AccessibilityDelegate() { - override fun performAccessibilityAction(host: View?, action: Int, args: Bundle?): Boolean { + override fun performAccessibilityAction(host: View, action: Int, args: Bundle?): Boolean { if (action == ACTION_CLICK) { falsingCollector.onA11yAction() } diff --git a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt index 3e6ac86e2417..c0d1951c22ce 100644 --- a/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/common/ui/data/repository/ConfigurationRepository.kt @@ -100,7 +100,7 @@ constructor( .stateIn(scope, SharingStarted.WhileSubscribed(), getResolutionScale()) override fun getResolutionScale(): Float { - context.display.getDisplayInfo(displayInfo.value) + context.display?.getDisplayInfo(displayInfo.value) val maxDisplayMode = displayUtils.getMaximumResolutionDisplayMode(displayInfo.value.supportedModes) maxDisplayMode?.let { diff --git a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt index f17d0f307473..e627b68dc171 100644 --- a/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/contrast/ContrastDialog.kt @@ -61,14 +61,14 @@ class ContrastDialog( ) dismiss() } - setPositiveButton(R.string.done) { _, _ -> dismiss() } + setPositiveButton(com.android.settingslib.R.string.done) { _, _ -> dismiss() } super.onCreate(savedInstanceState) contrastButtons = mapOf( - CONTRAST_LEVEL_STANDARD to findViewById(R.id.contrast_button_standard), - CONTRAST_LEVEL_MEDIUM to findViewById(R.id.contrast_button_medium), - CONTRAST_LEVEL_HIGH to findViewById(R.id.contrast_button_high) + CONTRAST_LEVEL_STANDARD to requireViewById(R.id.contrast_button_standard), + CONTRAST_LEVEL_MEDIUM to requireViewById(R.id.contrast_button_medium), + CONTRAST_LEVEL_HIGH to requireViewById(R.id.contrast_button_high) ) contrastButtons.forEach { (contrastLevel, contrastButton) -> diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt index e8c97bf77271..4a534e9cc74d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt @@ -190,7 +190,7 @@ class ControlsControllerImpl @Inject constructor ( PREFS_CONTROLS_SEEDING_COMPLETED, mutableSetOf<String>()) val servicePackageSet = serviceInfoSet.map { it.packageName } prefs.edit().putStringSet(PREFS_CONTROLS_SEEDING_COMPLETED, - completedSeedingPackageSet.intersect(servicePackageSet)).apply() + completedSeedingPackageSet?.intersect(servicePackageSet) ?: emptySet()).apply() var changed = false favoriteComponentSet.subtract(serviceInfoSet).forEach { diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt index 773f42375a08..b387e4a66bd2 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsEditingActivity.kt @@ -154,7 +154,7 @@ open class ControlsEditingActivity @Inject constructor( private fun bindViews() { setContentView(R.layout.controls_management) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById<ViewGroup>(R.id.controls_management_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt index d4713d287945..da571b3af086 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsFavoritingActivity.kt @@ -216,7 +216,7 @@ open class ControlsFavoritingActivity @Inject constructor( ControlsAnimations.enterAnimation(pageIndicator).apply { addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { // Position the tooltip if necessary after animations are complete // so we can get the position on screen. The tooltip is not // rooted in the layout root. @@ -268,7 +268,7 @@ open class ControlsFavoritingActivity @Inject constructor( private fun bindViews() { setContentView(R.layout.controls_management) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById<ViewGroup>(R.id.controls_management_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt index fb19ac99d19e..d5b8693af42d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/management/ControlsProviderSelectorActivity.kt @@ -91,7 +91,7 @@ open class ControlsProviderSelectorActivity @Inject constructor( setContentView(R.layout.controls_management) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById<ViewGroup>(R.id.controls_management_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt index ff55b76d4db7..a13f717bc77d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ChallengeDialogs.kt @@ -106,10 +106,8 @@ object ChallengeDialogs { } ) - getWindow().apply { - setType(WINDOW_TYPE) - setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) - } + window?.setType(WINDOW_TYPE) + window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) setOnShowListener(DialogInterface.OnShowListener { _ -> val editText = requireViewById<EditText>(R.id.controls_pin_input) editText.setHint(instructions) @@ -153,9 +151,7 @@ object ChallengeDialogs { ) } return builder.create().apply { - getWindow().apply { - setType(WINDOW_TYPE) - } + window?.setType(WINDOW_TYPE) } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt index c04bc8792223..abe342320858 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -384,7 +384,7 @@ class ControlViewHolder( ) } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { stateAnimator = null } }) @@ -438,7 +438,7 @@ class ControlViewHolder( duration = 200L interpolator = Interpolators.LINEAR addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { statusRowUpdater.invoke() } }) @@ -450,7 +450,7 @@ class ControlViewHolder( statusAnimator = AnimatorSet().apply { playSequentially(fadeOut, fadeIn) addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { status.alpha = STATUS_ALPHA_ENABLED statusAnimator = null } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt index 4a22e4eecc2b..557dcf4accc7 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsActivity.kt @@ -72,7 +72,7 @@ open class ControlsActivity @Inject constructor( setContentView(R.layout.controls_fullscreen) - getLifecycle().addObserver( + lifecycle.addObserver( ControlsAnimations.observerForAnimations( requireViewById(R.id.control_detail_root), window, diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt index be50a1468f07..98f17f409184 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/DetailDialog.kt @@ -132,8 +132,8 @@ class DetailDialog( init { // To pass touches to the task inside TaskView. - window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL) - window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY) + window?.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL) + window?.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY) setContentView(R.layout.controls_detail_dialog) @@ -182,7 +182,7 @@ class DetailDialog( } // consume all insets to achieve slide under effect - window.getDecorView().setOnApplyWindowInsetsListener { + checkNotNull(window).decorView.setOnApplyWindowInsetsListener { v: View, insets: WindowInsets -> val l = v.getPaddingLeft() val r = v.getPaddingRight() @@ -202,7 +202,7 @@ class DetailDialog( } fun getTaskViewBounds(): Rect { - val wm = context.getSystemService(WindowManager::class.java) + val wm = checkNotNull(context.getSystemService(WindowManager::class.java)) val windowMetrics = wm.getCurrentWindowMetrics() val rect = windowMetrics.bounds val metricInsets = windowMetrics.windowInsets diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/RenderInfo.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/RenderInfo.kt index ad2b785ea5c5..dbbda9aad518 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/RenderInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/RenderInfo.kt @@ -67,7 +67,8 @@ data class RenderInfo( iconMap.put(resourceId, icon) } } - return RenderInfo(icon!!.constantState.newDrawable(context.resources), fg, bg) + return RenderInfo( + checkNotNull(icon?.constantState).newDrawable(context.resources), fg, bg) } fun registerComponentIcon(componentName: ComponentName, icon: Drawable) { diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt index 84cda5a541e3..3c2bfa0efc39 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/StatusBehavior.kt @@ -94,10 +94,8 @@ class StatusBehavior : Behavior { ) } cvh.visibleDialog = builder.create().apply { - getWindow().apply { - setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY) - show() - } + window?.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY) + show() } } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt index 1461135d3d3b..b2c95a63ad72 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt @@ -244,7 +244,7 @@ class ToggleRangeBehavior : Behavior { cvh.clipLayer.level = it.animatedValue as Int } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { rangeAnimator = null } }) @@ -335,7 +335,7 @@ class ToggleRangeBehavior : Behavior { } override fun onScroll( - e1: MotionEvent, + e1: MotionEvent?, e2: MotionEvent, xDiff: Float, yDiff: Float diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt index 83253563e969..003d2c73fa06 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayLifecycleOwner.kt @@ -28,7 +28,8 @@ import javax.inject.Inject class DreamOverlayLifecycleOwner @Inject constructor() : LifecycleOwner { val registry: LifecycleRegistry = LifecycleRegistry(this) - override fun getLifecycle(): Lifecycle { - return registry - } + override val lifecycle: Lifecycle + get() { + return registry + } } diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt index 70783418ddb4..b5b56b2b2108 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt @@ -161,7 +161,7 @@ class KeyboardBacklightDialog( } private fun updateIconTile() { - val iconTile = rootView.findViewById(BACKLIGHT_ICON_ID) as ImageView + val iconTile = rootView.requireViewById(BACKLIGHT_ICON_ID) as ImageView val backgroundDrawable = iconTile.background as ShapeDrawable if (currentLevel == 0) { iconTile.setColorFilter(dimmedIconColor) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt index 68e72c58972b..ff390348ff25 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardUnlockAnimationController.kt @@ -171,7 +171,6 @@ class KeyguardUnlockAnimationController @Inject constructor( * for the canned animation (if applicable) so interested parties can sync with it. If no * canned animation is playing, these are both 0. */ - @JvmDefault fun onUnlockAnimationStarted( playingCannedAnimation: Boolean, isWakeAndUnlockNotFromDream: Boolean, @@ -184,7 +183,6 @@ class KeyguardUnlockAnimationController @Inject constructor( * The keyguard is no longer visible in this state and the app/launcher behind the keyguard * is now completely visible. */ - @JvmDefault fun onUnlockAnimationFinished() {} } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt index af0abdff0c62..5e5caba060ae 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt @@ -34,7 +34,7 @@ import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.flow.flow import kotlinx.coroutines.withContext @SysUISingleton @@ -58,16 +58,21 @@ constructor( get() = R.drawable.ic_camera override val lockScreenState: Flow<KeyguardQuickAffordanceConfig.LockScreenState> - get() = - flowOf( - KeyguardQuickAffordanceConfig.LockScreenState.Visible( - icon = - Icon.Resource( - R.drawable.ic_camera, - ContentDescription.Resource(R.string.accessibility_camera_button) - ) - ) + get() = flow { + emit( + if (isLaunchable()) { + KeyguardQuickAffordanceConfig.LockScreenState.Visible( + icon = + Icon.Resource( + R.drawable.ic_camera, + ContentDescription.Resource(R.string.accessibility_camera_button) + ) + ) + } else { + KeyguardQuickAffordanceConfig.LockScreenState.Hidden + } ) + } override suspend fun getPickerScreenState(): KeyguardQuickAffordanceConfig.PickerScreenState { return if (isLaunchable()) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt index c019d21e00ed..5d7a3d432dcb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt @@ -59,7 +59,7 @@ constructor( conflatedCallbackFlow { val callback = object : QuickAccessWalletClient.OnWalletCardsRetrievedCallback { - override fun onWalletCardsRetrieved(response: GetWalletCardsResponse?) { + override fun onWalletCardsRetrieved(response: GetWalletCardsResponse) { val hasCards = response?.walletCards?.isNotEmpty() == true trySendWithFailureLogging( state( @@ -71,7 +71,7 @@ constructor( ) } - override fun onWalletCardRetrievalError(error: GetWalletCardsError?) { + override fun onWalletCardRetrievalError(error: GetWalletCardsError) { Log.e(TAG, "Wallet card retrieval error, message: \"${error?.message}\"") trySendWithFailureLogging( KeyguardQuickAffordanceConfig.LockScreenState.Hidden, @@ -133,13 +133,13 @@ constructor( return suspendCancellableCoroutine { continuation -> val callback = object : QuickAccessWalletClient.OnWalletCardsRetrievedCallback { - override fun onWalletCardsRetrieved(response: GetWalletCardsResponse?) { + override fun onWalletCardsRetrieved(response: GetWalletCardsResponse) { continuation.resumeWith( Result.success(response?.walletCards ?: emptyList()) ) } - override fun onWalletCardRetrievalError(error: GetWalletCardsError?) { + override fun onWalletCardRetrievalError(error: GetWalletCardsError) { continuation.resumeWith(Result.success(emptyList())) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt index 2f506bb6a18e..eb79cc57428a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepository.kt @@ -544,7 +544,7 @@ constructor( // We always want to invoke face detect in the main thread. faceAuthLogger.faceDetectionStarted() faceManager?.detectFace( - detectCancellationSignal, + checkNotNull(detectCancellationSignal), detectionCallback, FaceAuthenticateOptions.Builder().setUserId(currentUserId).build() ) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt index 482e9a3d09d7..5654faaa6266 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/LightRevealScrimRepository.kt @@ -136,12 +136,13 @@ constructor( private fun constructCircleRevealFromPoint(point: Point): LightRevealEffect { return with(point) { + val display = checkNotNull(context.display) CircleReveal( x, y, startRadius = 0, endRadius = - max(max(x, context.display.width - x), max(y, context.display.height - y)), + max(max(x, display.width - x), max(y, display.height - y)), ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt index 5ad6e5196f66..30ca6affcc0c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardBottomAreaViewBinder.kt @@ -488,7 +488,7 @@ object KeyguardBottomAreaViewBinder { return true } - override fun onLongClickUseDefaultHapticFeedback(view: View?) = false + override fun onLongClickUseDefaultHapticFeedback(view: View) = false } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt index b92d10474ccd..ece6ff278507 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/preview/KeyguardPreviewRenderer.kt @@ -97,7 +97,7 @@ constructor( private var host: SurfaceControlViewHost val surfacePackage: SurfaceControlViewHost.SurfacePackage - get() = host.surfacePackage + get() = checkNotNull(host.surfacePackage) private lateinit var largeClockHostView: FrameLayout private lateinit var smallClockHostView: FrameLayout diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt index 34a67403fc84..5f7991e62cd7 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt @@ -70,7 +70,7 @@ fun View.repeatWhenAttached( var lifecycleOwner: ViewLifecycleOwner? = null val onAttachListener = object : View.OnAttachStateChangeListener { - override fun onViewAttachedToWindow(v: View?) { + override fun onViewAttachedToWindow(v: View) { Assert.isMainThread() lifecycleOwner?.onDestroy() lifecycleOwner = @@ -81,7 +81,7 @@ fun View.repeatWhenAttached( ) } - override fun onViewDetachedFromWindow(v: View?) { + override fun onViewDetachedFromWindow(v: View) { lifecycleOwner?.onDestroy() lifecycleOwner = null } @@ -167,9 +167,10 @@ class ViewLifecycleOwner( registry.currentState = Lifecycle.State.DESTROYED } - override fun getLifecycle(): Lifecycle { - return registry - } + override val lifecycle: Lifecycle + get() { + return registry + } private fun updateState() { registry.currentState = diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarViewModel.kt index 35f5a8ca4345..a91917ab97c2 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/models/player/SeekBarViewModel.kt @@ -514,7 +514,7 @@ constructor( * Returns true when the down event of the scroll hits within the target box of the thumb. */ override fun onScroll( - eventStart: MotionEvent, + eventStart: MotionEvent?, event: MotionEvent, distanceX: Float, distanceY: Float @@ -528,7 +528,7 @@ constructor( * Gestures that include a fling are considered a false gesture on the seek bar. */ override fun onFling( - eventStart: MotionEvent, + eventStart: MotionEvent?, event: MotionEvent, velocityX: Float, velocityY: Float diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt index 207df6bc4422..a1291a4d6b0f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataFilter.kt @@ -149,11 +149,7 @@ constructor( // Check if smartspace has explicitly specified whether to re-activate resumable media. // The default behavior is to trigger if the smartspace data is active. val shouldTriggerResume = - if (data.cardAction?.extras?.containsKey(EXTRA_KEY_TRIGGER_RESUME) == true) { - data.cardAction.extras.getBoolean(EXTRA_KEY_TRIGGER_RESUME, true) - } else { - true - } + data.cardAction?.extras?.getBoolean(EXTRA_KEY_TRIGGER_RESUME, true) ?: true val shouldReactivate = shouldTriggerResume && !hasActiveMedia() && hasAnyMedia() && data.isActive @@ -269,9 +265,7 @@ constructor( "Cannot create dismiss action click action: extras missing dismiss_intent." ) } else if ( - dismissIntent.getComponent() != null && - dismissIntent.getComponent().getClassName() == - EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME + dismissIntent.component?.className == EXPORTED_SMARTSPACE_TRAMPOLINE_ACTIVITY_NAME ) { // Dismiss the card Smartspace data through Smartspace trampoline activity. context.startActivity(dismissIntent) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt index 6b993ce9e7bf..7a219c19a0f7 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaDataManager.kt @@ -22,6 +22,7 @@ import android.app.Notification import android.app.Notification.EXTRA_SUBSTITUTE_APP_NAME import android.app.PendingIntent import android.app.StatusBarManager +import android.app.smartspace.SmartspaceAction import android.app.smartspace.SmartspaceConfig import android.app.smartspace.SmartspaceManager import android.app.smartspace.SmartspaceSession @@ -1623,20 +1624,18 @@ class MediaDataManager( * SmartspaceTarget's data is invalid. */ private fun toSmartspaceMediaData(target: SmartspaceTarget): SmartspaceMediaData { - var dismissIntent: Intent? = null - if (target.baseAction != null && target.baseAction.extras != null) { - dismissIntent = - target.baseAction.extras.getParcelable(EXTRAS_SMARTSPACE_DISMISS_INTENT_KEY) - as Intent? - } + val baseAction: SmartspaceAction? = target.baseAction + val dismissIntent = + baseAction?.extras?.getParcelable(EXTRAS_SMARTSPACE_DISMISS_INTENT_KEY) as Intent? val isActive = when { !mediaFlags.isPersistentSsCardEnabled() -> true - target.baseAction == null -> true - else -> - target.baseAction.extras.getString(EXTRA_KEY_TRIGGER_SOURCE) != - EXTRA_VALUE_TRIGGER_PERIODIC + baseAction == null -> true + else -> { + val triggerSource = baseAction.extras?.getString(EXTRA_KEY_TRIGGER_SOURCE) + triggerSource != EXTRA_VALUE_TRIGGER_PERIODIC + } } packageName(target)?.let { diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaSessionBasedFilter.kt b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaSessionBasedFilter.kt index d6f941de1b6d..6a8ffb7d8c42 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaSessionBasedFilter.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/pipeline/MediaSessionBasedFilter.kt @@ -65,7 +65,7 @@ constructor( private val sessionListener = object : MediaSessionManager.OnActiveSessionsChangedListener { - override fun onActiveSessionsChanged(controllers: List<MediaController>) { + override fun onActiveSessionsChanged(controllers: List<MediaController>?) { handleControllersChanged(controllers) } } @@ -190,16 +190,18 @@ constructor( } } - private fun handleControllersChanged(controllers: List<MediaController>) { + private fun handleControllersChanged(controllers: List<MediaController>?) { packageControllers.clear() - controllers.forEach { controller -> + controllers?.forEach { controller -> packageControllers.get(controller.packageName)?.let { tokens -> tokens.add(controller) } ?: run { val tokens = mutableListOf(controller) packageControllers.put(controller.packageName, tokens) } } - tokensWithNotifications.retainAll(controllers.map { TokenId(it.sessionToken) }) + controllers?.map { TokenId(it.sessionToken) }?.let { + tokensWithNotifications.retainAll(it) + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt index 2b42604e7160..14d4b6800b0a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/ColorSchemeTransition.kt @@ -119,7 +119,7 @@ internal constructor( ::AnimatingColorTransition ) - val bgColor = context.getColor(com.android.systemui.R.color.material_dynamic_secondary95) + val bgColor = context.getColor(com.google.android.material.R.color.material_dynamic_secondary95) val surfaceColor = animatingColorTransitionFactory(bgColor, ::surfaceFromScheme) { surfaceColor -> val colorList = ColorStateList.valueOf(surfaceColor) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt index b46ebb22ff05..b9cc772e7136 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/IlluminationDrawable.kt @@ -195,7 +195,7 @@ class IlluminationDrawable : Drawable() { } addListener( object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { backgroundAnimation = null } } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt index 937a618df68f..646d1d0ff0fc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/LightSourceDrawable.kt @@ -98,11 +98,11 @@ class LightSourceDrawable : Drawable() { addListener( object : AnimatorListenerAdapter() { var cancelled = false - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { cancelled = true } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { if (cancelled) { return } @@ -226,7 +226,7 @@ class LightSourceDrawable : Drawable() { ) addListener( object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { rippleData.progress = 0f rippleAnimation = null invalidateSelf() @@ -270,11 +270,8 @@ class LightSourceDrawable : Drawable() { return bounds } - override fun onStateChange(stateSet: IntArray?): Boolean { + override fun onStateChange(stateSet: IntArray): Boolean { val changed = super.onStateChange(stateSet) - if (stateSet == null) { - return changed - } val wasPressed = pressed var enabled = false diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt index 1ace3168780a..ce50a11cd85d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselScrollHandler.kt @@ -127,19 +127,19 @@ class MediaCarouselScrollHandler( object : GestureDetector.SimpleOnGestureListener() { override fun onFling( eStart: MotionEvent?, - eCurrent: MotionEvent?, + eCurrent: MotionEvent, vX: Float, vY: Float ) = onFling(vX, vY) override fun onScroll( down: MotionEvent?, - lastMotion: MotionEvent?, + lastMotion: MotionEvent, distanceX: Float, distanceY: Float - ) = onScroll(down!!, lastMotion!!, distanceX) + ) = onScroll(down!!, lastMotion, distanceX) - override fun onDown(e: MotionEvent?): Boolean { + override fun onDown(e: MotionEvent): Boolean { if (falsingProtectionNeeded) { falsingCollector.onNotificationStartDismissing() } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt index fe8ebafdf9b4..c1c757e424dc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt @@ -180,20 +180,20 @@ constructor( object : AnimatorListenerAdapter() { private var cancelled: Boolean = false - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { cancelled = true animationPending = false rootView?.removeCallbacks(startAnimation) } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { isCrossFadeAnimatorRunning = false if (!cancelled) { applyTargetStateIfNotAnimating() } } - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { cancelled = false animationPending = false } @@ -606,7 +606,7 @@ constructor( val viewHost = UniqueObjectHostView(context) viewHost.addOnAttachStateChangeListener( object : View.OnAttachStateChangeListener { - override fun onViewAttachedToWindow(p0: View?) { + override fun onViewAttachedToWindow(p0: View) { if (rootOverlay == null) { rootView = viewHost.viewRootImpl.view rootOverlay = (rootView!!.overlay as ViewGroupOverlay) @@ -614,7 +614,7 @@ constructor( viewHost.removeOnAttachStateChangeListener(this) } - override fun onViewDetachedFromWindow(p0: View?) {} + override fun onViewDetachedFromWindow(p0: View) {} } ) return viewHost diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHost.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHost.kt index be570b4a1119..631a0b8471b8 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHost.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHost.kt @@ -144,12 +144,12 @@ constructor( setListeningToMediaData(true) hostView.addOnAttachStateChangeListener( object : OnAttachStateChangeListener { - override fun onViewAttachedToWindow(v: View?) { + override fun onViewAttachedToWindow(v: View) { setListeningToMediaData(true) updateViewVisibility() } - override fun onViewDetachedFromWindow(v: View?) { + override fun onViewDetachedFromWindow(v: View) { setListeningToMediaData(false) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt index 583c626d2156..16dfc2130402 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/SquigglyProgress.kt @@ -117,7 +117,7 @@ class SquigglyProgress : Drawable() { } addListener( object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { heightAnimator = null } } diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt index bbd3d33e45c8..da8e106d3019 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt @@ -201,13 +201,13 @@ open class MediaTttChipControllerReceiver @Inject constructor( } override fun updateView(newInfo: ChipReceiverInfo, currentView: ViewGroup) { - val packageName = newInfo.routeInfo.clientPackageName + val packageName: String? = newInfo.routeInfo.clientPackageName var iconInfo = MediaTttUtils.getIconInfoFromPackageName( context, packageName, isReceiver = true, ) { - logger.logPackageNotFound(packageName) + packageName?.let { logger.logPackageNotFound(it) } } if (newInfo.appNameOverride != null) { diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt index 50138024e268..fbf7e25981da 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttReceiverRippleController.kt @@ -68,9 +68,9 @@ constructor( ) rippleView.addOnAttachStateChangeListener( object : View.OnAttachStateChangeListener { - override fun onViewDetachedFromWindow(view: View?) {} + override fun onViewDetachedFromWindow(view: View) {} - override fun onViewAttachedToWindow(view: View?) { + override fun onViewAttachedToWindow(view: View) { if (view == null) { return } diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt index 0b0535df6228..35018f190394 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/ReceiverChipRippleView.kt @@ -54,7 +54,7 @@ class ReceiverChipRippleView(context: Context?, attrs: AttributeSet?) : RippleVi // Reset all listeners to animator. animator.removeAllListeners() animator.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { onAnimationEnd?.run() isStarted = false } @@ -86,7 +86,7 @@ class ReceiverChipRippleView(context: Context?, attrs: AttributeSet?) : RippleVi invalidate() } animator.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { animation?.let { visibility = GONE } onAnimationEnd?.run() isStarted = false diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt index f75f8b9a18f7..87d0098805b3 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt @@ -162,7 +162,7 @@ constructor( logger: MediaTttSenderLogger, instanceId: InstanceId, ): ChipbarInfo { - val packageName = routeInfo.clientPackageName + val packageName = checkNotNull(routeInfo.clientPackageName) val otherDeviceName = if (routeInfo.name.isBlank()) { context.getString(R.string.media_ttt_default_device_type) diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt index c816446d5c25..64de9bd76122 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/MediaProjectionRecentsViewController.kt @@ -88,7 +88,7 @@ constructor( .inflate(R.layout.media_projection_recent_tasks, parent, /* attachToRoot= */ false) as ViewGroup - val container = recentsRoot.findViewById<View>(R.id.media_projection_recent_tasks_container) + val container = recentsRoot.requireViewById<View>(R.id.media_projection_recent_tasks_container) container.setTaskHeightSize() val progress = recentsRoot.requireViewById<View>(R.id.media_projection_recent_tasks_loader) diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt index 2d75359bf835..a09935b9fb6a 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt @@ -68,7 +68,9 @@ constructor( } launch { val label = labelLoader.loadLabel(task.userId, component) - root.contentDescription = label ?: root.context.getString(R.string.unknown) + root.contentDescription = + label + ?: root.context.getString(com.android.settingslib.R.string.unknown) } } launch { diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java index 58e700f81388..25965fc86370 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleStoryIconFactory.java @@ -33,7 +33,6 @@ import android.view.ContextThemeWrapper; import androidx.core.graphics.drawable.RoundedBitmapDrawable; import com.android.settingslib.Utils; -import com.android.systemui.R; class PeopleStoryIconFactory implements AutoCloseable { @@ -59,7 +58,8 @@ class PeopleStoryIconFactory implements AutoCloseable { mIconSize = mDensity * iconSizeDp; mPackageManager = pm; mIconDrawableFactory = iconDrawableFactory; - mImportantConversationColor = mContext.getColor(R.color.important_conversation); + mImportantConversationColor = mContext.getColor( + com.android.launcher3.icons.R.color.important_conversation); mAccentColor = Utils.getColorAttr(mContext, com.android.internal.R.attr.colorAccentPrimaryVariant).getDefaultColor(); } @@ -224,4 +224,4 @@ class PeopleStoryIconFactory implements AutoCloseable { @Override public void close() { } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt b/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt index d8a429e5bb1a..a821d3ce8c07 100644 --- a/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/people/ui/view/PeopleViewBinder.kt @@ -140,13 +140,13 @@ object PeopleViewBinder { LayoutInflater.from(context) .inflate(R.layout.people_space_activity_no_conversations, /* root= */ view) - noConversationsView.findViewById<View>(R.id.got_it_button).setOnClickListener { + noConversationsView.requireViewById<View>(R.id.got_it_button).setOnClickListener { onGotItClicked() } // The Tile preview has colorBackground as its background. Change it so it's different than // the activity's background. - val item = noConversationsView.findViewById<LinearLayout>(android.R.id.background) + val item = noConversationsView.requireViewById<LinearLayout>(android.R.id.background) val shape = item.background as GradientDrawable val ta = context.theme.obtainStyledAttributes( diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyConfig.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyConfig.kt index d652889f0082..d949a2a0afe5 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyConfig.kt @@ -145,13 +145,10 @@ class PrivacyConfig @Inject constructor( } interface Callback { - @JvmDefault fun onFlagMicCameraChanged(flag: Boolean) {} - @JvmDefault fun onFlagLocationChanged(flag: Boolean) {} - @JvmDefault fun onFlagMediaProjectionChanged(flag: Boolean) {} } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt index a676150f44a2..eb8ef9bf3e50 100644 --- a/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt +++ b/packages/SystemUI/src/com/android/systemui/privacy/PrivacyItemController.kt @@ -216,7 +216,6 @@ class PrivacyItemController @Inject constructor( interface Callback : PrivacyConfig.Callback { fun onPrivacyItemsChanged(privacyItems: List<PrivacyItem>) - @JvmDefault fun onFlagAllChanged(flag: Boolean) {} } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 4c3699ced6e5..7c76c1ae1bf5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -180,7 +180,8 @@ public class HotspotTile extends QSTileImpl<BooleanState> { private String getSecondaryLabel(boolean isActive, boolean isTransient, boolean isDataSaverEnabled, int numConnectedDevices, boolean isWifiTetheringAllowed) { if (!isWifiTetheringAllowed) { - return mContext.getString(R.string.wifitrackerlib_admin_restricted_network); + return mContext.getString( + com.android.wifitrackerlib.R.string.wifitrackerlib_admin_restricted_network); } else if (isTransient) { return mContext.getString(R.string.quick_settings_hotspot_secondary_label_transient); } else if (isDataSaverEnabled) { diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt index b34004397520..15a03a7261fb 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/BaseScreenSharePermissionDialog.kt @@ -50,22 +50,20 @@ open class BaseScreenSharePermissionDialog( public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - window.apply { - addPrivateFlags(WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS) - setGravity(Gravity.CENTER) - } + window?.addPrivateFlags(WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS) + window?.setGravity(Gravity.CENTER) setContentView(R.layout.screen_share_dialog) - dialogTitle = findViewById(R.id.screen_share_dialog_title) - warning = findViewById(R.id.text_warning) - startButton = findViewById(android.R.id.button1) - cancelButton = findViewById(android.R.id.button2) + dialogTitle = requireViewById(R.id.screen_share_dialog_title) + warning = requireViewById(R.id.text_warning) + startButton = requireViewById(android.R.id.button1) + cancelButton = requireViewById(android.R.id.button2) updateIcon() initScreenShareOptions() createOptionsView(getOptionsViewLayoutId()) } private fun updateIcon() { - val icon = findViewById<ImageView>(R.id.screen_share_dialog_icon) + val icon = requireViewById<ImageView>(R.id.screen_share_dialog_icon) if (dialogIconTint != null) { icon.setColorFilter(context.getColor(dialogIconTint)) } @@ -92,7 +90,7 @@ open class BaseScreenSharePermissionDialog( options ) adapter.setDropDownViewResource(R.layout.screen_share_dialog_spinner_item_text) - screenShareModeSpinner = findViewById(R.id.screen_share_mode_spinner) + screenShareModeSpinner = requireViewById(R.id.screen_share_mode_spinner) screenShareModeSpinner.adapter = adapter screenShareModeSpinner.onItemSelectedListener = this } @@ -128,7 +126,7 @@ open class BaseScreenSharePermissionDialog( private fun createOptionsView(@LayoutRes layoutId: Int?) { if (layoutId == null) return - val stub = findViewById<View>(R.id.options_stub) as ViewStub + val stub = requireViewById<View>(R.id.options_stub) as ViewStub stub.layoutResource = layoutId stub.inflate() } diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt index 604d44967e68..e8683fbea735 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialog.kt @@ -100,11 +100,11 @@ class ScreenRecordPermissionDialog( @LayoutRes override fun getOptionsViewLayoutId(): Int = R.layout.screen_record_options private fun initRecordOptionsView() { - audioSwitch = findViewById(R.id.screenrecord_audio_switch) - tapsSwitch = findViewById(R.id.screenrecord_taps_switch) - tapsView = findViewById(R.id.show_taps) + audioSwitch = requireViewById(R.id.screenrecord_audio_switch) + tapsSwitch = requireViewById(R.id.screenrecord_taps_switch) + tapsView = requireViewById(R.id.show_taps) updateTapsViewVisibility() - options = findViewById(R.id.screen_recording_options) + options = requireViewById(R.id.screen_recording_options) val a: ArrayAdapter<*> = ScreenRecordingAdapter(context, android.R.layout.simple_spinner_dropdown_item, MODES) a.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java index 93e5021fd6e0..e93f737308ba 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScrollCaptureClient.java @@ -365,6 +365,9 @@ public class ScrollCaptureClient { @Override public void onImageAvailable(ImageReader reader) { synchronized (mLock) { + if (mCapturedImage != null) { + mCapturedImage.close(); + } mCapturedImage = mReader.acquireLatestImage(); if (mCapturedArea != null) { completeCaptureRequest(); diff --git a/packages/SystemUI/src/com/android/systemui/settings/DisplayTracker.kt b/packages/SystemUI/src/com/android/systemui/settings/DisplayTracker.kt index bb7f721ad61f..468a75d8276e 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/DisplayTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/DisplayTracker.kt @@ -52,12 +52,12 @@ interface DisplayTracker { interface Callback { /** Notifies that a display has been added. */ - @JvmDefault fun onDisplayAdded(displayId: Int) {} + fun onDisplayAdded(displayId: Int) {} /** Notifies that a display has been removed. */ - @JvmDefault fun onDisplayRemoved(displayId: Int) {} + fun onDisplayRemoved(displayId: Int) {} /** Notifies a display has been changed */ - @JvmDefault fun onDisplayChanged(displayId: Int) {} + fun onDisplayChanged(displayId: Int) {} } } diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt index 33a3125d1c68..93a3e905f0e0 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserTracker.kt @@ -71,7 +71,6 @@ interface UserTracker : UserContentResolverProvider, UserContextProvider { * Same as {@link onUserChanging(Int, Context, CountDownLatch)} but the latch will be * auto-decremented after the completion of this method. */ - @JvmDefault fun onUserChanging(newUser: Int, userContext: Context) {} /** @@ -82,7 +81,6 @@ interface UserTracker : UserContentResolverProvider, UserContextProvider { * user switch duration. When overriding this method, countDown() MUST be called on the * latch once execution is complete. */ - @JvmDefault fun onUserChanging(newUser: Int, userContext: Context, latch: CountDownLatch) { onUserChanging(newUser, userContext) latch.countDown() @@ -93,13 +91,11 @@ interface UserTracker : UserContentResolverProvider, UserContextProvider { * Override this method to run things after the screen is unfrozen for the user switch. * Please see {@link #onUserChanging} if you need to hide jank. */ - @JvmDefault fun onUserChanged(newUser: Int, userContext: Context) {} /** * Notifies that the current user's profiles have changed. */ - @JvmDefault fun onProfilesChanged(profiles: List<@JvmSuppressWildcards UserInfo>) {} } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt index 3af75cef3d4c..5f53b594a4b6 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt @@ -126,11 +126,11 @@ constructor( private lateinit var carrierIconSlots: List<String> private lateinit var mShadeCarrierGroupController: ShadeCarrierGroupController - private val batteryIcon: BatteryMeterView = header.findViewById(R.id.batteryRemainingIcon) - private val clock: Clock = header.findViewById(R.id.clock) - private val date: TextView = header.findViewById(R.id.date) - private val iconContainer: StatusIconContainer = header.findViewById(R.id.statusIcons) - private val mShadeCarrierGroup: ShadeCarrierGroup = header.findViewById(R.id.carrier_group) + private val batteryIcon: BatteryMeterView = header.requireViewById(R.id.batteryRemainingIcon) + private val clock: Clock = header.requireViewById(R.id.clock) + private val date: TextView = header.requireViewById(R.id.date) + private val iconContainer: StatusIconContainer = header.requireViewById(R.id.statusIcons) + private val mShadeCarrierGroup: ShadeCarrierGroup = header.requireViewById(R.id.carrier_group) private var roundedCorners = 0 private var cutout: DisplayCutout? = null @@ -555,7 +555,7 @@ constructor( inner class CustomizerAnimationListener( private val enteringCustomizing: Boolean, ) : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) header.animate().setListener(null) if (enteringCustomizing) { @@ -563,7 +563,7 @@ constructor( } } - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { super.onAnimationStart(animation) if (!enteringCustomizing) { customizing = false diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt index b7551cf3408e..e284ac5b6a77 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt @@ -80,7 +80,7 @@ abstract class ShadeModule { fun providesNotificationStackScrollLayout( notificationShadeWindowView: NotificationShadeWindowView, ): NotificationStackScrollLayout { - return notificationShadeWindowView.findViewById(R.id.notification_stack_scroller) + return notificationShadeWindowView.requireViewById(R.id.notification_stack_scroller) } // TODO(b/277762009): Only allow this view's controller to inject the view. See above. @@ -89,7 +89,7 @@ abstract class ShadeModule { fun providesNotificationPanelView( notificationShadeWindowView: NotificationShadeWindowView, ): NotificationPanelView { - return notificationShadeWindowView.findViewById(R.id.notification_panel) + return notificationShadeWindowView.requireViewById(R.id.notification_panel) } @Provides @@ -97,7 +97,7 @@ abstract class ShadeModule { fun providesLightRevealScrim( notificationShadeWindowView: NotificationShadeWindowView, ): LightRevealScrim { - return notificationShadeWindowView.findViewById(R.id.light_reveal_scrim) + return notificationShadeWindowView.requireViewById(R.id.light_reveal_scrim) } // TODO(b/277762009): Only allow this view's controller to inject the view. See above. @@ -106,7 +106,7 @@ abstract class ShadeModule { fun providesAuthRippleView( notificationShadeWindowView: NotificationShadeWindowView, ): AuthRippleView? { - return notificationShadeWindowView.findViewById(R.id.auth_ripple) + return notificationShadeWindowView.requireViewById(R.id.auth_ripple) } // TODO(b/277762009): Only allow this view's controller to inject the view. See above. @@ -115,7 +115,7 @@ abstract class ShadeModule { fun providesLockIconView( notificationShadeWindowView: NotificationShadeWindowView, ): LockIconView { - return notificationShadeWindowView.findViewById(R.id.lock_icon_view) + return notificationShadeWindowView.requireViewById(R.id.lock_icon_view) } // TODO(b/277762009): Only allow this view's controller to inject the view. See above. @@ -124,7 +124,7 @@ abstract class ShadeModule { fun providesTapAgainView( notificationPanelView: NotificationPanelView, ): TapAgainView { - return notificationPanelView.findViewById(R.id.shade_falsing_tap_again) + return notificationPanelView.requireViewById(R.id.shade_falsing_tap_again) } // TODO(b/277762009): Only allow this view's controller to inject the view. See above. @@ -134,7 +134,7 @@ abstract class ShadeModule { fun providesShadeHeaderView( notificationShadeWindowView: NotificationShadeWindowView, ): MotionLayout { - val stub = notificationShadeWindowView.findViewById<ViewStub>(R.id.qs_header_stub) + val stub = notificationShadeWindowView.requireViewById<ViewStub>(R.id.qs_header_stub) val layoutId = R.layout.combined_qs_header stub.layoutResource = layoutId return stub.inflate() as MotionLayout @@ -151,7 +151,7 @@ abstract class ShadeModule { @SysUISingleton @Named(SHADE_HEADER) fun providesBatteryMeterView(@Named(SHADE_HEADER) view: MotionLayout): BatteryMeterView { - return view.findViewById(R.id.batteryRemainingIcon) + return view.requireViewById(R.id.batteryRemainingIcon) } @Provides @@ -185,7 +185,7 @@ abstract class ShadeModule { fun providesOngoingPrivacyChip( @Named(SHADE_HEADER) header: MotionLayout, ): OngoingPrivacyChip { - return header.findViewById(R.id.privacy_chip) + return header.requireViewById(R.id.privacy_chip) } @Provides @@ -194,7 +194,7 @@ abstract class ShadeModule { fun providesStatusIconContainer( @Named(SHADE_HEADER) header: MotionLayout, ): StatusIconContainer { - return header.findViewById(R.id.statusIcons) + return header.requireViewById(R.id.statusIcons) } } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt index 56bb1a6020cf..5804040a8676 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeStateEvents.kt @@ -29,12 +29,12 @@ interface ShadeStateEvents { interface ShadeStateEventsListener { /** Invoked when the notification panel starts or stops collapsing. */ - @JvmDefault fun onPanelCollapsingChanged(isCollapsing: Boolean) {} + fun onPanelCollapsingChanged(isCollapsing: Boolean) {} /** * Invoked when the notification panel starts or stops launching an [android.app.Activity]. */ - @JvmDefault fun onLaunchingActivityChanged(isLaunchingActivity: Boolean) {} + fun onLaunchingActivityChanged(isLaunchingActivity: Boolean) {} /** * Invoked when the "expand immediate" attribute changes. @@ -45,6 +45,6 @@ interface ShadeStateEvents { * Another example is when full QS is showing, and we swipe up from the bottom. Instead of * going to QQS, the panel fully collapses. */ - @JvmDefault fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {} + fun onExpandImmediateChanged(isExpandImmediateEnabled: Boolean) {} } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt b/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt index 37140ec2aa32..520976746785 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BatteryStatusChip.kt @@ -37,8 +37,8 @@ class BatteryStatusChip @JvmOverloads constructor(context: Context, attrs: Attri init { inflate(context, R.layout.battery_status_chip, this) - roundedContainer = findViewById(R.id.rounded_container) - batteryMeterView = findViewById(R.id.battery_meter_view) + roundedContainer = requireViewById(R.id.rounded_container) + batteryMeterView = requireViewById(R.id.battery_meter_view) updateResources() } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt index 823bb355a307..b2b6e1424f98 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt @@ -419,15 +419,14 @@ constructor( revealGradientCenter.y = top + (revealGradientHeight / 2f) } - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { if ( - canvas == null || - revealGradientWidth <= 0 || - revealGradientHeight <= 0 || - revealAmount == 0f + revealGradientWidth <= 0 || + revealGradientHeight <= 0 || + revealAmount == 0f ) { if (revealAmount < 1f) { - canvas?.drawColor(revealGradientEndColor) + canvas.drawColor(revealGradientEndColor) } return } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index c098f455512a..2d65c3884abf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -475,7 +475,7 @@ class LockscreenShadeTransitionController @Inject constructor( } if (endlistener != null) { dragDownAnimator.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { endlistener.invoke() } }) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt index 750272d65659..17b4e3baef13 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/MediaArtworkProcessor.kt @@ -66,7 +66,7 @@ class MediaArtworkProcessor @Inject constructor() { inBitmap = oldIn.copy(Bitmap.Config.ARGB_8888, false /* isMutable */) oldIn.recycle() } - val outBitmap = Bitmap.createBitmap(inBitmap.width, inBitmap.height, + val outBitmap = Bitmap.createBitmap(inBitmap?.width ?: 0, inBitmap?.height ?: 0, Bitmap.Config.ARGB_8888) input = Allocation.createFromBitmap(renderScript, inBitmap, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index 0e20df6ecfba..59c63aa28d0f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -272,7 +272,7 @@ class NotificationShadeDepthController @Inject constructor( blurUtils.blurRadiusOfRatio(animation.animatedValue as Float) } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { keyguardAnimator = null wakeAndUnlockBlurRadius = 0f } @@ -553,7 +553,6 @@ class NotificationShadeDepthController @Inject constructor( */ fun onWallpaperZoomOutChanged(zoomOut: Float) - @JvmDefault fun onBlurRadiusChanged(blurRadius: Int) {} } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt index 599beecb0e00..6be407af581d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/connectivity/SignalCallback.kt @@ -29,7 +29,6 @@ interface SignalCallback { * * @param wifiIndicators a box type containing enough information to properly draw a Wi-Fi icon */ - @JvmDefault fun setWifiIndicators(wifiIndicators: WifiIndicators) {} /** @@ -42,7 +41,6 @@ interface SignalCallback { * NOTE: phones can have multiple subscriptions, so this [mobileDataIndicators] object should be * indexed based on its [subId][MobileDataIndicators.subId] */ - @JvmDefault fun setMobileDataIndicators(mobileDataIndicators: MobileDataIndicators) {} /** @@ -51,7 +49,6 @@ interface SignalCallback { * * @param subs a [SubscriptionInfo] for each subscription that we know about */ - @JvmDefault fun setSubs(subs: List<@JvmSuppressWildcards SubscriptionInfo>) {} /** @@ -63,7 +60,6 @@ interface SignalCallback { * @param show whether or not to show a "no sim" view * @param simDetected whether any SIM is detected or not */ - @JvmDefault fun setNoSims(show: Boolean, simDetected: Boolean) {} /** @@ -72,7 +68,6 @@ interface SignalCallback { * * @param icon an [IconState] for the current ethernet status */ - @JvmDefault fun setEthernetIndicators(icon: IconState) {} /** @@ -80,7 +75,6 @@ interface SignalCallback { * * @param icon an [IconState] for the current airplane mode status */ - @JvmDefault fun setIsAirplaneMode(icon: IconState) {} /** @@ -88,7 +82,6 @@ interface SignalCallback { * * @param enabled the current mobile data feature ennabled state */ - @JvmDefault fun setMobileDataEnabled(enabled: Boolean) {} /** @@ -97,7 +90,6 @@ interface SignalCallback { * @param noValidatedNetwork whether there is any validated network. * @param noNetworksAvailable whether there is any WiFi networks available. */ - @JvmDefault fun setConnectivityStatus( noDefaultNetwork: Boolean, noValidatedNetwork: Boolean, @@ -109,7 +101,6 @@ interface SignalCallback { * @param statusIcon the icon for the call indicator * @param subId subscription ID for which to update the UI */ - @JvmDefault fun setCallIndicator(statusIcon: IconState, subId: Int) {} } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index eddb6835318d..d1e0a7193948 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -234,7 +234,7 @@ open class PrivacyDotViewController @Inject constructor( } // Set the dot's view gravity to hug the status bar - (corner.findViewById<View>(R.id.privacy_dot) + (corner.requireViewById<View>(R.id.privacy_dot) .layoutParams as FrameLayout.LayoutParams) .gravity = rotatedCorner.innerGravity() } @@ -255,7 +255,7 @@ open class PrivacyDotViewController @Inject constructor( // in every rotation. The only thing we need to check is rtl val rtl = state.layoutRtl val size = Point() - tl.context.display.getRealSize(size) + tl.context.display?.getRealSize(size) val currentRotation = RotationUtils.getExactRotation(tl.context) val displayWidth: Int diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt index 2a18f1f51ace..ef9089099a86 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt @@ -49,11 +49,10 @@ interface SystemStatusAnimationCallback { fun onSystemEventAnimationFinish(hasPersistentDot: Boolean): Animator? { return null } // Best method name, change my mind - @JvmDefault fun onSystemStatusAnimationTransitionToPersistentDot(contentDescription: String?): Animator? { return null } - @JvmDefault fun onHidePersistentDot(): Animator? { return null } + fun onHidePersistentDot(): Animator? { return null } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index 6c1dc8c0a51d..fe1144e0deac 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -165,7 +165,11 @@ constructor( now.isBefore(Instant.ofEpochMilli(t.expiryTimeMillis)) } if (weatherTarget != null) { - val weatherData = WeatherData.fromBundle(weatherTarget.baseAction.extras) + val weatherData = weatherTarget.baseAction?.extras?.let { extras -> + WeatherData.fromBundle( + extras, + ) + } if (weatherData != null) { keyguardUpdateMonitor.sendWeatherData(weatherData) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 9ba219903272..8d1e8d0ab524 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -613,20 +613,20 @@ constructor( interface WakeUpListener { /** Called whenever the notifications are fully hidden or shown */ - @JvmDefault fun onFullyHiddenChanged(isFullyHidden: Boolean) {} + fun onFullyHiddenChanged(isFullyHidden: Boolean) {} /** * Called whenever the pulseExpansion changes * * @param expandingChanged if the user has started or stopped expanding */ - @JvmDefault fun onPulseExpansionChanged(expandingChanged: Boolean) {} + fun onPulseExpansionChanged(expandingChanged: Boolean) {} /** * Called when the animator started by [scheduleDelayedDozeAmountAnimation] begins running * after the start delay, or after it ends/is cancelled. */ - @JvmDefault fun onDelayedDozeAmountAnimationRunning(running: Boolean) {} + fun onDelayedDozeAmountAnimationRunning(running: Boolean) {} } companion object { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS b/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS index ed80f33be701..5558ab1e2af2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/OWNERS @@ -2,13 +2,17 @@ set noparent # Bug component: 78010 -aaliomer@google.com +aioana@google.com aroederer@google.com +iyz@google.com jeffdq@google.com juliacr@google.com juliatuttle@google.com +kurucz@google.com +liuyining@google.com lynhan@google.com -steell@google.com +matiashe@google.com +valiiftime@google.com yurilin@google.com per-file MediaNotificationProcessor.java = ethibodeau@google.com, asc@google.com diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt index 212f2c215989..087383aba4af 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/Roundable.kt @@ -22,33 +22,27 @@ interface Roundable { /** Current top roundness */ @get:FloatRange(from = 0.0, to = 1.0) - @JvmDefault val topRoundness: Float get() = roundableState.topRoundness /** Current bottom roundness */ @get:FloatRange(from = 0.0, to = 1.0) - @JvmDefault val bottomRoundness: Float get() = roundableState.bottomRoundness /** Max radius in pixel */ - @JvmDefault val maxRadius: Float get() = roundableState.maxRadius /** Current top corner in pixel, based on [topRoundness] and [maxRadius] */ - @JvmDefault val topCornerRadius: Float get() = topRoundness * maxRadius /** Current bottom corner in pixel, based on [bottomRoundness] and [maxRadius] */ - @JvmDefault val bottomCornerRadius: Float get() = bottomRoundness * maxRadius /** Get and update the current radii */ - @JvmDefault val updatedRadii: FloatArray get() = roundableState.radiiBuffer.also { radii -> @@ -71,7 +65,6 @@ interface Roundable { * @param sourceType the source from which the request for roundness comes. * @return Whether the roundness was changed. */ - @JvmDefault fun requestTopRoundness( @FloatRange(from = 0.0, to = 1.0) value: Float, sourceType: SourceType, @@ -116,7 +109,6 @@ interface Roundable { * @param sourceType the source from which the request for roundness comes. * @return Whether the roundness was changed. */ - @JvmDefault fun requestTopRoundness( @FloatRange(from = 0.0, to = 1.0) value: Float, sourceType: SourceType, @@ -140,7 +132,6 @@ interface Roundable { * @param sourceType the source from which the request for roundness comes. * @return Whether the roundness was changed. */ - @JvmDefault fun requestBottomRoundness( @FloatRange(from = 0.0, to = 1.0) value: Float, sourceType: SourceType, @@ -185,7 +176,6 @@ interface Roundable { * @param sourceType the source from which the request for roundness comes. * @return Whether the roundness was changed. */ - @JvmDefault fun requestBottomRoundness( @FloatRange(from = 0.0, to = 1.0) value: Float, sourceType: SourceType, @@ -210,7 +200,6 @@ interface Roundable { * @param animate true if it should animate to that value. * @return Whether the roundness was changed. */ - @JvmDefault fun requestRoundness( @FloatRange(from = 0.0, to = 1.0) top: Float, @FloatRange(from = 0.0, to = 1.0) bottom: Float, @@ -237,7 +226,6 @@ interface Roundable { * @param sourceType the source from which the request for roundness comes. * @return Whether the roundness was changed. */ - @JvmDefault fun requestRoundness( @FloatRange(from = 0.0, to = 1.0) top: Float, @FloatRange(from = 0.0, to = 1.0) bottom: Float, @@ -261,7 +249,6 @@ interface Roundable { * @param sourceType the source from which the request for roundness comes. * @param animate true if it should animate to that value. */ - @JvmDefault fun requestRoundnessReset(sourceType: SourceType, animate: Boolean) { requestRoundness(top = 0f, bottom = 0f, sourceType = sourceType, animate = animate) } @@ -275,19 +262,16 @@ interface Roundable { * * @param sourceType the source from which the request for roundness comes. */ - @JvmDefault fun requestRoundnessReset(sourceType: SourceType) { requestRoundnessReset(sourceType = sourceType, animate = roundableState.targetView.isShown) } /** Apply the roundness changes, usually means invalidate the [RoundableState.targetView]. */ - @JvmDefault fun applyRoundnessAndInvalidate() { roundableState.targetView.invalidate() } /** @return true if top or bottom roundness is not zero. */ - @JvmDefault fun hasRoundedCorner(): Boolean { return topRoundness != 0f || bottomRoundness != 0f } @@ -298,7 +282,6 @@ interface Roundable { * * This method reuses the previous [radii] for performance reasons. */ - @JvmDefault fun updateRadii( topCornerRadius: Float, bottomCornerRadius: Float, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt index 16f1a45ba83f..1b43922f652a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ViewGroupFadeHelper.kt @@ -74,7 +74,7 @@ class ViewGroupFadeHelper { root.setTag(R.id.view_group_fade_helper_previous_value_tag, newAlpha) } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { endRunnable?.run() } }) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt index 4ebf33739faa..ad22c618a827 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifPipelineChoreographer.kt @@ -51,7 +51,7 @@ interface NotifPipelineChoreographer { object NotifPipelineChoreographerModule @Module -private interface PrivateModule { +interface PrivateModule { @Binds fun bindChoreographer(impl: NotifPipelineChoreographerImpl): NotifPipelineChoreographer } @@ -59,7 +59,7 @@ private interface PrivateModule { private const val TIMEOUT_MS: Long = 100 @SysUISingleton -private class NotifPipelineChoreographerImpl @Inject constructor( +class NotifPipelineChoreographerImpl @Inject constructor( private val viewChoreographer: Choreographer, @Main private val executor: DelayableExecutor ) : NotifPipelineChoreographer { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt index aeeeb4fb054d..9ba1f7aa2f66 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt @@ -38,7 +38,7 @@ import javax.inject.Inject interface SensitiveContentCoordinatorModule @Module -private interface PrivateSensitiveContentCoordinatorModule { +interface PrivateSensitiveContentCoordinatorModule { @Binds fun bindCoordinator(impl: SensitiveContentCoordinatorImpl): SensitiveContentCoordinator } @@ -47,7 +47,7 @@ private interface PrivateSensitiveContentCoordinatorModule { interface SensitiveContentCoordinator : Coordinator @CoordinatorScope -private class SensitiveContentCoordinatorImpl @Inject constructor( +class SensitiveContentCoordinatorImpl @Inject constructor( private val dynamicPrivacyController: DynamicPrivacyController, private val lockscreenUserManager: NotificationLockscreenUserManager, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt index 357c5b219fa2..c00bb93ff66e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/dagger/CoordinatorsModule.kt @@ -50,7 +50,7 @@ interface CoordinatorsSubcomponent { @Module(includes = [ SensitiveContentCoordinatorModule::class, ]) -private abstract class InternalCoordinatorsModule { +abstract class InternalCoordinatorsModule { @Binds @Internal abstract fun bindNotifCoordinators(impl: NotifCoordinatorsImpl): NotifCoordinators diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt index 7b59266e207a..49990d9c559e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/render/SectionHeaderController.kt @@ -38,7 +38,7 @@ interface SectionHeaderController { } @SectionHeaderScope -internal class SectionHeaderNodeControllerImpl @Inject constructor( +class SectionHeaderNodeControllerImpl @Inject constructor( @NodeLabel override val nodeLabel: String, private val layoutInflater: LayoutInflater, @HeaderText @StringRes private val headerTextResId: Int, @@ -103,4 +103,4 @@ internal class SectionHeaderNodeControllerImpl @Inject constructor( override fun offerToKeepInParentForAnimation(): Boolean = false override fun removeFromParentIfKeptForAnimation(): Boolean = false override fun resetKeepInParentForAnimation() {} -}
\ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt index 2a9cfd034dce..75801a8db65d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationSectionHeadersModule.kt @@ -145,7 +145,7 @@ interface SectionHeaderControllerSubcomponent { } @Module -private abstract class SectionHeaderBindingModule { +abstract class SectionHeaderBindingModule { @Binds abstract fun bindsNodeController(impl: SectionHeaderNodeControllerImpl): NodeController @Binds abstract fun bindsSectionHeaderController( impl: SectionHeaderNodeControllerImpl @@ -182,4 +182,4 @@ annotation class HeaderClickAction @Scope @Retention(AnnotationRetention.BINARY) -annotation class SectionHeaderScope
\ No newline at end of file +annotation class SectionHeaderScope diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt index 90014c2518d1..b2c32cd42d1d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/interruption/KeyguardNotificationVisibilityProvider.kt @@ -57,7 +57,7 @@ interface KeyguardNotificationVisibilityProvider { object KeyguardNotificationVisibilityProviderModule @Module -private interface KeyguardNotificationVisibilityProviderImplModule { +interface KeyguardNotificationVisibilityProviderImplModule { @Binds fun bindImpl(impl: KeyguardNotificationVisibilityProviderImpl): KeyguardNotificationVisibilityProvider @@ -69,7 +69,7 @@ private interface KeyguardNotificationVisibilityProviderImplModule { } @SysUISingleton -private class KeyguardNotificationVisibilityProviderImpl @Inject constructor( +class KeyguardNotificationVisibilityProviderImpl @Inject constructor( @Main private val handler: Handler, private val keyguardStateController: KeyguardStateController, private val lockscreenUserManager: NotificationLockscreenUserManager, @@ -87,6 +87,7 @@ private class KeyguardNotificationVisibilityProviderImpl @Inject constructor( private val userTrackerCallback = object : UserTracker.Callback { override fun onUserChanged(newUser: Int, userContext: Context) { + readShowSilentNotificationSetting() if (isLockedOrLocking) { // maybe public mode changed notifyStateChanged("onUserSwitched") diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt index 38a1579222b1..9c4aa072a83d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ChannelEditorListView.kt @@ -60,7 +60,7 @@ class ChannelEditorListView(c: Context, attrs: AttributeSet) : LinearLayout(c, a override fun onFinishInflate() { super.onFinishInflate() - appControlRow = findViewById(R.id.app_control) + appControlRow = requireViewById(R.id.app_control) } /** @@ -143,9 +143,9 @@ class AppControlView(c: Context, attrs: AttributeSet) : LinearLayout(c, attrs) { lateinit var switch: Switch override fun onFinishInflate() { - iconView = findViewById(R.id.icon) - channelName = findViewById(R.id.app_name) - switch = findViewById(R.id.toggle) + iconView = requireViewById(R.id.icon) + channelName = requireViewById(R.id.app_name) + switch = requireViewById(R.id.toggle) setOnClickListener { switch.toggle() } } @@ -174,9 +174,9 @@ class ChannelRow(c: Context, attrs: AttributeSet) : LinearLayout(c, attrs) { override fun onFinishInflate() { super.onFinishInflate() - channelName = findViewById(R.id.channel_name) - channelDescription = findViewById(R.id.channel_description) - switch = findViewById(R.id.toggle) + channelName = requireViewById(R.id.channel_name) + channelDescription = requireViewById(R.id.channel_description) + switch = requireViewById(R.id.toggle) switch.setOnCheckedChangeListener { _, b -> channel?.let { controller.proposeEditForChannel(it, if (b) it.importance else IMPORTANCE_NONE) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java index 124df8c3b815..2a0da658ed59 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java @@ -1396,8 +1396,8 @@ public class NotificationContentView extends FrameLayout implements Notification if (shouldShowBubbleButton(entry)) { // explicitly resolve drawable resource using SystemUI's theme Drawable d = mContext.getDrawable(entry.isBubble() - ? R.drawable.bubble_ic_stop_bubble - : R.drawable.bubble_ic_create_bubble); + ? com.android.wm.shell.R.drawable.bubble_ic_stop_bubble + : com.android.wm.shell.R.drawable.bubble_ic_create_bubble); String contentDescription = mContext.getResources().getString(entry.isBubble() ? R.string.notification_conversation_unbubble diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterImpl.kt index 1827a46958f8..2a4eba486089 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ActivityStarterImpl.kt @@ -879,8 +879,8 @@ constructor( val packages: Array<String> = context.resources.getStringArray(R.array.system_ui_packages) for (pkg in packages) { - if (intent.component == null) break - if (pkg == intent.component.packageName) { + val componentName = intent.component ?: break + if (pkg == componentName.packageName) { return UserHandle(UserHandle.myUserId()) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java index 2677c3f2a8bd..bb64beb1ad5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DarkIconDispatcherImpl.java @@ -23,7 +23,6 @@ import android.graphics.Rect; import android.util.ArrayMap; import android.widget.ImageView; -import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; @@ -54,8 +53,10 @@ public class DarkIconDispatcherImpl implements SysuiDarkIconDispatcher, Context context, LightBarTransitionsController.Factory lightBarTransitionsControllerFactory, DumpManager dumpManager) { - mDarkModeIconColorSingleTone = context.getColor(R.color.dark_mode_icon_color_single_tone); - mLightModeIconColorSingleTone = context.getColor(R.color.light_mode_icon_color_single_tone); + mDarkModeIconColorSingleTone = context.getColor( + com.android.settingslib.R.color.dark_mode_icon_color_single_tone); + mLightModeIconColorSingleTone = context.getColor( + com.android.settingslib.R.color.light_mode_icon_color_single_tone); mTransitionsController = lightBarTransitionsControllerFactory.create(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt index d433814d7ce4..d832b6b75200 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.kt @@ -32,6 +32,7 @@ import com.android.systemui.keyguard.ui.viewmodel.KeyguardBottomAreaViewModel import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.VibratorHelper +import com.android.systemui.util.animation.requiresRemeasuring /** * Renders the bottom area of the lock-screen. Concerned primarily with the quick affordance UI @@ -94,7 +95,7 @@ constructor( ambientIndicationArea?.let { nonNullAmbientIndicationArea -> // remove old ambient indication from its parent val originalAmbientIndicationView = - oldBottomArea.findViewById<View>(R.id.ambient_indication_container) + oldBottomArea.requireViewById<View>(R.id.ambient_indication_container) (originalAmbientIndicationView.parent as ViewGroup).removeView( originalAmbientIndicationView ) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 720eeba0fd4e..c54415a87ef6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -458,8 +458,9 @@ public class KeyguardStatusBarView extends RelativeLayout { @ColorInt int textColor = Utils.getColorAttrDefaultColor(mContext, R.attr.wallpaperTextColor); @ColorInt int iconColor = Utils.getColorStateListDefaultColor(mContext, - Color.luminance(textColor) < 0.5 ? R.color.dark_mode_icon_color_single_tone : - R.color.light_mode_icon_color_single_tone); + Color.luminance(textColor) < 0.5 + ? com.android.settingslib.R.color.dark_mode_icon_color_single_tone + : com.android.settingslib.R.color.light_mode_icon_color_single_tone); float intensity = textColor == Color.WHITE ? 0 : 1; mCarrierLabel.setTextColor(iconColor); @@ -467,7 +468,7 @@ public class KeyguardStatusBarView extends RelativeLayout { if (userSwitcherName != null) { userSwitcherName.setTextColor(Utils.getColorStateListDefaultColor( mContext, - R.color.light_mode_icon_color_single_tone)); + com.android.settingslib.R.color.light_mode_icon_color_single_tone)); } if (iconManager != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java index f26a84ba20a3..dcd2b722b15f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java @@ -35,7 +35,6 @@ import androidx.annotation.NonNull; import com.android.internal.colorextraction.ColorExtractor.GradientColors; import com.android.internal.view.AppearanceRegion; import com.android.systemui.Dumpable; -import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; @@ -127,8 +126,10 @@ public class LightBarController implements BatteryController.BatteryStateChangeC DumpManager dumpManager, DisplayTracker displayTracker) { mUseNewLightBarLogic = featureFlags.isEnabled(Flags.NEW_LIGHT_BAR_LOGIC); - mDarkIconColor = ctx.getColor(R.color.dark_mode_icon_color_single_tone); - mLightIconColor = ctx.getColor(R.color.light_mode_icon_color_single_tone); + mDarkIconColor = ctx.getColor( + com.android.settingslib.R.color.dark_mode_icon_color_single_tone); + mLightIconColor = ctx.getColor( + com.android.settingslib.R.color.light_mode_icon_color_single_tone); mStatusBarIconController = (SysuiDarkIconDispatcher) darkIconDispatcher; mBatteryController = batteryController; mBatteryController.addCallback(this); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt index e6cb68ff17a9..0f6d6244354a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt @@ -67,8 +67,8 @@ class PhoneStatusBarViewController private constructor( override fun onViewAttached() { if (moveFromCenterAnimationController == null) return - val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_start_side_except_heads_up) - val systemIconArea: ViewGroup = mView.findViewById(R.id.status_bar_end_side_content) + val statusBarLeftSide: View = mView.requireViewById(R.id.status_bar_start_side_except_heads_up) + val systemIconArea: ViewGroup = mView.requireViewById(R.id.status_bar_end_side_content) val viewsToAnimate = arrayOf( statusBarLeftSide, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt index c850d4f9c56b..ad1817019284 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt @@ -117,11 +117,11 @@ class StatusBarContentInsetsProvider @Inject constructor( * status bar area is contiguous. */ fun currentRotationHasCornerCutout(): Boolean { - val cutout = context.display.cutout ?: return false + val cutout = checkNotNull(context.display).cutout ?: return false val topBounds = cutout.boundingRectTop val point = Point() - context.display.getRealSize(point) + checkNotNull(context.display).getRealSize(point) return topBounds.left <= 0 || topBounds.right >= point.x } @@ -161,7 +161,7 @@ class StatusBarContentInsetsProvider @Inject constructor( */ fun getStatusBarContentInsetsForRotation(@Rotation rotation: Int): Pair<Int, Int> = traceSection(tag = "StatusBarContentInsetsProvider.getStatusBarContentInsetsForRotation") { - val displayCutout = context.display.cutout + val displayCutout = checkNotNull(context.display).cutout val key = getCacheKey(rotation, displayCutout) val screenBounds = context.resources.configuration.windowConfiguration.maxBounds @@ -198,7 +198,7 @@ class StatusBarContentInsetsProvider @Inject constructor( fun getStatusBarContentAreaForRotation( @Rotation rotation: Int ): Rect { - val displayCutout = context.display.cutout + val displayCutout = checkNotNull(context.display).cutout val key = getCacheKey(rotation, displayCutout) return insetsCache[key] ?: getAndSetCalculatedAreaForRotation( rotation, displayCutout, getResourcesForRotation(rotation, context), key) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java index bb223650facc..baf94fcba634 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java @@ -427,7 +427,8 @@ public class SystemUIDialog extends AlertDialog implements ViewRootImpl.ConfigCh // We first look for the background on the dialogContentWithBackground added by // DialogLaunchAnimator. If it's not there, we use the background of the DecorView. View viewWithBackground = decorView.findViewByPredicate( - view -> view.getTag(R.id.tag_dialog_background) != null); + view -> view.getTag( + com.android.systemui.animation.R.id.tag_dialog_background) != null); Drawable background = viewWithBackground != null ? viewWithBackground.getBackground() : decorView.getBackground(); Insets insets = background != null ? background.getOpticalInsets() : Insets.NONE; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt index 135307accd13..5a90edde342e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt @@ -101,18 +101,18 @@ class UnlockedScreenOffAnimationController @Inject constructor( } } addListener(object : AnimatorListenerAdapter() { - override fun onAnimationCancel(animation: Animator?) { + override fun onAnimationCancel(animation: Animator) { if (lightRevealScrim.revealEffect !is CircleReveal) { lightRevealScrim.revealAmount = 1f } } - override fun onAnimationEnd(animation: Animator?) { + override fun onAnimationEnd(animation: Animator) { lightRevealAnimationPlaying = false interactionJankMonitor.end(CUJ_SCREEN_OFF) } - override fun onAnimationStart(animation: Animator?) { + override fun onAnimationStart(animation: Animator) { interactionJankMonitor.begin( mCentralSurfaces.notificationShadeWindowView, CUJ_SCREEN_OFF) } @@ -339,7 +339,7 @@ class UnlockedScreenOffAnimationController @Inject constructor( // portrait. If we're in another orientation, disable the screen off animation so we don't // animate in the keyguard AOD UI sideways or upside down. if (!keyguardStateController.isKeyguardScreenRotationAllowed && - context.display.rotation != Surface.ROTATION_0) { + context.display?.rotation != Surface.ROTATION_0) { return false } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index fcae23b068bf..0d057f349dd3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -718,9 +718,9 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private void initOperatorName() { int subId = SubscriptionManager.getDefaultDataSubscriptionId(); if (mCarrierConfigTracker.getShowOperatorNameInStatusBarConfig(subId)) { - ViewStub stub = mStatusBar.findViewById(R.id.operator_name); + View view = mStatusBar.findViewById(R.id.operator_name); mOperatorNameViewController = - mOperatorNameViewControllerFactory.create((OperatorNameView) stub.inflate()); + mOperatorNameViewControllerFactory.create((OperatorNameView) view); mOperatorNameViewController.init(); // This view should not be visible on lock-screen if (mKeyguardStateController.isShowing()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java index 730ecded58e2..8f9f0196abfa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentModule.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.phone.fragment.dagger; import android.view.View; +import android.view.ViewStub; import com.android.systemui.R; import com.android.systemui.battery.BatteryMeterView; @@ -95,7 +96,7 @@ public interface StatusBarFragmentModule { @StatusBarFragmentScope @Named(OPERATOR_NAME_VIEW) static View provideOperatorNameView(@RootView PhoneStatusBarView view) { - return view.findViewById(R.id.operator_name); + return ((ViewStub) view.findViewById(R.id.operator_name_stub)).inflate(); } /** */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherContainer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherContainer.kt index 270c592ae4fd..12594771a0df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherContainer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherContainer.kt @@ -34,7 +34,7 @@ class StatusBarUserSwitcherContainer( override fun onFinishInflate() { super.onFinishInflate() - text = findViewById(R.id.current_user_name) - avatar = findViewById(R.id.current_user_avatar) + text = requireViewById(R.id.current_user_name) + avatar = requireViewById(R.id.current_user_avatar) } }
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt index 49504827e073..ffb743ff926c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt @@ -128,7 +128,8 @@ public class DeviceControlsControllerImpl @Inject constructor( val prefs = userContextProvider.userContext.getSharedPreferences( PREFS_CONTROLS_FILE, Context.MODE_PRIVATE) - val seededPackages = prefs.getStringSet(PREFS_CONTROLS_SEEDING_COMPLETED, emptySet()) + val seededPackages = + prefs.getStringSet(PREFS_CONTROLS_SEEDING_COMPLETED, emptySet()) ?: emptySet() val controlsController = controlsComponent.getControlsController().get() val componentsToSeed = mutableListOf<ComponentName>() @@ -174,7 +175,8 @@ public class DeviceControlsControllerImpl @Inject constructor( } private fun addPackageToSeededSet(prefs: SharedPreferences, pkg: String) { - val seededPackages = prefs.getStringSet(PREFS_CONTROLS_SEEDING_COMPLETED, emptySet()) + val seededPackages = + prefs.getStringSet(PREFS_CONTROLS_SEEDING_COMPLETED, emptySet()) ?: emptySet() val updatedPkgs = seededPackages.toMutableSet() updatedPkgs.add(pkg) prefs.edit().putStringSet(PREFS_CONTROLS_SEEDING_COMPLETED, updatedPkgs).apply() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java index c8ee647cf8a8..880e0d2eef31 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java @@ -319,7 +319,7 @@ public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> drawable = new CircleFramedDrawable(mCurrentUser.picture, avatarSize); } - Drawable bg = mContext.getDrawable(R.drawable.user_avatar_bg); + Drawable bg = mContext.getDrawable(com.android.settingslib.R.drawable.user_avatar_bg); drawable = new LayerDrawable(new Drawable[]{bg, drawable}); return drawable; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java index 66b52563c0a9..2d04ffa9e624 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherController.java @@ -534,7 +534,7 @@ public class KeyguardUserSwitcherController extends ViewController<KeyguardUserS } drawable.setTint(mResources.getColor(iconColorRes, mContext.getTheme())); - Drawable bg = mContext.getDrawable(R.drawable.user_avatar_bg); + Drawable bg = mContext.getDrawable(com.android.settingslib.R.drawable.user_avatar_bg); drawable = new LayerDrawable(new Drawable[]{bg, drawable}); return drawable; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt index d4abc40c4ff8..d31c00120866 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/RemoteInput.kt @@ -41,7 +41,7 @@ interface RemoteInputViewSubcomponent { } @Module -private interface InternalRemoteInputViewModule { +interface InternalRemoteInputViewModule { @Binds fun bindController(impl: RemoteInputViewControllerImpl): RemoteInputViewController } diff --git a/packages/SystemUI/src/com/android/systemui/stylus/StylusManager.kt b/packages/SystemUI/src/com/android/systemui/stylus/StylusManager.kt index 27aaa6828036..eb7d339f5b42 100644 --- a/packages/SystemUI/src/com/android/systemui/stylus/StylusManager.kt +++ b/packages/SystemUI/src/com/android/systemui/stylus/StylusManager.kt @@ -353,8 +353,8 @@ constructor( // before CoreStartables run, and will not be removed. // In many cases, it reports the battery level of the stylus. registerBatteryListener(deviceId) - } else if (device.bluetoothAddress != null) { - onStylusBluetoothConnected(deviceId, device.bluetoothAddress) + } else { + device.bluetoothAddress?.let { onStylusBluetoothConnected(deviceId, it) } } } } diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java index 32ecb6786a51..ecaf7921a4df 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerActivity.java @@ -61,7 +61,7 @@ public class TunerActivity extends Activity implements protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTheme(R.style.Theme_AppCompat_DayNight); + setTheme(androidx.appcompat.R.style.Theme_AppCompat_DayNight); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); requestWindowFeature(Window.FEATURE_NO_TITLE); diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbContaminantActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbContaminantActivity.java index d10e890f3c02..534049b65cb4 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbContaminantActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbContaminantActivity.java @@ -75,7 +75,12 @@ public class UsbContaminantActivity extends Activity implements View.OnClickList mLearnMore.setVisibility(View.VISIBLE); } - mEnableUsb.setOnClickListener(this); + if (!mUsbPort.supportsEnableContaminantPresenceDetection()) { + mEnableUsb.setVisibility(View.GONE); + } else { + mEnableUsb.setOnClickListener(this); + } + mGotIt.setOnClickListener(this); mLearnMore.setOnClickListener(this); } diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherFullscreenDialog.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherFullscreenDialog.kt index 72786efc416d..5ad963035e36 100644 --- a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherFullscreenDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherFullscreenDialog.kt @@ -60,7 +60,7 @@ class UserSwitchFullscreenDialog( override fun getWidth(): Int { val displayMetrics = context.resources.displayMetrics.apply { - context.display.getRealMetrics(this) + checkNotNull(context.display).getRealMetrics(this) } return displayMetrics.widthPixels } diff --git a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt index 088cd93bdf7e..ee84580ac4ec 100644 --- a/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt +++ b/packages/SystemUI/src/com/android/systemui/user/UserSwitcherPopupMenu.kt @@ -52,22 +52,22 @@ class UserSwitcherPopupMenu( override fun show() { // need to call show() first in order to construct the listView super.show() - val listView = getListView() + listView?.apply { + isVerticalScrollBarEnabled = false + isHorizontalScrollBarEnabled = false - listView.setVerticalScrollBarEnabled(false) - listView.setHorizontalScrollBarEnabled(false) + // Creates a transparent spacer between items + val shape = ShapeDrawable() + shape.alpha = 0 + divider = shape + dividerHeight = res.getDimensionPixelSize( + R.dimen.bouncer_user_switcher_popup_divider_height) - // Creates a transparent spacer between items - val shape = ShapeDrawable() - shape.setAlpha(0) - listView.setDivider(shape) - listView.setDividerHeight(res.getDimensionPixelSize( - R.dimen.bouncer_user_switcher_popup_divider_height)) - - val height = res.getDimensionPixelSize(R.dimen.bouncer_user_switcher_popup_header_height) - listView.addHeaderView(createSpacer(height), null, false) - listView.addFooterView(createSpacer(height), null, false) - setWidth(findMaxWidth(listView)) + val height = res.getDimensionPixelSize(R.dimen.bouncer_user_switcher_popup_header_height) + addHeaderView(createSpacer(height), null, false) + addFooterView(createSpacer(height), null, false) + setWidth(findMaxWidth(this)) + } super.show() } diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt index a487f538e59c..21f0ee2715e5 100644 --- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserInteractor.kt @@ -768,7 +768,9 @@ constructor( userId: Int, ): Drawable { if (isGuest) { - return checkNotNull(applicationContext.getDrawable(R.drawable.ic_account_circle)) + return checkNotNull( + applicationContext.getDrawable(com.android.settingslib.R.drawable.ic_account_circle) + ) } // TODO(b/246631653): cache the bitmaps to avoid the background work to fetch them. diff --git a/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt b/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt index e74232df3ac3..1ac86ce6162b 100644 --- a/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/user/legacyhelper/ui/LegacyUserUiHelper.kt @@ -42,13 +42,13 @@ object LegacyUserUiHelper { isManageUsers: Boolean, ): Int { return if (isAddUser && isTablet) { - R.drawable.ic_account_circle_filled + com.android.settingslib.R.drawable.ic_account_circle_filled } else if (isAddUser) { R.drawable.ic_add } else if (isGuest) { - R.drawable.ic_account_circle + com.android.settingslib.R.drawable.ic_account_circle } else if (isAddSupervisedUser) { - R.drawable.ic_add_supervised_user + com.android.settingslib.R.drawable.ic_add_supervised_user } else if (isManageUsers) { R.drawable.ic_manage_users } else { @@ -67,7 +67,7 @@ object LegacyUserUiHelper { val resourceId: Int? = getGuestUserRecordNameResourceId(record) return when { resourceId != null -> context.getString(resourceId) - record.info != null -> record.info.name + record.info != null -> checkNotNull(record.info.name) else -> context.getString( getUserSwitcherActionTextResourceId( diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt b/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt index afd72e7ed1be..aeed5fc59281 100644 --- a/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/user/ui/viewmodel/UserSwitcherViewModel.kt @@ -128,7 +128,7 @@ constructor( viewKey = model.id, name = if (model.isGuest && model.isSelected) { - Text.Resource(R.string.guest_exit_quick_settings_button) + Text.Resource(com.android.settingslib.R.string.guest_exit_quick_settings_button) } else { model.name }, diff --git a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java index 2efeda932ff3..904a98b5e54d 100644 --- a/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java +++ b/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java @@ -112,7 +112,7 @@ public class NotificationChannels implements CoreStartable { // priority, so it can be shown in all times. nm.createNotificationChannel(new NotificationChannel( TVPIP, - context.getString(R.string.notification_channel_tv_pip), + context.getString(com.android.wm.shell.R.string.notification_channel_tv_pip), NotificationManager.IMPORTANCE_MAX)); } } diff --git a/packages/SystemUI/src/com/android/systemui/util/UserAwareController.kt b/packages/SystemUI/src/com/android/systemui/util/UserAwareController.kt index 693c2708b0f7..5582ced1bad6 100644 --- a/packages/SystemUI/src/com/android/systemui/util/UserAwareController.kt +++ b/packages/SystemUI/src/com/android/systemui/util/UserAwareController.kt @@ -23,7 +23,6 @@ import android.os.UserHandle * changes. */ interface UserAwareController { - @JvmDefault fun changeUser(newUser: UserHandle) {} val currentUserId: Int diff --git a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt index 56c5d3b433ff..7866d7673937 100644 --- a/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/util/animation/TransitionLayout.kt @@ -223,11 +223,11 @@ class TransitionLayout @JvmOverloads constructor( } } - override fun dispatchDraw(canvas: Canvas?) { - canvas?.save() - canvas?.clipRect(boundsRect) + override fun dispatchDraw(canvas: Canvas) { + canvas.save() + canvas.clipRect(boundsRect) super.dispatchDraw(canvas) - canvas?.restore() + canvas.restore() } private fun updateBounds() { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 93622200ad46..ab0d78cdfd6e 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -1768,8 +1768,10 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, if (!ss.dynamic) continue; mDynamic.put(stream, true); if (findRow(stream) == null) { - addRow(stream, R.drawable.ic_volume_remote, R.drawable.ic_volume_remote_mute, true, - false, true); + addRow(stream, + com.android.settingslib.R.drawable.ic_volume_remote, + com.android.settingslib.R.drawable.ic_volume_remote_mute, + true, false, true); } } diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java index d2142dcfb2b4..e5c55b0a5e7f 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/DotIndicatorDecoration.java @@ -48,8 +48,10 @@ final class DotIndicatorDecoration extends RecyclerView.ItemDecoration { R.dimen.card_carousel_dot_selected_radius); mDotMargin = context.getResources().getDimensionPixelSize(R.dimen.card_carousel_dot_margin); - mUnselectedColor = context.getColor(R.color.material_dynamic_neutral70); - mSelectedColor = context.getColor(R.color.material_dynamic_neutral100); + mUnselectedColor = context.getColor( + com.google.android.material.R.color.material_dynamic_neutral70); + mSelectedColor = context.getColor( + com.google.android.material.R.color.material_dynamic_neutral100); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java index d03148cee335..2491e2bdd623 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java @@ -278,7 +278,7 @@ public class WalletActivity extends ComponentActivity implements private Drawable getHomeIndicatorDrawable() { Drawable drawable = getDrawable(R.drawable.ic_close); - drawable.setTint(getColor(R.color.material_dynamic_neutral70)); + drawable.setTint(getColor(com.google.android.material.R.color.material_dynamic_neutral70)); return drawable; } } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.kt index f8262d43cdbb..210f3cb65ac0 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardStatusViewTest.kt @@ -21,9 +21,9 @@ class KeyguardStatusViewTest : SysuiTestCase() { private lateinit var keyguardStatusView: KeyguardStatusView private val mediaView: View - get() = keyguardStatusView.findViewById(R.id.status_view_media_container) + get() = keyguardStatusView.requireViewById(R.id.status_view_media_container) private val statusViewContainer: ViewGroup - get() = keyguardStatusView.findViewById(R.id.status_view_container) + get() = keyguardStatusView.requireViewById(R.id.status_view_container) private val childrenExcludingMedia get() = statusViewContainer.children.filter { it != mediaView } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/SplitShadeTransitionAdapterTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/SplitShadeTransitionAdapterTest.kt index 6fe889270d65..9f9b9a478561 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/SplitShadeTransitionAdapterTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/SplitShadeTransitionAdapterTest.kt @@ -19,9 +19,11 @@ import android.animation.Animator import android.testing.AndroidTestingRunner import android.transition.TransitionValues import android.view.View +import android.view.ViewGroup import androidx.test.filters.SmallTest import com.android.keyguard.KeyguardStatusViewController.SplitShadeTransitionAdapter import com.android.systemui.SysuiTestCase +import com.android.systemui.util.mockito.mock import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Test @@ -84,5 +86,5 @@ private fun SplitShadeTransitionAdapter.createAnimator( startValues: TransitionValues?, endValues: TransitionValues? ): Animator? { - return createAnimator(/* sceneRoot= */ null, startValues, endValues) + return createAnimator(/* sceneRoot= */ mock(), startValues, endValues) } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ViewPreviewerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/clock/ViewPreviewerTest.kt index 5ece6ef1a794..d9caf32bb613 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ViewPreviewerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ViewPreviewerTest.kt @@ -55,9 +55,9 @@ class ViewPreviewerTest : SysuiTestCase() { } class TestView(context: Context) : View(context) { - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { super.onDraw(canvas) - canvas?.drawColor(Color.RED) + canvas.drawColor(Color.RED) } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java index b5e0df5d733c..1ea4460d971f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java @@ -53,7 +53,6 @@ import com.android.systemui.util.settings.SecureSettings; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; @@ -66,7 +65,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; -@Ignore @LargeTest @RunWith(AndroidTestingRunner.class) public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { @@ -74,8 +72,11 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { private static final float DEFAULT_SCALE = 4.0f; private static final float DEFAULT_CENTER_X = 400.0f; private static final float DEFAULT_CENTER_Y = 500.0f; - // The duration couldn't too short, otherwise the ValueAnimator won't work in expectation. - private static final long ANIMATION_DURATION_MS = 300; + // The duration and period can't be too short, otherwise the ValueAnimator and + // Instrumentation.runOnMainSync won't work in expectation. (b/288926821) + private static final long ANIMATION_DURATION_MS = 600; + private static final long WAIT_FULL_ANIMATION_PERIOD = 1000; + private static final long WAIT_INTERMEDIATE_ANIMATION_PERIOD = 250; private AtomicReference<Float> mCurrentScale = new AtomicReference<>((float) 0); private AtomicReference<Float> mCurrentCenterX = new AtomicReference<>((float) 0); @@ -117,8 +118,8 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase { mWindowManager = spy(new TestableWindowManager(wm)); mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager); - mWaitingAnimationPeriod = 2 * ANIMATION_DURATION_MS; - mWaitIntermediateAnimationPeriod = ANIMATION_DURATION_MS / 2; + mWaitingAnimationPeriod = WAIT_FULL_ANIMATION_PERIOD; + mWaitIntermediateAnimationPeriod = WAIT_INTERMEDIATE_ANIMATION_PERIOD; mWindowMagnificationAnimationController = new WindowMagnificationAnimationController( mContext, newValueAnimator()); mController = new SpyWindowMagnificationController(mContext, mHandler, diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt index 316de59692f9..2233e3226fd6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt @@ -70,7 +70,7 @@ class DialogLaunchAnimatorTest : SysuiTestCase() { assertTrue(dialog.isShowing) // The dialog is now fullscreen. - val window = dialog.window + val window = checkNotNull(dialog.window) val decorView = window.decorView as DecorView assertEquals(MATCH_PARENT, window.attributes.width) assertEquals(MATCH_PARENT, window.attributes.height) @@ -172,14 +172,15 @@ class DialogLaunchAnimatorTest : SysuiTestCase() { // Important: the power menu animation relies on this behavior to know when to animate (see // http://ag/16774605). val dialog = runOnMainThreadAndWaitForIdleSync { TestDialog(context) } - dialog.window.setWindowAnimations(0) - assertEquals(0, dialog.window.attributes.windowAnimations) + val window = checkNotNull(dialog.window) + window.setWindowAnimations(0) + assertEquals(0, window.attributes.windowAnimations) val touchSurface = createTouchSurface() runOnMainThreadAndWaitForIdleSync { dialogLaunchAnimator.showFromView(dialog, touchSurface) } - assertNotEquals(0, dialog.window.attributes.windowAnimations) + assertNotEquals(0, window.attributes.windowAnimations) } @Test @@ -351,13 +352,14 @@ class DialogLaunchAnimatorTest : SysuiTestCase() { init { // We need to set the window type for dialogs shown by SysUI, otherwise WM will throw. - window.setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL) + checkNotNull(window).setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(contentView) + val window = checkNotNull(window) window.setLayout(DIALOG_WIDTH, DIALOG_HEIGHT) window.setBackgroundDrawable(windowBackground) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS b/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS index adb10f01b5e1..5420c377be39 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/OWNERS @@ -1,4 +1,5 @@ set noparent +# Bug component: 879035 include /services/core/java/com/android/server/biometrics/OWNERS beverlyt@google.com diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt index 2908e753c2fe..565e22f4fc25 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt @@ -164,7 +164,7 @@ class SideFpsControllerTest : SysuiTestCase() { context.addMockSystemService(WindowManager::class.java, windowManager) whenEver(layoutInflater.inflate(R.layout.sidefps_view, null, false)).thenReturn(sideFpsView) - whenEver(sideFpsView.findViewById<LottieAnimationView>(eq(R.id.sidefps_animation))) + whenEver(sideFpsView.requireViewById<LottieAnimationView>(eq(R.id.sidefps_animation))) .thenReturn(mock(LottieAnimationView::class.java)) with(mock(ViewPropertyAnimator::class.java)) { whenEver(sideFpsView.animate()).thenReturn(this) diff --git a/packages/SystemUI/tests/src/com/android/systemui/charging/WiredChargingRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/charging/WiredChargingRippleControllerTest.kt index d6cafcb6b5ae..5a5c058793b2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/charging/WiredChargingRippleControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/charging/WiredChargingRippleControllerTest.kt @@ -211,7 +211,7 @@ class WiredChargingRippleControllerTest : SysuiTestCase() { context.resources.getFloat(R.dimen.physical_charger_port_location_normalized_y) val expectedCenterX: Float val expectedCenterY: Float - when (context.display.rotation) { + when (checkNotNull(context.display).rotation) { Surface.ROTATION_90 -> { expectedCenterX = width * normalizedPortPosY expectedCenterY = height * (1 - normalizedPortPosX) diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt index 42f28c8c6043..2ae342a5cfa5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlViewHolderTest.kt @@ -125,7 +125,7 @@ class ControlViewHolderTest : SysuiTestCase() { control ) cvh.bindData(cws, false) - val chevronIcon = baseLayout.findViewById<View>(R.id.chevron_icon) + val chevronIcon = baseLayout.requireViewById<View>(R.id.chevron_icon) assertThat(chevronIcon.visibility).isEqualTo(View.VISIBLE) } @@ -138,4 +138,4 @@ private const val TINT_COLOR = 0x00ff00 // Should be different from [COLOR] private val DRAWABLE = GradientDrawable() private val COLOR = ColorStateList.valueOf(0xffff00) private val DEFAULT_CONTROL = Control.StatelessBuilder( - CONTROL_ID, mock(PendingIntent::class.java)).build()
\ No newline at end of file + CONTROL_ID, mock(PendingIntent::class.java)).build() diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt index fcd6568de9f3..a400ff963026 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/ui/ControlsUiControllerImplTest.kt @@ -365,7 +365,8 @@ class ControlsUiControllerImplTest : SysuiTestCase() { val selectedItems = listOf( SelectedItem.StructureItem( - StructureInfo(ComponentName.unflattenFromString("pkg/.cls1"), "a", ArrayList()) + StructureInfo(checkNotNull(ComponentName.unflattenFromString("pkg/.cls1")), + "a", ArrayList()) ), ) preferredPanelRepository.setSelectedComponent( diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt index 76028e49c757..208eae342a80 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/DeviceEntryFaceAuthRepositoryTest.kt @@ -316,9 +316,6 @@ class DeviceEntryFaceAuthRepositoryTest : SysuiTestCase() { ) .isFalse() - whenever(faceManager.sensorPropertiesInternal).thenReturn(null) - assertThat(createDeviceEntryFaceAuthRepositoryImpl().isDetectionSupported).isFalse() - whenever(faceManager.sensorPropertiesInternal).thenReturn(listOf()) assertThat(createDeviceEntryFaceAuthRepositoryImpl().isDetectionSupported).isFalse() diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt index 5b8272b04bfb..064bebd0df01 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt @@ -132,7 +132,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Before fun setup() { MockitoAnnotations.initMocks(this) - context.resources.configuration.locales = LocaleList(Locale.US, Locale.UK) + context.resources.configuration.setLocales(LocaleList(Locale.US, Locale.UK)) transitionRepository = FakeKeyguardTransitionRepository() mediaCarouselController = MediaCarouselController( @@ -730,13 +730,13 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Test fun testOnLocaleListChanged_playersAreAddedBack() { - context.resources.configuration.locales = LocaleList(Locale.US, Locale.UK, Locale.CANADA) + context.resources.configuration.setLocales(LocaleList(Locale.US, Locale.UK, Locale.CANADA)) testConfigurationChange(configListener.value::onLocaleListChanged) verify(pageIndicator, never()).tintList = ColorStateList.valueOf(context.getColor(R.color.media_paging_indicator)) - context.resources.configuration.locales = LocaleList(Locale.UK, Locale.US, Locale.CANADA) + context.resources.configuration.setLocales(LocaleList(Locale.UK, Locale.US, Locale.CANADA)) testConfigurationChange(configListener.value::onLocaleListChanged) verify(pageIndicator).tintList = diff --git a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt index 01ffdcd580c0..1833fd3aea3f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/mediaprojection/appselector/view/TaskPreviewSizeProviderTest.kt @@ -107,7 +107,7 @@ class TaskPreviewSizeProviderTest : SysuiTestCase() { private fun givenDisplay(width: Int, height: Int, isTablet: Boolean = false) { val bounds = Rect(0, 0, width, height) - val windowMetrics = WindowMetrics(bounds, null) + val windowMetrics = WindowMetrics(bounds, { null }, 1.0f) whenever(windowManager.maximumWindowMetrics).thenReturn(windowMetrics) whenever(windowManager.currentWindowMetrics).thenReturn(windowMetrics) diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt index 611c5b987d84..5ad869edcc11 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/gestural/BackPanelControllerTest.kt @@ -67,7 +67,7 @@ class BackPanelControllerTest : SysuiTestCase() { context, windowManager, ViewConfiguration.get(context), - Handler.createAsync(Looper.myLooper()), + Handler.createAsync(checkNotNull(Looper.myLooper())), vibratorHelper, configurationController, latencyTracker diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt index 0954f6f0ffaf..1bce6d85360f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt @@ -67,6 +67,7 @@ import com.android.wm.shell.bubbles.Bubble import com.android.wm.shell.bubbles.Bubbles import com.google.common.truth.Truth.assertThat import java.util.Optional +import kotlin.test.assertNotNull import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -599,7 +600,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { extras().bool(EXTRA_USE_STYLUS_MODE).isTrue() } iconCaptor.value?.let { icon -> - assertThat(icon).isNotNull() + assertNotNull(icon) assertThat(icon.resId).isEqualTo(R.drawable.ic_note_task_shortcut_widget) } } @@ -662,7 +663,7 @@ internal class NoteTaskControllerTest : SysuiTestCase() { } assertThat(actualShortcut.shortLabel).isEqualTo(NOTE_TASK_SHORT_LABEL) assertThat(actualShortcut.isLongLived).isEqualTo(true) - assertThat(actualShortcut.icon.resId).isEqualTo(R.drawable.ic_note_task_shortcut_widget) + assertThat(actualShortcut.icon?.resId).isEqualTo(R.drawable.ic_note_task_shortcut_widget) assertThat(actualShortcut.extras?.getString(EXTRA_SHORTCUT_BADGE_OVERRIDE_PACKAGE)) .isEqualTo(NOTE_TASK_PACKAGE_NAME) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogTest.kt index 07feedf1d654..ad6909d71ddd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenrecord/ScreenRecordPermissionDialogTest.kt @@ -126,6 +126,7 @@ class ScreenRecordPermissionDialogTest : SysuiTestCase() { private fun onSpinnerItemSelected(position: Int) { val spinner = dialog.requireViewById<Spinner>(R.id.screen_share_mode_spinner) - spinner.onItemSelectedListener.onItemSelected(spinner, mock(), position, /* id= */ 0) + checkNotNull(spinner.onItemSelectedListener) + .onItemSelected(spinner, mock(), position, /* id= */ 0) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt index 08b5d2bdc31c..16091b2633aa 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotDetectionControllerTest.kt @@ -170,8 +170,8 @@ class ScreenshotDetectionControllerTest { private class ComponentInfoFlagMatcher( @PackageManager.ComponentInfoFlagsBits val mask: Int, val value: Int ): ArgumentMatcher<PackageManager.ComponentInfoFlags> { - override fun matches(flags: PackageManager.ComponentInfoFlags): Boolean { - return (mask.toLong() and flags.value) == value.toLong() + override fun matches(flags: PackageManager.ComponentInfoFlags?): Boolean { + return flags != null && (mask.toLong() and flags.value) == value.toLong() } override fun toString(): String{ diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt index 168cbb7b8da3..accb68a66421 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationQSContainerControllerTest.kt @@ -487,7 +487,7 @@ class NotificationQSContainerControllerTest : SysuiTestCase() { private fun emptyInsets() = mock(WindowInsets::class.java) private fun WindowInsets.withCutout(): WindowInsets { - whenever(displayCutout.safeInsetBottom).thenReturn(CUTOUT_HEIGHT) + whenever(checkNotNull(displayCutout).safeInsetBottom).thenReturn(CUTOUT_HEIGHT) return this } diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt index 2da2e9238d0a..8fe7010260ac 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt @@ -134,18 +134,18 @@ class ShadeHeaderControllerTest : SysuiTestCase() { @Before fun setup() { - whenever<Clock>(view.findViewById(R.id.clock)).thenReturn(clock) + whenever<Clock>(view.requireViewById(R.id.clock)).thenReturn(clock) whenever(clock.context).thenReturn(mockedContext) - whenever<TextView>(view.findViewById(R.id.date)).thenReturn(date) + whenever<TextView>(view.requireViewById(R.id.date)).thenReturn(date) whenever(date.context).thenReturn(mockedContext) - whenever<ShadeCarrierGroup>(view.findViewById(R.id.carrier_group)).thenReturn(carrierGroup) + whenever<ShadeCarrierGroup>(view.requireViewById(R.id.carrier_group)).thenReturn(carrierGroup) - whenever<BatteryMeterView>(view.findViewById(R.id.batteryRemainingIcon)) + whenever<BatteryMeterView>(view.requireViewById(R.id.batteryRemainingIcon)) .thenReturn(batteryMeterView) - whenever<StatusIconContainer>(view.findViewById(R.id.statusIcons)).thenReturn(statusIcons) + whenever<StatusIconContainer>(view.requireViewById(R.id.statusIcons)).thenReturn(statusIcons) viewContext = Mockito.spy(context) whenever(view.context).thenReturn(viewContext) diff --git a/packages/SystemUI/tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt index 58b44ae5bcbd..19dc72d6c2e3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/smartspace/DreamSmartspaceControllerTest.kt @@ -236,7 +236,8 @@ class DreamSmartspaceControllerTest : SysuiTestCase() { `when`(precondition.conditionsMet()).thenReturn(true) // Given a session is created - val weatherView = controller.buildAndConnectWeatherView(fakeParent, customView) + val weatherView = + checkNotNull(controller.buildAndConnectWeatherView(fakeParent, customView)) controller.stateChangeListener.onViewAttachedToWindow(weatherView) verify(smartspaceManager).createSmartspaceSession(any()) @@ -258,7 +259,8 @@ class DreamSmartspaceControllerTest : SysuiTestCase() { // Given a session is created val customView = Mockito.mock(TestView::class.java) - val weatherView = controller.buildAndConnectWeatherView(fakeParent, customView) + val weatherView = + checkNotNull(controller.buildAndConnectWeatherView(fakeParent, customView)) controller.stateChangeListener.onViewAttachedToWindow(weatherView) verify(smartspaceManager).createSmartspaceSession(any()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt index 724ea023f2bd..e4da53a1a0a4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/MediaArtworkProcessorTest.kt @@ -47,7 +47,7 @@ class MediaArtworkProcessorTest : SysuiTestCase() { processor = MediaArtworkProcessor() val point = Point() - context.display.getSize(point) + checkNotNull(context.display).getSize(point) screenWidth = point.x screenHeight = point.y } @@ -106,4 +106,4 @@ class MediaArtworkProcessorTest : SysuiTestCase() { // THEN the processed bitmap is null assertThat(background).isNull() } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt index 2de57051d4f2..9036f22a792a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceControllerTest.kt @@ -278,7 +278,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() { `when`(deviceProvisionedController.isCurrentUserSetup).thenReturn(false) // WHEN a connection attempt is made and view is attached - val view = controller.buildAndConnectView(fakeParent) + val view = controller.buildAndConnectView(fakeParent)!! controller.stateChangeListener.onViewAttachedToWindow(view) // THEN no session is created diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt index 6155e3c16996..1cccd123c106 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ConfigurationControllerImplTest.kt @@ -212,13 +212,13 @@ class ConfigurationControllerImplTest : SysuiTestCase() { @Test fun localeListChanged_listenerNotified() { val config = mContext.resources.configuration - config.locales = LocaleList(Locale.CANADA, Locale.GERMANY) + config.setLocales(LocaleList(Locale.CANADA, Locale.GERMANY)) mConfigurationController.onConfigurationChanged(config) val listener = createAndAddListener() // WHEN the locales are updated - config.locales = LocaleList(Locale.FRANCE, Locale.JAPAN, Locale.CHINESE) + config.setLocales(LocaleList(Locale.FRANCE, Locale.JAPAN, Locale.CHINESE)) mConfigurationController.onConfigurationChanged(config) // THEN the listener is notified diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt index 1759fb794bd6..210c5ab28c42 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt @@ -463,10 +463,10 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { val provider = StatusBarContentInsetsProvider(contextMock, configurationController, mock(DumpManager::class.java)) - configuration.windowConfiguration.maxBounds = Rect(0, 0, 1080, 2160) + configuration.windowConfiguration.setMaxBounds(Rect(0, 0, 1080, 2160)) val firstDisplayInsets = provider.getStatusBarContentAreaForRotation(ROTATION_NONE) - configuration.windowConfiguration.maxBounds = Rect(0, 0, 800, 600) + configuration.windowConfiguration.setMaxBounds(Rect(0, 0, 800, 600)) // WHEN: get insets on the second display val secondDisplayInsets = provider.getStatusBarContentAreaForRotation(ROTATION_NONE) @@ -482,14 +482,14 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { val provider = StatusBarContentInsetsProvider(contextMock, configurationController, mock(DumpManager::class.java)) - configuration.windowConfiguration.maxBounds = Rect(0, 0, 1080, 2160) + configuration.windowConfiguration.setMaxBounds(Rect(0, 0, 1080, 2160)) val firstDisplayInsetsFirstCall = provider .getStatusBarContentAreaForRotation(ROTATION_NONE) - configuration.windowConfiguration.maxBounds = Rect(0, 0, 800, 600) + configuration.windowConfiguration.setMaxBounds(Rect(0, 0, 800, 600)) provider.getStatusBarContentAreaForRotation(ROTATION_NONE) - configuration.windowConfiguration.maxBounds = Rect(0, 0, 1080, 2160) + configuration.windowConfiguration.setMaxBounds(Rect(0, 0, 1080, 2160)) // WHEN: get insets on the first display again val firstDisplayInsetsSecondCall = provider @@ -577,4 +577,4 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { " expected=$expected actual=$actual", expected.equals(actual)) } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java index 85052e600486..e4318659bef9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/InflatedSmartRepliesTest.java @@ -64,7 +64,7 @@ import java.util.List; public class InflatedSmartRepliesTest extends SysuiTestCase { private static final Intent TEST_INTENT = new Intent("com.android.SMART_REPLY_VIEW_ACTION"); - private static final Intent WHITELISTED_TEST_INTENT = + private static final Intent ALLOWLISTED_TEST_INTENT = new Intent("com.android.WHITELISTED_TEST_ACTION"); @Mock private SmartReplyConstants mSmartReplyConstants; @@ -343,7 +343,7 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { assertThat(smartReplyState.getSmartReplies().choices) .containsExactlyElementsIn(mEntry.getSmartReplies()).inOrder(); - // Since no apps are whitelisted no actions should be shown. + // Since no apps are allowlisted no actions should be shown. assertThat(smartReplyState.getSmartActions().actions).isEmpty(); assertThat(smartReplyState.getSuppressedActions()).isNull(); assertThat(smartReplyState.getHasPhishingAction()).isFalse(); @@ -358,7 +358,7 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { allowedResolveInfo.activityInfo.packageName = allowedPackage; when(mPackageManagerWrapper .resolveActivity( - argThat(intent -> WHITELISTED_TEST_INTENT.getAction().equals( + argThat(intent -> ALLOWLISTED_TEST_INTENT.getAction().equals( intent.getAction())), anyInt() /* flags */)) .thenReturn(allowedResolveInfo); @@ -368,7 +368,7 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { // suggestions. setupAppGeneratedReplies(null /* smartReplies */); ArrayList<Notification.Action> actions = new ArrayList<>(); - actions.add(createAction("allowed action", WHITELISTED_TEST_INTENT)); + actions.add(createAction("allowed action", ALLOWLISTED_TEST_INTENT)); actions.add(createAction("non-allowed action", TEST_INTENT)); modifyRanking(mEntry) @@ -379,7 +379,7 @@ public class InflatedSmartRepliesTest extends SysuiTestCase { InflatedSmartReplyState smartReplyState = mSmartReplyStateInflater.chooseSmartRepliesAndActions(mEntry); - // Only the action for the whitelisted package should be allowed. + // Only the action for the allowlisted package should be allowed. assertThat(smartReplyState.getSmartActions().actions) .containsExactly(mEntry.getSmartActions().get(0)); assertThat(smartReplyState.getSuppressedActions()).isNull(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt index ca83d49b19ca..2bda8481729b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/user/domain/interactor/UserInteractorTest.kt @@ -662,6 +662,7 @@ class UserInteractorTest : SysuiTestCase() { val userInfos = createUserInfos(count = 2, includeGuest = false) userRepository.setUserInfos(userInfos) userRepository.setSelectedUserInfo(userInfos[0]) + runCurrent() val refreshUsersCallCount = userRepository.refreshUsersCallCount fakeBroadcastDispatcher.registeredReceivers.forEach { @@ -682,6 +683,7 @@ class UserInteractorTest : SysuiTestCase() { val userInfos = createUserInfos(count = 2, includeGuest = false) userRepository.setUserInfos(userInfos) userRepository.setSelectedUserInfo(userInfos[0]) + runCurrent() val refreshUsersCallCount = userRepository.refreshUsersCallCount fakeBroadcastDispatcher.registeredReceivers.forEach { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt index 69575a987e5d..7e0632bddcf9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/mockito/KotlinMockitoHelpers.kt @@ -36,7 +36,7 @@ import org.mockito.stubbing.Stubber * * Generic T is nullable because implicitly bounded by Any?. */ -fun <T> eq(obj: T): T = Mockito.eq<T>(obj) +fun <T> eq(obj: T): T = Mockito.eq<T>(obj) ?: obj /** * Returns Mockito.any() as nullable type to avoid java.lang.IllegalStateException when diff --git a/packages/SystemUI/unfold/Android.bp b/packages/SystemUI/unfold/Android.bp index 2e0a9462ffbe..1f0181f2e5bd 100644 --- a/packages/SystemUI/unfold/Android.bp +++ b/packages/SystemUI/unfold/Android.bp @@ -33,7 +33,7 @@ android_library { "dagger2", "jsr330", ], - kotlincflags: ["-Xjvm-default=enable"], + kotlincflags: ["-Xjvm-default=all"], java_version: "1.8", sdk_version: "current", min_sdk_version: "current", diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionProgressProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionProgressProvider.kt index fee485d97afa..896444d4df5a 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionProgressProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldTransitionProgressProvider.kt @@ -35,14 +35,12 @@ interface UnfoldTransitionProgressProvider : CallbackController<TransitionProgre interface TransitionProgressListener { /** Called when transition is started */ - @JvmDefault fun onTransitionStarted() {} /** * Called whenever transition progress is updated, [progress] is a value of the animation * where 0 is fully folded, 1 is fully unfolded */ - @JvmDefault fun onTransitionProgress(@FloatRange(from = 0.0, to = 1.0) progress: Float) {} /** @@ -51,11 +49,9 @@ interface UnfoldTransitionProgressProvider : CallbackController<TransitionProgre * For example, in [PhysicsBasedUnfoldTransitionProgressProvider] this could happen when the * animation is not tied to the hinge angle anymore and it is about to run fixed animation. */ - @JvmDefault fun onTransitionFinishing() {} /** Called when transition is completely finished */ - @JvmDefault fun onTransitionFinished() {} } } diff --git a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt index 0af372f9da24..bce7e8849903 100644 --- a/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt +++ b/packages/SystemUI/unfold/src/com/android/systemui/unfold/updates/FoldStateProvider.kt @@ -31,9 +31,9 @@ interface FoldStateProvider : CallbackController<FoldUpdatesListener> { val isFinishedOpening: Boolean interface FoldUpdatesListener { - @JvmDefault fun onHingeAngleUpdate(@FloatRange(from = 0.0, to = 180.0) angle: Float) {} - @JvmDefault fun onFoldUpdate(@FoldUpdate update: Int) {} - @JvmDefault fun onUnfoldedScreenAvailable() {} + fun onHingeAngleUpdate(@FloatRange(from = 0.0, to = 180.0) angle: Float) {} + fun onFoldUpdate(@FoldUpdate update: Int) {} + fun onUnfoldedScreenAvailable() {} } @IntDef( diff --git a/packages/VpnDialogs/res/values-pt-rPT/strings.xml b/packages/VpnDialogs/res/values-pt-rPT/strings.xml index 95f7c1abe0f3..c1be1d1c4b01 100644 --- a/packages/VpnDialogs/res/values-pt-rPT/strings.xml +++ b/packages/VpnDialogs/res/values-pt-rPT/strings.xml @@ -17,8 +17,8 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="prompt" msgid="3183836924226407828">"Pedido de ligação"</string> - <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> pretende configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na fonte. <br /> <br /> <img src=vpn_icon /> aparece na parte superior do seu ecrã quando a VPN está ativa."</string> - <string name="warning" product="tv" msgid="5188957997628124947">"A app <xliff:g id="APP">%s</xliff:g> pretende configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na origem. <br /> <br /> <img src=vpn_icon /> aparece no ecrã quando a VPN está ativa."</string> + <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> quer configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na fonte. <br /> <br /> <img src=vpn_icon /> aparece na parte superior do seu ecrã quando a VPN está ativa."</string> + <string name="warning" product="tv" msgid="5188957997628124947">"A app <xliff:g id="APP">%s</xliff:g> quer configurar uma ligação VPN que lhe permita monitorizar o tráfego de rede. Aceite apenas se confiar na origem. <br /> <br /> <img src=vpn_icon /> aparece no ecrã quando a VPN está ativa."</string> <string name="legacy_title" msgid="192936250066580964">"A VPN está ligada"</string> <string name="session" msgid="6470628549473641030">"Sessão"</string> <string name="duration" msgid="3584782459928719435">"Duração:"</string> diff --git a/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java b/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java index b9dac4e2b28e..c7abed887cac 100644 --- a/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java +++ b/packages/WAPPushManager/tests/src/com/android/smspush/unitTests/WapPushTest.java @@ -2237,10 +2237,6 @@ public class WapPushTest extends ServiceTestCase<WapPushManager> { mClassName = "com.android.smspush.unitTests.ReceiverActivity"; - // Phone dummy = new DummyPhone(getContext()); - // Phone gsm = PhoneFactory.getGsmPhone(); - // GSMPhone gsm = new GSMPhone(getContext(), new SimulatedCommands(), null, true); - // WapPushOverSms dispatcher = new WapPushOverSms(dummy, null); try { // set up data diff --git a/packages/WallpaperBackup/Android.bp b/packages/WallpaperBackup/Android.bp index 8acc5089f8bd..155dc1a68295 100644 --- a/packages/WallpaperBackup/Android.bp +++ b/packages/WallpaperBackup/Android.bp @@ -27,9 +27,6 @@ android_app { name: "WallpaperBackup", defaults: ["platform_app_defaults"], srcs: ["src/**/*.java"], - optimize: { - proguard_flags_files: ["proguard.flags"], - }, platform_apis: true, certificate: "platform", privileged: false, diff --git a/packages/WallpaperBackup/proguard.flags b/packages/WallpaperBackup/proguard.flags deleted file mode 100644 index 247e6efb10ef..000000000000 --- a/packages/WallpaperBackup/proguard.flags +++ /dev/null @@ -1 +0,0 @@ --keep class com.android.wallpaperbackup.WallpaperBackupAgent diff --git a/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml b/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml index 648e1d4cf383..b437b69e15bd 100644 --- a/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml +++ b/packages/overlays/AvoidAppsInCutoutOverlay/res/values-am/strings.xml @@ -17,5 +17,5 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="display_cutout_emulation_overlay" msgid="3814493834951357513">"ከተቆረጠው አከባቢ በታች የመተግበሪያዎች ምስልን ስራ"</string> + <string name="display_cutout_emulation_overlay" msgid="3814493834951357513">"ከተቆረጠው አከባቢ በታች የመተግበሪያዎች ምስልን ሥራ"</string> </resources> diff --git a/packages/services/VirtualCamera/OWNERS b/packages/services/VirtualCamera/OWNERS new file mode 100644 index 000000000000..c66443fb8a14 --- /dev/null +++ b/packages/services/VirtualCamera/OWNERS @@ -0,0 +1,3 @@ +include /services/companion/java/com/android/server/companion/virtual/OWNERS +caen@google.com +jsebechlebsky@google.com
\ No newline at end of file diff --git a/services/Android.bp b/services/Android.bp index b0a0e5e44a8c..66181f5ed45c 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -58,7 +58,12 @@ system_optimized_java_defaults { optimize: false, shrink: true, ignore_warnings: false, - proguard_flags_files: ["proguard.flags"], + proguard_flags_files: [ + "proguard.flags", + // Ensure classes referenced in the framework-res manifest + // and implemented in system_server are kept. + ":framework-res{.aapt.proguardOptionsFile}", + ], }, conditions_default: { optimize: { @@ -269,4 +274,5 @@ droidstubs { tag: ".removed-api.txt", }, ], + api_surface: "system-server", } diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java index 777c7c8e0da9..8060d5a96aa6 100644 --- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java @@ -637,7 +637,7 @@ public class TouchExplorer extends BaseEventStreamTransformation MotionEvent event, MotionEvent rawEvent, int policyFlags) { switch (event.getActionMasked()) { case ACTION_DOWN: - // We should have already received ACTION_DOWN. Ignore. + handleActionDownStateTouchExploring(event, rawEvent, policyFlags); break; case ACTION_POINTER_DOWN: handleActionPointerDown(event, rawEvent, policyFlags); @@ -843,6 +843,15 @@ public class TouchExplorer extends BaseEventStreamTransformation } } + private void handleActionDownStateTouchExploring( + MotionEvent event, MotionEvent rawEvent, int policyFlags) { + // This is an interrupted and continued touch exploration. Maintain the consistency of the + // event stream. + mSendTouchExplorationEndDelayed.cancel(); + mSendTouchInteractionEndDelayed.cancel(); + sendTouchExplorationGestureStartAndHoverEnterIfNeeded(policyFlags); + } + /** * Handles move events while touch exploring. this is also where we drag or delegate based on * the number of fingers moving on the screen. @@ -1100,12 +1109,15 @@ public class TouchExplorer extends BaseEventStreamTransformation } /** - * Sends the enter events if needed. Such events are hover enter and touch explore - * gesture start. + * Sends the enter events if needed. Such events are hover enter and touch explore gesture + * start. * * @param policyFlags The policy flags associated with the event. */ private void sendTouchExplorationGestureStartAndHoverEnterIfNeeded(int policyFlags) { + if (!mState.isTouchExploring()) { + mDispatcher.sendAccessibilityEvent(TYPE_TOUCH_EXPLORATION_GESTURE_START); + } MotionEvent event = mState.getLastInjectedHoverEvent(); if (event != null && event.getActionMasked() == ACTION_HOVER_EXIT) { final int pointerIdBits = event.getPointerIdBits(); @@ -1118,7 +1130,6 @@ public class TouchExplorer extends BaseEventStreamTransformation } } - /** * Determines whether a two pointer gesture is a dragging one. * @@ -1344,6 +1355,8 @@ public class TouchExplorer extends BaseEventStreamTransformation Slog.e(LOG_TAG, "Unable to find a valid pointer for touch exploration."); return; } + // Send hover exit if we haven't closed a previous touch exploration event stream. + sendHoverExitAndTouchExplorationGestureEndIfNeeded(pointerId); final int pointerIdBits = (1 << pointerId); final int policyFlags = mState.getLastReceivedPolicyFlags(); mSendHoverEnterAndMoveDelayed.setPointerIdBits(pointerIdBits); diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 2d60716104c1..a98cacd465c3 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -3987,14 +3987,14 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BIND_APPWIDGET, null); } catch (SecurityException se) { - if (!isCallerBindAppWidgetWhiteListedLocked(packageName)) { + if (!isCallerBindAppWidgetAllowListedLocked(packageName)) { return false; } } return true; } - private boolean isCallerBindAppWidgetWhiteListedLocked(String packageName) { + private boolean isCallerBindAppWidgetAllowListedLocked(String packageName) { final int userId = UserHandle.getCallingUserId(); final int packageUid = getUidForPackage(packageName, userId); if (packageUid < 0) { diff --git a/services/autofill/OWNERS b/services/autofill/OWNERS index edfb2112198a..4f170ca65337 100644 --- a/services/autofill/OWNERS +++ b/services/autofill/OWNERS @@ -1 +1,20 @@ +# Bug component: 351486 + include /core/java/android/view/autofill/OWNERS + +# co-own by both teams +per-file Session.java = file:/core/java/android/view/autofill/OWNERS +per-file Session.java = wangqi@google.com +per-file AutofillManagerService*. = file:/core/java/android/view/autofill/OWNERS +per-file Session.java = wangqi@google.com +per-file AutofillManagerService* = file:/core/java/android/view/autofill/OWNERS +per-file AutofillManagerService* = wangqi@google.com +per-file *FillUI* = file:/core/java/android/view/autofill/OWNERS +per-file *FillUI* = wangqi@google.com + +# Bug component: 543785 = per-file *Augmented* +per-file *Augmented* = file:/core/java/android/service/autofill/augmented/OWNERS + +# Bug component: 543785 = per-file *Inline* +per-file *Inline* = file:/core/java/android/widget/inline/OWNERS + diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 63a607c8d0d4..5b8bdd57ccbb 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -1413,7 +1413,7 @@ final class AutofillManagerServiceImpl Slog.v(TAG, "setAugmentedAutofillWhitelistLocked(packages=" + packages + ", activities=" + activities + ")"); } - whitelistForAugmentedAutofillPackages(packages, activities); + allowlistForAugmentedAutofillPackages(packages, activities); final String serviceName; if (mRemoteAugmentedAutofillServiceInfo != null) { serviceName = mRemoteAugmentedAutofillServiceInfo.getComponentName() @@ -1477,7 +1477,7 @@ final class AutofillManagerServiceImpl /** * @throws IllegalArgumentException if packages or components are empty. */ - private void whitelistForAugmentedAutofillPackages(@Nullable List<String> packages, + private void allowlistForAugmentedAutofillPackages(@Nullable List<String> packages, @Nullable List<ComponentName> components) { // TODO(b/123100824): add CTS test for when it's null synchronized (mLock) { diff --git a/services/backup/java/com/android/server/backup/TransportManager.java b/services/backup/java/com/android/server/backup/TransportManager.java index 05327dcc7903..a792db0f7c78 100644 --- a/services/backup/java/com/android/server/backup/TransportManager.java +++ b/services/backup/java/com/android/server/backup/TransportManager.java @@ -738,6 +738,9 @@ public class TransportManager { try { String transportName = transport.name(); String transportDirName = transport.transportDirName(); + if (transportName == null || transportDirName == null) { + return BackupManager.ERROR_TRANSPORT_INVALID; + } registerTransport(transportComponent, transport); // If registerTransport() hasn't thrown... Slog.d(TAG, addUserIdToLogMessage(mUserId, "Transport " + transportString diff --git a/services/companion/OWNERS b/services/companion/OWNERS index cb4cc56ca17b..734d8b6c5f43 100644 --- a/services/companion/OWNERS +++ b/services/companion/OWNERS @@ -1,4 +1 @@ -evanxinchen@google.com -ewol@google.com -guojing@google.com -svetoslavganov@google.com
\ No newline at end of file +include /core/java/android/companion/OWNERS
\ No newline at end of file diff --git a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java index 3cb9ac823bac..720687ef20cc 100644 --- a/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java +++ b/services/companion/java/com/android/server/companion/securechannel/SecureChannel.java @@ -340,7 +340,7 @@ public class SecureChannel { return; } - mRole = Role.Initiator; + mRole = Role.INITIATOR; mHandshakeContext = D2DHandshakeContext.forInitiator(); mClientInit = mHandshakeContext.getNextHandshakeMessage(); @@ -412,7 +412,7 @@ public class SecureChannel { // Proceed with the rest of Ukey2 handshake if (mHandshakeContext == null) { // Server-side logic - mRole = Role.Responder; + mRole = Role.RESPONDER; mHandshakeContext = D2DHandshakeContext.forResponder(); // Receive Client Init @@ -479,9 +479,9 @@ public class SecureChannel { } sendMessage(MessageType.PRE_SHARED_KEY, constructToken(mRole, mPreSharedKey)); byte[] receivedAuthToken = readMessage(MessageType.PRE_SHARED_KEY); - byte[] expectedAuthToken = constructToken(mRole == Role.Initiator - ? Role.Responder - : Role.Initiator, + byte[] expectedAuthToken = constructToken(mRole == Role.INITIATOR + ? Role.RESPONDER + : Role.INITIATOR, mPreSharedKey); mPskVerified = Arrays.equals(receivedAuthToken, expectedAuthToken); @@ -515,9 +515,9 @@ public class SecureChannel { byte[] remoteAttestation = readMessage(MessageType.ATTESTATION); // Verifying remote attestation with public key local binding param - byte[] expectedChallenge = constructToken(mRole == Role.Initiator - ? Role.Responder - : Role.Initiator, + byte[] expectedChallenge = constructToken(mRole == Role.INITIATOR + ? Role.RESPONDER + : Role.INITIATOR, mConnectionContext.getSessionUnique()); mVerificationResult = mVerifier.verifyAttestation(remoteAttestation, expectedChallenge); @@ -554,7 +554,7 @@ public class SecureChannel { // This information is needed to help resolve potential role collision. private byte[] constructHandshakeInitMessage(byte[] message) { return ByteBuffer.allocate(1 + message.length) - .put((byte) (Role.Initiator.equals(mRole) ? 0 : 1)) + .put((byte) (Role.INITIATOR.equals(mRole) ? 0 : 1)) .put(message) .array(); } @@ -562,7 +562,8 @@ public class SecureChannel { private byte[] constructToken(D2DHandshakeContext.Role role, byte[] authValue) throws GeneralSecurityException { MessageDigest hash = MessageDigest.getInstance("SHA-256"); - byte[] roleUtf8 = role.name().getBytes(StandardCharsets.UTF_8); + String roleName = role == Role.INITIATOR ? "Initiator" : "Responder"; + byte[] roleUtf8 = roleName.getBytes(StandardCharsets.UTF_8); int tokenLength = roleUtf8.length + authValue.length; return hash.digest(ByteBuffer.allocate(tokenLength) .put(roleUtf8) diff --git a/services/companion/java/com/android/server/companion/virtual/OWNERS b/services/companion/java/com/android/server/companion/virtual/OWNERS index 5e8291fe5587..83143a431406 100644 --- a/services/companion/java/com/android/server/companion/virtual/OWNERS +++ b/services/companion/java/com/android/server/companion/virtual/OWNERS @@ -2,4 +2,5 @@ set noparent ogunwale@google.com michaelwr@google.com -vladokom@google.com
\ No newline at end of file +vladokom@google.com +marvinramin@google.com
\ No newline at end of file diff --git a/services/core/Android.bp b/services/core/Android.bp index f8d19ec9903d..4e412bbe67df 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -229,8 +229,7 @@ genrule { name: "services.core.json.gz", srcs: [":checked-protolog.json"], out: ["services.core.protolog.json.gz"], - cmd: "$(location minigzip) -c < $(in) > $(out)", - tools: ["minigzip"], + cmd: "gzip -c < $(in) > $(out)", } prebuilt_etc { diff --git a/services/core/java/com/android/server/CertBlacklister.java b/services/core/java/com/android/server/CertBlacklister.java index c16378be7342..e726c6abfac3 100644 --- a/services/core/java/com/android/server/CertBlacklister.java +++ b/services/core/java/com/android/server/CertBlacklister.java @@ -31,17 +31,17 @@ import java.io.IOException; import libcore.io.IoUtils; /** - * <p>CertBlacklister provides a simple mechanism for updating the platform blacklists for SSL + * <p>CertBlacklister provides a simple mechanism for updating the platform denylists for SSL * certificate public keys and serial numbers. */ public class CertBlacklister extends Binder { private static final String TAG = "CertBlacklister"; - private static final String BLACKLIST_ROOT = System.getenv("ANDROID_DATA") + "/misc/keychain/"; + private static final String DENYLIST_ROOT = System.getenv("ANDROID_DATA") + "/misc/keychain/"; - public static final String PUBKEY_PATH = BLACKLIST_ROOT + "pubkey_blacklist.txt"; - public static final String SERIAL_PATH = BLACKLIST_ROOT + "serial_blacklist.txt"; + public static final String PUBKEY_PATH = DENYLIST_ROOT + "pubkey_blacklist.txt"; + public static final String SERIAL_PATH = DENYLIST_ROOT + "serial_blacklist.txt"; public static final String PUBKEY_BLACKLIST_KEY = "pubkey_blacklist"; public static final String SERIAL_BLACKLIST_KEY = "serial_blacklist"; @@ -66,14 +66,14 @@ public class CertBlacklister extends Binder { @Override public void onChange(boolean selfChange) { super.onChange(selfChange); - writeBlacklist(); + writeDenylist(); } public String getValue() { return Settings.Secure.getString(mContentResolver, mKey); } - private void writeBlacklist() { + private void writeDenylist() { new Thread("BlacklistUpdater") { public void run() { synchronized(mTmpDir) { diff --git a/services/core/java/com/android/server/DynamicSystemService.java b/services/core/java/com/android/server/DynamicSystemService.java index 27215b2fbf30..cbacee6ba72c 100644 --- a/services/core/java/com/android/server/DynamicSystemService.java +++ b/services/core/java/com/android/server/DynamicSystemService.java @@ -44,7 +44,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub { private static final String TAG = "DynamicSystemService"; private static final long MINIMUM_SD_MB = (30L << 10); private static final int GSID_ROUGH_TIMEOUT_MS = 8192; - private static final String PATH_DEFAULT = "/data/gsi/"; + private static final String PATH_DEFAULT = "/data/gsi/dsu/"; private Context mContext; private String mInstallPath, mDsuSlot; private volatile IGsiService mGsiService; @@ -226,9 +226,7 @@ public class DynamicSystemService extends IDynamicSystemService.Stub { IGsiService gsiService = getGsiService(); if (enable) { try { - if (mDsuSlot == null) { - mDsuSlot = gsiService.getActiveDsuSlot(); - } + getActiveDsuSlot(); GsiServiceCallback callback = new GsiServiceCallback(); synchronized (callback) { gsiService.enableGsiAsync(oneShot, mDsuSlot, callback); @@ -287,4 +285,15 @@ public class DynamicSystemService extends IDynamicSystemService.Stub { return getGsiService().suggestScratchSize(); } + + @Override + @EnforcePermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM) + public String getActiveDsuSlot() throws RemoteException { + super.getActiveDsuSlot_enforcePermission(); + + if (mDsuSlot == null) { + mDsuSlot = getGsiService().getActiveDsuSlot(); + } + return mDsuSlot; + } } diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index 123cd3288343..55130e4cbbe6 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -1,3 +1,6 @@ +# BootReceiver +per-file BootReceiver.java = gaillard@google.com + # Connectivity / Networking per-file ConnectivityService.java,ConnectivityServiceInitializer.java,NetworkManagementService.java,NsdService.java,VpnManagerService.java = file:/services/core/java/com/android/server/net/OWNERS diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 73dbb86ae7cc..71428284882d 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -262,17 +262,17 @@ class StorageManagerService extends IStorageManager.Stub @Override public void onUserUnlocking(@NonNull TargetUser user) { - mStorageManagerService.onUnlockUser(user.getUserIdentifier()); + mStorageManagerService.onUserUnlocking(user.getUserIdentifier()); } @Override public void onUserStopped(@NonNull TargetUser user) { - mStorageManagerService.onCleanupUser(user.getUserIdentifier()); + mStorageManagerService.onUserStopped(user.getUserIdentifier()); } @Override public void onUserStopping(@NonNull TargetUser user) { - mStorageManagerService.onStopUser(user.getUserIdentifier()); + mStorageManagerService.onUserStopping(user.getUserIdentifier()); } @Override @@ -676,6 +676,7 @@ class StorageManagerService extends IStorageManager.Stub private static final int H_VOLUME_STATE_CHANGED = 15; private static final int H_CLOUD_MEDIA_PROVIDER_CHANGED = 16; private static final int H_SECURE_KEYGUARD_STATE_CHANGED = 17; + private static final int H_REMOUNT_VOLUMES_ON_MOVE = 18; class StorageManagerServiceHandler extends Handler { public StorageManagerServiceHandler(Looper looper) { @@ -831,6 +832,10 @@ class StorageManagerService extends IStorageManager.Stub } break; } + case H_REMOUNT_VOLUMES_ON_MOVE: { + remountVolumesForRunningUsersOnMove(); + break; + } } } } @@ -1155,8 +1160,8 @@ class StorageManagerService extends IStorageManager.Stub } } - private void onUnlockUser(int userId) { - Slog.d(TAG, "onUnlockUser " + userId); + private void onUserUnlocking(int userId) { + Slog.d(TAG, "onUserUnlocking " + userId); if (userId != UserHandle.USER_SYSTEM) { // Check if this user shares media with another user @@ -1219,8 +1224,8 @@ class StorageManagerService extends IStorageManager.Stub } } - private void onCleanupUser(int userId) { - Slog.d(TAG, "onCleanupUser " + userId); + private void onUserStopped(int userId) { + Slog.d(TAG, "onUserStopped " + userId); try { mVold.onUserStopped(userId); @@ -1234,8 +1239,8 @@ class StorageManagerService extends IStorageManager.Stub } } - private void onStopUser(int userId) { - Slog.i(TAG, "onStopUser " + userId); + private void onUserStopping(int userId) { + Slog.i(TAG, "onUserStopping " + userId); try { mStorageSessionController.onUserStopping(userId); } catch (Exception e) { @@ -1269,11 +1274,74 @@ class StorageManagerService extends IStorageManager.Stub } } + /** + * This method checks if the volume is public and the volume is visible and the volume it is + * trying to mount doesn't have the same mount user id as the current user being maintained by + * StorageManagerService and change the mount Id. The checks are same as + * {@link StorageManagerService#maybeRemountVolumes(int)} + * @param VolumeInfo object to consider for changing the mountId + */ + private void updateVolumeMountIdIfRequired(VolumeInfo vol) { + synchronized (mLock) { + if (!vol.isPrimary() && vol.isVisible() && vol.getMountUserId() != mCurrentUserId) { + vol.mountUserId = mCurrentUserId; + } + } + } + + /** + * This method informs vold and storaged that the user has stopped and started whenever move + * storage is performed. This ensures that the correct emulated volumes are mounted for the + * users other than the current user. This solves an edge case wherein the correct emulated + * volumes are not mounted, this will cause the media data to be still stored on internal + * storage whereas the data should be stored in the adopted primary storage. This method stops + * the users at vold first which will remove the old volumes which and starts the users at vold + * which will reattach the correct volumes. This does not performs a full reset as full reset + * clears every state from vold and SMS {@link #resetIfRebootedAndConnected} which is expensive + * and causes instability. + */ + private void remountVolumesForRunningUsersOnMove() { + // Do not want to hold the lock for long + final List<Integer> unlockedUsers = new ArrayList<>(); + synchronized (mLock) { + for (int userId : mSystemUnlockedUsers) { + if (userId == mCurrentUserId) continue; + unlockedUsers.add(userId); + } + } + for (Integer userId : unlockedUsers) { + try { + mVold.onUserStopped(userId); + mStoraged.onUserStopped(userId); + } catch (Exception e) { + Slog.wtf(TAG, e); + } + } + for (Integer userId : unlockedUsers) { + try { + mVold.onUserStarted(userId); + mStoraged.onUserStarted(userId); + } catch (Exception e) { + Slog.wtf(TAG, e); + } + } + } + private boolean supportsBlockCheckpoint() throws RemoteException { enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS); return mVold.supportsBlockCheckpoint(); } + private void prepareUserStorageForMoveInternal(String fromVolumeUuid, String toVolumeUuid, + List<UserInfo> users) throws Exception { + + final int flags = StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE; + for (UserInfo user : users) { + prepareUserStorageInternal(fromVolumeUuid, user.id, user.serialNumber, flags); + prepareUserStorageInternal(toVolumeUuid, user.id, user.serialNumber, flags); + } + } + @Override public void onAwakeStateChanged(boolean isAwake) { // Ignored @@ -1382,13 +1450,14 @@ class StorageManagerService extends IStorageManager.Stub } @Override - public void onVolumeStateChanged(String volId, final int newState) { + public void onVolumeStateChanged(String volId, final int newState, final int userId) { synchronized (mLock) { final VolumeInfo vol = mVolumes.get(volId); if (vol != null) { final int oldState = vol.state; vol.state = newState; final VolumeInfo vInfo = new VolumeInfo(vol); + vInfo.mountUserId = userId; final SomeArgs args = SomeArgs.obtain(); args.arg1 = vInfo; args.argi1 = oldState; @@ -1792,6 +1861,7 @@ class StorageManagerService extends IStorageManager.Stub mPrimaryStorageUuid = mMoveTargetUuid; writeSettingsLocked(); + mHandler.obtainMessage(H_REMOUNT_VOLUMES_ON_MOVE).sendToTarget(); } if (PackageManager.isMoveStatusFinished(status)) { @@ -2232,7 +2302,7 @@ class StorageManagerService extends IStorageManager.Stub if (isMountDisallowed(vol)) { throw new SecurityException("Mounting " + volId + " restricted by policy"); } - + updateVolumeMountIdIfRequired(vol); mount(vol); } @@ -2896,6 +2966,7 @@ class StorageManagerService extends IStorageManager.Stub final VolumeInfo from; final VolumeInfo to; + final List<UserInfo> users; synchronized (mLock) { if (Objects.equals(mPrimaryStorageUuid, volumeUuid)) { @@ -2909,7 +2980,7 @@ class StorageManagerService extends IStorageManager.Stub mMoveTargetUuid = volumeUuid; // We need all the users unlocked to move their primary storage - final List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers(); + users = mContext.getSystemService(UserManager.class).getUsers(); for (UserInfo user : users) { if (StorageManager.isFileEncrypted() && !isUserKeyUnlocked(user.id)) { Slog.w(TAG, "Failing move due to locked user " + user.id); @@ -2945,6 +3016,19 @@ class StorageManagerService extends IStorageManager.Stub } } + // Prepare the storage before move, this is required to unlock adoptable storage (as the + // keys are tied to prepare user data step) & also is required for the destination files to + // end up with the correct SELinux labels and encryption policies for directories + try { + prepareUserStorageForMoveInternal(mPrimaryStorageUuid, volumeUuid, users); + } catch (Exception e) { + Slog.w(TAG, "Failing move due to failure on prepare user data", e); + synchronized (mLock) { + onMoveStatusLocked(PackageManager.MOVE_FAILED_INTERNAL_ERROR); + } + return; + } + try { mVold.moveStorage(from.id, to.id, new IVoldTaskListener.Stub() { @Override @@ -4888,5 +4972,16 @@ class StorageManagerService extends IStorageManager.Stub mCloudProviderChangeListeners.add(listener); mHandler.obtainMessage(H_CLOUD_MEDIA_PROVIDER_CHANGED, listener).sendToTarget(); } + + @Override + public void prepareUserStorageForMove(String fromVolumeUuid, String toVolumeUuid, + List<UserInfo> users) { + try { + prepareUserStorageForMoveInternal(fromVolumeUuid, toVolumeUuid, users); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } } diff --git a/services/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java index 7fae31c0bb4b..f348af12ff24 100644 --- a/services/core/java/com/android/server/SystemConfig.java +++ b/services/core/java/com/android/server/SystemConfig.java @@ -88,7 +88,7 @@ public class SystemConfig { private static final int ALLOW_APP_CONFIGS = 0x008; private static final int ALLOW_PRIVAPP_PERMISSIONS = 0x010; private static final int ALLOW_OEM_PERMISSIONS = 0x020; - private static final int ALLOW_HIDDENAPI_WHITELISTING = 0x040; + private static final int ALLOW_HIDDENAPI_ALLOWLISTING = 0x040; private static final int ALLOW_ASSOCIATIONS = 0x080; // ALLOW_OVERRIDE_APP_RESTRICTIONS allows to use "allow-in-power-save-except-idle", // "allow-in-power-save", "allow-in-data-usage-save","allow-unthrottled-location", @@ -237,7 +237,7 @@ public class SystemConfig { final ArrayMap<String, PermissionEntry> mPermissions = new ArrayMap<>(); // These are the packages that are white-listed to be able to run in the - // background while in power save mode (but not whitelisted from device idle modes), + // background while in power save mode (but not allowlisted from device idle modes), // as read from the configuration files. final ArraySet<String> mAllowInPowerSaveExceptIdle = new ArraySet<>(); @@ -261,7 +261,7 @@ public class SystemConfig { // location settings are off, for emergency purposes, as read from the configuration files. final ArrayMap<String, ArraySet<String>> mAllowIgnoreLocationSettings = new ArrayMap<>(); - // These are the action strings of broadcasts which are whitelisted to + // These are the action strings of broadcasts which are allowlisted to // be delivered anonymously even to apps which target O+. final ArraySet<String> mAllowImplicitBroadcasts = new ArraySet<>(); @@ -284,7 +284,7 @@ public class SystemConfig { final ArrayMap<String, ArrayMap<String, Boolean>> mPackageComponentEnabledState = new ArrayMap<>(); - // Package names that are exempted from private API blacklisting + // Package names that are exempted from private API denylisting final ArraySet<String> mHiddenApiPackageWhitelist = new ArraySet<>(); // The list of carrier applications which should be disabled until used. @@ -514,7 +514,7 @@ public class SystemConfig { /** * Gets map of packagesNames to userTypes, dictating on which user types each package should NOT - * be initially installed, even if they are whitelisted, and then removes this map from + * be initially installed, even if they are allowlisted, and then removes this map from * SystemConfig. * Called by UserManagerService when it is constructed. */ @@ -630,10 +630,10 @@ public class SystemConfig { Environment.getOemDirectory(), "etc", "permissions"), oemPermissionFlag); // Allow Product to customize these configs - // TODO(b/157203468): ALLOW_HIDDENAPI_WHITELISTING must be removed because we prohibited + // TODO(b/157203468): ALLOW_HIDDENAPI_ALLOWLISTING must be removed because we prohibited // the use of hidden APIs from the product partition. int productPermissionFlag = ALLOW_FEATURES | ALLOW_LIBS | ALLOW_PERMISSIONS - | ALLOW_APP_CONFIGS | ALLOW_PRIVAPP_PERMISSIONS | ALLOW_HIDDENAPI_WHITELISTING + | ALLOW_APP_CONFIGS | ALLOW_PRIVAPP_PERMISSIONS | ALLOW_HIDDENAPI_ALLOWLISTING | ALLOW_ASSOCIATIONS | ALLOW_OVERRIDE_APP_RESTRICTIONS | ALLOW_IMPLICIT_BROADCASTS | ALLOW_VENDOR_APEX; if (Build.VERSION.DEVICE_INITIAL_SDK_INT <= Build.VERSION_CODES.R) { @@ -757,7 +757,7 @@ public class SystemConfig { final boolean allowPrivappPermissions = (permissionFlag & ALLOW_PRIVAPP_PERMISSIONS) != 0; final boolean allowOemPermissions = (permissionFlag & ALLOW_OEM_PERMISSIONS) != 0; - final boolean allowApiWhitelisting = (permissionFlag & ALLOW_HIDDENAPI_WHITELISTING) + final boolean allowApiWhitelisting = (permissionFlag & ALLOW_HIDDENAPI_ALLOWLISTING) != 0; final boolean allowAssociations = (permissionFlag & ALLOW_ASSOCIATIONS) != 0; final boolean allowOverrideAppRestrictions = @@ -1827,6 +1827,9 @@ public class SystemConfig { soname, soname, new String[0], true); mSharedLibraries.put(entry.name, entry); } + } catch (FileNotFoundException e) { + // Expected for /vendor/etc/public.libraries.txt on some devices + Slog.d(TAG, listFile + " does not exist"); } catch (IOException e) { Slog.w(TAG, "Failed to read public libraries file " + listFile, e); } diff --git a/services/core/java/com/android/server/TEST_MAPPING b/services/core/java/com/android/server/TEST_MAPPING index ae095b500cb1..b6ba6a5fc5c4 100644 --- a/services/core/java/com/android/server/TEST_MAPPING +++ b/services/core/java/com/android/server/TEST_MAPPING @@ -76,6 +76,23 @@ // GWP-ASan's CTS test ensures that recoverable tombstones work, // which is emitted by the NativeTombstoneManager. "name": "CtsGwpAsanTestCases" + }, + { + "name": "FrameworksVcnTests", + "file_patterns": ["VcnManagementService\\.java"] + }, + { + "name": "CtsVcnTestCases", + "file_patterns": ["VcnManagementService\\.java"] + }, + { + "name": "FrameworksNetTests", + "options": [ + { + "exclude-annotation": "com.android.testutils.SkipPresubmit" + } + ], + "file_patterns": ["VpnManagerService\\.java"] } ], "presubmit-large": [ @@ -93,6 +110,21 @@ } ], "file_patterns": ["ClipboardService\\.java"] + }, + { + "name": "CtsHostsideNetworkTests", + "options": [ + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + }, + { + "exclude-annotation": "android.platform.test.annotations.FlakyTest" + }, + { + "exclude-annotation": "com.android.testutils.SkipPresubmit" + } + ], + "file_patterns": ["VpnManagerService\\.java"] } ] } diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index c6e9a7d5e2e5..7acca19f9d79 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -456,7 +456,13 @@ public class VcnManagementService extends IVcnManagementService.Stub { final List<SubscriptionInfo> subscriptionInfos = new ArrayList<>(); Binder.withCleanCallingIdentity( () -> { - subscriptionInfos.addAll(subMgr.getSubscriptionsInGroup(subscriptionGroup)); + List<SubscriptionInfo> subsInGroup = + subMgr.getSubscriptionsInGroup(subscriptionGroup); + if (subsInGroup == null) { + logWtf("Received null from getSubscriptionsInGroup"); + subsInGroup = Collections.emptyList(); + } + subscriptionInfos.addAll(subsInGroup); }); for (SubscriptionInfo info : subscriptionInfos) { diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index c30b522f6ac7..5fec8494fb92 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -71,6 +71,7 @@ import android.content.pm.Signature; import android.content.pm.SigningDetails.CertCapabilities; import android.content.pm.UserInfo; import android.database.Cursor; +import android.database.sqlite.SQLiteCantOpenDatabaseException; import android.database.sqlite.SQLiteFullException; import android.database.sqlite.SQLiteStatement; import android.os.Binder; @@ -1415,7 +1416,13 @@ public class AccountManagerService private void purgeOldGrants(UserAccounts accounts) { synchronized (accounts.dbLock) { synchronized (accounts.cacheLock) { - List<Integer> uids = accounts.accountsDb.findAllUidGrants(); + List<Integer> uids; + try { + uids = accounts.accountsDb.findAllUidGrants(); + } catch (SQLiteCantOpenDatabaseException e) { + Log.w(TAG, "Could not delete grants for user = " + accounts.userId); + return; + } for (int uid : uids) { final boolean packageExists = mPackageManager.getPackagesForUid(uid) != null; if (packageExists) { @@ -1441,7 +1448,13 @@ public class AccountManagerService mPackageManager.getPackageUidAsUser(packageName, accounts.userId); } catch (NameNotFoundException e) { // package does not exist - remove visibility values - accounts.accountsDb.deleteAccountVisibilityForPackage(packageName); + try { + accounts.accountsDb.deleteAccountVisibilityForPackage(packageName); + } catch (SQLiteCantOpenDatabaseException sqlException) { + Log.w(TAG, "Could not delete account visibility for user = " + + accounts.userId, sqlException); + continue; + } synchronized (accounts.dbLock) { synchronized (accounts.cacheLock) { for (Account account : accounts.visibilityCache.keySet()) { @@ -4892,7 +4905,6 @@ public class AccountManagerService if (accountType == null) throw new IllegalArgumentException("accountType is null"); mAccounts = accounts; mStripAuthTokenFromResult = stripAuthTokenFromResult; - mResponse = response; mAccountType = accountType; mExpectActivityLaunch = expectActivityLaunch; mCreationTime = SystemClock.elapsedRealtime(); @@ -4906,8 +4918,8 @@ public class AccountManagerService if (response != null) { try { response.asBinder().linkToDeath(this, 0 /* flags */); + mResponse = response; } catch (RemoteException e) { - mResponse = null; binderDied(); } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 476e1b4ef11e..e6df1d91861a 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3993,21 +3993,6 @@ public class ActivityManagerService extends IActivityManager.Stub profile.addPss(mi.getTotalPss(), mi.getTotalUss(), mi.getTotalRss(), false, ProcessStats.ADD_PSS_EXTERNAL_SLOW, duration); - proc.getPkgList().forEachPackageProcessStats(holder -> { - final ProcessState state = holder.state; - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_MEMORY_STAT_REPORTED, - proc.info.uid, - state != null ? state.getName() : proc.processName, - state != null ? state.getPackage() : proc.info.packageName, - mi.getTotalPss(), - mi.getTotalUss(), - mi.getTotalRss(), - ProcessStats.ADD_PSS_EXTERNAL_SLOW, - duration, - holder.appVersion, - profile.getCurrentHostingComponentTypes(), - profile.getHistoricalHostingComponentTypes()); - }); } } } @@ -4054,20 +4039,6 @@ public class ActivityManagerService extends IActivityManager.Stub // Record this for posterity if the process has been stable. profile.addPss(pi, tmpUss[0], tmpUss[2], false, ProcessStats.ADD_PSS_EXTERNAL, duration); - proc.getPkgList().forEachPackageProcessStats(holder -> { - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_MEMORY_STAT_REPORTED, - proc.info.uid, - holder.state.getName(), - holder.state.getPackage(), - pi, - tmpUss[0], - tmpUss[2], - ProcessStats.ADD_PSS_EXTERNAL, - duration, - holder.appVersion, - profile.getCurrentHostingComponentTypes(), - profile.getHistoricalHostingComponentTypes()); - }); } } } @@ -5061,6 +5032,10 @@ public class ActivityManagerService extends IActivityManager.Stub // Tell anyone interested that we are done booting! SystemProperties.set("sys.boot_completed", "1"); SystemProperties.set("dev.bootcomplete", "1"); + + // Start PSI monitoring in LMKD if it was skipped earlier. + ProcessList.startPsiMonitoringAfterBoot(); + mUserController.onBootComplete( new IIntentReceiver.Stub() { @Override @@ -11312,6 +11287,13 @@ public class ActivityManagerService extends IActivityManager.Stub pw.println("\n\n** Cache info for pid " + pid + " [" + r.processName + "] **"); pw.flush(); try { + if (pid == Process.myPid()) { + // Directly dump to target fd for local dump to avoid hang. + try (ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(fd.getInt$())) { + thread.dumpCacheInfo(pfd, args); + } + continue; + } TransferPipe tp = new TransferPipe(); try { thread.dumpCacheInfo(tp.getWriteFd(), args); @@ -11906,17 +11888,6 @@ public class ActivityManagerService extends IActivityManager.Stub // Record this for posterity if the process has been stable. r.mProfile.addPss(myTotalPss, myTotalUss, myTotalRss, true, reportType, endTime - startTime); - r.getPkgList().forEachPackageProcessStats(holder -> { - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_MEMORY_STAT_REPORTED, - r.info.uid, - holder.state.getName(), - holder.state.getPackage(), - myTotalPss, myTotalUss, myTotalRss, reportType, - endTime-startTime, - holder.appVersion, - r.mProfile.getCurrentHostingComponentTypes(), - r.mProfile.getHistoricalHostingComponentTypes()); - }); } } @@ -12552,16 +12523,6 @@ public class ActivityManagerService extends IActivityManager.Stub // Record this for posterity if the process has been stable. r.mProfile.addPss(myTotalPss, myTotalUss, myTotalRss, true, reportType, endTime - startTime); - r.getPkgList().forEachPackageProcessStats(holder -> { - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_MEMORY_STAT_REPORTED, - r.info.uid, - holder.state.getName(), - holder.state.getPackage(), - myTotalPss, myTotalUss, myTotalRss, reportType, endTime-startTime, - holder.appVersion, - r.mProfile.getCurrentHostingComponentTypes(), - r.mProfile.getHistoricalHostingComponentTypes()); - }); } } diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 569f55f7890f..2e45da3c8d42 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -761,37 +761,37 @@ final class ActivityManagerShellCommand extends ShellCommand { out.println( "Error: Activity not started, unable to " + "resolve " + intent.toString()); - break; + return 1; case ActivityManager.START_CLASS_NOT_FOUND: out.println(NO_CLASS_ERROR_CODE); out.println("Error: Activity class " + intent.getComponent().toShortString() + " does not exist."); - break; + return 1; case ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT: out.println( "Error: Activity not started, you requested to " + "both forward and receive its result"); - break; + return 1; case ActivityManager.START_PERMISSION_DENIED: out.println( "Error: Activity not started, you do not " + "have permission to access it."); - break; + return 1; case ActivityManager.START_NOT_VOICE_COMPATIBLE: out.println( "Error: Activity not started, voice control not allowed for: " + intent); - break; + return 1; case ActivityManager.START_NOT_CURRENT_USER_ACTIVITY: out.println( "Error: Not allowed to start background user activity" + " that shouldn't be displayed for all users."); - break; + return 1; default: out.println( "Error: Activity not started, unknown error code " + res); - break; + return 1; } out.flush(); if (mWaitOption && launched) { diff --git a/services/core/java/com/android/server/am/AppProfiler.java b/services/core/java/com/android/server/am/AppProfiler.java index 16f222697646..0934ffd2568a 100644 --- a/services/core/java/com/android/server/am/AppProfiler.java +++ b/services/core/java/com/android/server/am/AppProfiler.java @@ -765,17 +765,6 @@ public class AppProfiler { swapPss * 1024, rss * 1024, statType, procState, pssDuration); profile.setLastPssTime(now); profile.addPss(pss, uss, rss, true, statType, pssDuration); - proc.getPkgList().forEachPackageProcessStats(holder -> { - FrameworkStatsLog.write(FrameworkStatsLog.PROCESS_MEMORY_STAT_REPORTED, - proc.info.uid, - holder.state.getName(), - holder.state.getPackage(), - pss, uss, rss, - statType, pssDuration, - holder.appVersion, - profile.getCurrentHostingComponentTypes(), - profile.getHistoricalHostingComponentTypes()); - }); if (DEBUG_PSS) { Slog.d(TAG_PSS, "pss of " + proc.toShortString() + ": " + pss diff --git a/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java b/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java index ff78355121d5..62680823588d 100644 --- a/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java +++ b/services/core/java/com/android/server/am/BaseAppStateTimeSlotEventsTracker.java @@ -338,7 +338,7 @@ abstract class BaseAppStateTimeSlotEventsTracker pw.print(prefix); pw.print(mKeyNumOfEventsThreshold); pw.print('='); - pw.println(mDefaultNumOfEventsThreshold); + pw.println(mNumOfEventsThreshold); } pw.print(prefix); pw.print("event_time_slot_size="); diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS index ef15bebfc0ac..bf7cc10637a7 100644 --- a/services/core/java/com/android/server/am/OWNERS +++ b/services/core/java/com/android/server/am/OWNERS @@ -32,7 +32,7 @@ narayan@google.com per-file *Assist* = file:/core/java/android/service/voice/OWNERS per-file *Voice* = file:/core/java/android/service/voice/OWNERS -per-file SettingsToPropertiesMapper.java = omakoto@google.com, yamasani@google.com +per-file SettingsToPropertiesMapper.java = omakoto@google.com, yamasani@google.com, dzshen@google.com, zhidou@google.com, tedbauer@google.com per-file CarUserSwitchingDialog.java = file:platform/packages/services/Car:/OWNERS diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index c5776d822c8f..e484a6cf251b 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -357,6 +357,7 @@ public final class ProcessList { static final byte LMK_UPDATE_PROPS = 7; static final byte LMK_KILL_OCCURRED = 8; // Msg to subscribed clients on kill occurred event static final byte LMK_STATE_CHANGED = 9; // Msg to subscribed clients on state changed + static final byte LMK_START_MONITORING = 9; // Start monitoring if delayed earlier // Low Memory Killer Daemon command codes. // These must be kept in sync with async_event_type definitions in lmkd.h @@ -1568,6 +1569,15 @@ public final class ProcessList { return true; } + /** + * {@hide} + */ + public static void startPsiMonitoringAfterBoot() { + ByteBuffer buf = ByteBuffer.allocate(4); + buf.putInt(LMK_START_MONITORING); + writeLmkd(buf, null); + } + private static boolean writeLmkd(ByteBuffer buf, ByteBuffer repl) { if (!sLmkdConnection.isConnected()) { // try to connect immediately and then keep retrying @@ -1827,6 +1837,7 @@ public final class ProcessList { if (debuggableFlag) { runtimeFlags |= Zygote.DEBUG_ENABLE_JDWP; + runtimeFlags |= Zygote.DEBUG_ENABLE_PTRACE; runtimeFlags |= Zygote.DEBUG_JAVA_DEBUGGABLE; // Also turn on CheckJNI for debuggable apps. It's quite // awkward to turn on otherwise. diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 29a19417b8fd..4f45c0dd2f14 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -2125,7 +2125,7 @@ import java.util.concurrent.atomic.AtomicBoolean; try { mCb.unlinkToDeath(this, 0); } catch (NoSuchElementException e) { - Log.w(TAG, "CommunicationRouteClient could not not unregistered to binder"); + Log.w(TAG, "CommunicationRouteClient could not unlink to " + mCb + " binder death"); } } @@ -2175,7 +2175,7 @@ import java.util.concurrent.atomic.AtomicBoolean; if (btSCoOn) { // Use the SCO device known to BtHelper so that it matches exactly // what has been communicated to audio policy manager. The device - // returned by requestedCommunicationDevice() can be a dummy SCO device if legacy + // returned by requestedCommunicationDevice() can be a placeholder SCO device if legacy // APIs are used to start SCO audio. AudioDeviceAttributes device = mBtHelper.getHeadsetAudioDevice(); if (device != null) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 53ed38edffe4..f313e168c62d 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -156,6 +156,7 @@ import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.ResultReceiver; +import android.os.ServiceDebugInfo; import android.os.ServiceManager; import android.os.ShellCallback; import android.os.SystemClock; @@ -3598,16 +3599,21 @@ public class AudioService extends IAudioService.Stub synchronized (mHdmiClientLock) { if (mHdmiManager != null) { // At most one of mHdmiPlaybackClient and mHdmiTvClient should be non-null - HdmiClient fullVolumeHdmiClient = mHdmiPlaybackClient; + HdmiClient hdmiClient = mHdmiPlaybackClient; if (mHdmiTvClient != null) { - fullVolumeHdmiClient = mHdmiTvClient; + hdmiClient = mHdmiTvClient; } - if (fullVolumeHdmiClient != null + boolean playbackDeviceConditions = mHdmiPlaybackClient != null + && isFullVolumeDevice(device); + boolean tvConditions = mHdmiTvClient != null + && mHdmiSystemAudioSupported + && !isAbsoluteVolumeDevice(device) + && !isA2dpAbsoluteVolumeDevice(device); + + if ((playbackDeviceConditions || tvConditions) && mHdmiCecVolumeControlEnabled - && streamTypeAlias == AudioSystem.STREAM_MUSIC - // vol change on a full volume device - && isFullVolumeDevice(device)) { + && streamTypeAlias == AudioSystem.STREAM_MUSIC) { int keyCode = KeyEvent.KEYCODE_UNKNOWN; switch (direction) { case AudioManager.ADJUST_RAISE: @@ -3631,14 +3637,14 @@ public class AudioService extends IAudioService.Stub try { switch (keyEventMode) { case AudioDeviceVolumeManager.ADJUST_MODE_NORMAL: - fullVolumeHdmiClient.sendVolumeKeyEvent(keyCode, true); - fullVolumeHdmiClient.sendVolumeKeyEvent(keyCode, false); + hdmiClient.sendVolumeKeyEvent(keyCode, true); + hdmiClient.sendVolumeKeyEvent(keyCode, false); break; case AudioDeviceVolumeManager.ADJUST_MODE_START: - fullVolumeHdmiClient.sendVolumeKeyEvent(keyCode, true); + hdmiClient.sendVolumeKeyEvent(keyCode, true); break; case AudioDeviceVolumeManager.ADJUST_MODE_END: - fullVolumeHdmiClient.sendVolumeKeyEvent(keyCode, false); + hdmiClient.sendVolumeKeyEvent(keyCode, false); break; default: Log.e(TAG, "Invalid keyEventMode " + keyEventMode); @@ -12876,12 +12882,25 @@ public class AudioService extends IAudioService.Stub private static final String AUDIO_HAL_SERVICE_PREFIX = "android.hardware.audio"; - private Set<Integer> getAudioHalPids() { + private void getAudioAidlHalPids(HashSet<Integer> pids) { + try { + ServiceDebugInfo[] infos = ServiceManager.getServiceDebugInfo(); + if (infos == null) return; + for (ServiceDebugInfo info : infos) { + if (info.debugPid > 0 && info.name.startsWith(AUDIO_HAL_SERVICE_PREFIX)) { + pids.add(info.debugPid); + } + } + } catch (RuntimeException e) { + // ignored, pid hashset does not change + } + } + + private void getAudioHalHidlPids(HashSet<Integer> pids) { try { IServiceManager serviceManager = IServiceManager.getService(); ArrayList<IServiceManager.InstanceDebugInfo> dump = serviceManager.debugDump(); - HashSet<Integer> pids = new HashSet<>(); for (IServiceManager.InstanceDebugInfo info : dump) { if (info.pid != IServiceManager.PidConstant.NO_PID && info.interfaceName != null @@ -12889,12 +12908,18 @@ public class AudioService extends IAudioService.Stub pids.add(info.pid); } } - return pids; } catch (RemoteException | RuntimeException e) { - return new HashSet<Integer>(); + // ignored, pid hashset does not change } } + private Set<Integer> getAudioHalPids() { + HashSet<Integer> pids = new HashSet<>(); + getAudioAidlHalPids(pids); + getAudioHalHidlPids(pids); + return pids; + } + private void updateAudioHalPids() { Set<Integer> pidsSet = getAudioHalPids(); if (pidsSet.isEmpty()) { diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index 50d375c56f4a..7ae31b2a114d 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -212,8 +212,6 @@ class FaceAuthenticationClient extends AuthenticationClient<AidlSession, FaceAut // 1) Authenticated == true // 2) Error occurred // 3) Authenticated == false - // 4) onLockout - // 5) onLockoutTimed mCallback.onClientFinished(this, true /* success */); } @@ -306,7 +304,11 @@ class FaceAuthenticationClient extends AuthenticationClient<AidlSession, FaceAut PerformanceTracker.getInstanceForSensorId(getSensorId()) .incrementTimedLockoutForUser(getTargetUserId()); - onError(error, 0 /* vendorCode */); + try { + getListener().onError(getSensorId(), getCookie(), error, 0 /* vendorCode */); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + } } @Override @@ -321,6 +323,10 @@ class FaceAuthenticationClient extends AuthenticationClient<AidlSession, FaceAut PerformanceTracker.getInstanceForSensorId(getSensorId()) .incrementPermanentLockoutForUser(getTargetUserId()); - onError(error, 0 /* vendorCode */); + try { + getListener().onError(getSensorId(), getCookie(), error, 0 /* vendorCode */); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + } } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java index a50164718417..5aa1175b92cd 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java @@ -149,6 +149,17 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { @NonNull String halInstanceName, @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull BiometricContext biometricContext) { + this(context, biometricStateCallback, props, halInstanceName, lockoutResetDispatcher, + biometricContext, null /* daemon */); + } + + @VisibleForTesting FaceProvider(@NonNull Context context, + @NonNull BiometricStateCallback biometricStateCallback, + @NonNull SensorProps[] props, + @NonNull String halInstanceName, + @NonNull LockoutResetDispatcher lockoutResetDispatcher, + @NonNull BiometricContext biometricContext, + IFace daemon) { mContext = context; mBiometricStateCallback = biometricStateCallback; mHalInstanceName = halInstanceName; @@ -160,6 +171,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { mTaskStackListener = new BiometricTaskStackListener(); mBiometricContext = biometricContext; mAuthSessionCoordinator = mBiometricContext.getAuthSessionCoordinator(); + mDaemon = daemon; for (SensorProps prop : props) { final int sensorId = prop.commonProps.sensorId; @@ -475,7 +487,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { BaseClientMonitor clientMonitor, boolean success) { mAuthSessionCoordinator.authEndedFor(userId, Utils.getCurrentStrength(sensorId), - sensorId, requestId, client.wasAuthSuccessful()); + sensorId, requestId, success); } }); }); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 58ece898a9fe..9b2ea1589275 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -160,6 +160,17 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher, @NonNull BiometricContext biometricContext) { + this(context, biometricStateCallback, props, halInstanceName, lockoutResetDispatcher, + gestureAvailabilityDispatcher, biometricContext, null /* daemon */); + } + + @VisibleForTesting FingerprintProvider(@NonNull Context context, + @NonNull BiometricStateCallback biometricStateCallback, + @NonNull SensorProps[] props, @NonNull String halInstanceName, + @NonNull LockoutResetDispatcher lockoutResetDispatcher, + @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher, + @NonNull BiometricContext biometricContext, + IFingerprint daemon) { mContext = context; mBiometricStateCallback = biometricStateCallback; mHalInstanceName = halInstanceName; @@ -170,6 +181,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi mTaskStackListener = new BiometricTaskStackListener(); mBiometricContext = biometricContext; mAuthSessionCoordinator = mBiometricContext.getAuthSessionCoordinator(); + mDaemon = daemon; final List<SensorLocationInternal> workaroundLocations = getWorkaroundSensorProps(context); diff --git a/services/core/java/com/android/server/camera/CameraServiceProxy.java b/services/core/java/com/android/server/camera/CameraServiceProxy.java index 0b04159194d1..f8f0088ac047 100644 --- a/services/core/java/com/android/server/camera/CameraServiceProxy.java +++ b/services/core/java/com/android/server/camera/CameraServiceProxy.java @@ -613,16 +613,26 @@ public class CameraServiceProxy extends SystemService @Override public boolean isCameraDisabled(int userId) { - DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); - if (dpm == null) { - Slog.e(TAG, "Failed to get the device policy manager service"); + if (Binder.getCallingUid() != Process.CAMERASERVER_UID) { + Slog.e(TAG, "Calling UID: " + Binder.getCallingUid() + + " doesn't match expected camera service UID!"); return false; } + final long ident = Binder.clearCallingIdentity(); try { - return dpm.getCameraDisabled(null, userId); - } catch (Exception e) { - e.printStackTrace(); - return false; + DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); + if (dpm == null) { + Slog.e(TAG, "Failed to get the device policy manager service"); + return false; + } + try { + return dpm.getCameraDisabled(null, userId); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } finally { + Binder.restoreCallingIdentity(ident); } } }; diff --git a/services/core/java/com/android/server/connectivity/OWNERS b/services/core/java/com/android/server/connectivity/OWNERS index 62c5737a2e8e..c24680e9b06a 100644 --- a/services/core/java/com/android/server/connectivity/OWNERS +++ b/services/core/java/com/android/server/connectivity/OWNERS @@ -1,2 +1,2 @@ set noparent -file:platform/packages/modules/Connectivity:master:/OWNERS_core_networking +file:platform/packages/modules/Connectivity:main:/OWNERS_core_networking diff --git a/services/core/java/com/android/server/connectivity/TEST_MAPPING b/services/core/java/com/android/server/connectivity/TEST_MAPPING new file mode 100644 index 000000000000..687d4b06b4c0 --- /dev/null +++ b/services/core/java/com/android/server/connectivity/TEST_MAPPING @@ -0,0 +1,30 @@ +{ + "presubmit": [ + { + "name": "FrameworksNetTests", + "options": [ + { + "exclude-annotation": "com.android.testutils.SkipPresubmit" + } + ], + "file_patterns": ["Vpn\\.java", "VpnIkeV2Utils\\.java", "VpnProfileStore\\.java"] + } + ], + "presubmit-large": [ + { + "name": "CtsHostsideNetworkTests", + "options": [ + { + "exclude-annotation": "androidx.test.filters.FlakyTest" + }, + { + "exclude-annotation": "android.platform.test.annotations.FlakyTest" + }, + { + "exclude-annotation": "com.android.testutils.SkipPresubmit" + } + ], + "file_patterns": ["Vpn\\.java", "VpnIkeV2Utils\\.java", "VpnProfileStore\\.java"] + } + ] +}
\ No newline at end of file diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index e85eee817d29..53fbe8f37046 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -22,7 +22,6 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_VPN; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; -import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static android.net.RouteInfo.RTN_THROW; import static android.net.RouteInfo.RTN_UNREACHABLE; import static android.net.VpnManager.NOTIFICATION_CHANNEL_VPN; @@ -280,15 +279,21 @@ public class Vpn { private static final int VPN_DEFAULT_SCORE = 101; /** - * The reset session timer for data stall. If a session has not successfully revalidated after - * the delay, the session will be torn down and restarted in an attempt to recover. Delay + * The recovery timer for data stall. If a session has not successfully revalidated after + * the delay, the session will perform MOBIKE or be restarted in an attempt to recover. Delay * counter is reset on successful validation only. * + * <p>The first {@code MOBIKE_RECOVERY_ATTEMPT} timers are used for performing MOBIKE. + * System will perform session reset for the remaining timers. * <p>If retries have exceeded the length of this array, the last entry in the array will be * used as a repeating interval. */ - private static final long[] DATA_STALL_RESET_DELAYS_SEC = {30L, 60L, 120L, 240L, 480L, 960L}; - + private static final long[] DATA_STALL_RECOVERY_DELAYS_MS = + {1000L, 5000L, 30000L, 60000L, 120000L, 240000L, 480000L, 960000L}; + /** + * Maximum attempts to perform MOBIKE when the network is bad. + */ + private static final int MAX_MOBIKE_RECOVERY_ATTEMPT = 2; /** * The initial token value of IKE session. */ @@ -380,6 +385,7 @@ public class Vpn { private final INetworkManagementService mNms; private final INetd mNetd; @VisibleForTesting + @GuardedBy("this") protected VpnConfig mConfig; private final NetworkProvider mNetworkProvider; @VisibleForTesting @@ -392,7 +398,6 @@ public class Vpn { private final UserManager mUserManager; private final VpnProfileStore mVpnProfileStore; - protected boolean mDataStallSuspected = false; @VisibleForTesting VpnProfileStore getVpnProfileStore() { @@ -685,14 +690,14 @@ public class Vpn { } /** - * Get the length of time to wait before resetting the ike session when a data stall is - * suspected. + * Get the length of time to wait before perform data stall recovery when the validation + * result is bad. */ - public long getDataStallResetSessionSeconds(int count) { - if (count >= DATA_STALL_RESET_DELAYS_SEC.length) { - return DATA_STALL_RESET_DELAYS_SEC[DATA_STALL_RESET_DELAYS_SEC.length - 1]; + public long getValidationFailRecoveryMs(int count) { + if (count >= DATA_STALL_RECOVERY_DELAYS_MS.length) { + return DATA_STALL_RECOVERY_DELAYS_MS[DATA_STALL_RECOVERY_DELAYS_MS.length - 1]; } else { - return DATA_STALL_RESET_DELAYS_SEC[count]; + return DATA_STALL_RECOVERY_DELAYS_MS[count]; } } @@ -1389,7 +1394,7 @@ public class Vpn { } // Check that the caller is authorized. - enforceControlPermission(); + enforceControlPermissionOrInternalCaller(); // Stop an existing always-on VPN from being dethroned by other apps. if (mAlwaysOn && !isCurrentPreparedPackage(newPackage)) { @@ -1598,6 +1603,8 @@ public class Vpn { return network; } + // TODO : this is not synchronized(this) but reads from mConfig, which is dangerous + // This file makes an effort to avoid partly initializing mConfig, but this is still not great private LinkProperties makeLinkProperties() { // The design of disabling IPv6 is only enabled for IKEv2 VPN because it needs additional // logic to handle IPv6 only VPN, and the IPv6 only VPN may be restarted when its MTU @@ -1679,6 +1686,7 @@ public class Vpn { * registering a new NetworkAgent. This is not always possible if the new VPN configuration * has certain changes, in which case this method would just return {@code false}. */ + // TODO : this method is not synchronized(this) but reads from mConfig private boolean updateLinkPropertiesInPlaceIfPossible(NetworkAgent agent, VpnConfig oldConfig) { // NetworkAgentConfig cannot be updated without registering a new NetworkAgent. // Strictly speaking, bypassability is affected by lockdown and therefore it's possible @@ -1733,6 +1741,7 @@ public class Vpn { .setBypassableVpn(bypassable) .setVpnRequiresValidation(mConfig.requiresInternetValidation) .setLocalRoutesExcludedForVpn(mConfig.excludeLocalRoutes) + .setLegacyExtraInfo("VPN:" + mPackage) .build(); capsBuilder.setOwnerUid(mOwnerUID); @@ -2269,7 +2278,12 @@ public class Vpn { */ public synchronized VpnConfig getVpnConfig() { enforceControlPermission(); - return mConfig; + // Constructor of VpnConfig cannot take a null parameter. Return null directly if mConfig is + // null + if (mConfig == null) return null; + // mConfig is guarded by "this" and can be modified by another thread as soon as + // this method returns, so this method must return a copy. + return new VpnConfig(mConfig); } @Deprecated @@ -2315,6 +2329,7 @@ public class Vpn { } }; + @GuardedBy("this") private void cleanupVpnStateLocked() { mStatusIntent = null; resetNetworkCapabilities(); @@ -2837,9 +2852,7 @@ public class Vpn { } final boolean isLegacyVpn = mVpnRunner instanceof LegacyVpnRunner; - mVpnRunner.exit(); - mVpnRunner = null; // LegacyVpn uses daemons that must be shut down before new ones are brought up. // The same limitation does not apply to Platform VPNs. @@ -3044,7 +3057,6 @@ public class Vpn { @Nullable private IkeSessionWrapper mSession; @Nullable private IkeSessionConnectionInfo mIkeConnectionInfo; - @Nullable private VpnConnectivityDiagnosticsCallback mDiagnosticsCallback; // mMobikeEnabled can only be updated after IKE AUTH is finished. private boolean mMobikeEnabled = false; @@ -3055,7 +3067,8 @@ public class Vpn { * <p>This variable controls the retry delay, and is reset when the VPN pass network * validation. */ - private int mDataStallRetryCount = 0; + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) + int mValidationFailRetryCount = 0; /** * The number of attempts since the last successful connection. @@ -3084,6 +3097,7 @@ public class Vpn { } }; + // GuardedBy("Vpn.this") (annotation can't be applied to constructor) IkeV2VpnRunner( @NonNull Ikev2VpnProfile profile, @NonNull ScheduledThreadPoolExecutor executor) { super(TAG); @@ -3136,15 +3150,6 @@ public class Vpn { mConnectivityManager.registerSystemDefaultNetworkCallback(mNetworkCallback, new Handler(mLooper)); } - - // DiagnosticsCallback may return more than one alive VPNs, but VPN will filter based on - // Network object. - final NetworkRequest diagRequest = new NetworkRequest.Builder() - .addTransportType(TRANSPORT_VPN) - .removeCapability(NET_CAPABILITY_NOT_VPN).build(); - mDiagnosticsCallback = new VpnConnectivityDiagnosticsCallback(); - mConnectivityDiagnosticsManager.registerConnectivityDiagnosticsCallback( - diagRequest, mExecutor, mDiagnosticsCallback); } private boolean isActiveNetwork(@Nullable Network network) { @@ -3293,13 +3298,6 @@ public class Vpn { } agentConnect(this::onValidationStatus); return; // Link properties are already sent. - } else { - // Underlying networks also set in agentConnect() - doSetUnderlyingNetworks(networkAgent, Collections.singletonList(network)); - mNetworkCapabilities = - new NetworkCapabilities.Builder(mNetworkCapabilities) - .setUnderlyingNetworks(Collections.singletonList(network)) - .build(); } lp = makeLinkProperties(); // Accesses VPN instance fields; must be locked @@ -3343,7 +3341,7 @@ public class Vpn { // Transforms do not need to be persisted; the IkeSession will keep // them alive for us mIpSecManager.applyTunnelModeTransform(mTunnelIface, direction, transform); - } catch (IOException e) { + } catch (IOException | IllegalArgumentException e) { Log.d(TAG, "Transform application failed for token " + token, e); onSessionLost(token, e); } @@ -3381,8 +3379,6 @@ public class Vpn { final LinkProperties oldLp = makeLinkProperties(); - final boolean underlyingNetworkHasChanged = - !Arrays.equals(mConfig.underlyingNetworks, new Network[]{network}); mConfig.underlyingNetworks = new Network[] {network}; mConfig.mtu = calculateVpnMtu(); @@ -3414,18 +3410,9 @@ public class Vpn { removed.getAddress(), removed.getPrefixLength()); } } else { - // Put below 3 updates into else block is because agentConnect() will do - // those things, so there is no need to do the redundant work. + // Put below update into else block is because agentConnect() will do + // the same things, so there is no need to do the redundant work. if (!newLp.equals(oldLp)) doSendLinkProperties(mNetworkAgent, newLp); - if (underlyingNetworkHasChanged) { - mNetworkCapabilities = - new NetworkCapabilities.Builder(mNetworkCapabilities) - .setUnderlyingNetworks( - Collections.singletonList(network)) - .build(); - doSetUnderlyingNetworks(mNetworkAgent, - Collections.singletonList(network)); - } } } @@ -3437,7 +3424,7 @@ public class Vpn { mTunnelIface, IpSecManager.DIRECTION_IN, inTransform); mIpSecManager.applyTunnelModeTransform( mTunnelIface, IpSecManager.DIRECTION_OUT, outTransform); - } catch (IOException e) { + } catch (IOException | IllegalArgumentException e) { Log.d(TAG, "Transform application failed for token " + token, e); onSessionLost(token, e); } @@ -3551,10 +3538,28 @@ public class Vpn { */ private void startOrMigrateIkeSession(@Nullable Network underlyingNetwork) { if (underlyingNetwork == null) { + // For null underlyingNetwork case, there will not be a NetworkAgent available so + // no underlying network update is necessary here. Note that updating + // mNetworkCapabilities here would also be reasonable, but it will be updated next + // time the VPN connects anyway. Log.d(TAG, "There is no active network for starting an IKE session"); return; } + final List<Network> networks = Collections.singletonList(underlyingNetwork); + // Update network capabilities if underlying network is changed. + if (!networks.equals(mNetworkCapabilities.getUnderlyingNetworks())) { + mNetworkCapabilities = + new NetworkCapabilities.Builder(mNetworkCapabilities) + .setUnderlyingNetworks(networks) + .build(); + // No NetworkAgent case happens when Vpn tries to start a new VPN. The underlying + // network update will be done later with NetworkAgent connected event. + if (mNetworkAgent != null) { + doSetUnderlyingNetworks(mNetworkAgent, networks); + } + } + if (maybeMigrateIkeSessionAndUpdateVpnTransportInfo(underlyingNetwork)) return; startIkeSession(underlyingNetwork); @@ -3710,11 +3715,14 @@ public class Vpn { } public void updateVpnTransportInfoAndNetCap(int keepaliveDelaySec) { - final VpnTransportInfo info = new VpnTransportInfo( - getActiveVpnType(), - mConfig.session, - mConfig.allowBypass && !mLockdown, - areLongLivedTcpConnectionsExpensive(keepaliveDelaySec)); + final VpnTransportInfo info; + synchronized (Vpn.this) { + info = new VpnTransportInfo( + getActiveVpnType(), + mConfig.session, + mConfig.allowBypass && !mLockdown, + areLongLivedTcpConnectionsExpensive(keepaliveDelaySec)); + } final boolean ncUpdateRequired = !info.equals(mNetworkCapabilities.getTransportInfo()); if (ncUpdateRequired) { mNetworkCapabilities = new NetworkCapabilities.Builder(mNetworkCapabilities) @@ -3875,39 +3883,12 @@ public class Vpn { } } - class VpnConnectivityDiagnosticsCallback - extends ConnectivityDiagnosticsManager.ConnectivityDiagnosticsCallback { - // The callback runs in the executor thread. - @Override - public void onDataStallSuspected( - ConnectivityDiagnosticsManager.DataStallReport report) { - synchronized (Vpn.this) { - // Ignore stale runner. - if (mVpnRunner != Vpn.IkeV2VpnRunner.this) return; - - // Handle the report only for current VPN network. If data stall is already - // reported, ignoring the other reports. It means that the stall is not - // recovered by MOBIKE and should be on the way to reset the ike session. - if (mNetworkAgent != null - && mNetworkAgent.getNetwork().equals(report.getNetwork()) - && !mDataStallSuspected) { - Log.d(TAG, "Data stall suspected"); - - // Trigger MOBIKE. - maybeMigrateIkeSessionAndUpdateVpnTransportInfo(mActiveNetwork); - mDataStallSuspected = true; - } - } - } - } - public void onValidationStatus(int status) { mEventChanges.log("[Validation] validation status " + status); if (status == NetworkAgent.VALIDATION_STATUS_VALID) { // No data stall now. Reset it. mExecutor.execute(() -> { - mDataStallSuspected = false; - mDataStallRetryCount = 0; + mValidationFailRetryCount = 0; if (mScheduledHandleDataStallFuture != null) { Log.d(TAG, "Recovered from stall. Cancel pending reset action."); mScheduledHandleDataStallFuture.cancel(false /* mayInterruptIfRunning */); @@ -3918,8 +3899,33 @@ public class Vpn { // Skip other invalid status if the scheduled recovery exists. if (mScheduledHandleDataStallFuture != null) return; + // Trigger network validation on the underlying network to possibly cause system + // switch default network or try recover if the current default network is broken. + // + // For the same underlying network, the first validation result should clarify if + // it's caused by broken underlying network. So only perform underlying network + // re-evaluation after first validation failure to prevent extra network resource + // costs on sending probes. + if (mValidationFailRetryCount == 0) { + mConnectivityManager.reportNetworkConnectivity( + mActiveNetwork, false /* hasConnectivity */); + } + + if (mValidationFailRetryCount < MAX_MOBIKE_RECOVERY_ATTEMPT) { + Log.d(TAG, "Validation failed"); + + // Trigger MOBIKE to recover first. + mExecutor.schedule(() -> { + maybeMigrateIkeSessionAndUpdateVpnTransportInfo(mActiveNetwork); + }, mDeps.getValidationFailRecoveryMs(mValidationFailRetryCount++), + TimeUnit.MILLISECONDS); + return; + } + + // Data stall is not recovered by MOBIKE. Try to reset session to recover it. mScheduledHandleDataStallFuture = mExecutor.schedule(() -> { - if (mDataStallSuspected) { + // Only perform the recovery when the network is still bad. + if (mValidationFailRetryCount > 0) { Log.d(TAG, "Reset session to recover stalled network"); // This will reset old state if it exists. startIkeSession(mActiveNetwork); @@ -3928,7 +3934,9 @@ public class Vpn { // Reset mScheduledHandleDataStallFuture since it's already run on executor // thread. mScheduledHandleDataStallFuture = null; - }, mDeps.getDataStallResetSessionSeconds(mDataStallRetryCount++), TimeUnit.SECONDS); + // TODO: compute the delay based on the last recovery timestamp + }, mDeps.getValidationFailRecoveryMs(mValidationFailRetryCount++), + TimeUnit.MILLISECONDS); } } @@ -4220,7 +4228,7 @@ public class Vpn { * consistency of the Ikev2VpnRunner fields. */ private void disconnectVpnRunner() { - mEventChanges.log("[VPNRunner] Disconnect runner, underlying network" + mActiveNetwork); + mEventChanges.log("[VPNRunner] Disconnect runner, underlying net " + mActiveNetwork); mActiveNetwork = null; mUnderlyingNetworkCapabilities = null; mUnderlyingLinkProperties = null; @@ -4231,8 +4239,6 @@ public class Vpn { mCarrierConfigManager.unregisterCarrierConfigChangeListener( mCarrierConfigChangeListener); mConnectivityManager.unregisterNetworkCallback(mNetworkCallback); - mConnectivityDiagnosticsManager.unregisterConnectivityDiagnosticsCallback( - mDiagnosticsCallback); clearVpnNetworkPreference(mSessionKey); mExecutor.shutdown(); @@ -4293,6 +4299,7 @@ public class Vpn { } }; + // GuardedBy("Vpn.this") (annotation can't be applied to constructor) LegacyVpnRunner(VpnConfig config, String[] racoon, String[] mtpd, VpnProfile profile) { super(TAG); if (racoon == null && mtpd == null) { @@ -4500,46 +4507,46 @@ public class Vpn { } // Set the interface and the addresses in the config. - mConfig.interfaze = parameters[0].trim(); + synchronized (Vpn.this) { + mConfig.interfaze = parameters[0].trim(); - mConfig.addLegacyAddresses(parameters[1]); - // Set the routes if they are not set in the config. - if (mConfig.routes == null || mConfig.routes.isEmpty()) { - mConfig.addLegacyRoutes(parameters[2]); - } + mConfig.addLegacyAddresses(parameters[1]); + // Set the routes if they are not set in the config. + if (mConfig.routes == null || mConfig.routes.isEmpty()) { + mConfig.addLegacyRoutes(parameters[2]); + } - // Set the DNS servers if they are not set in the config. - if (mConfig.dnsServers == null || mConfig.dnsServers.size() == 0) { - String dnsServers = parameters[3].trim(); - if (!dnsServers.isEmpty()) { - mConfig.dnsServers = Arrays.asList(dnsServers.split(" ")); + // Set the DNS servers if they are not set in the config. + if (mConfig.dnsServers == null || mConfig.dnsServers.size() == 0) { + String dnsServers = parameters[3].trim(); + if (!dnsServers.isEmpty()) { + mConfig.dnsServers = Arrays.asList(dnsServers.split(" ")); + } } - } - // Set the search domains if they are not set in the config. - if (mConfig.searchDomains == null || mConfig.searchDomains.size() == 0) { - String searchDomains = parameters[4].trim(); - if (!searchDomains.isEmpty()) { - mConfig.searchDomains = Arrays.asList(searchDomains.split(" ")); + // Set the search domains if they are not set in the config. + if (mConfig.searchDomains == null || mConfig.searchDomains.size() == 0) { + String searchDomains = parameters[4].trim(); + if (!searchDomains.isEmpty()) { + mConfig.searchDomains = Arrays.asList(searchDomains.split(" ")); + } } - } - // Add a throw route for the VPN server endpoint, if one was specified. - if (endpointAddress instanceof Inet4Address) { - mConfig.routes.add(new RouteInfo( - new IpPrefix(endpointAddress, 32), null /*gateway*/, - null /*iface*/, RTN_THROW)); - } else if (endpointAddress instanceof Inet6Address) { - mConfig.routes.add(new RouteInfo( - new IpPrefix(endpointAddress, 128), null /*gateway*/, - null /*iface*/, RTN_THROW)); - } else { - Log.e(TAG, "Unknown IP address family for VPN endpoint: " - + endpointAddress); - } + // Add a throw route for the VPN server endpoint, if one was specified. + if (endpointAddress instanceof Inet4Address) { + mConfig.routes.add(new RouteInfo( + new IpPrefix(endpointAddress, 32), null /*gateway*/, + null /*iface*/, RTN_THROW)); + } else if (endpointAddress instanceof Inet6Address) { + mConfig.routes.add(new RouteInfo( + new IpPrefix(endpointAddress, 128), null /*gateway*/, + null /*iface*/, RTN_THROW)); + } else { + Log.e(TAG, "Unknown IP address family for VPN endpoint: " + + endpointAddress); + } - // Here is the last step and it must be done synchronously. - synchronized (Vpn.this) { + // Here is the last step and it must be done synchronously. // Set the start time mConfig.startTime = SystemClock.elapsedRealtime(); @@ -4773,25 +4780,26 @@ public class Vpn { try { // Build basic config - mConfig = new VpnConfig(); + final VpnConfig config = new VpnConfig(); if (VpnConfig.LEGACY_VPN.equals(packageName)) { - mConfig.legacy = true; - mConfig.session = profile.name; - mConfig.user = profile.key; + config.legacy = true; + config.session = profile.name; + config.user = profile.key; // TODO: Add support for configuring meteredness via Settings. Until then, use a // safe default. - mConfig.isMetered = true; + config.isMetered = true; } else { - mConfig.user = packageName; - mConfig.isMetered = profile.isMetered; + config.user = packageName; + config.isMetered = profile.isMetered; } - mConfig.startTime = SystemClock.elapsedRealtime(); - mConfig.proxyInfo = profile.proxy; - mConfig.requiresInternetValidation = profile.requiresInternetValidation; - mConfig.excludeLocalRoutes = profile.excludeLocalRoutes; - mConfig.allowBypass = profile.isBypassable; - mConfig.disallowedApplications = getAppExclusionList(mPackage); + config.startTime = SystemClock.elapsedRealtime(); + config.proxyInfo = profile.proxy; + config.requiresInternetValidation = profile.requiresInternetValidation; + config.excludeLocalRoutes = profile.excludeLocalRoutes; + config.allowBypass = profile.isBypassable; + config.disallowedApplications = getAppExclusionList(mPackage); + mConfig = config; switch (profile.type) { case VpnProfile.TYPE_IKEV2_IPSEC_USER_PASS: @@ -4805,6 +4813,7 @@ public class Vpn { mVpnRunner.start(); break; default: + mConfig = null; updateState(DetailedState.FAILED, "Invalid platform VPN type"); Log.d(TAG, "Unknown VPN profile type: " + profile.type); break; @@ -5216,7 +5225,7 @@ public class Vpn { pw.println("MOBIKE " + (runner.mMobikeEnabled ? "enabled" : "disabled")); pw.println("Profile: " + runner.mProfile); pw.println("Token: " + runner.mCurrentToken); - if (mDataStallSuspected) pw.println("Data stall suspected"); + pw.println("Validation failed retry count:" + runner.mValidationFailRetryCount); if (runner.mScheduledHandleDataStallFuture != null) { pw.println("Reset session scheduled"); } diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 3e31bd1e820f..9a2d9ce0d55f 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -781,7 +781,7 @@ public class SyncManager { // This can be noisy, therefore we will allowlist sync adapters installed // before we started checking for account access because they already know // the account (they run before) which is the genie is out of the bottle. - whiteListExistingSyncAdaptersIfNeeded(); + allowListExistingSyncAdaptersIfNeeded(); mLogger.log("Sync manager initialized: " + Build.FINGERPRINT); } @@ -827,7 +827,7 @@ public class SyncManager { } } - private void whiteListExistingSyncAdaptersIfNeeded() { + private void allowListExistingSyncAdaptersIfNeeded() { if (!mSyncStorageEngine.shouldGrantSyncAdaptersAccountAccess()) { return; } diff --git a/services/core/java/com/android/server/content/SyncManagerConstants.java b/services/core/java/com/android/server/content/SyncManagerConstants.java index 2a5858c3e182..409b469dc6bf 100644 --- a/services/core/java/com/android/server/content/SyncManagerConstants.java +++ b/services/core/java/com/android/server/content/SyncManagerConstants.java @@ -52,11 +52,11 @@ public class SyncManagerConstants extends ContentObserver { private static final int DEF_MAX_RETRIES_WITH_APP_STANDBY_EXEMPTION = 5; private int mMaxRetriesWithAppStandbyExemption = DEF_MAX_RETRIES_WITH_APP_STANDBY_EXEMPTION; - private static final String KEY_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS = + private static final String KEY_EXEMPTION_TEMP_ALLOWLIST_DURATION_IN_SECONDS = "exemption_temp_whitelist_duration_in_seconds"; - private static final int DEF_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS = 10 * 60; + private static final int DEF_EXEMPTION_TEMP_ALLOWLIST_DURATION_IN_SECONDS = 10 * 60; private int mKeyExemptionTempWhitelistDurationInSeconds - = DEF_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS; + = DEF_EXEMPTION_TEMP_ALLOWLIST_DURATION_IN_SECONDS; protected SyncManagerConstants(Context context) { super(null); @@ -105,8 +105,8 @@ public class SyncManagerConstants extends ContentObserver { DEF_MAX_RETRIES_WITH_APP_STANDBY_EXEMPTION); mKeyExemptionTempWhitelistDurationInSeconds = parser.getInt( - KEY_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS, - DEF_EXEMPTION_TEMP_WHITELIST_DURATION_IN_SECONDS); + KEY_EXEMPTION_TEMP_ALLOWLIST_DURATION_IN_SECONDS, + DEF_EXEMPTION_TEMP_ALLOWLIST_DURATION_IN_SECONDS); } } diff --git a/services/core/java/com/android/server/display/OWNERS b/services/core/java/com/android/server/display/OWNERS index fcaa95731408..9439eaa3a4c6 100644 --- a/services/core/java/com/android/server/display/OWNERS +++ b/services/core/java/com/android/server/display/OWNERS @@ -6,5 +6,6 @@ santoscordon@google.com flc@google.com wilczynskip@google.com brup@google.com +petsjonkin@google.com per-file ColorDisplayService.java=christyfranks@google.com diff --git a/services/core/java/com/android/server/display/WifiDisplayController.java b/services/core/java/com/android/server/display/WifiDisplayController.java index f6d06aa2fec0..955b8d95fd87 100644 --- a/services/core/java/com/android/server/display/WifiDisplayController.java +++ b/services/core/java/com/android/server/display/WifiDisplayController.java @@ -1062,8 +1062,10 @@ final class WifiDisplayController implements DumpUtils.Dump { } private static WifiDisplay createWifiDisplay(WifiP2pDevice device) { + WifiP2pWfdInfo wfdInfo = device.getWfdInfo(); + boolean isSessionAvailable = wfdInfo != null && wfdInfo.isSessionAvailable(); return new WifiDisplay(device.deviceAddress, device.deviceName, null, - true, device.getWfdInfo().isSessionAvailable(), false); + true, isSessionAvailable, false); } private final BroadcastReceiver mWifiP2pReceiver = new BroadcastReceiver() { diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index ca1abd683d4f..7d0d5a73f093 100755..100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -1126,6 +1126,16 @@ abstract class HdmiCecLocalDevice extends HdmiLocalDevice { removeActionExcept(clazz, null); } + // Remove all running actions. + @ServiceThreadOnly + void removeAllActions() { + assertRunOnServiceThread(); + for (HdmiCecFeatureAction action : mActions) { + action.finish(false); + } + mActions.clear(); + } + // Remove all actions matched with the given Class type besides |exception|. @ServiceThreadOnly <T extends HdmiCecFeatureAction> void removeActionExcept( diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index a026c4b59ec5..184bdd778300 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -231,6 +231,14 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { super.disableDevice(initiatedByCec, callback); assertRunOnServiceThread(); mService.unregisterTvInputCallback(mTvInputCallback); + // Removing actions and invoking the callback is similar to + // HdmiCecLocalDevicePlayback#disableDevice and HdmiCecLocalDeviceTv#disableDevice, + // with the difference that in those classes only specific actions are removed and + // here we remove all actions. We don't expect any issues with removing all actions + // at this time, but we have to pay attention in the future. + removeAllActions(); + // Call the callback instantly or else it will be called 5 seconds later. + checkIfPendingActionsCleared(); } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 3ec3f9446954..c73a07d98f6a 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -110,7 +110,8 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { new SendMessageCallback() { @Override public void onSendCompleted(int error) { - if (error != SendMessageResult.SUCCESS) { + // In consideration of occasional transmission failures. + if (error == SendMessageResult.NACK) { HdmiLogger.debug( "AVR did not respond to <Give System Audio Mode Status>"); mService.setSystemAudioActivated(false); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 5ef06f9f8967..effedce727f1 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -377,6 +377,7 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { return; } int oldPath = getActivePortId() != Constants.INVALID_PORT_ID + && getActivePortId() != Constants.CEC_SWITCH_HOME ? mService.portIdToPath(getActivePortId()) : getDeviceInfo().getPhysicalAddress(); setActivePath(oldPath); if (mSkipRoutingControl) { diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 4cb22dbcf308..a809c75eaff8 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -2560,12 +2560,17 @@ public class InputManagerService extends IInputManager.Stub } /** - * Ports are highly platform-specific, so only allow these to be specified in the vendor + * Ports are highly platform-specific, so allow these to be specified in the odm/vendor * directory. */ private static Map<String, Integer> loadStaticInputPortAssociations() { - final File baseDir = Environment.getVendorDirectory(); - final File confFile = new File(baseDir, PORT_ASSOCIATIONS_PATH); + File baseDir = Environment.getOdmDirectory(); + File confFile = new File(baseDir, PORT_ASSOCIATIONS_PATH); + + if (!confFile.exists()) { + baseDir = Environment.getVendorDirectory(); + confFile = new File(baseDir, PORT_ASSOCIATIONS_PATH); + } try (final InputStream stream = new FileInputStream(confFile)) { return ConfigurationProcessor.processInputPortAssociations(stream); diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java index ec03d9d43539..a7c986d04fa4 100644 --- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java +++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java @@ -710,7 +710,7 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { } private String getCallingRulePusherPackageName(int callingUid) { - // Obtain the system apps that are whitelisted in config_integrityRuleProviderPackages. + // Obtain the system apps that are allowlisted in config_integrityRuleProviderPackages. List<String> allowedRuleProviders = getAllowedRuleProviderSystemApps(); if (DEBUG_INTEGRITY_COMPONENT) { Slog.i( diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java index 91f14de040fe..6c8ba1609f50 100644 --- a/services/core/java/com/android/server/lights/LightsService.java +++ b/services/core/java/com/android/server/lights/LightsService.java @@ -465,9 +465,10 @@ public class LightsService extends SystemService { } for (int i = mLightsById.size() - 1; i >= 0; i--) { - final int type = mLightsById.keyAt(i); + LightImpl light = mLightsById.valueAt(i); + final int type = light.mHwLight.type; if (0 <= type && type < mLightsByType.length) { - mLightsByType[type] = mLightsById.valueAt(i); + mLightsByType[type] = light; } } } diff --git a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java index 567d8ac5e5df..f21a9fe6af2a 100644 --- a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java +++ b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java @@ -201,10 +201,10 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter this::onProviderEnabledChanged; private final SettingsHelper.GlobalSettingChangedListener mBackgroundThrottlePackageWhitelistChangedListener = - this::onBackgroundThrottlePackageWhitelistChanged; + this::onBackgroundThrottlePackageAllowlistChanged; private final SettingsHelper.UserSettingChangedListener mLocationPackageBlacklistChangedListener = - this::onLocationPackageBlacklistChanged; + this::onLocationPackageDenylistChanged; private final LocationPermissionsHelper.LocationPermissionsListener mLocationPermissionsListener = new LocationPermissionsHelper.LocationPermissionsListener() { @@ -407,11 +407,11 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter updateRegistrations(registration -> registration.getIdentity().getUserId() == userId); } - private void onBackgroundThrottlePackageWhitelistChanged() { + private void onBackgroundThrottlePackageAllowlistChanged() { updateRegistrations(registration -> true); } - private void onLocationPackageBlacklistChanged(int userId) { + private void onLocationPackageDenylistChanged(int userId) { updateRegistrations(registration -> registration.getIdentity().getUserId() == userId); } diff --git a/services/core/java/com/android/server/location/injector/SettingsHelper.java b/services/core/java/com/android/server/location/injector/SettingsHelper.java index 490bfe1ab82f..32cbff8d50c7 100644 --- a/services/core/java/com/android/server/location/injector/SettingsHelper.java +++ b/services/core/java/com/android/server/location/injector/SettingsHelper.java @@ -93,37 +93,37 @@ public abstract class SettingsHelper { GlobalSettingChangedListener listener); /** - * Check if the given package is blacklisted for location access. + * Check if the given package is denylisted for location access. */ public abstract boolean isLocationPackageBlacklisted(int userId, String packageName); /** - * Add a listener for changes to the location package blacklist. Callbacks occur on an + * Add a listener for changes to the location package denylist. Callbacks occur on an * unspecified thread. */ public abstract void addOnLocationPackageBlacklistChangedListener( UserSettingChangedListener listener); /** - * Remove a listener for changes to the location package blacklist. + * Remove a listener for changes to the location package denylist. */ public abstract void removeOnLocationPackageBlacklistChangedListener( UserSettingChangedListener listener); /** - * Retrieve the background throttle package whitelist. + * Retrieve the background throttle package allowlist. */ public abstract Set<String> getBackgroundThrottlePackageWhitelist(); /** - * Add a listener for changes to the background throttle package whitelist. Callbacks occur on + * Add a listener for changes to the background throttle package allowlist. Callbacks occur on * an unspecified thread. */ public abstract void addOnBackgroundThrottlePackageWhitelistChangedListener( GlobalSettingChangedListener listener); /** - * Remove a listener for changes to the background throttle package whitelist. + * Remove a listener for changes to the background throttle package allowlist. */ public abstract void removeOnBackgroundThrottlePackageWhitelistChangedListener( GlobalSettingChangedListener listener); @@ -134,14 +134,14 @@ public abstract class SettingsHelper { public abstract boolean isGnssMeasurementsFullTrackingEnabled(); /** - * Add a listener for changes to the background throttle package whitelist. Callbacks occur on + * Add a listener for changes to the background throttle package allowlist. Callbacks occur on * an unspecified thread. */ public abstract void addOnGnssMeasurementsFullTrackingEnabledChangedListener( GlobalSettingChangedListener listener); /** - * Remove a listener for changes to the background throttle package whitelist. + * Remove a listener for changes to the background throttle package allowlist. */ public abstract void removeOnGnssMeasurementsFullTrackingEnabledChangedListener( GlobalSettingChangedListener listener); @@ -166,14 +166,14 @@ public abstract class SettingsHelper { public abstract PackageTagsList getIgnoreSettingsAllowlist(); /** - * Add a listener for changes to the ignore settings package whitelist. Callbacks occur on an + * Add a listener for changes to the ignore settings package allowlist. Callbacks occur on an * unspecified thread. */ public abstract void addIgnoreSettingsAllowlistChangedListener( GlobalSettingChangedListener listener); /** - * Remove a listener for changes to the ignore settings package whitelist. + * Remove a listener for changes to the ignore settings package allowlist. */ public abstract void removeIgnoreSettingsAllowlistChangedListener( GlobalSettingChangedListener listener); diff --git a/services/core/java/com/android/server/location/injector/SystemSettingsHelper.java b/services/core/java/com/android/server/location/injector/SystemSettingsHelper.java index 777683ef59cf..8bb184c43ebb 100644 --- a/services/core/java/com/android/server/location/injector/SystemSettingsHelper.java +++ b/services/core/java/com/android/server/location/injector/SystemSettingsHelper.java @@ -65,8 +65,8 @@ import java.util.function.Supplier; */ public class SystemSettingsHelper extends SettingsHelper { - private static final String LOCATION_PACKAGE_BLACKLIST = "locationPackagePrefixBlacklist"; - private static final String LOCATION_PACKAGE_WHITELIST = "locationPackagePrefixWhitelist"; + private static final String LOCATION_PACKAGE_DENYLIST = "locationPackagePrefixBlacklist"; + private static final String LOCATION_PACKAGE_ALLOWLIST = "locationPackagePrefixWhitelist"; private static final long DEFAULT_BACKGROUND_THROTTLE_INTERVAL_MS = 30 * 60 * 1000; private static final long DEFAULT_BACKGROUND_THROTTLE_PROXIMITY_ALERT_INTERVAL_MS = @@ -93,9 +93,9 @@ public class SystemSettingsHelper extends SettingsHelper { mGnssMeasurementFullTracking = new BooleanGlobalSetting(context, ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, FgThread.getHandler()); mLocationPackageBlacklist = new StringListCachedSecureSetting(context, - LOCATION_PACKAGE_BLACKLIST, FgThread.getHandler()); + LOCATION_PACKAGE_DENYLIST, FgThread.getHandler()); mLocationPackageWhitelist = new StringListCachedSecureSetting(context, - LOCATION_PACKAGE_WHITELIST, FgThread.getHandler()); + LOCATION_PACKAGE_ALLOWLIST, FgThread.getHandler()); mBackgroundThrottlePackageWhitelist = new StringSetCachedGlobalSetting(context, LOCATION_BACKGROUND_THROTTLE_PACKAGE_WHITELIST, () -> SystemConfig.getInstance().getAllowUnthrottledLocation(), diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 48d46df37061..0a02c49192b9 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -190,9 +190,40 @@ import javax.crypto.SecretKey; import javax.crypto.spec.GCMParameterSpec; /** - * Keeps the lock pattern/password data and related settings for each user. Used by - * LockPatternUtils. Needs to be a service because Settings app also needs to be able to save - * lockscreen information for secondary users. + * LockSettingsService (LSS) mainly has the following responsibilities: + * <p> + * <ul> + * <li>Provide APIs to verify and change the Lock Screen Knowledge Factor (LSKF) ("lockscreen + * credential") of each user. Unlock users when their correct LSKF is given.</li> + * + * <li>Store other lockscreen related settings, such as some Keyguard (UI) settings.</li> + * + * <li>Manage each user's synthetic password (SP), which is their main cryptographic secret. + * See {@link SyntheticPasswordManager}.</li> + * + * <li>Protect each user's SP using their LSKF. Use the Gatekeeper or Weaver HAL to ensure that + * guesses of the LSKF are ratelimited by the TEE or secure element.</li> + * + * <li>Protect each user's data using their SP. For example, use the SP to encrypt/decrypt the + * user's credential-encrypted (CE) key for file-based encryption (FBE).</li> + * + * <li>Generate, protect, and use profile passwords for managed profiles.</li> + * + * <li>Support unlocking the SP by alternative means: resume-on-reboot (reboot escrow) for easier + * OTA updates, and escrow tokens when set up by the Device Policy Controller (DPC).</li> + * + * <li>Implement part of the Factory Reset Protection (FRP) and Repair Mode features by storing + * the information needed to verify a user's LSKF on the persist or metadata partition.</li> + * + * <li>Support insider attack resistance using the AuthSecret HAL.</li> + * + * <li>Implement "recoverable keystore", a feature that enables end-to-end encrypted backups. + * See {@link android.security.keystore.recovery.RecoveryController}.</li> + * </ul> + * <p> + * The main clients of LockSettingsService are Keyguard (i.e. the lockscreen UI, which is part of + * System UI), the Settings app (com.android.settings), and other parts of system_server. Most + * methods are protected by ACCESS_KEYGUARD_SECURE_STORAGE which only system processes can have. * * @hide */ @@ -1276,7 +1307,6 @@ public class LockSettingsService extends ILockSettings.Stub { return getCredentialTypeInternal(userId); } - // TODO: this is a hot path, can we optimize it? /** * Returns the credential type of the user, can be one of {@link #CREDENTIAL_TYPE_NONE}, * {@link #CREDENTIAL_TYPE_PATTERN}, {@link #CREDENTIAL_TYPE_PIN} and diff --git a/services/core/java/com/android/server/locksettings/OWNERS b/services/core/java/com/android/server/locksettings/OWNERS index 55b0cffb32df..5d4986307835 100644 --- a/services/core/java/com/android/server/locksettings/OWNERS +++ b/services/core/java/com/android/server/locksettings/OWNERS @@ -1,3 +1,4 @@ +# Bug component: 1333694 ebiggers@google.com jaggies@google.com rubinxu@google.com diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index 66f862ac9205..e8fd6f88359c 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -1576,8 +1576,10 @@ class SyntheticPasswordManager { } return result; } else if (responseCode == GateKeeperResponse.RESPONSE_RETRY) { + Slog.e(TAG, "Gatekeeper verification of synthetic password failed with RESPONSE_RETRY"); return VerifyCredentialResponse.fromTimeout(response.getTimeout()); } else { + Slog.e(TAG, "Gatekeeper verification of synthetic password failed with RESPONSE_ERROR"); return VerifyCredentialResponse.ERROR; } } diff --git a/services/core/java/com/android/server/logcat/LogcatManagerService.java b/services/core/java/com/android/server/logcat/LogcatManagerService.java index 497ed0346d97..fee54f5ed337 100644 --- a/services/core/java/com/android/server/logcat/LogcatManagerService.java +++ b/services/core/java/com/android/server/logcat/LogcatManagerService.java @@ -28,6 +28,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; +import android.os.DeadObjectException; import android.os.Handler; import android.os.ILogd; import android.os.Looper; @@ -518,7 +519,15 @@ public final class LogcatManagerService extends SystemService { Slog.d(TAG, "Approving log access: " + request); } try { - getLogdService().approve(request.mUid, request.mGid, request.mPid, request.mFd); + try { + getLogdService().approve(request.mUid, request.mGid, request.mPid, request.mFd); + } catch (DeadObjectException e) { + // This can happen if logd restarts, so force getting a new connection + // to logd and try once more. + Slog.w(TAG, "Logd connection no longer valid while approving, trying once more."); + mLogdService = null; + getLogdService().approve(request.mUid, request.mGid, request.mPid, request.mFd); + } Integer activeCount = mActiveLogAccessCount.getOrDefault(client, 0); mActiveLogAccessCount.put(client, activeCount + 1); } catch (RemoteException e) { @@ -531,7 +540,15 @@ public final class LogcatManagerService extends SystemService { Slog.d(TAG, "Declining log access: " + request); } try { - getLogdService().decline(request.mUid, request.mGid, request.mPid, request.mFd); + try { + getLogdService().decline(request.mUid, request.mGid, request.mPid, request.mFd); + } catch (DeadObjectException e) { + // This can happen if logd restarts, so force getting a new connection + // to logd and try once more. + Slog.w(TAG, "Logd connection no longer valid while declining, trying once more."); + mLogdService = null; + getLogdService().decline(request.mUid, request.mGid, request.mPid, request.mFd); + } } catch (RemoteException e) { Slog.e(TAG, "Fails to call remote functions", e); } diff --git a/services/core/java/com/android/server/net/NetworkManagementService.java b/services/core/java/com/android/server/net/NetworkManagementService.java index e5ffa7e15f28..36adea7e0112 100644 --- a/services/core/java/com/android/server/net/NetworkManagementService.java +++ b/services/core/java/com/android/server/net/NetworkManagementService.java @@ -34,8 +34,6 @@ import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_RESTRICTED; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_STANDBY; import static android.net.NetworkPolicyManager.FIREWALL_RULE_DEFAULT; -import static com.android.net.module.util.NetworkStatsUtils.LIMIT_GLOBAL_ALERT; - import android.annotation.NonNull; import android.app.ActivityManager; import android.content.Context; @@ -43,15 +41,12 @@ import android.net.ConnectivityManager; import android.net.INetd; import android.net.INetdUnsolicitedEventListener; import android.net.INetworkManagementEventObserver; -import android.net.ITetheringStatsProvider; import android.net.InetAddresses; import android.net.InterfaceConfiguration; import android.net.InterfaceConfigurationParcel; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.NetworkPolicyManager; -import android.net.NetworkStack; -import android.net.NetworkStats; import android.net.RouteInfo; import android.net.util.NetdService; import android.os.BatteryStats; @@ -78,28 +73,21 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.util.DumpUtils; import com.android.internal.util.HexDump; -import com.android.internal.util.Preconditions; +import com.android.modules.utils.build.SdkLevel; import com.android.net.module.util.NetdUtils; import com.android.net.module.util.NetdUtils.ModifyOperation; +import com.android.net.module.util.PermissionUtils; import com.android.server.FgThread; import com.android.server.LocalServices; import com.google.android.collect.Maps; -import java.io.BufferedReader; -import java.io.DataInputStream; import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; -import java.net.InterfaceAddress; import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.Objects; /** * @hide @@ -129,13 +117,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { private static final String TAG = "NetworkManagement"; private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG); - private static final int MAX_UID_RANGES_PER_COMMAND = 10; - - static final int DAEMON_MSG_MOBILE_CONN_REAL_TIME_INFO = 1; - - static final boolean MODIFY_OPERATION_ADD = true; - static final boolean MODIFY_OPERATION_REMOVE = false; - /** * Binder context for this service */ @@ -154,10 +135,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { private final RemoteCallbackList<INetworkManagementEventObserver> mObservers = new RemoteCallbackList<>(); - @GuardedBy("mTetheringStatsProviders") - private final HashMap<ITetheringStatsProvider, String> - mTetheringStatsProviders = Maps.newHashMap(); - /** * If both locks need to be held, then they should be obtained in the order: * first {@link #mQuotaLock} and then {@link #mRulesLock}. @@ -182,35 +159,35 @@ public class NetworkManagementService extends INetworkManagementService.Stub { private SparseIntArray mUidCleartextPolicy = new SparseIntArray(); /** Set of UIDs that are to be blocked/allowed by firewall controller. */ @GuardedBy("mRulesLock") - private SparseIntArray mUidFirewallRules = new SparseIntArray(); + private final SparseIntArray mUidFirewallRules = new SparseIntArray(); /** * Set of UIDs that are to be blocked/allowed by firewall controller. This set of Ids matches * to application idles. */ @GuardedBy("mRulesLock") - private SparseIntArray mUidFirewallStandbyRules = new SparseIntArray(); + private final SparseIntArray mUidFirewallStandbyRules = new SparseIntArray(); /** * Set of UIDs that are to be blocked/allowed by firewall controller. This set of Ids matches * to device idles. */ @GuardedBy("mRulesLock") - private SparseIntArray mUidFirewallDozableRules = new SparseIntArray(); + private final SparseIntArray mUidFirewallDozableRules = new SparseIntArray(); /** * Set of UIDs that are to be blocked/allowed by firewall controller. This set of Ids matches * to device on power-save mode. */ @GuardedBy("mRulesLock") - private SparseIntArray mUidFirewallPowerSaveRules = new SparseIntArray(); + private final SparseIntArray mUidFirewallPowerSaveRules = new SparseIntArray(); /** * Contains the per-UID firewall rules that are used when Restricted Networking Mode is enabled. */ @GuardedBy("mRulesLock") - private SparseIntArray mUidFirewallRestrictedRules = new SparseIntArray(); + private final SparseIntArray mUidFirewallRestrictedRules = new SparseIntArray(); /** * Contains the per-UID firewall rules that are used when Low Power Standby is enabled. */ @GuardedBy("mRulesLock") - private SparseIntArray mUidFirewallLowPowerStandbyRules = new SparseIntArray(); + private final SparseIntArray mUidFirewallLowPowerStandbyRules = new SparseIntArray(); /** Set of states for the child firewall chains. True if the chain is active. */ @GuardedBy("mRulesLock") final SparseBooleanArray mFirewallChainStates = new SparseBooleanArray(); @@ -237,17 +214,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { mNetdUnsolicitedEventListener = new NetdUnsolicitedEventListener(); mDeps.registerLocalService(new LocalService()); - - synchronized (mTetheringStatsProviders) { - mTetheringStatsProviders.put(new NetdTetheringStatsProvider(), "netd"); - } - } - - private NetworkManagementService() { - mContext = null; - mDaemonHandler = null; - mDeps = null; - mNetdUnsolicitedEventListener = null; } static NetworkManagementService create(Context context, Dependencies deps) @@ -290,19 +256,19 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void registerObserver(INetworkManagementEventObserver observer) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); mObservers.register(observer); } @Override public void unregisterObserver(INetworkManagementEventObserver observer) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); mObservers.unregister(observer); } @FunctionalInterface private interface NetworkManagementEventCallback { - public void sendCallback(INetworkManagementEventObserver o) throws RemoteException; + void sendCallback(INetworkManagementEventObserver o) throws RemoteException; } private void invokeForAllObservers(NetworkManagementEventCallback eventCallback) { @@ -368,35 +334,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { type, isActive, tsNanos, uid)); } - @Override - public void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name) { - NetworkStack.checkNetworkStackPermission(mContext); - Objects.requireNonNull(provider); - synchronized(mTetheringStatsProviders) { - mTetheringStatsProviders.put(provider, name); - } - } - - @Override - public void unregisterTetheringStatsProvider(ITetheringStatsProvider provider) { - NetworkStack.checkNetworkStackPermission(mContext); - synchronized(mTetheringStatsProviders) { - mTetheringStatsProviders.remove(provider); - } - } - - @Override - public void tetherLimitReached(ITetheringStatsProvider provider) { - NetworkStack.checkNetworkStackPermission(mContext); - synchronized(mTetheringStatsProviders) { - if (!mTetheringStatsProviders.containsKey(provider)) { - return; - } - // No current code examines the interface parameter in a global alert. Just pass null. - mDaemonHandler.post(() -> notifyLimitReached(LIMIT_GLOBAL_ALERT, null)); - } - } - // Sync the state of the given chain with the native daemon. private void syncFirewallChainLocked(int chain, String name) { SparseIntArray rules; @@ -666,7 +603,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { public String[] listInterfaces() { // TODO: Remove CONNECTIVITY_INTERNAL after bluetooth tethering has no longer called these // APIs. - NetworkStack.checkNetworkStackPermissionOr(mContext, CONNECTIVITY_INTERNAL); + PermissionUtils.enforceNetworkStackPermissionOr(mContext, CONNECTIVITY_INTERNAL); try { return mNetdService.interfaceGetList(); } catch (RemoteException | ServiceSpecificException e) { @@ -718,7 +655,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { public InterfaceConfiguration getInterfaceConfig(String iface) { // TODO: Remove CONNECTIVITY_INTERNAL after bluetooth tethering has no longer called these // APIs. - NetworkStack.checkNetworkStackPermissionOr(mContext, CONNECTIVITY_INTERNAL); + PermissionUtils.enforceNetworkStackPermissionOr(mContext, CONNECTIVITY_INTERNAL); final InterfaceConfigurationParcel result; try { result = mNetdService.interfaceGetCfg(iface); @@ -738,7 +675,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { public void setInterfaceConfig(String iface, InterfaceConfiguration cfg) { // TODO: Remove CONNECTIVITY_INTERNAL after bluetooth tethering has no longer called these // APIs. - NetworkStack.checkNetworkStackPermissionOr(mContext, CONNECTIVITY_INTERNAL); + PermissionUtils.enforceNetworkStackPermissionOr(mContext, CONNECTIVITY_INTERNAL); LinkAddress linkAddr = cfg.getLinkAddress(); if (linkAddr == null || linkAddr.getAddress() == null) { throw new IllegalStateException("Null LinkAddress given"); @@ -755,7 +692,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void setInterfaceDown(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); final InterfaceConfiguration ifcg = getInterfaceConfig(iface); ifcg.setInterfaceDown(); setInterfaceConfig(iface, ifcg); @@ -763,7 +700,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void setInterfaceUp(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); final InterfaceConfiguration ifcg = getInterfaceConfig(iface); ifcg.setInterfaceUp(); setInterfaceConfig(iface, ifcg); @@ -771,7 +708,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); try { mNetdService.interfaceSetIPv6PrivacyExtensions(iface, enable); } catch (RemoteException | ServiceSpecificException e) { @@ -783,7 +720,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { IPv6 addresses on interface down, but we need to do full clean up here */ @Override public void clearInterfaceAddresses(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); try { mNetdService.interfaceClearAddrs(iface); } catch (RemoteException | ServiceSpecificException e) { @@ -793,7 +730,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void enableIpv6(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); try { mNetdService.interfaceSetEnableIPv6(iface, true); } catch (RemoteException | ServiceSpecificException e) { @@ -803,7 +740,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void setIPv6AddrGenMode(String iface, int mode) throws ServiceSpecificException { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); try { mNetdService.setIPv6AddrGenMode(iface, mode); } catch (RemoteException e) { @@ -813,7 +750,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void disableIpv6(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); try { mNetdService.interfaceSetEnableIPv6(iface, false); } catch (RemoteException | ServiceSpecificException e) { @@ -823,44 +760,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void addRoute(int netId, RouteInfo route) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); NetdUtils.modifyRoute(mNetdService, ModifyOperation.ADD, netId, route); } @Override public void removeRoute(int netId, RouteInfo route) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); NetdUtils.modifyRoute(mNetdService, ModifyOperation.REMOVE, netId, route); } - private ArrayList<String> readRouteList(String filename) { - FileInputStream fstream = null; - ArrayList<String> list = new ArrayList<>(); - - try { - fstream = new FileInputStream(filename); - DataInputStream in = new DataInputStream(fstream); - BufferedReader br = new BufferedReader(new InputStreamReader(in)); - String s; - - // throw away the title line - - while (((s = br.readLine()) != null) && (s.length() != 0)) { - list.add(s); - } - } catch (IOException ex) { - // return current list, possibly empty - } finally { - if (fstream != null) { - try { - fstream.close(); - } catch (IOException ex) {} - } - } - - return list; - } - @android.annotation.EnforcePermission(android.Manifest.permission.SHUTDOWN) @Override public void shutdown() { @@ -873,11 +782,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public boolean getIpForwardingEnabled() throws IllegalStateException{ - NetworkStack.checkNetworkStackPermission(mContext); - + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException( + "NMS#getIpForwardingEnabled not supported in V+"); + } try { - final boolean isEnabled = mNetdService.ipfwdEnabled(); - return isEnabled; + return mNetdService.ipfwdEnabled(); } catch (RemoteException | ServiceSpecificException e) { throw new IllegalStateException(e); } @@ -885,8 +796,11 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void setIpForwardingEnabled(boolean enable) { - NetworkStack.checkNetworkStackPermission(mContext); - try { + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException( + "NMS#setIpForwardingEnabled not supported in V+"); + } try { if (enable) { mNetdService.ipfwdEnableForwarding("tethering"); } else { @@ -899,14 +813,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void startTethering(String[] dhcpRange) { - startTetheringWithConfiguration(true, dhcpRange); - } - - @Override - public void startTetheringWithConfiguration(boolean usingLegacyDnsProxy, String[] dhcpRange) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException("NMS#startTethering not supported in V+"); + } try { - NetdUtils.tetherStart(mNetdService, usingLegacyDnsProxy, dhcpRange); + NetdUtils.tetherStart(mNetdService, true /* usingLegacyDnsProxy */, dhcpRange); } catch (RemoteException | ServiceSpecificException e) { throw new IllegalStateException(e); } @@ -914,7 +826,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void stopTethering() { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException("NMS#stopTethering not supported in V+"); + } try { mNetdService.tetherStop(); } catch (RemoteException | ServiceSpecificException e) { @@ -924,11 +839,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public boolean isTetheringStarted() { - NetworkStack.checkNetworkStackPermission(mContext); - + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException("NMS#isTetheringStarted not supported in V+"); + } try { - final boolean isEnabled = mNetdService.tetherIsEnabled(); - return isEnabled; + return mNetdService.tetherIsEnabled(); } catch (RemoteException | ServiceSpecificException e) { throw new IllegalStateException(e); } @@ -936,7 +852,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void tetherInterface(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException("NMS#tetherInterface not supported in V+"); + } try { final LinkAddress addr = getInterfaceConfig(iface).getLinkAddress(); final IpPrefix dest = new IpPrefix(addr.getAddress(), addr.getPrefixLength()); @@ -948,7 +867,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void untetherInterface(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException("NMS#untetherInterface not supported in V+"); + } try { NetdUtils.untetherInterface(mNetdService, iface); } catch (RemoteException | ServiceSpecificException e) { @@ -958,60 +880,24 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public String[] listTetheredInterfaces() { - NetworkStack.checkNetworkStackPermission(mContext); - try { - return mNetdService.tetherInterfaceList(); - } catch (RemoteException | ServiceSpecificException e) { - throw new IllegalStateException(e); + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException( + "NMS#listTetheredInterfaces not supported in V+"); } - } - - @Override - public String[] getDnsForwarders() { - NetworkStack.checkNetworkStackPermission(mContext); - try { - return mNetdService.tetherDnsList(); - } catch (RemoteException | ServiceSpecificException e) { - throw new IllegalStateException(e); - } - } - - private List<InterfaceAddress> excludeLinkLocal(List<InterfaceAddress> addresses) { - ArrayList<InterfaceAddress> filtered = new ArrayList<>(addresses.size()); - for (InterfaceAddress ia : addresses) { - if (!ia.getAddress().isLinkLocalAddress()) - filtered.add(ia); - } - return filtered; - } - - private void modifyInterfaceForward(boolean add, String fromIface, String toIface) { try { - if (add) { - mNetdService.ipfwdAddInterfaceForward(fromIface, toIface); - } else { - mNetdService.ipfwdRemoveInterfaceForward(fromIface, toIface); - } + return mNetdService.tetherInterfaceList(); } catch (RemoteException | ServiceSpecificException e) { throw new IllegalStateException(e); } } @Override - public void startInterfaceForwarding(String fromIface, String toIface) { - NetworkStack.checkNetworkStackPermission(mContext); - modifyInterfaceForward(true, fromIface, toIface); - } - - @Override - public void stopInterfaceForwarding(String fromIface, String toIface) { - NetworkStack.checkNetworkStackPermission(mContext); - modifyInterfaceForward(false, fromIface, toIface); - } - - @Override public void enableNat(String internalInterface, String externalInterface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException("NMS#enableNat not supported in V+"); + } try { mNetdService.tetherAddForward(internalInterface, externalInterface); } catch (RemoteException | ServiceSpecificException e) { @@ -1021,7 +907,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void disableNat(String internalInterface, String externalInterface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); + if (SdkLevel.isAtLeastV()) { + throw new UnsupportedOperationException("NMS#disableNat not supported in V+"); + } try { mNetdService.tetherRemoveForward(internalInterface, externalInterface); } catch (RemoteException | ServiceSpecificException e) { @@ -1031,7 +920,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void setInterfaceQuota(String iface, long quotaBytes) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); synchronized (mQuotaLock) { if (mActiveQuotas.containsKey(iface)) { @@ -1046,23 +935,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub { } catch (RemoteException | ServiceSpecificException e) { throw new IllegalStateException(e); } - - synchronized (mTetheringStatsProviders) { - for (ITetheringStatsProvider provider : mTetheringStatsProviders.keySet()) { - try { - provider.setInterfaceQuota(iface, quotaBytes); - } catch (RemoteException e) { - Log.e(TAG, "Problem setting tethering data limit on provider " + - mTetheringStatsProviders.get(provider) + ": " + e); - } - } - } } } @Override public void removeInterfaceQuota(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); synchronized (mQuotaLock) { if (!mActiveQuotas.containsKey(iface)) { @@ -1079,23 +957,12 @@ public class NetworkManagementService extends INetworkManagementService.Stub { } catch (RemoteException | ServiceSpecificException e) { throw new IllegalStateException(e); } - - synchronized (mTetheringStatsProviders) { - for (ITetheringStatsProvider provider : mTetheringStatsProviders.keySet()) { - try { - provider.setInterfaceQuota(iface, ITetheringStatsProvider.QUOTA_UNLIMITED); - } catch (RemoteException e) { - Log.e(TAG, "Problem removing tethering data limit on provider " + - mTetheringStatsProviders.get(provider) + ": " + e); - } - } - } } } @Override public void setInterfaceAlert(String iface, long alertBytes) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); // quick validity check if (!mActiveQuotas.containsKey(iface)) { @@ -1119,7 +986,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void removeInterfaceAlert(String iface) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); synchronized (mQuotaLock) { if (!mActiveAlerts.containsKey(iface)) { @@ -1137,19 +1004,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub { } } - @Override - public void setGlobalAlert(long alertBytes) { - NetworkStack.checkNetworkStackPermission(mContext); - - try { - mNetdService.bandwidthSetGlobalAlert(alertBytes); - } catch (RemoteException | ServiceSpecificException e) { - throw new IllegalStateException(e); - } - } - private void setUidOnMeteredNetworkList(int uid, boolean allowlist, boolean enable) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); synchronized (mQuotaLock) { boolean oldEnable; @@ -1261,7 +1117,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void setUidCleartextNetworkPolicy(int uid, int policy) { if (mDeps.getCallingUid() != uid) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); } synchronized (mQuotaLock) { @@ -1298,27 +1154,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { return true; } - private class NetdTetheringStatsProvider extends ITetheringStatsProvider.Stub { - @Override - public NetworkStats getTetherStats(int how) { - // Remove the implementation of NetdTetheringStatsProvider#getTetherStats - // since all callers are migrated to use INetd#tetherGetStats directly. - throw new UnsupportedOperationException(); - } - - @Override - public void setInterfaceQuota(String iface, long quotaBytes) { - // Do nothing. netd is already informed of quota changes in setInterfaceQuota. - } - } - - @Override - public NetworkStats getNetworkStatsTethering(int how) { - // Remove the implementation of getNetworkStatsTethering since all callers are migrated - // to use INetd#tetherGetStats directly. - throw new UnsupportedOperationException(); - } - @Override public void setFirewallEnabled(boolean enabled) { enforceSystemUid(); @@ -1338,18 +1173,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { } @Override - public void setFirewallInterfaceRule(String iface, boolean allow) { - enforceSystemUid(); - Preconditions.checkState(mFirewallEnabled); - try { - mNetdService.firewallSetInterfaceRule(iface, - allow ? INetd.FIREWALL_RULE_ALLOW : INetd.FIREWALL_RULE_DENY); - } catch (RemoteException | ServiceSpecificException e) { - throw new IllegalStateException(e); - } - } - - @Override public void setFirewallChainEnabled(int chain, boolean enable) { enforceSystemUid(); synchronized (mQuotaLock) { @@ -1619,22 +1442,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub { pw.println("]"); } - private void modifyInterfaceInNetwork(boolean add, int netId, String iface) { - NetworkStack.checkNetworkStackPermission(mContext); - try { - if (add) { - mNetdService.networkAddInterface(netId, iface); - } else { - mNetdService.networkRemoveInterface(netId, iface); - } - } catch (RemoteException | ServiceSpecificException e) { - throw new IllegalStateException(e); - } - } - @Override public void allowProtect(int uid) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); try { mNetdService.networkSetProtectAllow(uid); @@ -1645,7 +1455,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub { @Override public void denyProtect(int uid) { - NetworkStack.checkNetworkStackPermission(mContext); + PermissionUtils.enforceNetworkStackPermission(mContext); try { mNetdService.networkSetProtectDeny(uid); @@ -1654,24 +1464,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub { } } - @Override - public void addInterfaceToLocalNetwork(String iface, List<RouteInfo> routes) { - modifyInterfaceInNetwork(MODIFY_OPERATION_ADD, INetd.LOCAL_NET_ID, iface); - // modifyInterfaceInNetwork already check calling permission. - NetdUtils.addRoutesToLocalNetwork(mNetdService, iface, routes); - } - - @Override - public void removeInterfaceFromLocalNetwork(String iface) { - modifyInterfaceInNetwork(MODIFY_OPERATION_REMOVE, INetd.LOCAL_NET_ID, iface); - } - - @Override - public int removeRoutesFromLocalNetwork(List<RouteInfo> routes) { - NetworkStack.checkNetworkStackPermission(mContext); - return NetdUtils.removeRoutesFromLocalNetwork(mNetdService, routes); - } - @android.annotation.EnforcePermission(android.Manifest.permission.OBSERVE_NETWORK_POLICY) @Override public boolean isNetworkRestricted(int uid) { diff --git a/services/core/java/com/android/server/net/NetworkPolicyLogger.java b/services/core/java/com/android/server/net/NetworkPolicyLogger.java index dc8fcb077f61..85731651dd59 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyLogger.java +++ b/services/core/java/com/android/server/net/NetworkPolicyLogger.java @@ -338,8 +338,8 @@ public class NetworkPolicyLogger { return "App idle state of uid " + uid + ": " + idle; } - private static String getAppIdleWlChangedLog(int uid, boolean isWhitelisted) { - return "App idle whitelist state of uid " + uid + ": " + isWhitelisted; + private static String getAppIdleWlChangedLog(int uid, boolean isAllowlisted) { + return "App idle whitelist state of uid " + uid + ": " + isAllowlisted; } private static String getParoleStateChanged(boolean paroleOn) { @@ -519,14 +519,14 @@ public class NetworkPolicyLogger { data.timeStamp = System.currentTimeMillis(); } - public void appIdleWlChanged(int uid, boolean isWhitelisted) { + public void appIdleWlChanged(int uid, boolean isAllowlisted) { final Data data = getNextSlot(); if (data == null) return; data.reset(); data.type = EVENT_APP_IDLE_WL_CHANGED; data.ifield1 = uid; - data.bfield1 = isWhitelisted; + data.bfield1 = isAllowlisted; data.timeStamp = System.currentTimeMillis(); } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index b7082690276c..52734a4ad3b0 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -222,6 +222,7 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.SubscriptionPlan; +import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.text.format.DateUtils; @@ -363,7 +364,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final String TAG_NETWORK_POLICY = "network-policy"; private static final String TAG_UID_POLICY = "uid-policy"; private static final String TAG_APP_POLICY = "app-policy"; - private static final String TAG_WHITELIST = "whitelist"; + private static final String TAG_ALLOWLIST = "whitelist"; private static final String TAG_RESTRICT_BACKGROUND = "restrict-background"; private static final String TAG_REVOKED_RESTRICT_BACKGROUND = "revoked-restrict-background"; private static final String TAG_XML_UTILS_INT_ARRAY = "int-array"; @@ -803,6 +804,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } return buckets; } + + /** Require IPC call. Don't call when holding a lock. */ + int getDefaultDataSubId() { + return SubscriptionManager.getDefaultDataSubscriptionId(); + } + + /** Require IPC call. Don't call when holding a lock. */ + int getActivateDataSubId() { + return SubscriptionManager.getActiveDataSubscriptionId(); + } } @VisibleForTesting @@ -830,7 +841,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mSuppressDefaultPolicy = suppressDefaultPolicy; mDeps = Objects.requireNonNull(deps, "missing Dependencies"); - + mActiveDataSubIdListener = new ActiveDataSubIdListener(); mPolicyFile = new AtomicFile(new File(systemDir, "netpolicy.xml"), "net-policy"); mAppOps = context.getSystemService(AppOpsManager.class); @@ -847,7 +858,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } @GuardedBy("mUidRulesFirstLock") - private void updatePowerSaveWhitelistUL() { + private void updatePowerSaveAllowlistUL() { int[] whitelist = mPowerWhitelistManager.getWhitelistedAppIds(/* includingIdle */ false); mPowerSaveWhitelistExceptIdleAppIds.clear(); for (int uid : whitelist) { @@ -938,7 +949,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { synchronized (mUidRulesFirstLock) { synchronized (mNetworkPoliciesSecondLock) { - updatePowerSaveWhitelistUL(); + updatePowerSaveAllowlistUL(); mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); mPowerManagerInternal.registerLowPowerModeObserver( new PowerManagerInternal.LowPowerModeListener() { @@ -1090,6 +1101,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } }); + // Listen for active data sub Id change, upon which data notifications is shown/hidden. + mContext.getSystemService(TelephonyManager.class).registerTelephonyCallback(executor, + mActiveDataSubIdListener); + // tell systemReady() that the service has been initialized initCompleteSignal.countDown(); } finally { @@ -1178,7 +1193,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public void onReceive(Context context, Intent intent) { // on background handler thread, and POWER_SAVE_WHITELIST_CHANGED is protected synchronized (mUidRulesFirstLock) { - updatePowerSaveWhitelistUL(); + updatePowerSaveAllowlistUL(); updateRulesForRestrictPowerUL(); updateRulesForAppIdleUL(); } @@ -1261,6 +1276,38 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { }; /** + * Listener that watches for active data sub Id change, upon which data notifications are + * shown/hidden. + */ + private final ActiveDataSubIdListener mActiveDataSubIdListener; + private class ActiveDataSubIdListener extends TelephonyCallback implements + TelephonyCallback.ActiveDataSubscriptionIdListener { + /** + * In most cases active data sub is the same as the default data sub, but if user enabled + * auto data switch {@link TelephonyManager#MOBILE_DATA_POLICY_AUTO_DATA_SWITCH}, + * active data sub could be the non-default data sub. + * + * If the listener is initialized before the phone process is up, the IPC call to the + * static method of SubscriptionManager lead to INVALID_SUBSCRIPTION_ID to be returned, + * indicating the phone process is unable to determine a valid data sub Id at this point, in + * which case no data notifications should be shown anyway. Later on when an active data + * sub is known, notifications will be re-evaluated by this callback. + */ + private int mDefaultDataSubId = mDeps.getDefaultDataSubId(); + private int mActiveDataSubId = mDeps.getActivateDataSubId(); + // Only listen to active data sub change is sufficient because default data sub change + // leads to active data sub change as well. + @Override + public void onActiveDataSubscriptionIdChanged(int subId) { + mActiveDataSubId = subId; + mDefaultDataSubId = mDeps.getDefaultDataSubId(); + synchronized (mNetworkPoliciesSecondLock) { + updateNotificationsNL(); + } + } + } + + /** * Listener that watches for {@link NetworkStatsManager} updates, which * NetworkPolicyManagerService uses to check against {@link NetworkPolicy#warningBytes}. */ @@ -1449,6 +1496,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // ignore policies that aren't relevant to user if (subId == INVALID_SUBSCRIPTION_ID) continue; + // ignore if the data sub is neither default nor active for data at the moment. + if (subId != mActiveDataSubIdListener.mDefaultDataSubId + && subId != mActiveDataSubIdListener.mActiveDataSubId) continue; if (!policy.hasCycle()) continue; final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager @@ -2633,7 +2683,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { Slog.w(TAG, "unable to apply policy to UID " + uid + "; ignoring"); } - } else if (TAG_WHITELIST.equals(tag)) { + } else if (TAG_ALLOWLIST.equals(tag)) { insideAllowlist = true; } else if (TAG_RESTRICT_BACKGROUND.equals(tag) && insideAllowlist) { final int uid = readIntAttribute(in, ATTR_UID); @@ -2643,7 +2693,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mRestrictBackgroundAllowlistRevokedUids.put(uid, true); } } else if (type == END_TAG) { - if (TAG_WHITELIST.equals(tag)) { + if (TAG_ALLOWLIST.equals(tag)) { insideAllowlist = false; } @@ -2819,7 +2869,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { out.endTag(null, TAG_POLICY_LIST); // write all allowlists - out.startTag(null, TAG_WHITELIST); + out.startTag(null, TAG_ALLOWLIST); // revoked restrict background allowlist int size = mRestrictBackgroundAllowlistRevokedUids.size(); @@ -2830,7 +2880,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { out.endTag(null, TAG_REVOKED_RESTRICT_BACKGROUND); } - out.endTag(null, TAG_WHITELIST); + out.endTag(null, TAG_ALLOWLIST); out.endDocument(); @@ -4332,7 +4382,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { void updateRulesForPowerSaveUL() { Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForPowerSaveUL"); try { - updateRulesForWhitelistedPowerSaveUL(mRestrictPower, FIREWALL_CHAIN_POWERSAVE, + updateRulesForAllowlistedPowerSaveUL(mRestrictPower, FIREWALL_CHAIN_POWERSAVE, mUidFirewallPowerSaveRules); } finally { Trace.traceEnd(Trace.TRACE_TAG_NETWORK); @@ -4341,14 +4391,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @GuardedBy("mUidRulesFirstLock") void updateRuleForRestrictPowerUL(int uid) { - updateRulesForWhitelistedPowerSaveUL(uid, mRestrictPower, FIREWALL_CHAIN_POWERSAVE); + updateRulesForAllowlistedPowerSaveUL(uid, mRestrictPower, FIREWALL_CHAIN_POWERSAVE); } @GuardedBy("mUidRulesFirstLock") void updateRulesForDeviceIdleUL() { Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "updateRulesForDeviceIdleUL"); try { - updateRulesForWhitelistedPowerSaveUL(mDeviceIdleMode, FIREWALL_CHAIN_DOZABLE, + updateRulesForAllowlistedPowerSaveUL(mDeviceIdleMode, FIREWALL_CHAIN_DOZABLE, mUidFirewallDozableRules); } finally { Trace.traceEnd(Trace.TRACE_TAG_NETWORK); @@ -4357,26 +4407,26 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { @GuardedBy("mUidRulesFirstLock") void updateRuleForDeviceIdleUL(int uid) { - updateRulesForWhitelistedPowerSaveUL(uid, mDeviceIdleMode, FIREWALL_CHAIN_DOZABLE); + updateRulesForAllowlistedPowerSaveUL(uid, mDeviceIdleMode, FIREWALL_CHAIN_DOZABLE); } // NOTE: since both fw_dozable and fw_powersave uses the same map // (mPowerSaveTempWhitelistAppIds) for allowlisting, we can reuse their logic in this method. @GuardedBy("mUidRulesFirstLock") - private void updateRulesForWhitelistedPowerSaveUL(boolean enabled, int chain, + private void updateRulesForAllowlistedPowerSaveUL(boolean enabled, int chain, SparseIntArray rules) { if (enabled) { - // Sync the whitelists before enabling the chain. We don't care about the rules if + // Sync the allowlists before enabling the chain. We don't care about the rules if // we are disabling the chain. final SparseIntArray uidRules = rules; uidRules.clear(); final List<UserInfo> users = mUserManager.getUsers(); for (int ui = users.size() - 1; ui >= 0; ui--) { UserInfo user = users.get(ui); - updateRulesForWhitelistedAppIds(uidRules, mPowerSaveTempWhitelistAppIds, user.id); - updateRulesForWhitelistedAppIds(uidRules, mPowerSaveWhitelistAppIds, user.id); + updateRulesForAllowlistedAppIds(uidRules, mPowerSaveTempWhitelistAppIds, user.id); + updateRulesForAllowlistedAppIds(uidRules, mPowerSaveWhitelistAppIds, user.id); if (chain == FIREWALL_CHAIN_POWERSAVE) { - updateRulesForWhitelistedAppIds(uidRules, + updateRulesForAllowlistedAppIds(uidRules, mPowerSaveWhitelistExceptIdleAppIds, user.id); } } @@ -4391,7 +4441,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } - private void updateRulesForWhitelistedAppIds(final SparseIntArray uidRules, + private void updateRulesForAllowlistedAppIds(final SparseIntArray uidRules, final SparseBooleanArray whitelistedAppIds, int userId) { for (int i = whitelistedAppIds.size() - 1; i >= 0; --i) { if (whitelistedAppIds.valueAt(i)) { @@ -4452,12 +4502,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * allowlisted. */ @GuardedBy("mUidRulesFirstLock") - private boolean isWhitelistedFromPowerSaveUL(int uid, boolean deviceIdleMode) { + private boolean isAllowlistedFromPowerSaveUL(int uid, boolean deviceIdleMode) { final int appId = UserHandle.getAppId(uid); boolean isWhitelisted = mPowerSaveTempWhitelistAppIds.get(appId) || mPowerSaveWhitelistAppIds.get(appId); if (!deviceIdleMode) { - isWhitelisted = isWhitelisted || isWhitelistedFromPowerSaveExceptIdleUL(uid); + isWhitelisted = isWhitelisted || isAllowlistedFromPowerSaveExceptIdleUL(uid); } return isWhitelisted; } @@ -4467,7 +4517,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * (eg: Battery Saver and app idle). */ @GuardedBy("mUidRulesFirstLock") - private boolean isWhitelistedFromPowerSaveExceptIdleUL(int uid) { + private boolean isAllowlistedFromPowerSaveExceptIdleUL(int uid) { final int appId = UserHandle.getAppId(uid); return mPowerSaveWhitelistExceptIdleAppIds.get(appId); } @@ -4483,9 +4533,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // NOTE: since both fw_dozable and fw_powersave uses the same map // (mPowerSaveTempWhitelistAppIds) for allowlisting, we can reuse their logic in this method. @GuardedBy("mUidRulesFirstLock") - private void updateRulesForWhitelistedPowerSaveUL(int uid, boolean enabled, int chain) { + private void updateRulesForAllowlistedPowerSaveUL(int uid, boolean enabled, int chain) { if (enabled) { - final boolean isWhitelisted = isWhitelistedFromPowerSaveUL(uid, + final boolean isWhitelisted = isAllowlistedFromPowerSaveUL(uid, chain == FIREWALL_CHAIN_DOZABLE); if (isWhitelisted || isUidForegroundOnRestrictPowerUL(uid)) { setUidFirewallRuleUL(chain, uid, FIREWALL_RULE_ALLOW); @@ -4743,7 +4793,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } @GuardedBy("mUidRulesFirstLock") - private void updateRulesForTempWhitelistChangeUL(int appId) { + private void updateRulesForTempAllowlistChangeUL(int appId) { final List<UserInfo> users = mUserManager.getUsers(); final int numUsers = users.size(); for (int i = 0; i < numUsers; i++) { @@ -5134,7 +5184,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final boolean isForeground = isUidForegroundOnRestrictPowerUL(uid); final boolean isTop = isUidTop(uid); - final boolean isWhitelisted = isWhitelistedFromPowerSaveUL(uid, mDeviceIdleMode); + final boolean isWhitelisted = isAllowlistedFromPowerSaveUL(uid, mDeviceIdleMode); final int oldEffectiveBlockedReasons; final int newEffectiveBlockedReasons; @@ -5157,9 +5207,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { newAllowedReasons |= (isSystem(uid) ? ALLOWED_REASON_SYSTEM : 0); newAllowedReasons |= (isForeground ? ALLOWED_REASON_FOREGROUND : 0); newAllowedReasons |= (isTop ? ALLOWED_REASON_TOP : 0); - newAllowedReasons |= (isWhitelistedFromPowerSaveUL(uid, true) + newAllowedReasons |= (isAllowlistedFromPowerSaveUL(uid, true) ? ALLOWED_REASON_POWER_SAVE_ALLOWLIST : 0); - newAllowedReasons |= (isWhitelistedFromPowerSaveExceptIdleUL(uid) + newAllowedReasons |= (isAllowlistedFromPowerSaveExceptIdleUL(uid) ? ALLOWED_REASON_POWER_SAVE_EXCEPT_IDLE_ALLOWLIST : 0); newAllowedReasons |= (uidBlockedState.allowedReasons & ALLOWED_REASON_RESTRICTED_MODE_PERMISSIONS); @@ -6072,7 +6122,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { mPowerSaveTempWhitelistAppIds.delete(appId); } - updateRulesForTempWhitelistChangeUL(appId); + updateRulesForTempAllowlistChangeUL(appId); } } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java index 47bb8f009920..34c8a0d19e23 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerShellCommand.java @@ -154,13 +154,13 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { } switch(type) { case "app-idle-whitelist": - return listAppIdleWhitelist(); + return listAppIdleAllowlist(); case "wifi-networks": return listWifiNetworks(); case "restrict-background-whitelist": - return listRestrictBackgroundWhitelist(); + return listRestrictBackgroundAllowlist(); case "restrict-background-blacklist": - return listRestrictBackgroundBlacklist(); + return listRestrictBackgroundDenylist(); } pw.println("Error: unknown list type '" + type + "'"); return -1; @@ -175,11 +175,11 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { } switch(type) { case "restrict-background-whitelist": - return addRestrictBackgroundWhitelist(); + return addRestrictBackgroundAllowlist(); case "restrict-background-blacklist": - return addRestrictBackgroundBlacklist(); + return addRestrictBackgroundDenylist(); case "app-idle-whitelist": - return addAppIdleWhitelist(); + return addAppIdleAllowlist(); } pw.println("Error: unknown add type '" + type + "'"); return -1; @@ -194,11 +194,11 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { } switch(type) { case "restrict-background-whitelist": - return removeRestrictBackgroundWhitelist(); + return removeRestrictBackgroundAllowlist(); case "restrict-background-blacklist": - return removeRestrictBackgroundBlacklist(); + return removeRestrictBackgroundDenylist(); case "app-idle-whitelist": - return removeAppIdleWhitelist(); + return removeAppIdleAllowlist(); } pw.println("Error: unknown remove type '" + type + "'"); return -1; @@ -241,17 +241,17 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } - private int listRestrictBackgroundWhitelist() throws RemoteException { + private int listRestrictBackgroundAllowlist() throws RemoteException { return listUidPolicies("Restrict background whitelisted UIDs", POLICY_ALLOW_METERED_BACKGROUND); } - private int listRestrictBackgroundBlacklist() throws RemoteException { + private int listRestrictBackgroundDenylist() throws RemoteException { return listUidPolicies("Restrict background blacklisted UIDs", POLICY_REJECT_METERED_BACKGROUND); } - private int listAppIdleWhitelist() throws RemoteException { + private int listAppIdleAllowlist() throws RemoteException { final PrintWriter pw = getOutPrintWriter(); final int[] uids = mInterface.getAppIdleWhitelist(); return listUidList("App Idle whitelisted UIDs", uids); @@ -311,23 +311,23 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } - private int addRestrictBackgroundWhitelist() throws RemoteException { + private int addRestrictBackgroundAllowlist() throws RemoteException { return setUidPolicy(POLICY_ALLOW_METERED_BACKGROUND); } - private int removeRestrictBackgroundWhitelist() throws RemoteException { + private int removeRestrictBackgroundAllowlist() throws RemoteException { return resetUidPolicy("not whitelisted", POLICY_ALLOW_METERED_BACKGROUND); } - private int addRestrictBackgroundBlacklist() throws RemoteException { + private int addRestrictBackgroundDenylist() throws RemoteException { return setUidPolicy(POLICY_REJECT_METERED_BACKGROUND); } - private int removeRestrictBackgroundBlacklist() throws RemoteException { + private int removeRestrictBackgroundDenylist() throws RemoteException { return resetUidPolicy("not blacklisted", POLICY_REJECT_METERED_BACKGROUND); } - private int setAppIdleWhitelist(boolean isWhitelisted) { + private int setAppIdleAllowlist(boolean isWhitelisted) { final int uid = getUidFromNextArg(); if (uid < 0) { return uid; @@ -336,12 +336,12 @@ class NetworkPolicyManagerShellCommand extends ShellCommand { return 0; } - private int addAppIdleWhitelist() throws RemoteException { - return setAppIdleWhitelist(true); + private int addAppIdleAllowlist() throws RemoteException { + return setAppIdleAllowlist(true); } - private int removeAppIdleWhitelist() throws RemoteException { - return setAppIdleWhitelist(false); + private int removeAppIdleAllowlist() throws RemoteException { + return setAppIdleAllowlist(false); } private int listWifiNetworks() { diff --git a/services/core/java/com/android/server/net/OWNERS b/services/core/java/com/android/server/net/OWNERS index 9c96d46f15b8..d0e95dd55b6c 100644 --- a/services/core/java/com/android/server/net/OWNERS +++ b/services/core/java/com/android/server/net/OWNERS @@ -1,5 +1,5 @@ set noparent -file:platform/packages/modules/Connectivity:master:/OWNERS_core_networking +file:platform/packages/modules/Connectivity:main:/OWNERS_core_networking jsharkey@android.com sudheersai@google.com diff --git a/services/core/java/com/android/server/net/watchlist/OWNERS b/services/core/java/com/android/server/net/watchlist/OWNERS index a3d4b85367cf..d0c4e553ad8c 100644 --- a/services/core/java/com/android/server/net/watchlist/OWNERS +++ b/services/core/java/com/android/server/net/watchlist/OWNERS @@ -1,3 +1,2 @@ -rickywai@google.com alanstokes@google.com simonjw@google.com diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index d471c8abb1b2..2f9536ff6427 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -1120,6 +1120,21 @@ public final class OverlayManagerService extends SystemService { int callingUid = Binder.getCallingUid(); mActorEnforcer.enforceActor(overlayInfo, methodName, callingUid, realUserId); } + + /** + * @hide + */ + public String getPartitionOrder() { + return mImpl.getOverlayConfig().getPartitionOrder(); + } + + /** + * @hide + */ + public boolean isDefaultPartitionOrder() { + return mImpl.getOverlayConfig().isDefaultPartitionOrder(); + } + }; private static final class PackageManagerHelperImpl implements PackageManagerHelper { diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index 1beba9fd003a..972c78db9460 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -925,4 +925,8 @@ final class OverlayManagerServiceImpl { super(message, cause); } } + + OverlayConfig getOverlayConfig() { + return mOverlayConfig; + } } diff --git a/services/core/java/com/android/server/om/OverlayManagerShellCommand.java b/services/core/java/com/android/server/om/OverlayManagerShellCommand.java index 978e43633b92..f77d789891f7 100644 --- a/services/core/java/com/android/server/om/OverlayManagerShellCommand.java +++ b/services/core/java/com/android/server/om/OverlayManagerShellCommand.java @@ -16,6 +16,8 @@ package com.android.server.om; +import static com.android.internal.content.om.OverlayConfig.PARTITION_ORDER_FILE_PATH; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -95,6 +97,8 @@ final class OverlayManagerShellCommand extends ShellCommand { return runLookup(); case "fabricate": return runFabricate(); + case "partition-order": + return runPartitionOrder(); default: return handleDefaultCommands(cmd); } @@ -147,6 +151,9 @@ final class OverlayManagerShellCommand extends ShellCommand { out.println(" Create an overlay from a single resource. Caller must be root. Example:"); out.println(" fabricate --target android --name LighterGray \\"); out.println(" android:color/lighter_gray 0x1c 0xffeeeeee"); + out.println(" partition-order"); + out.println(" Print the partition order from overlay config and how this order"); + out.println(" got established, by default or by " + PARTITION_ORDER_FILE_PATH); } private int runList() throws RemoteException { @@ -247,6 +254,14 @@ final class OverlayManagerShellCommand extends ShellCommand { return 0; } + private int runPartitionOrder() throws RemoteException { + final PrintWriter out = getOutPrintWriter(); + out.println("Partition order (low to high priority): " + mInterface.getPartitionOrder()); + out.println("Established by " + (mInterface.isDefaultPartitionOrder() ? "default" + : PARTITION_ORDER_FILE_PATH)); + return 0; + } + private int runFabricate() throws RemoteException { final PrintWriter err = getErrPrintWriter(); if (Binder.getCallingUid() != Process.ROOT_UID) { diff --git a/services/core/java/com/android/server/os/NativeTombstoneManager.java b/services/core/java/com/android/server/os/NativeTombstoneManager.java index d3d1cc5d05cb..7b0eddc505f4 100644 --- a/services/core/java/com/android/server/os/NativeTombstoneManager.java +++ b/services/core/java/com/android/server/os/NativeTombstoneManager.java @@ -370,7 +370,7 @@ public final class NativeTombstoneManager { return false; } - if (Math.abs(exitInfo.getTimestamp() - mTimestampMs) > 5000) { + if (Math.abs(exitInfo.getTimestamp() - mTimestampMs) > 10000) { return false; } diff --git a/services/core/java/com/android/server/os/OWNERS b/services/core/java/com/android/server/os/OWNERS index 19573323e5ad..70be161ba9a8 100644 --- a/services/core/java/com/android/server/os/OWNERS +++ b/services/core/java/com/android/server/os/OWNERS @@ -1,2 +1,5 @@ # Bugreporting per-file Bugreport* = file:/platform/frameworks/native:/cmds/dumpstate/OWNERS + +# NativeTombstone +per-file NativeTombstone* = gaillard@google.com diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java index 5e62b56c7bcd..42be07b3e3ba 100644 --- a/services/core/java/com/android/server/pm/ApexManager.java +++ b/services/core/java/com/android/server/pm/ApexManager.java @@ -363,9 +363,13 @@ public abstract class ApexManager { /** * Performs a non-staged install of the given {@code apexFile}. * + * If {@code force} is {@code true}, then update is forced even for APEXes that do not support + * non-staged update. This feature is only available on debuggable builds to improve development + * velocity of the teams that have their code packaged in an APEX. + * * @return {@code ApeInfo} about the newly installed APEX package. */ - abstract ApexInfo installPackage(File apexFile) throws PackageManagerException; + abstract ApexInfo installPackage(File apexFile, boolean force) throws PackageManagerException; /** * Get a list of apex system services implemented in an apex. @@ -910,10 +914,11 @@ public abstract class ApexManager { } @Override - ApexInfo installPackage(File apexFile) + ApexInfo installPackage(File apexFile, boolean force) throws PackageManagerException { try { - return waitForApexService().installAndActivatePackage(apexFile.getAbsolutePath()); + return waitForApexService().installAndActivatePackage(apexFile.getAbsolutePath(), + force); } catch (RemoteException e) { throw new PackageManagerException(PackageManager.INSTALL_FAILED_INTERNAL_ERROR, "apexservice not available"); @@ -1170,7 +1175,7 @@ public abstract class ApexManager { } @Override - ApexInfo installPackage(File apexFile) { + ApexInfo installPackage(File apexFile, boolean force) { throw new UnsupportedOperationException("APEX updates are not supported"); } diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java index 2e1c72e66e55..5b93244c1710 100644 --- a/services/core/java/com/android/server/pm/ApkChecksums.java +++ b/services/core/java/com/android/server/pm/ApkChecksums.java @@ -40,8 +40,6 @@ import android.content.pm.SigningDetails.SignatureSchemeVersion; import android.content.pm.parsing.ApkLiteParseUtils; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; -import android.os.Environment; -import android.os.FileUtils; import android.os.Handler; import android.os.RemoteException; import android.os.SystemClock; @@ -637,18 +635,9 @@ public class ApkChecksums { return null; } - private static boolean containsFile(File dir, String filePath) { - if (dir == null) { - return false; - } - return FileUtils.contains(dir.getAbsolutePath(), filePath); - } - private static ApkChecksum extractHashFromFS(String split, String filePath) { // verity first - // Skip /product folder. - // TODO(b/231354111): remove this hack once we are allowed to change SELinux rules. - if (!containsFile(Environment.getProductDirectory(), filePath)) { + if (VerityUtils.hasFsverity(filePath)) { byte[] verityHash = VerityUtils.getFsverityDigest(filePath); if (verityHash != null) { return new ApkChecksum(split, TYPE_WHOLE_MERKLE_ROOT_4K_SHA256, verityHash); diff --git a/services/core/java/com/android/server/pm/InstallArgs.java b/services/core/java/com/android/server/pm/InstallArgs.java index 6de7f07b78bb..dd96a2b84a97 100644 --- a/services/core/java/com/android/server/pm/InstallArgs.java +++ b/services/core/java/com/android/server/pm/InstallArgs.java @@ -43,6 +43,7 @@ final class InstallArgs { final IPackageInstallObserver2 mObserver; // Always refers to PackageManager flags only final int mInstallFlags; + final int mDevelopmentInstallFlags; @NonNull final InstallSource mInstallSource; final String mVolumeUuid; @@ -69,8 +70,8 @@ final class InstallArgs { @Nullable String[] mInstructionSets; InstallArgs(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer, - int installFlags, InstallSource installSource, String volumeUuid, - UserHandle user, String[] instructionSets, String abiOverride, + int installFlags, int developmentInstallFlags, InstallSource installSource, + String volumeUuid, UserHandle user, String[] instructionSets, String abiOverride, @NonNull ArrayMap<String, Integer> permissionStates, List<String> allowlistedRestrictedPermissions, int autoRevokePermissionsMode, String traceMethod, int traceCookie, @@ -80,6 +81,7 @@ final class InstallArgs { mOriginInfo = originInfo; mMoveInfo = moveInfo; mInstallFlags = installFlags; + mDevelopmentInstallFlags = developmentInstallFlags; mObserver = observer; mInstallSource = Preconditions.checkNotNull(installSource); mVolumeUuid = volumeUuid; @@ -105,7 +107,7 @@ final class InstallArgs { * when cleaning up old installs, or used as a move source. */ InstallArgs(String codePath, String[] instructionSets) { - this(OriginInfo.fromNothing(), null, null, 0, InstallSource.EMPTY, null, null, + this(OriginInfo.fromNothing(), null, null, 0, 0, InstallSource.EMPTY, null, null, instructionSets, null, new ArrayMap<>(), null, MODE_DEFAULT, null, 0, SigningDetails.UNKNOWN, PackageManager.INSTALL_REASON_UNKNOWN, PackageManager.INSTALL_SCENARIO_DEFAULT, false, DataLoaderType.NONE, diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java index 34648740d54c..6fc14e814525 100644 --- a/services/core/java/com/android/server/pm/InstallRequest.java +++ b/services/core/java/com/android/server/pm/InstallRequest.java @@ -134,12 +134,13 @@ final class InstallRequest { InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); mInstallArgs = new InstallArgs(params.mOriginInfo, params.mMoveInfo, params.mObserver, - params.mInstallFlags, params.mInstallSource, params.mVolumeUuid, - params.getUser(), null /*instructionSets*/, params.mPackageAbiOverride, - params.mPermissionStates, params.mAllowlistedRestrictedPermissions, - params.mAutoRevokePermissionsMode, params.mTraceMethod, params.mTraceCookie, - params.mSigningDetails, params.mInstallReason, params.mInstallScenario, - params.mForceQueryableOverride, params.mDataLoaderType, params.mPackageSource, + params.mInstallFlags, params.mDevelopmentInstallFlags, params.mInstallSource, + params.mVolumeUuid, params.getUser(), null /*instructionSets*/, + params.mPackageAbiOverride, params.mPermissionStates, + params.mAllowlistedRestrictedPermissions, params.mAutoRevokePermissionsMode, + params.mTraceMethod, params.mTraceCookie, params.mSigningDetails, + params.mInstallReason, params.mInstallScenario, params.mForceQueryableOverride, + params.mDataLoaderType, params.mPackageSource, params.mApplicationEnabledSettingPersistent); mPackageMetrics = new PackageMetrics(this); mIsInstallInherit = params.mIsInherit; @@ -286,6 +287,10 @@ final class InstallRequest { return mInstallArgs == null ? 0 : mInstallArgs.mInstallFlags; } + public int getDevelopmentInstallFlags() { + return mInstallArgs == null ? 0 : mInstallArgs.mDevelopmentInstallFlags; + } + public int getInstallReason() { return mInstallArgs == null ? INSTALL_REASON_UNKNOWN : mInstallArgs.mInstallReason; } diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 68c8abf0c2d3..9ac983dfebeb 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -399,7 +399,7 @@ public class Installer extends SystemService { args[j] = mArgs.get(i + j); } final CreateAppDataResult[] results = installer.createAppDataBatched(args); - for (int j = 0; j < args.length; j++) { + for (int j = 0; j < results.length; j++) { final CreateAppDataResult result = results[j]; final CompletableFuture<Long> future = mFutures.get(i + j); if (result.exceptionCode == 0) { diff --git a/services/core/java/com/android/server/pm/InstallingSession.java b/services/core/java/com/android/server/pm/InstallingSession.java index 35862db3d3db..30a23bfd0641 100644 --- a/services/core/java/com/android/server/pm/InstallingSession.java +++ b/services/core/java/com/android/server/pm/InstallingSession.java @@ -68,6 +68,7 @@ class InstallingSession { final MoveInfo mMoveInfo; final IPackageInstallObserver2 mObserver; int mInstallFlags; + int mDevelopmentInstallFlags; @NonNull final InstallSource mInstallSource; final String mVolumeUuid; @@ -102,8 +103,8 @@ class InstallingSession { // For move install InstallingSession(OriginInfo originInfo, MoveInfo moveInfo, IPackageInstallObserver2 observer, - int installFlags, InstallSource installSource, String volumeUuid, - UserHandle user, String packageAbiOverride, int packageSource, + int installFlags, int developmentInstallFlags, InstallSource installSource, + String volumeUuid, UserHandle user, String packageAbiOverride, int packageSource, PackageLite packageLite, PackageManagerService pm) { mPm = pm; mUser = user; @@ -113,6 +114,7 @@ class InstallingSession { mMoveInfo = moveInfo; mObserver = observer; mInstallFlags = installFlags; + mDevelopmentInstallFlags = developmentInstallFlags; mInstallSource = Preconditions.checkNotNull(installSource); mVolumeUuid = volumeUuid; mPackageAbiOverride = packageAbiOverride; @@ -149,6 +151,7 @@ class InstallingSession { mInstallScenario = sessionParams.installScenario; mObserver = observer; mInstallFlags = sessionParams.installFlags; + mDevelopmentInstallFlags = sessionParams.developmentInstallFlags; mInstallSource = installSource; mVolumeUuid = sessionParams.volumeUuid; mPackageAbiOverride = sessionParams.abiOverride; @@ -592,6 +595,10 @@ class InstallingSession { "Only a non-staged install of a single APEX is supported"); } InstallRequest request = requests.get(0); + boolean force = + (request.getDevelopmentInstallFlags() + & PackageManager.INSTALL_DEVELOPMENT_FORCE_NON_STAGED_APEX_UPDATE) + != 0; try { // Should directory scanning logic be moved to ApexManager for better test coverage? final File dir = request.getOriginInfo().mResolvedFile; @@ -608,7 +615,7 @@ class InstallingSession { PackageManagerException.INTERNAL_ERROR_APEX_MORE_THAN_ONE_FILE); } try (PackageParser2 packageParser = mPm.mInjector.getScanningPackageParser()) { - ApexInfo apexInfo = mPm.mApexManager.installPackage(apexes[0]); + ApexInfo apexInfo = mPm.mApexManager.installPackage(apexes[0], force); // APEX has been handled successfully by apexd. Let's continue the install flow // so it will be scanned and registered with the system. // TODO(b/225756739): Improve atomicity of rebootless APEX install. diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java index bec5a9a7782c..481bd975fef5 100644 --- a/services/core/java/com/android/server/pm/MovePackageHelper.java +++ b/services/core/java/com/android/server/pm/MovePackageHelper.java @@ -35,6 +35,7 @@ import android.content.pm.IPackageMoveObserver; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageStats; +import android.content.pm.UserInfo; import android.content.pm.parsing.ApkLiteParseUtils; import android.content.pm.parsing.PackageLite; import android.content.pm.parsing.result.ParseResult; @@ -48,6 +49,7 @@ import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.UserHandle; import android.os.storage.StorageManager; +import android.os.storage.StorageManagerInternal; import android.os.storage.VolumeInfo; import android.util.MathUtils; import android.util.Slog; @@ -62,6 +64,7 @@ import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageStateUtils; import java.io.File; +import java.util.ArrayList; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -220,6 +223,14 @@ public final class MovePackageHelper { "Not enough free space to move"); } + try { + prepareUserStorageForMove(currentVolumeUuid, volumeUuid, installedUserIds); + } catch (RuntimeException e) { + freezer.close(); + throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR, + "Failed to prepare user storage while moving app"); + } + mPm.mMoveCallbacks.notifyStatusChanged(moveId, 10); final CountDownLatch installedLatch = new CountDownLatch(1); @@ -293,8 +304,9 @@ public final class MovePackageHelper { new File(origin.mResolvedPath), /* flags */ 0); final PackageLite lite = ret.isSuccess() ? ret.getResult() : null; final InstallingSession installingSession = new InstallingSession(origin, move, - installObserver, installFlags, installSource, volumeUuid, user, packageAbiOverride, - PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, lite, mPm); + installObserver, installFlags, /* developmentInstallFlags= */ 0, installSource, + volumeUuid, user, packageAbiOverride, PackageInstaller.PACKAGE_SOURCE_UNSPECIFIED, + lite, mPm); installingSession.movePackage(); } @@ -366,6 +378,22 @@ public final class MovePackageHelper { return true; } + private void prepareUserStorageForMove(String fromVolumeUuid, String toVolumeUuid, + int[] userIds) { + if (DEBUG_INSTALL) { + Slog.d(TAG, "Preparing user directories before moving app, from UUID " + fromVolumeUuid + + " to UUID " + toVolumeUuid); + } + final StorageManagerInternal smInternal = + mPm.mInjector.getLocalService(StorageManagerInternal.class); + final ArrayList<UserInfo> users = new ArrayList<>(); + for (int userId : userIds) { + final UserInfo user = mPm.mUserManager.getUserInfo(userId); + users.add(user); + } + smInternal.prepareUserStorageForMove(fromVolumeUuid, toVolumeUuid, users); + } + public static class MoveCallbacks extends Handler { private static final int MSG_CREATED = 1; private static final int MSG_STATUS_CHANGED = 2; diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index a9115371413c..178719f3c4ec 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -709,6 +709,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements != PackageManager.PERMISSION_GRANTED) { params.installFlags &= ~PackageManager.INSTALL_ALLOW_TEST; } + + // developmentInstallFlags can ony be set by shell or root. + params.developmentInstallFlags = 0; } String originatingPackageName = null; diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index e1f010f62232..2a7ebfb75dde 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -3211,6 +3211,13 @@ class PackageManagerShellCommand extends ShellCommand { // Set package source to other by default sessionParams.setPackageSource(PackageInstaller.PACKAGE_SOURCE_OTHER); + // Encodes one of the states: + // 1. Install request explicitly specified --staged, then value will be true. + // 2. Install request explicitly specified --non-staged, then value will be false. + // 3. Install request did not specify either --staged or --non-staged, then for APEX + // installs the value will be true, and for apk installs it will be false. + Boolean staged = null; + String opt; boolean replaceExisting = true; boolean forceNonStaged = false; @@ -3319,7 +3326,6 @@ class PackageManagerShellCommand extends ShellCommand { break; case "--apex": sessionParams.setInstallAsApex(); - sessionParams.setStaged(); break; case "--force-non-staged": forceNonStaged = true; @@ -3328,7 +3334,10 @@ class PackageManagerShellCommand extends ShellCommand { sessionParams.setMultiPackage(); break; case "--staged": - sessionParams.setStaged(); + staged = true; + break; + case "--non-staged": + staged = false; break; case "--force-queryable": sessionParams.setForceQueryable(); @@ -3363,11 +3372,18 @@ class PackageManagerShellCommand extends ShellCommand { throw new IllegalArgumentException("Unknown option " + opt); } } + if (staged == null) { + staged = (sessionParams.installFlags & PackageManager.INSTALL_APEX) != 0; + } if (replaceExisting) { sessionParams.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; } if (forceNonStaged) { sessionParams.isStaged = false; + sessionParams.developmentInstallFlags |= + PackageManager.INSTALL_DEVELOPMENT_FORCE_NON_STAGED_APEX_UPDATE; + } else if (staged) { + sessionParams.setStaged(); } return params; } @@ -4231,7 +4247,8 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" [--preload] [--instant] [--full] [--dont-kill]"); pw.println(" [--enable-rollback]"); pw.println(" [--force-uuid internal|UUID] [--pkg PACKAGE] [-S BYTES]"); - pw.println(" [--apex] [--staged-ready-timeout TIMEOUT]"); + pw.println(" [--apex] [--non-staged] [--force-non-staged]"); + pw.println(" [--staged-ready-timeout TIMEOUT]"); pw.println(" [PATH [SPLIT...]|-]"); pw.println(" Install an application. Must provide the apk data to install, either as"); pw.println(" file path(s) or '-' to read from stdin. Options are:"); @@ -4260,6 +4277,12 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" --update-ownership: request the update ownership enforcement"); pw.println(" --force-uuid: force install on to disk volume with given UUID"); pw.println(" --apex: install an .apex file, not an .apk"); + pw.println(" --non-staged: explicitly set this installation to be non-staged."); + pw.println(" This flag is only useful for APEX installs that are implicitly"); + pw.println(" assumed to be staged."); + pw.println(" --force-non-staged: force the installation to run under a non-staged"); + pw.println(" session, which may complete without requiring a reboot. This will"); + pw.println(" force a rebootless update even for APEXes that don't support it"); pw.println(" --staged-ready-timeout: By default, staged sessions wait " + DEFAULT_STAGED_READY_TIMEOUT_MS); pw.println(" milliseconds for pre-reboot verification to complete when"); diff --git a/services/core/java/com/android/server/pm/PreferredActivityHelper.java b/services/core/java/com/android/server/pm/PreferredActivityHelper.java index 214a8b80b35d..e1ba8b6ec1f9 100644 --- a/services/core/java/com/android/server/pm/PreferredActivityHelper.java +++ b/services/core/java/com/android/server/pm/PreferredActivityHelper.java @@ -661,6 +661,7 @@ final class PreferredActivityHelper { final Iterator<PreferredActivity> it = pir.filterIterator(); while (it.hasNext()) { final PreferredActivity pa = it.next(); + if (pa == null) continue; final String prefPackageName = pa.mPref.mComponent.getPackageName(); if (packageName == null || (prefPackageName.equals(packageName) && pa.mPref.mAlways)) { diff --git a/services/core/java/com/android/server/pm/SELinuxMMAC.java b/services/core/java/com/android/server/pm/SELinuxMMAC.java index 25960062fa67..a8cdef4ec64c 100644 --- a/services/core/java/com/android/server/pm/SELinuxMMAC.java +++ b/services/core/java/com/android/server/pm/SELinuxMMAC.java @@ -83,6 +83,8 @@ public final class SELinuxMMAC { // Append targetSdkVersion=n to existing seinfo label where n is the app's targetSdkVersion private static final String TARGETSDKVERSION_STR = ":targetSdkVersion="; + private static final String PARTITION_STR = ":partition="; + /** * Allows opt-in to the latest targetSdkVersion enforced changes without changing target SDK. * Turning this change on for an app targeting the latest SDK or higher is a no-op. @@ -373,15 +375,33 @@ public final class SELinuxMMAC { return pkg.getTargetSdkVersion(); } + private static String getPartition(PackageState state) { + if (state.isSystemExt()) { + return "system_ext"; + } else if (state.isProduct()) { + return "product"; + } else if (state.isVendor()) { + return "vendor"; + } else if (state.isOem()) { + return "oem"; + } else if (state.isOdm()) { + return "odm"; + } else if (state.isSystem()) { + return "system"; + } + return ""; + } + /** * Selects a security label to a package based on input parameters and the seinfo tag taken * from a matched policy. All signature based policy stanzas are consulted and, if no match * is found, the default seinfo label of 'default' is used. The security label is attached to * the ApplicationInfo instance of the package. * - * @param pkg object representing the package to be labeled. - * @param sharedUser if the app shares a sharedUserId, then this has the shared setting. - * @param compatibility the PlatformCompat service to ask about state of compat changes. + * @param packageState {@link PackageState} object representing the package to be labeled. + * @param pkg {@link AndroidPackage} object representing the package to be labeled. + * @param sharedUser if the app shares a sharedUserId, then this has the shared setting. + * @param compatibility the PlatformCompat service to ask about state of compat changes. * @return String representing the resulting seinfo. */ public static String getSeInfo(@NonNull PackageState packageState, @NonNull AndroidPackage pkg, @@ -393,7 +413,7 @@ public final class SELinuxMMAC { final boolean isPrivileged = (sharedUser != null) ? sharedUser.isPrivileged() | packageState.isPrivileged() : packageState.isPrivileged(); - return getSeInfo(pkg, isPrivileged, targetSdkVersion); + return getSeInfo(packageState, pkg, isPrivileged, targetSdkVersion); } /** @@ -402,15 +422,16 @@ public final class SELinuxMMAC { * is found, the default seinfo label of 'default' is used. The security label is attached to * the ApplicationInfo instance of the package. * - * @param pkg object representing the package to be labeled. - * @param isPrivileged boolean. + * @param packageState {@link PackageState} object representing the package to be labeled. + * @param pkg {@link AndroidPackage} object representing the package to be labeled. + * @param isPrivileged boolean. * @param targetSdkVersion int. If this pkg runs as a sharedUser, targetSdkVersion is the * greater of: lowest targetSdk for all pkgs in the sharedUser, or * MINIMUM_TARGETSDKVERSION. * @return String representing the resulting seinfo. */ - public static String getSeInfo(AndroidPackage pkg, boolean isPrivileged, - int targetSdkVersion) { + public static String getSeInfo(PackageState packageState, AndroidPackage pkg, + boolean isPrivileged, int targetSdkVersion) { String seInfo = null; synchronized (sPolicies) { if (!sPolicyRead) { @@ -437,8 +458,13 @@ public final class SELinuxMMAC { seInfo += TARGETSDKVERSION_STR + targetSdkVersion; + String partition = getPartition(packageState); + if (!partition.isEmpty()) { + seInfo += PARTITION_STR + partition; + } + if (DEBUG_POLICY_INSTALL) { - Slog.i(TAG, "package (" + pkg.getPackageName() + ") labeled with " + Slog.i(TAG, "package (" + packageState.getPackageName() + ") labeled with " + "seinfo=" + seInfo); } return seInfo; diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java index a037ae8ead04..9376259c08b1 100644 --- a/services/core/java/com/android/server/pm/SharedUserSetting.java +++ b/services/core/java/com/android/server/pm/SharedUserSetting.java @@ -285,7 +285,7 @@ public final class SharedUserSetting extends SettingBase implements SharedUserAp continue; } final boolean isPrivileged = isPrivileged() | ps.isPrivileged(); - ps.getPkgState().setOverrideSeInfo(SELinuxMMAC.getSeInfo(ps.getPkg(), isPrivileged, + ps.getPkgState().setOverrideSeInfo(SELinuxMMAC.getSeInfo(ps, ps.getPkg(), isPrivileged, seInfoTargetSdkVersion)); onChanged(); } diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index 8815834f6b5c..4e2ceab290d4 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -151,7 +151,8 @@ public class UserRestrictionsUtils { UserManager.DISALLOW_ADD_WIFI_CONFIG, UserManager.DISALLOW_CELLULAR_2G, UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO, - UserManager.DISALLOW_CONFIG_DEFAULT_APPS + UserManager.DISALLOW_CONFIG_DEFAULT_APPS, + UserManager.DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO }); public static final Set<String> DEPRECATED_USER_RESTRICTIONS = Sets.newArraySet( @@ -201,7 +202,8 @@ public class UserRestrictionsUtils { UserManager.DISALLOW_WIFI_DIRECT, UserManager.DISALLOW_ADD_WIFI_CONFIG, UserManager.DISALLOW_CELLULAR_2G, - UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO + UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO, + UserManager.DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO ); /** @@ -243,7 +245,8 @@ public class UserRestrictionsUtils { UserManager.DISALLOW_WIFI_DIRECT, UserManager.DISALLOW_ADD_WIFI_CONFIG, UserManager.DISALLOW_CELLULAR_2G, - UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO + UserManager.DISALLOW_ULTRA_WIDEBAND_RADIO, + UserManager.DISALLOW_NEAR_FIELD_COMMUNICATION_RADIO ); /** diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 951052922586..c2b185674185 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -74,6 +74,8 @@ import com.android.server.pm.KnownPackages; import com.android.server.pm.permission.LegacyPermissionManagerInternal.PackagesProvider; import com.android.server.pm.permission.LegacyPermissionManagerInternal.SyncAdapterPackagesProvider; +import libcore.util.HexEncoding; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -126,6 +128,7 @@ final class DefaultPermissionGrantPolicy { private static final String ATTR_NAME = "name"; private static final String ATTR_FIXED = "fixed"; private static final String ATTR_WHITELISTED = "whitelisted"; + private static final String ATTR_CERT = "cert"; private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>(); @@ -1438,7 +1441,7 @@ final class DefaultPermissionGrantPolicy { final int exceptionCount = mGrantExceptions.size(); for (int i = 0; i < exceptionCount; i++) { String packageName = mGrantExceptions.keyAt(i); - PackageInfo pkg = pm.getSystemPackageInfo(packageName); + PackageInfo pkg = pm.getPackageInfo(packageName); List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i); final int permissionGrantCount = permissionGrants.size(); for (int j = 0; j < permissionGrantCount; j++) { @@ -1485,12 +1488,9 @@ final class DefaultPermissionGrantPolicy { if (dir.isDirectory() && dir.canRead()) { Collections.addAll(ret, dir.listFiles()); } - // For IoT devices, we check the oem partition for default permissions for each app. - if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED, 0)) { - dir = new File(Environment.getOemDirectory(), "etc/default-permissions"); - if (dir.isDirectory() && dir.canRead()) { - Collections.addAll(ret, dir.listFiles()); - } + dir = new File(Environment.getOemDirectory(), "etc/default-permissions"); + if (dir.isDirectory() && dir.canRead()) { + Collections.addAll(ret, dir.listFiles()); } return ret.isEmpty() ? null : ret.toArray(new File[0]); } @@ -1556,12 +1556,12 @@ final class DefaultPermissionGrantPolicy { } if (TAG_EXCEPTION.equals(parser.getName())) { String packageName = parser.getAttributeValue(null, ATTR_PACKAGE); + String cert = parser.getAttributeValue(null, ATTR_CERT); List<DefaultPermissionGrant> packageExceptions = outGrantExceptions.get(packageName); if (packageExceptions == null) { - // The package must be on the system image - PackageInfo packageInfo = pm.getSystemPackageInfo(packageName); + PackageInfo packageInfo = pm.getPackageInfo(packageName); if (packageInfo == null) { Log.w(TAG, "No such package:" + packageName); @@ -1569,8 +1569,8 @@ final class DefaultPermissionGrantPolicy { continue; } - if (!pm.isSystemPackage(packageInfo)) { - Log.w(TAG, "Unknown system package:" + packageName); + if (!isSystemOrCertificateMatchingPackage(packageInfo, cert)) { + Log.w(TAG, "Not system or certificate-matching package: " + packageName); XmlUtils.skipCurrentTag(parser); continue; } @@ -1625,6 +1625,15 @@ final class DefaultPermissionGrantPolicy { } } + private boolean isSystemOrCertificateMatchingPackage(PackageInfo pi, String cert) { + if (cert == null) { + return pi.applicationInfo.isSystemApp(); + } + + return mContext.getPackageManager().hasSigningCertificate(pi.packageName, HexEncoding. + decode(cert.replace(":", "")), PackageManager.CERT_INPUT_SHA256); + } + private static boolean doesPackageSupportRuntimePermissions(PackageInfo pkg) { return pkg.applicationInfo != null && pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.LOLLIPOP_MR1; diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java index 2499529f0fc0..21446549cfbd 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java @@ -2148,6 +2148,12 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt if (!isStorageOrMedia) { continue; } + boolean isSystemOrPolicyFixed = (getPermissionFlags(newPackage.getPackageName(), + permInfo.name, userId) & (FLAG_PERMISSION_SYSTEM_FIXED + | FLAG_PERMISSION_POLICY_FIXED)) != 0; + if (isSystemOrPolicyFixed) { + continue; + } EventLog.writeEvent(0x534e4554, "171430330", newPackage.getUid(), "Revoking permission " + permInfo.name + " from package " diff --git a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java index 1567af081857..8c9ecb2e5046 100644 --- a/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java +++ b/services/core/java/com/android/server/pm/pkg/parsing/ParsingPackageUtils.java @@ -1532,6 +1532,7 @@ public class ParsingPackageUtils { private static ParseResult<ParsingPackage> parseUsesSdk(ParseInput input, ParsingPackage pkg, Resources res, XmlResourceParser parser, int flags) throws IOException, XmlPullParserException { + String pkgName = (pkg != null) ? pkg.getPackageName() : "<unknown>"; if (SDK_VERSION > 0) { final boolean isApkInApex = (flags & PARSE_APK_IN_APEX) != 0; TypedArray sa = res.obtainAttributes(parser, R.styleable.AndroidManifestUsesSdk); @@ -1581,7 +1582,7 @@ public class ParsingPackageUtils { ParseResult<Integer> targetSdkVersionResult = FrameworkParsingPackageUtils .computeTargetSdkVersion(targetVers, targetCode, SDK_CODENAMES, input, - isApkInApex); + isApkInApex, pkgName); if (targetSdkVersionResult.isError()) { return input.error(targetSdkVersionResult); } @@ -1595,7 +1596,8 @@ public class ParsingPackageUtils { } ParseResult<Integer> minSdkVersionResult = FrameworkParsingPackageUtils - .computeMinSdkVersion(minVers, minCode, SDK_VERSION, SDK_CODENAMES, input); + .computeMinSdkVersion(minVers, minCode, SDK_VERSION, SDK_CODENAMES, + input, pkgName); if (minSdkVersionResult.isError()) { return input.error(minSdkVersionResult); } @@ -3055,7 +3057,7 @@ public class ParsingPackageUtils { * * TODO(b/155513789): Remove this in favor of collecting certificates during the original parse * call if requested. Leaving this as an optional method for the caller means we have to - * construct a dummy ParseInput. + * construct a placeholder ParseInput. */ @CheckResult public static ParseResult<SigningDetails> getSigningDetails(ParseInput input, diff --git a/services/core/java/com/android/server/policy/OWNERS b/services/core/java/com/android/server/policy/OWNERS index 8887e401211a..f20ea4b571b6 100644 --- a/services/core/java/com/android/server/policy/OWNERS +++ b/services/core/java/com/android/server/policy/OWNERS @@ -1,3 +1,6 @@ include /services/core/java/com/android/server/wm/OWNERS include /services/core/java/com/android/server/input/OWNERS -include /services/core/java/com/android/server/pm/permission/OWNERS +per-file *AppOp* = file:/services/core/java/com/android/server/pm/permission/OWNERS +per-file *Permission* = file:/services/core/java/com/android/server/pm/permission/OWNERS +per-file OWNERS = file:/services/core/java/com/android/server/pm/permission/OWNERS +per-file TEST_MAPPING = file:/services/core/java/com/android/server/pm/permission/OWNERS diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a88e2b06a4c3..473573afd2c5 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6101,10 +6101,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { pw.println(endcallBehaviorToString(mEndcallBehavior)); pw.print(prefix); // TODO(b/117479243): handle it in InputPolicy - pw.print("mDisplayHomeButtonHandlers="); + pw.println("mDisplayHomeButtonHandlers="); for (int i = 0; i < mDisplayHomeButtonHandlers.size(); i++) { final int key = mDisplayHomeButtonHandlers.keyAt(i); - pw.println(mDisplayHomeButtonHandlers.get(key)); + pw.print(prefix); pw.print(" "); pw.println(mDisplayHomeButtonHandlers.get(key)); } pw.print(prefix); pw.print("mKeyguardOccluded="); pw.print(isKeyguardOccluded()); pw.print(" mKeyguardOccludedChanged="); pw.print(mKeyguardOccludedChanged); @@ -6375,6 +6375,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { private class HdmiVideoExtconUEventObserver extends ExtconStateObserver<Boolean> { private static final String HDMI_EXIST = "HDMI=1"; + private static final String DP_EXIST = "DP=1"; private static final String NAME = "hdmi"; private boolean init(ExtconInfo hdmi) { @@ -6405,7 +6406,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { public Boolean parseState(ExtconInfo extconIfno, String state) { // extcon event state changes from kernel4.9 // new state will be like STATE=HDMI=1 - return state.contains(HDMI_EXIST); + // or like STATE=DP=1 for newer kernel + return state.contains(HDMI_EXIST) || state.contains(DP_EXIST); } } diff --git a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java index 33fc6fbf1de7..32a21c587f08 100644 --- a/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java +++ b/services/core/java/com/android/server/policy/SoftRestrictedPermissionPolicy.java @@ -215,7 +215,7 @@ public abstract class SoftRestrictedPermissionPolicy { return true; } - // The package is now a part of the forced scoped storage whitelist + // The package is now a part of the forced scoped storage allowlist if (isForcedScopedStorage) { return true; } diff --git a/services/core/java/com/android/server/policy/role/OWNERS b/services/core/java/com/android/server/policy/role/OWNERS new file mode 100644 index 000000000000..a462da8f01a7 --- /dev/null +++ b/services/core/java/com/android/server/policy/role/OWNERS @@ -0,0 +1 @@ +include /services/core/java/com/android/server/pm/permission/OWNERS diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java index 43f96e7dcead..99064bc1884d 100644 --- a/services/core/java/com/android/server/power/ThermalManagerService.java +++ b/services/core/java/com/android/server/power/ThermalManagerService.java @@ -589,6 +589,8 @@ public class ThermalManagerService extends SystemService { @Override public int onCommand(String cmd) { switch(cmd != null ? cmd : "") { + case "inject-temperature": + return runInjectTemperature(); case "override-status": return runOverrideStatus(); case "reset": @@ -611,6 +613,95 @@ public class ThermalManagerService extends SystemService { } } + + private int runInjectTemperature() { + final long token = Binder.clearCallingIdentity(); + try { + final PrintWriter pw = getOutPrintWriter(); + int type; + String typeName = getNextArgRequired(); + switch (typeName.toUpperCase()) { + case "UNKNOWN": + type = Temperature.TYPE_UNKNOWN; + break; + case "CPU": + type = Temperature.TYPE_CPU; + break; + case "GPU": + type = Temperature.TYPE_GPU; + break; + case "BATTERY": + type = Temperature.TYPE_BATTERY; + break; + case "SKIN": + type = Temperature.TYPE_SKIN; + break; + case "USB_PORT": + type = Temperature.TYPE_USB_PORT; + break; + case "POWER_AMPLIFIER": + type = Temperature.TYPE_POWER_AMPLIFIER; + break; + case "BCL_VOLTAGE": + type = Temperature.TYPE_BCL_VOLTAGE; + break; + case "BCL_CURRENT": + type = Temperature.TYPE_BCL_CURRENT; + break; + case "BCL_PERCENTAGE": + type = Temperature.TYPE_BCL_PERCENTAGE; + break; + case "NPU": + type = Temperature.TYPE_NPU; + break; + default: + pw.println("Invalid temperature type: " + typeName); + return -1; + } + int throttle; + String throttleName = getNextArgRequired(); + switch (throttleName.toUpperCase()) { + case "NONE": + throttle = Temperature.THROTTLING_NONE; + break; + case "LIGHT": + throttle = Temperature.THROTTLING_LIGHT; + break; + case "MODERATE": + throttle = Temperature.THROTTLING_MODERATE; + break; + case "SEVERE": + throttle = Temperature.THROTTLING_SEVERE; + break; + case "CRITICAL": + throttle = Temperature.THROTTLING_CRITICAL; + break; + case "EMERGENCY": + throttle = Temperature.THROTTLING_EMERGENCY; + break; + case "SHUTDOWN": + throttle = Temperature.THROTTLING_SHUTDOWN; + break; + default: + pw.println("Invalid throttle status: " + throttleName); + return -1; + } + String name = getNextArgRequired(); + float value = 28.0f; + try { + String valueStr = getNextArg(); + if (valueStr != null) value = Float.parseFloat(valueStr); + } catch (RuntimeException ex) { + pw.println("Error: " + ex.toString()); + return -1; + } + onTemperatureChanged(new Temperature(value, type, name, throttle), true); + return 0; + } finally { + Binder.restoreCallingIdentity(token); + } + } + private int runOverrideStatus() { final long token = Binder.clearCallingIdentity(); try { @@ -643,6 +734,9 @@ public class ThermalManagerService extends SystemService { pw.println(" help"); pw.println(" Print this help text."); pw.println(""); + pw.println(" inject-temperature TYPE STATUS NAME [VALUE]"); + pw.println(" injects a new temperature sample for the specified device."); + pw.println(" type and status strings follow the names in android.os.Temperature."); pw.println(" override-status STATUS"); pw.println(" sets and locks the thermal status of the device to STATUS."); pw.println(" status code is defined in android.os.Temperature."); diff --git a/services/core/java/com/android/server/power/batterysaver/OWNERS b/services/core/java/com/android/server/power/batterysaver/OWNERS index 09136dcc2feb..cf23bea97289 100644 --- a/services/core/java/com/android/server/power/batterysaver/OWNERS +++ b/services/core/java/com/android/server/power/batterysaver/OWNERS @@ -1 +1,3 @@ +kwekua@google.com omakoto@google.com +yamasani@google.com
\ No newline at end of file diff --git a/services/core/java/com/android/server/power/hint/OWNERS b/services/core/java/com/android/server/power/hint/OWNERS new file mode 100644 index 000000000000..c28c07a234b3 --- /dev/null +++ b/services/core/java/com/android/server/power/hint/OWNERS @@ -0,0 +1,2 @@ +include /ADPF_OWNERS + diff --git a/services/core/java/com/android/server/recoverysystem/OWNERS b/services/core/java/com/android/server/recoverysystem/OWNERS index e3e7fdfd8f20..e09805310bbb 100644 --- a/services/core/java/com/android/server/recoverysystem/OWNERS +++ b/services/core/java/com/android/server/recoverysystem/OWNERS @@ -1,3 +1,2 @@ +aveena@google.com ejyzhang@google.com -rvrolyk@google.com -xunchang@google.com diff --git a/services/core/java/com/android/server/recoverysystem/hal/BootControlHIDL.java b/services/core/java/com/android/server/recoverysystem/hal/BootControlHIDL.java index 65325c297719..7c4d7875b76f 100644 --- a/services/core/java/com/android/server/recoverysystem/hal/BootControlHIDL.java +++ b/services/core/java/com/android/server/recoverysystem/hal/BootControlHIDL.java @@ -22,6 +22,8 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; +import java.util.NoSuchElementException; + public class BootControlHIDL implements IBootControl { private static final String TAG = "BootControlHIDL"; @@ -32,7 +34,7 @@ public class BootControlHIDL implements IBootControl { public static boolean isServicePresent() { try { android.hardware.boot.V1_0.IBootControl.getService(true); - } catch (RemoteException e) { + } catch (RemoteException | NoSuchElementException e) { return false; } return true; @@ -41,7 +43,7 @@ public class BootControlHIDL implements IBootControl { public static boolean isV1_2ServicePresent() { try { android.hardware.boot.V1_2.IBootControl.getService(true); - } catch (RemoteException e) { + } catch (RemoteException | NoSuchElementException e) { return false; } return true; diff --git a/services/core/java/com/android/server/security/FileIntegrityService.java b/services/core/java/com/android/server/security/FileIntegrityService.java index 5ae697315ed1..95296210be80 100644 --- a/services/core/java/com/android/server/security/FileIntegrityService.java +++ b/services/core/java/com/android/server/security/FileIntegrityService.java @@ -184,13 +184,7 @@ public class FileIntegrityService extends SystemService { } private void loadAllCertificates() { - // A better alternative to load certificates would be to read from .fs-verity kernel - // keyring, which fsverity_init loads to during earlier boot time from the same sources - // below. But since the read operation from keyring is not provided in kernel, we need to - // duplicate the same loading logic here. - // Load certificates trusted by the device manufacturer. - // NB: Directories need to be synced with system/security/fsverity_init/fsverity_init.cpp. final String relativeDir = "etc/security/fsverity"; loadCertificatesFromDirectory(Environment.getRootDirectory().toPath() .resolve(relativeDir)); diff --git a/services/core/java/com/android/server/security/KeyChainSystemService.java b/services/core/java/com/android/server/security/KeyChainSystemService.java index da1ff7325545..caa5340d477b 100644 --- a/services/core/java/com/android/server/security/KeyChainSystemService.java +++ b/services/core/java/com/android/server/security/KeyChainSystemService.java @@ -54,7 +54,7 @@ public class KeyChainSystemService extends SystemService { /** * Maximum time limit for the KeyChain app to deal with packages being removed. */ - private static final int KEYCHAIN_IDLE_WHITELIST_DURATION_MS = 30 * 1000; + private static final int KEYCHAIN_IDLE_ALLOWLIST_DURATION_MS = 30 * 1000; public KeyChainSystemService(final Context context) { super(context); @@ -105,7 +105,7 @@ public class KeyChainSystemService extends SystemService { final DeviceIdleInternal idleController = LocalServices.getService(DeviceIdleInternal.class); idleController.addPowerSaveTempWhitelistApp(Process.myUid(), packageName, - KEYCHAIN_IDLE_WHITELIST_DURATION_MS, user.getIdentifier(), false, + KEYCHAIN_IDLE_ALLOWLIST_DURATION_MS, user.getIdentifier(), false, REASON_KEY_CHAIN, "keychain"); getContext().startServiceAsUser(intent, user); diff --git a/services/core/java/com/android/server/security/OWNERS b/services/core/java/com/android/server/security/OWNERS index 5bcc98b600fc..fa4bf228c683 100644 --- a/services/core/java/com/android/server/security/OWNERS +++ b/services/core/java/com/android/server/security/OWNERS @@ -1,4 +1,7 @@ # Bug component: 36824 +include /core/java/android/security/OWNERS + per-file *AttestationVerification* = file:/core/java/android/security/attestationverification/OWNERS per-file FileIntegrity*.java = victorhsieh@google.com +per-file KeyChainSystemService.java = file:platform/packages/apps/KeyChain:/OWNERS diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java index 2bd7383ddde0..1c5838c165a4 100644 --- a/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java +++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java @@ -105,14 +105,27 @@ public class RemoteProvisioningService extends SystemService { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(getContext(), TAG, pw)) return; - new RemoteProvisioningShellCommand().dump(pw); + final int callerUid = Binder.getCallingUidOrThrow(); + final long callingIdentity = Binder.clearCallingIdentity(); + try { + new RemoteProvisioningShellCommand(getContext(), callerUid).dump(pw); + } finally { + Binder.restoreCallingIdentity(callingIdentity); + } } @Override public int handleShellCommand(ParcelFileDescriptor in, ParcelFileDescriptor out, ParcelFileDescriptor err, String[] args) { - return new RemoteProvisioningShellCommand().exec(this, in.getFileDescriptor(), - out.getFileDescriptor(), err.getFileDescriptor(), args); + final int callerUid = Binder.getCallingUidOrThrow(); + final long callingIdentity = Binder.clearCallingIdentity(); + try { + return new RemoteProvisioningShellCommand(getContext(), callerUid).exec(this, + in.getFileDescriptor(), out.getFileDescriptor(), err.getFileDescriptor(), + args); + } finally { + Binder.restoreCallingIdentity(callingIdentity); + } } } } diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningShellCommand.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningShellCommand.java index 71eca691dba7..4a6d74658754 100644 --- a/services/core/java/com/android/server/security/rkp/RemoteProvisioningShellCommand.java +++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningShellCommand.java @@ -16,22 +16,30 @@ package com.android.server.security.rkp; +import android.content.Context; import android.hardware.security.keymint.DeviceInfo; import android.hardware.security.keymint.IRemotelyProvisionedComponent; import android.hardware.security.keymint.MacedPublicKey; import android.hardware.security.keymint.ProtectedData; import android.hardware.security.keymint.RpcHardwareInfo; +import android.os.CancellationSignal; +import android.os.OutcomeReceiver; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ShellCommand; +import android.security.rkp.service.RegistrationProxy; +import android.security.rkp.service.RemotelyProvisionedKey; import android.util.IndentingPrintWriter; -import com.android.internal.annotations.VisibleForTesting; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.PrintWriter; +import java.security.cert.Certificate; +import java.security.cert.CertificateFactory; +import java.time.Duration; import java.util.Base64; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; import co.nstant.in.cbor.CborDecoder; import co.nstant.in.cbor.CborEncoder; @@ -49,21 +57,22 @@ class RemoteProvisioningShellCommand extends ShellCommand { + " Show this message.\n" + "dump\n" + " Dump service diagnostics.\n" - + "list [--min-version MIN_VERSION]\n" + + "list\n" + " List the names of the IRemotelyProvisionedComponent instances.\n" + "csr [--challenge CHALLENGE] NAME\n" + " Generate and print a base64-encoded CSR from the named\n" + " IRemotelyProvisionedComponent. A base64-encoded challenge can be provided,\n" - + " or else it defaults to an empty challenge.\n"; + + " or else it defaults to an empty challenge.\n" + + "certify NAME\n" + + " Output the PEM-encoded certificate chain provisioned for the named\n" + + " IRemotelyProvisionedComponent.\n"; - @VisibleForTesting static final String EEK_ED25519_BASE64 = "goRDoQEnoFgqpAEBAycgBiFYIJm57t1e5FL2hcZMYtw+YatXSH11N" + "ymtdoAy0rPLY1jZWEAeIghLpLekyNdOAw7+uK8UTKc7b6XN3Np5xitk/pk5r3bngPpmAIUNB5gqrJFcpyUUS" + "QY0dcqKJ3rZ41pJ6wIDhEOhASegWE6lAQECWCDQrsEVyirPc65rzMvRlh1l6LHd10oaN7lDOpfVmd+YCAM4G" + "CAEIVggvoXnRsSjQlpA2TY6phXQLFh+PdwzAjLS/F4ehyVfcmBYQJvPkOIuS6vRGLEOjl0gJ0uEWP78MpB+c" + "gWDvNeCvvpkeC1UEEvAMb9r6B414vAtzmwvT/L1T6XUg62WovGHWAQ="; - @VisibleForTesting static final String EEK_P256_BASE64 = "goRDoQEmoFhNpQECAyYgASFYIPcUituX9MxT79JkEcTjdR9mH6RxDGzP" + "+glGgHSHVPKtIlggXn9b9uzk9hnM/xM3/Q+hyJPbGAZ2xF3m12p3hsMtr49YQC+XjkL7vgctlUeFR5NAsB/U" + "m0ekxESp8qEHhxDHn8sR9L+f6Dvg5zRMFfx7w34zBfTRNDztAgRgehXgedOK/ySEQ6EBJqBYcaYBAgJYIDVz" @@ -74,14 +83,20 @@ class RemoteProvisioningShellCommand extends ShellCommand { private static final int ERROR = -1; private static final int SUCCESS = 0; + private static final Duration BIND_TIMEOUT = Duration.ofSeconds(10); + private static final int KEY_ID = 452436; + + private final Context mContext; + private final int mCallerUid; private final Injector mInjector; - RemoteProvisioningShellCommand() { - this(new Injector()); + RemoteProvisioningShellCommand(Context context, int callerUid) { + this(context, callerUid, new Injector()); } - @VisibleForTesting - RemoteProvisioningShellCommand(Injector injector) { + RemoteProvisioningShellCommand(Context context, int callerUid, Injector injector) { + mContext = context; + mCallerUid = callerUid; mInjector = injector; } @@ -102,6 +117,8 @@ class RemoteProvisioningShellCommand extends ShellCommand { return list(); case "csr": return csr(); + case "certify": + return certify(); default: return handleDefaultCommands(cmd); } @@ -134,7 +151,9 @@ class RemoteProvisioningShellCommand extends ShellCommand { pw.println("supportedEekCurve=" + info.supportedEekCurve); } pw.println("uniqueId=" + info.uniqueId); - pw.println("supportedNumKeysInCsr=" + info.supportedNumKeysInCsr); + if (info.versionNumber >= 3) { + pw.println("supportedNumKeysInCsr=" + info.supportedNumKeysInCsr); + } } private int list() throws RemoteException { @@ -153,7 +172,7 @@ class RemoteProvisioningShellCommand extends ShellCommand { challenge = Base64.getDecoder().decode(getNextArgRequired()); break; default: - getErrPrintWriter().println("error: unknown option"); + getErrPrintWriter().println("error: unknown option " + opt); return ERROR; } } @@ -230,7 +249,45 @@ class RemoteProvisioningShellCommand extends ShellCommand { return new CborDecoder(bais).decodeNext(); } - @VisibleForTesting + private int certify() throws Exception { + String name = getNextArgRequired(); + + Executor executor = mContext.getMainExecutor(); + CancellationSignal cancellationSignal = new CancellationSignal(); + OutcomeFuture<RemotelyProvisionedKey> key = new OutcomeFuture<>(); + mInjector.getRegistrationProxy(mContext, mCallerUid, name, executor) + .getKeyAsync(KEY_ID, cancellationSignal, executor, key); + byte[] encodedCertChain = key.join().getEncodedCertChain(); + ByteArrayInputStream is = new ByteArrayInputStream(encodedCertChain); + PrintWriter pw = getOutPrintWriter(); + for (Certificate cert : CertificateFactory.getInstance("X.509").generateCertificates(is)) { + String encoded = Base64.getEncoder().encodeToString(cert.getEncoded()); + pw.println("-----BEGIN CERTIFICATE-----"); + pw.println(encoded.replaceAll("(.{64})", "$1\n").stripTrailing()); + pw.println("-----END CERTIFICATE-----"); + } + return SUCCESS; + } + + /** Treat an OutcomeReceiver as a future for use in synchronous code. */ + private static class OutcomeFuture<T> implements OutcomeReceiver<T, Exception> { + private CompletableFuture<T> mFuture = new CompletableFuture<>(); + + @Override + public void onResult(T result) { + mFuture.complete(result); + } + + @Override + public void onError(Exception e) { + mFuture.completeExceptionally(e); + } + + public T join() { + return mFuture.join(); + } + } + static class Injector { String[] getIrpcNames() { return ServiceManager.getDeclaredInstances(IRemotelyProvisionedComponent.DESCRIPTOR); @@ -246,5 +303,14 @@ class RemoteProvisioningShellCommand extends ShellCommand { } return binder; } + + RegistrationProxy getRegistrationProxy( + Context context, int callerUid, String name, Executor executor) { + String irpc = IRemotelyProvisionedComponent.DESCRIPTOR + "/" + name; + OutcomeFuture<RegistrationProxy> registration = new OutcomeFuture<>(); + RegistrationProxy.createAsync( + context, callerUid, irpc, BIND_TIMEOUT, executor, registration); + return registration.join(); + } } } diff --git a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java index ecd5bd22cd03..76126df14bfd 100644 --- a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java +++ b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java @@ -1487,6 +1487,7 @@ public final class SensorPrivacyService extends SystemService { @Override public void binderDied() { mSensorPrivacyServiceImpl.removeSensorPrivacyListener(mListener); + mSensorPrivacyServiceImpl.removeToggleSensorPrivacyListener(mListener); } public void destroy() { diff --git a/services/core/java/com/android/server/trust/TrustAgentWrapper.java b/services/core/java/com/android/server/trust/TrustAgentWrapper.java index 415d05e96799..3abebf8c381c 100644 --- a/services/core/java/com/android/server/trust/TrustAgentWrapper.java +++ b/services/core/java/com/android/server/trust/TrustAgentWrapper.java @@ -49,6 +49,7 @@ import android.util.Pair; import android.util.Slog; import com.android.internal.infra.AndroidFuture; +import com.android.server.utils.Slogf; import java.util.Collections; import java.util.List; @@ -120,9 +121,6 @@ public class TrustAgentWrapper { private final BroadcastReceiver mTrustableDowngradeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (!TrustManagerService.ENABLE_ACTIVE_UNLOCK_FLAG) { - return; - } // are these the broadcasts we want to listen to if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) { downgradeToTrustable(); @@ -327,8 +325,8 @@ public class TrustAgentWrapper { int flags, AndroidFuture resultCallback) { if (DEBUG) { - Slog.d(TAG, "enableTrust(" + message + ", durationMs = " + durationMs - + ", flags = " + flags + ")"); + Slogf.d(TAG, "grantTrust(message=\"%s\", durationMs=%d, flags=0x%x)", + message, durationMs, flags); } Message msg = mHandler.obtainMessage( @@ -345,30 +343,32 @@ public class TrustAgentWrapper { @Override public void lockUser() { + if (DEBUG) Slog.d(TAG, "lockUser()"); mHandler.sendEmptyMessage(MSG_LOCK_USER); } @Override public void setManagingTrust(boolean managingTrust) { - if (DEBUG) Slog.d(TAG, "managingTrust()"); + if (DEBUG) Slogf.d(TAG, "setManagingTrust(%s)", managingTrust); mHandler.obtainMessage(MSG_MANAGING_TRUST, managingTrust ? 1 : 0, 0).sendToTarget(); } @Override public void onConfigureCompleted(boolean result, IBinder token) { - if (DEBUG) Slog.d(TAG, "onSetTrustAgentFeaturesEnabledCompleted(result=" + result); + if (DEBUG) Slogf.d(TAG, "onConfigureCompleted(result=%s)", result); mHandler.obtainMessage(MSG_SET_TRUST_AGENT_FEATURES_COMPLETED, result ? 1 : 0, 0, token).sendToTarget(); } @Override public void addEscrowToken(byte[] token, int userId) { + // 'token' is secret; never log it. + if (DEBUG) Slogf.d(TAG, "addEscrowToken(userId=%d)", userId); + if (mContext.getResources() .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) { - throw new SecurityException("Escrow token API is not allowed."); + throw new SecurityException("Escrow token API is not allowed."); } - - if (DEBUG) Slog.d(TAG, "adding escrow token for user " + userId); Message msg = mHandler.obtainMessage(MSG_ADD_ESCROW_TOKEN); msg.getData().putByteArray(DATA_ESCROW_TOKEN, token); msg.getData().putInt(DATA_USER_ID, userId); @@ -377,12 +377,12 @@ public class TrustAgentWrapper { @Override public void isEscrowTokenActive(long handle, int userId) { + if (DEBUG) Slogf.d(TAG, "isEscrowTokenActive(handle=%016x, userId=%d)", handle, userId); + if (mContext.getResources() .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) { throw new SecurityException("Escrow token API is not allowed."); } - - if (DEBUG) Slog.d(TAG, "checking the state of escrow token on user " + userId); Message msg = mHandler.obtainMessage(MSG_ESCROW_TOKEN_STATE); msg.getData().putLong(DATA_HANDLE, handle); msg.getData().putInt(DATA_USER_ID, userId); @@ -391,12 +391,12 @@ public class TrustAgentWrapper { @Override public void removeEscrowToken(long handle, int userId) { + if (DEBUG) Slogf.d(TAG, "removeEscrowToken(handle=%016x, userId=%d)", handle, userId); + if (mContext.getResources() .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) { throw new SecurityException("Escrow token API is not allowed."); } - - if (DEBUG) Slog.d(TAG, "removing escrow token on user " + userId); Message msg = mHandler.obtainMessage(MSG_REMOVE_ESCROW_TOKEN); msg.getData().putLong(DATA_HANDLE, handle); msg.getData().putInt(DATA_USER_ID, userId); @@ -405,12 +405,13 @@ public class TrustAgentWrapper { @Override public void unlockUserWithToken(long handle, byte[] token, int userId) { + // 'token' is secret; never log it. + if (DEBUG) Slogf.d(TAG, "unlockUserWithToken(handle=%016x, userId=%d)", handle, userId); + if (mContext.getResources() .getBoolean(com.android.internal.R.bool.config_allowEscrowTokenForTrustAgent)) { throw new SecurityException("Escrow token API is not allowed."); } - - if (DEBUG) Slog.d(TAG, "unlocking user " + userId); Message msg = mHandler.obtainMessage(MSG_UNLOCK_USER); msg.getData().putInt(DATA_USER_ID, userId); msg.getData().putLong(DATA_HANDLE, handle); @@ -420,7 +421,7 @@ public class TrustAgentWrapper { @Override public void showKeyguardErrorMessage(CharSequence message) { - if (DEBUG) Slog.d(TAG, "Showing keyguard error message: " + message); + if (DEBUG) Slogf.d(TAG, "showKeyguardErrorMessage(\"%s\")", message); Message msg = mHandler.obtainMessage(MSG_SHOW_KEYGUARD_ERROR_MESSAGE); msg.getData().putCharSequence(DATA_MESSAGE, message); msg.sendToTarget(); diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index bab4886a6c6a..36529d824f41 100644 --- a/services/core/java/com/android/server/trust/TrustManagerService.java +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -58,7 +58,6 @@ import android.os.Message; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.SystemClock; -import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -162,18 +161,27 @@ public class TrustManagerService extends SystemService { private final ActivityManager mActivityManager; private VirtualDeviceManagerInternal mVirtualDeviceManager; - @GuardedBy("mUserIsTrusted") - private final SparseBooleanArray mUserIsTrusted = new SparseBooleanArray(); - - //TODO(b/215724686): remove flag - public static final boolean ENABLE_ACTIVE_UNLOCK_FLAG = SystemProperties.getBoolean( - "fw.enable_active_unlock_flag", true); - private enum TrustState { - UNTRUSTED, // the phone is not unlocked by any trustagents - TRUSTABLE, // the phone is in a semi-locked state that can be unlocked if - // FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE is passed and a trustagent is trusted - TRUSTED // the phone is unlocked + // UNTRUSTED means that TrustManagerService is currently *not* giving permission for the + // user's Keyguard to be dismissed, and grants of trust by trust agents are remembered in + // the corresponding TrustAgentWrapper but are not recognized until the device is unlocked + // for the user. I.e., if the device is locked and the state is UNTRUSTED, it cannot be + // unlocked by a trust agent. Automotive devices are an exception; grants of trust are + // always recognized on them. + UNTRUSTED, + + // TRUSTABLE is the same as UNTRUSTED except that new grants of trust using + // FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE are recognized for moving to TRUSTED. I.e., if + // the device is locked and the state is TRUSTABLE, it can be unlocked by a trust agent, + // provided that the trust agent chooses to use Active Unlock. The TRUSTABLE state is only + // possible as a result of a downgrade from TRUSTED, after a trust agent used + // FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE in its most recent grant. + TRUSTABLE, + + // TRUSTED means that TrustManagerService is currently giving permission for the user's + // Keyguard to be dismissed. This implies that the device is unlocked for the user (where + // the case of Keyguard showing but dismissible just with swipe counts as "unlocked"). + TRUSTED }; @GuardedBy("mUserTrustState") @@ -569,69 +577,6 @@ public class TrustManagerService extends SystemService { int flags, boolean isFromUnlock, @Nullable AndroidFuture<GrantTrustResult> resultCallback) { - if (ENABLE_ACTIVE_UNLOCK_FLAG) { - updateTrustWithRenewableUnlock(userId, flags, isFromUnlock, resultCallback); - } else { - updateTrustWithNonrenewableTrust(userId, flags, isFromUnlock); - } - } - - private void updateTrustWithNonrenewableTrust(int userId, int flags, boolean isFromUnlock) { - boolean managed = aggregateIsTrustManaged(userId); - dispatchOnTrustManagedChanged(managed, userId); - if (mStrongAuthTracker.isTrustAllowedForUser(userId) - && isTrustUsuallyManagedInternal(userId) != managed) { - updateTrustUsuallyManaged(userId, managed); - } - - boolean trusted = aggregateIsTrusted(userId); - IWindowManager wm = WindowManagerGlobal.getWindowManagerService(); - boolean showingKeyguard = true; - try { - showingKeyguard = wm.isKeyguardLocked(); - } catch (RemoteException e) { - } - - boolean changed; - synchronized (mUserIsTrusted) { - if (mSettingsObserver.getTrustAgentsNonrenewableTrust()) { - // For non-renewable trust agents can only set the device to trusted if it already - // trusted or the device is unlocked. Attempting to set the device as trusted - // when the device is locked will be ignored. - changed = mUserIsTrusted.get(userId) != trusted; - trusted = trusted - && (!showingKeyguard || isFromUnlock || !changed) - && userId == mCurrentUser; - if (DEBUG) { - Slog.d(TAG, "Extend unlock setting trusted as " + Boolean.toString(trusted) - + " && " + Boolean.toString(!showingKeyguard) - + " && " + Boolean.toString(userId == mCurrentUser)); - } - } - changed = mUserIsTrusted.get(userId) != trusted; - mUserIsTrusted.put(userId, trusted); - } - dispatchOnTrustChanged( - trusted, - false /* newlyUnlocked */, - userId, - flags, - getTrustGrantedMessages(userId)); - if (changed) { - refreshDeviceLockedForUser(userId); - if (!trusted) { - maybeLockScreen(userId); - } else { - scheduleTrustTimeout(false /* override */, false /* isTrustableTimeout*/); - } - } - } - - private void updateTrustWithRenewableUnlock( - int userId, - int flags, - boolean isFromUnlock, - @Nullable AndroidFuture<GrantTrustResult> resultCallback) { boolean managed = aggregateIsTrustManaged(userId); dispatchOnTrustManagedChanged(managed, userId); if (mStrongAuthTracker.isTrustAllowedForUser(userId) @@ -917,6 +862,12 @@ public class TrustManagerService extends SystemService { } } + private TrustState getUserTrustStateInner(int userId) { + synchronized (mUserTrustState) { + return mUserTrustState.get(userId, TrustState.UNTRUSTED); + } + } + boolean isDeviceLockedInner(int userId) { synchronized (mDeviceLockedForUser) { return mDeviceLockedForUser.get(userId, true); @@ -979,7 +930,12 @@ public class TrustManagerService extends SystemService { continue; } - boolean trusted = aggregateIsTrusted(id); + final boolean trusted; + if (android.security.Flags.fixUnlockedDeviceRequiredKeys()) { + trusted = getUserTrustStateInner(id) == TrustState.TRUSTED; + } else { + trusted = aggregateIsTrusted(id); + } boolean showingKeyguard = true; boolean biometricAuthenticated = false; boolean currentUserIsUnlocked = false; @@ -1800,7 +1756,7 @@ public class TrustManagerService extends SystemService { if (isCurrent) { fout.print(" (current)"); } - fout.print(": trusted=" + dumpBool(aggregateIsTrusted(user.id))); + fout.print(": trustState=" + getUserTrustStateInner(user.id)); fout.print(", trustManaged=" + dumpBool(aggregateIsTrustManaged(user.id))); fout.print(", deviceLocked=" + dumpBool(isDeviceLockedInner(user.id))); fout.print(", isActiveUnlockRunning=" + dumpBool( @@ -2109,9 +2065,6 @@ public class TrustManagerService extends SystemService { } else if (Intent.ACTION_USER_REMOVED.equals(action)) { int userId = getUserId(intent); if (userId > 0) { - synchronized (mUserIsTrusted) { - mUserIsTrusted.delete(userId); - } synchronized (mDeviceLockedForUser) { mDeviceLockedForUser.delete(userId); } @@ -2265,16 +2218,11 @@ public class TrustManagerService extends SystemService { @Override public void handleAlarm() { - TrustableTimeoutAlarmListener otherAlarm; - boolean otherAlarmPresent; - if (ENABLE_ACTIVE_UNLOCK_FLAG) { - otherAlarm = mTrustableTimeoutAlarmListenerForUser.get(mUserId); - otherAlarmPresent = (otherAlarm != null) && otherAlarm.isQueued(); - if (otherAlarmPresent) { - synchronized (mAlarmLock) { - disableNonrenewableTrustWhileRenewableTrustIsPresent(); - } - return; + TrustableTimeoutAlarmListener otherAlarm = + mTrustableTimeoutAlarmListenerForUser.get(mUserId); + if (otherAlarm != null && otherAlarm.isQueued()) { + synchronized (mAlarmLock) { + disableNonrenewableTrustWhileRenewableTrustIsPresent(); } } } @@ -2299,17 +2247,11 @@ public class TrustManagerService extends SystemService { @Override public void handleAlarm() { - TrustedTimeoutAlarmListener otherAlarm; - boolean otherAlarmPresent; - if (ENABLE_ACTIVE_UNLOCK_FLAG) { - cancelBothTrustableAlarms(mUserId); - otherAlarm = mTrustTimeoutAlarmListenerForUser.get(mUserId); - otherAlarmPresent = (otherAlarm != null) && otherAlarm.isQueued(); - if (otherAlarmPresent) { - synchronized (mAlarmLock) { - disableRenewableTrustWhileNonrenewableTrustIsPresent(); - } - return; + cancelBothTrustableAlarms(mUserId); + TrustedTimeoutAlarmListener otherAlarm = mTrustTimeoutAlarmListenerForUser.get(mUserId); + if (otherAlarm != null && otherAlarm.isQueued()) { + synchronized (mAlarmLock) { + disableRenewableTrustWhileNonrenewableTrustIsPresent(); } } } diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java index 301e612e4699..8e375275d080 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java @@ -82,6 +82,11 @@ public final class ClientProfile { private Set<Integer> mUsingDemuxHandles = new HashSet<>(); /** + * Client id sharee that has shared frontend with the current client. + */ + private Integer mShareeFeClientId = INVALID_RESOURCE_ID; + + /** * List of the Lnb handles that are used by the current client. */ private Set<Integer> mUsingLnbHandles = new HashSet<>(); @@ -225,12 +230,21 @@ public final class ClientProfile { return mShareFeClientIds; } + public Integer getShareeFeClientId() { + return mShareeFeClientId; + } + + public void setShareeFeClientId(Integer shareeFeClientId) { + mShareeFeClientId = shareeFeClientId; + } + /** * Called when the client released a frontend. */ public void releaseFrontend() { mUsingFrontendHandles.clear(); mShareFeClientIds.clear(); + mShareeFeClientId = INVALID_RESOURCE_ID; mPrimaryUsingFrontendHandle = TunerResourceManager.INVALID_RESOURCE_HANDLE; } diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java index 8f416082374e..c526016544a6 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -1087,9 +1087,15 @@ public class TunerResourceManagerService extends SystemService implements IBinde if (DEBUG) { Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId); } + Integer shareeFeClientId = getClientProfile(selfClientId).getShareeFeClientId(); + if (shareeFeClientId != ClientProfile.INVALID_RESOURCE_ID) { + getClientProfile(shareeFeClientId).stopSharingFrontend(selfClientId); + getClientProfile(selfClientId).releaseFrontend(); + } for (int feId : getClientProfile(targetClientId).getInUseFrontendHandles()) { getClientProfile(selfClientId).useFrontend(feId); } + getClientProfile(selfClientId).setShareeFeClientId(targetClientId); getClientProfile(targetClientId).shareFrontend(selfClientId); } @@ -1099,6 +1105,8 @@ public class TunerResourceManagerService extends SystemService implements IBinde // change the owner of all the inUse frontend newOwnerProfile.shareFrontend(currentOwnerId); currentOwnerProfile.stopSharingFrontend(newOwnerId); + newOwnerProfile.setShareeFeClientId(ClientProfile.INVALID_RESOURCE_ID); + currentOwnerProfile.setShareeFeClientId(newOwnerId); for (int inUseHandle : newOwnerProfile.getInUseFrontendHandles()) { getFrontendResource(inUseHandle).setOwner(newOwnerId); } diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java index a1ef537ff268..d480ddb092eb 100644 --- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java +++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java @@ -1889,7 +1889,7 @@ public class VcnGatewayConnection extends StateMachine { mIpSecManager.applyTunnelModeTransform( tunnelIface, IpSecManager.DIRECTION_FWD, transform); } - } catch (IOException e) { + } catch (IOException | IllegalArgumentException e) { logInfo("Transform application failed for network " + token, e); sessionLost(token, e); } diff --git a/services/core/java/com/android/server/vibrator/SetAmplitudeVibratorStep.java b/services/core/java/com/android/server/vibrator/SetAmplitudeVibratorStep.java index cce1ef4db381..6d01123f6ead 100644 --- a/services/core/java/com/android/server/vibrator/SetAmplitudeVibratorStep.java +++ b/services/core/java/com/android/server/vibrator/SetAmplitudeVibratorStep.java @@ -179,7 +179,9 @@ final class SetAmplitudeVibratorStep extends AbstractVibratorStep { while (i < segmentCount) { VibrationEffectSegment segment = segments.get(i); if (!(segment instanceof StepSegment) - || ((StepSegment) segment).getAmplitude() == 0) { + // play() will ignore segments with zero duration, so it's important that + // zero-duration segments don't affect this method. + || (segment.getDuration() > 0 && ((StepSegment) segment).getAmplitude() == 0)) { break; } timing += segment.getDuration(); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index cd3d603d831a..7a940ffc2913 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -45,6 +45,7 @@ import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.ApplicationExitInfo; import android.app.ILocalWallpaperColorConsumer; import android.app.IWallpaperManager; import android.app.IWallpaperManagerCallback; @@ -187,6 +188,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub /** Tracks wallpaper being migrated from system+lock to lock when setting static wp. */ WallpaperDestinationChangeHandler mPendingMigrationViaStatic; + private static final double LMK_LOW_THRESHOLD_MEMORY_PERCENTAGE = 10; + private static final int LMK_RECONNECT_REBIND_RETRIES = 3; + private static final long LMK_RECONNECT_DELAY_MS = 5000; + /** * Minimum time between crashes of a wallpaper service for us to consider * restarting it vs. just reverting to the static wallpaper. @@ -988,6 +993,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub /** Time in milliseconds until we expect the wallpaper to reconnect (unless we're in the * middle of an update). If exceeded, the wallpaper gets reset to the system default. */ private static final long WALLPAPER_RECONNECT_TIMEOUT_MS = 10000; + private int mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES; final WallpaperInfo mInfo; IWallpaperService mService; @@ -1209,20 +1215,51 @@ public class WallpaperManagerService extends IWallpaperManager.Stub && mWallpaper.userId == mCurrentUserId && !Objects.equals(mDefaultWallpaperComponent, wpService) && !Objects.equals(mImageWallpaper, wpService)) { - // There is a race condition which causes - // {@link #mWallpaper.wallpaperUpdating} to be false even if it is - // currently updating since the broadcast notifying us is async. - // This race is overcome by the general rule that we only reset the - // wallpaper if its service was shut down twice - // during {@link #MIN_WALLPAPER_CRASH_TIME} millis. - if (mWallpaper.lastDiedTime != 0 - && mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME - > SystemClock.uptimeMillis()) { - Slog.w(TAG, "Reverting to built-in wallpaper!"); - clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null); + List<ApplicationExitInfo> reasonList = + mActivityManager.getHistoricalProcessExitReasons( + wpService.getPackageName(), 0, 1); + int exitReason = ApplicationExitInfo.REASON_UNKNOWN; + if (reasonList != null && !reasonList.isEmpty()) { + ApplicationExitInfo info = reasonList.get(0); + exitReason = info.getReason(); + } + Slog.d(TAG, "exitReason: " + exitReason); + // If exit reason is LOW_MEMORY_KILLER + // delay the mTryToRebindRunnable for 10s + if (exitReason == ApplicationExitInfo.REASON_LOW_MEMORY) { + if (isRunningOnLowMemory()) { + Slog.i(TAG, "Rebind is delayed due to lmk"); + mContext.getMainThreadHandler().postDelayed(mTryToRebindRunnable, + LMK_RECONNECT_DELAY_MS); + mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES; + } else { + if (mLmkLimitRebindRetries <= 0) { + Slog.w(TAG, "Reverting to built-in wallpaper due to lmk!"); + clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, + null); + mLmkLimitRebindRetries = LMK_RECONNECT_REBIND_RETRIES; + return; + } + mLmkLimitRebindRetries--; + mContext.getMainThreadHandler().postDelayed(mTryToRebindRunnable, + LMK_RECONNECT_DELAY_MS); + } } else { - mWallpaper.lastDiedTime = SystemClock.uptimeMillis(); - tryToRebind(); + // There is a race condition which causes + // {@link #mWallpaper.wallpaperUpdating} to be false even if it is + // currently updating since the broadcast notifying us is async. + // This race is overcome by the general rule that we only reset the + // wallpaper if its service was shut down twice + // during {@link #MIN_WALLPAPER_CRASH_TIME} millis. + if (mWallpaper.lastDiedTime != 0 + && mWallpaper.lastDiedTime + MIN_WALLPAPER_CRASH_TIME + > SystemClock.uptimeMillis()) { + Slog.w(TAG, "Reverting to built-in wallpaper!"); + clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null); + } else { + mWallpaper.lastDiedTime = SystemClock.uptimeMillis(); + tryToRebind(); + } } } } else { @@ -1233,6 +1270,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub } }; + private boolean isRunningOnLowMemory() { + ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); + mActivityManager.getMemoryInfo(memoryInfo); + double availableMBsInPercentage = memoryInfo.availMem / (double)memoryInfo.totalMem * + 100.0; + return availableMBsInPercentage < LMK_LOW_THRESHOLD_MEMORY_PERCENTAGE; + } + /** * Called by a live wallpaper if its colors have changed. * @param primaryColors representation of wallpaper primary colors diff --git a/services/core/java/com/android/server/webkit/OWNERS b/services/core/java/com/android/server/webkit/OWNERS index 00e540a46ab2..e7fd7a5d1096 100644 --- a/services/core/java/com/android/server/webkit/OWNERS +++ b/services/core/java/com/android/server/webkit/OWNERS @@ -1,3 +1,3 @@ -changwan@google.com -tobiasjs@google.com +# Bug component: 76427 +ntfschr@google.com torne@google.com diff --git a/services/core/java/com/android/server/wm/BLASTSyncEngine.java b/services/core/java/com/android/server/wm/BLASTSyncEngine.java index 98ee98ba67f7..778951a545fa 100644 --- a/services/core/java/com/android/server/wm/BLASTSyncEngine.java +++ b/services/core/java/com/android/server/wm/BLASTSyncEngine.java @@ -248,10 +248,7 @@ class BLASTSyncEngine { Slog.e(TAG, "WM sent Transaction to organized, but never received" + " commit callback. Application ANR likely to follow."); Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); - synchronized (mWm.mGlobalLock) { - onCommitted(merged.mNativeObject != 0 - ? merged : mWm.mTransactionFactory.get()); - } + onCommitted(merged); } }; CommitCallback callback = new CommitCallback(); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index ef19eef22794..7addaa265ab2 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -6401,9 +6401,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // Don't do recursive work. return; } - mInEnsureActivitiesVisible = true; mAtmService.mTaskSupervisor.beginActivityVisibilityUpdate(); try { + mInEnsureActivitiesVisible = true; forAllRootTasks(rootTask -> { rootTask.ensureActivitiesVisible(starting, configChanges, preserveWindows, notifyClients); diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index a1a9a0877710..4c0c4b5add44 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2282,8 +2282,8 @@ public class DisplayPolicy { && Arrays.equals(mLastLetterboxDetails, letterboxDetails)) { return; } - if (mDisplayContent.isDefaultDisplay && mLastFocusIsFullscreen != isFullscreen - && ((mLastAppearance ^ appearance) & APPEARANCE_LOW_PROFILE_BARS) != 0) { + if (mDisplayContent.isDefaultDisplay && (mLastFocusIsFullscreen != isFullscreen + || ((mLastAppearance ^ appearance) & APPEARANCE_LOW_PROFILE_BARS) != 0)) { mService.mInputManager.setSystemUiLightsOut( isFullscreen || (appearance & APPEARANCE_LOW_PROFILE_BARS) != 0); } diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index 83fd725aafdf..d03388a8455e 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -204,7 +204,8 @@ class KeyguardController { // handle the snapshot. // - The display state is ON. Because if AOD is not on or pulsing, the display state will // be OFF or DOZE (the path of screen off may have handled it). - if (((aodShowing ^ keyguardShowing) || (aodShowing && aodChanged && keyguardChanged)) + if (displayId == DEFAULT_DISPLAY + && ((aodShowing ^ keyguardShowing) || (aodShowing && aodChanged && keyguardChanged)) && !state.mKeyguardGoingAway && Display.isOnState( mRootWindowContainer.getDefaultDisplay().getDisplayInfo().state)) { mWindowManager.mTaskSnapshotController.snapshotForSleeping(DEFAULT_DISPLAY); @@ -686,8 +687,7 @@ class KeyguardController { display.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; } - if (mTopTurnScreenOnActivity != lastTurnScreenOnActivity - && mTopTurnScreenOnActivity != null + if (mTopTurnScreenOnActivity != null && !mService.mWindowManager.mPowerManager.isInteractive() && (mRequestDismissKeyguard || occludedByActivity)) { controller.mTaskSupervisor.wakeUp("handleTurnScreenOn"); diff --git a/services/core/java/com/android/server/wm/OWNERS b/services/core/java/com/android/server/wm/OWNERS index 07f3bc6a53f3..26abe51c8c34 100644 --- a/services/core/java/com/android/server/wm/OWNERS +++ b/services/core/java/com/android/server/wm/OWNERS @@ -15,6 +15,7 @@ tigerhuang@google.com lihongyu@google.com mariiasand@google.com rgl@google.com +yunfanc@google.com per-file BackgroundActivityStartController.java = set noparent -per-file BackgroundActivityStartController.java = brufino@google.com, ogunwale@google.com, louischang@google.com, lus@google.com, rickywai@google.com +per-file BackgroundActivityStartController.java = brufino@google.com, ogunwale@google.com, louischang@google.com, lus@google.com diff --git a/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java b/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java index 43baebc7255a..e646f14a3e13 100644 --- a/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java +++ b/services/core/java/com/android/server/wm/RemoteDisplayChangeController.java @@ -114,9 +114,15 @@ public class RemoteDisplayChangeController { // timed-out, so run all continue callbacks and clear the list synchronized (mService.mGlobalLock) { for (int i = 0; i < mCallbacks.size(); ++i) { - mCallbacks.get(i).onContinueRemoteDisplayChange(null /* transaction */); + final ContinueRemoteDisplayChangeCallback callback = mCallbacks.get(i); + if (i == mCallbacks.size() - 1) { + // Clear all callbacks before calling the last one, so that if the callback + // itself calls {@link #isWaitingForRemoteDisplayChange()}, it will get + // {@code false}. After all, there is nothing pending after this one. + mCallbacks.clear(); + } + callback.onContinueRemoteDisplayChange(null /* transaction */); } - mCallbacks.clear(); } } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 05f95f813e55..9a0e47de7873 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -1023,31 +1023,28 @@ class RootWindowContainer extends WindowContainer<DisplayContent> * manager may choose to mirror or blank the display. */ boolean handleNotObscuredLocked(WindowState w, boolean obscured, boolean syswin) { - final WindowManager.LayoutParams attrs = w.mAttrs; - final int attrFlags = attrs.flags; final boolean onScreen = w.isOnScreen(); - final boolean canBeSeen = w.isDisplayed(); - final int privateflags = attrs.privateFlags; boolean displayHasContent = false; ProtoLog.d(WM_DEBUG_KEEP_SCREEN_ON, "handleNotObscuredLocked w: %s, w.mHasSurface: %b, w.isOnScreen(): %b, w" + ".isDisplayedLw(): %b, w.mAttrs.userActivityTimeout: %d", w, w.mHasSurface, onScreen, w.isDisplayed(), w.mAttrs.userActivityTimeout); - if (w.mHasSurface && onScreen) { - if (!syswin && w.mAttrs.userActivityTimeout >= 0 && mUserActivityTimeout < 0) { - mUserActivityTimeout = w.mAttrs.userActivityTimeout; - ProtoLog.d(WM_DEBUG_KEEP_SCREEN_ON, "mUserActivityTimeout set to %d", - mUserActivityTimeout); - } + if (!onScreen) { + return false; } - if (w.mHasSurface && canBeSeen) { + if (!syswin && w.mAttrs.userActivityTimeout >= 0 && mUserActivityTimeout < 0) { + mUserActivityTimeout = w.mAttrs.userActivityTimeout; + ProtoLog.d(WM_DEBUG_KEEP_SCREEN_ON, "mUserActivityTimeout set to %d", + mUserActivityTimeout); + } + if (w.isDrawn() || (w.mActivityRecord != null && w.mActivityRecord.firstWindowDrawn + && w.mActivityRecord.isVisibleRequested())) { if (!syswin && w.mAttrs.screenBrightness >= 0 && Float.isNaN(mScreenBrightnessOverride)) { mScreenBrightnessOverride = w.mAttrs.screenBrightness; } - final int type = attrs.type; // This function assumes that the contents of the default display are processed first // before secondary displays. final DisplayContent displayContent = w.getDisplayContent(); @@ -1062,12 +1059,12 @@ class RootWindowContainer extends WindowContainer<DisplayContent> } else if (displayContent != null && (!mObscureApplicationContentOnSecondaryDisplays || displayContent.isKeyguardAlwaysUnlocked() - || (obscured && type == TYPE_KEYGUARD_DIALOG))) { + || (obscured && w.mAttrs.type == TYPE_KEYGUARD_DIALOG))) { // Allow full screen keyguard presentation dialogs to be seen, or simply ignore the // keyguard if this display is always unlocked. displayHasContent = true; } - if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) { + if ((w.mAttrs.privateFlags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) { mSustainedPerformanceModeCurrent = true; } } @@ -1850,9 +1847,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent> // Don't do recursive work. return; } - + mTaskSupervisor.beginActivityVisibilityUpdate(); try { - mTaskSupervisor.beginActivityVisibilityUpdate(); // First the front root tasks. In case any are not fullscreen and are in front of home. for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) { final DisplayContent display = getChildAt(displayNdx); diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java index 7572a6417f5c..bbc35a35e93f 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java @@ -63,6 +63,8 @@ import java.util.function.Supplier; */ class SurfaceAnimationRunner { + private static final String TAG = SurfaceAnimationRunner.class.getSimpleName(); + private final Object mLock = new Object(); /** @@ -186,6 +188,16 @@ class SurfaceAnimationRunner { // We must wait for t to be committed since otherwise the leash doesn't have the // windows we want to screenshot and extend as children. t.addTransactionCommittedListener(mEdgeExtensionExecutor, () -> { + if (!animationLeash.isValid()) { + Log.e(TAG, "Animation leash is not valid"); + synchronized (mEdgeExtensionLock) { + mEdgeExtensions.remove(animationLeash); + } + synchronized (mLock) { + mPreProcessingAnimations.remove(animationLeash); + } + return; + } final WindowAnimationSpec animationSpec = a.asWindowAnimationSpec(); final Transaction edgeExtensionCreationTransaction = new Transaction(); @@ -450,8 +462,7 @@ class SurfaceAnimationRunner { // The leash we are trying to screenshot may have been removed by this point, which is // likely the reason for ending up with a null edgeBuffer, in which case we just want to // return and do nothing. - Log.e("SurfaceAnimationRunner", "Failed to create edge extension - " - + "edge buffer is null"); + Log.e(TAG, "Failed to create edge extension - edge buffer is null"); return; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index ceb80d6a1a8b..3063d46208c2 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -5717,7 +5717,7 @@ class Task extends TaskFragment { } } ActivityRecord topActivity = getDisplayArea().topRunningActivity(); - Task topRootTask = topActivity.getRootTask(); + Task topRootTask = topActivity == null ? null : topActivity.getRootTask(); if (topRootTask != null && topRootTask != this && topActivity.isState(RESUMED)) { // Usually resuming a top activity triggers the next app transition, but nothing's got // resumed in this case, so we need to execute it explicitly. diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 0c1f33ccedbc..7d0f58e7efef 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1081,21 +1081,13 @@ class TaskFragment extends WindowContainer<WindowContainer> { } final int otherWindowingMode = other.getWindowingMode(); - if (otherWindowingMode == WINDOWING_MODE_FULLSCREEN) { - if (isTranslucent(other, starting)) { - // Can be visible behind a translucent fullscreen TaskFragment. - gotTranslucentFullscreen = true; - continue; - } - return TASK_FRAGMENT_VISIBILITY_INVISIBLE; - } else if (otherWindowingMode == WINDOWING_MODE_MULTI_WINDOW - && other.matchParentBounds()) { + if (otherWindowingMode == WINDOWING_MODE_FULLSCREEN + || (otherWindowingMode != WINDOWING_MODE_PINNED && other.matchParentBounds())) { if (isTranslucent(other, starting)) { // Can be visible behind a translucent TaskFragment. gotTranslucentFullscreen = true; continue; } - // Multi-window TaskFragment that matches parent bounds would occlude other children return TASK_FRAGMENT_VISIBILITY_INVISIBLE; } diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java index 29c192cc7c48..7e0e5a4cc599 100644 --- a/services/core/java/com/android/server/wm/TaskPersister.java +++ b/services/core/java/com/android/server/wm/TaskPersister.java @@ -549,8 +549,8 @@ public class TaskPersister implements PersisterQueue.Listener { // Write out one task. byte[] data = null; Task task = mTask; - if (DEBUG) Slog.d(TAG, "Writing task=" + task); synchronized (mService.mGlobalLock) { + if (DEBUG) Slog.d(TAG, "Writing task=" + task); if (task.inRecents) { // Still there. try { diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index d5217c8295bd..6f2455e073a7 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -168,7 +168,6 @@ cc_defaults { "android.hardware.graphics.bufferqueue@1.0", "android.hardware.graphics.bufferqueue@2.0", "android.hardware.graphics.common@1.2", - "android.hardware.graphics.mapper@4.0", "android.hardware.input.processor-V1-ndk", "android.hardware.ir@1.0", "android.hardware.light@2.0", diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp index 0488247ec78b..98482b8ec700 100644 --- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp +++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp @@ -54,6 +54,9 @@ using android::base::WriteStringToFile; using android::meminfo::ProcMemInfo; using namespace android::meminfo; +static const size_t kPageSize = getpagesize(); +static const size_t kPageMask = ~(kPageSize - 1); + #define COMPACT_ACTION_FILE_FLAG 1 #define COMPACT_ACTION_ANON_FLAG 2 @@ -64,7 +67,7 @@ using android::base::unique_fd; #define ASYNC_RECEIVED_WHILE_FROZEN (2) #define TXNS_PENDING_WHILE_FROZEN (4) -#define MAX_RW_COUNT (INT_MAX & PAGE_MASK) +#define MAX_RW_COUNT (INT_MAX & kPageMask) // Defines the maximum amount of VMAs we can send per process_madvise syscall. // Currently this is set to UIO_MAXIOV which is the maximum segments allowed by @@ -258,7 +261,7 @@ int madviseVmasFromBatch(unique_fd& pidfd, VmaBatch& batch, int madviseType, } else if (bytesProcessedInSend < batch.totalBytes) { // Partially processed the bytes requested // skip last page which is where it failed. - bytesProcessedInSend += PAGE_SIZE; + bytesProcessedInSend += kPageSize; } bytesProcessedInSend = consumeBytes(batch, bytesProcessedInSend); diff --git a/services/core/jni/gnss/GnssVisibilityControlCallback.cpp b/services/core/jni/gnss/GnssVisibilityControlCallback.cpp index ec215f106650..bc57c1d95b02 100644 --- a/services/core/jni/gnss/GnssVisibilityControlCallback.cpp +++ b/services/core/jni/gnss/GnssVisibilityControlCallback.cpp @@ -73,7 +73,7 @@ bool GnssVisibilityControlCallbackUtil::isInEmergencySession() { template <> jstring ToJstring(JNIEnv* env, const String16& value) { - const char16_t* str = value.string(); + const char16_t* str = value.c_str(); size_t len = value.size(); return env->NewString(reinterpret_cast<const jchar*>(str), len); } diff --git a/services/core/xsd/vts/OWNERS b/services/core/xsd/vts/OWNERS new file mode 100644 index 000000000000..9af2ebaba437 --- /dev/null +++ b/services/core/xsd/vts/OWNERS @@ -0,0 +1,2 @@ +# Bug component: 151862 +sundongahn@google.com diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 51e4fe3027f3..34170fa4c8b5 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -14843,17 +14843,23 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { "Caller is not managed profile owner or device owner;" + " only managed profile owner or device owner may control the preferential" + " network service"); - synchronized (getLockObject()) { - final ActiveAdmin requiredAdmin = getDeviceOrProfileOwnerAdminLocked( - caller.getUserId()); - if (!requiredAdmin.mPreferentialNetworkServiceConfigs.equals( - preferentialNetworkServiceConfigs)) { - requiredAdmin.mPreferentialNetworkServiceConfigs = - new ArrayList<>(preferentialNetworkServiceConfigs); - saveSettingsLocked(caller.getUserId()); + + try { + updateNetworkPreferenceForUser(caller.getUserId(), preferentialNetworkServiceConfigs); + synchronized (getLockObject()) { + final ActiveAdmin requiredAdmin = getDeviceOrProfileOwnerAdminLocked( + caller.getUserId()); + if (!requiredAdmin.mPreferentialNetworkServiceConfigs.equals( + preferentialNetworkServiceConfigs)) { + requiredAdmin.mPreferentialNetworkServiceConfigs = + new ArrayList<>(preferentialNetworkServiceConfigs); + saveSettingsLocked(caller.getUserId()); + } } + } catch (Exception e) { + Slogf.e(LOG_TAG, "Failed to set preferential network service configs"); + throw e; } - updateNetworkPreferenceForUser(caller.getUserId(), preferentialNetworkServiceConfigs); DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_PREFERENTIAL_NETWORK_SERVICE_ENABLED) .setBoolean(preferentialNetworkServiceConfigs diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java index 06f11be20245..733b1d98f3e2 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyVersionUpgrader.java @@ -29,6 +29,7 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; +import java.nio.file.NoSuchFileException; import java.util.ArrayList; import java.util.List; @@ -307,6 +308,8 @@ public class PolicyVersionUpgrader { String versionString = Files.readAllLines( file.toPath(), Charset.defaultCharset()).get(0); return Integer.parseInt(versionString); + } catch (NoSuchFileException e) { + return 0; // expected on first boot } catch (IOException | NumberFormatException | IndexOutOfBoundsException e) { Slog.e(LOG_TAG, "Error reading version", e); return 0; diff --git a/services/foldables/devicestateprovider/OWNERS b/services/foldables/devicestateprovider/OWNERS new file mode 100644 index 000000000000..573284419a48 --- /dev/null +++ b/services/foldables/devicestateprovider/OWNERS @@ -0,0 +1,6 @@ +akulian@google.com +jiamingliu@google.com +kchyn@google.com +kennethford@google.com +nickchameyev@google.com +nicomazz@google.com
\ No newline at end of file diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index af841808992e..1792964fe3af 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -2043,14 +2043,17 @@ public final class SystemServer implements Dumpable { t.traceEnd(); } - t.traceBegin("StartPacProxyService"); - try { - pacProxyService = new PacProxyService(context); - ServiceManager.addService(Context.PAC_PROXY_SERVICE, pacProxyService); - } catch (Throwable e) { - reportWtf("starting PacProxyService", e); + // Devices without WebView/JavaScript cannot support PAC proxies. + if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) { + t.traceBegin("StartPacProxyService"); + try { + pacProxyService = new PacProxyService(context); + ServiceManager.addService(Context.PAC_PROXY_SERVICE, pacProxyService); + } catch (Throwable e) { + reportWtf("starting PacProxyService", e); + } + t.traceEnd(); } - t.traceEnd(); t.traceBegin("StartConnectivityService"); // This has to be called after NetworkManagementService, NetworkStatsService diff --git a/services/musicrecognition/OWNERS b/services/musicrecognition/OWNERS index 58f5d40dd8c3..037b04831260 100644 --- a/services/musicrecognition/OWNERS +++ b/services/musicrecognition/OWNERS @@ -1,6 +1,5 @@ # Bug component: 830636 -joannechung@google.com oni@google.com volnov@google.com diff --git a/services/net/OWNERS b/services/net/OWNERS index 62c5737a2e8e..c24680e9b06a 100644 --- a/services/net/OWNERS +++ b/services/net/OWNERS @@ -1,2 +1,2 @@ set noparent -file:platform/packages/modules/Connectivity:master:/OWNERS_core_networking +file:platform/packages/modules/Connectivity:main:/OWNERS_core_networking diff --git a/services/net/java/android/net/util/NetworkConstants.java b/services/net/java/android/net/util/NetworkConstants.java index ea5ce65f6f79..49962eabbff3 100644 --- a/services/net/java/android/net/util/NetworkConstants.java +++ b/services/net/java/android/net/util/NetworkConstants.java @@ -52,7 +52,6 @@ public final class NetworkConstants { public static final int IPV6_ADDR_BITS = 128; public static final int IPV6_ADDR_LEN = 16; public static final int IPV6_MIN_MTU = 1280; - public static final int RFC7421_PREFIX_LENGTH = 64; /** * ICMP common (v4/v6) constants. diff --git a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt index de7dc3b53752..fc10f2623eb4 100644 --- a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt +++ b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt @@ -931,7 +931,7 @@ class PermissionService( isGranted: Boolean ) { val appOpPolicy = service.getSchemePolicy(UidUri.SCHEME, AppOpUri.SCHEME) as UidAppOpPolicy - val appOpName = AppOpsManager.permissionToOp(permissionName) + val appOpName = checkNotNull(AppOpsManager.permissionToOp(permissionName)) val mode = if (isGranted) AppOpsManager.MODE_ALLOWED else AppOpsManager.MODE_ERRORED with(appOpPolicy) { setAppOpMode(packageState.appId, userId, appOpName, mode) } } @@ -1889,7 +1889,7 @@ class PermissionService( packageName: String, appId: Int, packageState: PackageState, - androidPackage: AndroidPackage?, + androidPackage: AndroidPackage, sharedUserPkgs: List<AndroidPackage>, userId: Int ) { diff --git a/services/proguard.flags b/services/proguard.flags index c31abbb5c0d6..e11e613adb5c 100644 --- a/services/proguard.flags +++ b/services/proguard.flags @@ -42,19 +42,6 @@ -keep,allowoptimization,allowaccessmodification class * extends android.os.IInterface -keep,allowoptimization,allowaccessmodification class * extends android.os.IHwInterface -# Global entities normally kept through explicit Manifest entries -# TODO(b/210510433): Revisit and consider generating from frameworks/base/core/res/AndroidManifest.xml, -# by including that manifest with the library rule that triggers optimization. --keep,allowoptimization,allowaccessmodification class com.android.server.** extends android.app.Activity --keep,allowoptimization,allowaccessmodification class com.android.server.** extends android.app.Service --keep,allowoptimization,allowaccessmodification class com.android.server.** extends android.app.backup.BackupAgent --keep,allowoptimization,allowaccessmodification class com.android.server.** extends android.content.BroadcastReceiver --keep,allowoptimization,allowaccessmodification class com.android.server.** extends android.content.ContentProvider --keep,allowoptimization,allowaccessmodification class com.android.server.** extends android.preference.Preference --keep,allowoptimization,allowaccessmodification class com.android.server.** extends android.view.View { - public <init>(...); -} - # Various classes subclassed in or referenced via JNI in ethernet-service -keep public class android.net.** { *; } -keep,allowoptimization,allowaccessmodification class com.android.net.module.util.* { *; } diff --git a/services/tests/PackageManagerComponentOverrideTests/OWNERS b/services/tests/PackageManagerComponentOverrideTests/OWNERS index d825dfd7cf00..ecdd02814ffb 100644 --- a/services/tests/PackageManagerComponentOverrideTests/OWNERS +++ b/services/tests/PackageManagerComponentOverrideTests/OWNERS @@ -1 +1,2 @@ +# Bug component: 36137 include /services/core/java/com/android/server/pm/OWNERS diff --git a/services/tests/PackageManagerServiceTests/OWNERS b/services/tests/PackageManagerServiceTests/OWNERS index 86ae5818e91c..95f146d466f1 100644 --- a/services/tests/PackageManagerServiceTests/OWNERS +++ b/services/tests/PackageManagerServiceTests/OWNERS @@ -1 +1,2 @@ +# Bug component: 36137 include /PACKAGE_MANAGER_OWNERS diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java index 9e371649214c..460eb3c20e81 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/parsing/PackageParserLegacyCoreTest.java @@ -106,7 +106,8 @@ public class PackageParserLegacyCoreTest { minSdkCodename, PLATFORM_VERSION, isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE, - input); + input, + null); if (expectedMinSdk == -1) { assertTrue(result.isError()); @@ -209,7 +210,7 @@ public class PackageParserLegacyCoreTest { targetSdkCodename, isPlatformReleased ? CODENAMES_RELEASED : CODENAMES_PRE_RELEASE, input, - allowUnknownCodenames); + allowUnknownCodenames, null); if (expectedTargetSdk == -1) { assertTrue(result.isError()); diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/PackageManagerLocalSnapshotTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/PackageManagerLocalSnapshotTest.kt index 5f26d6f846aa..cd37674f4f8c 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/PackageManagerLocalSnapshotTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/PackageManagerLocalSnapshotTest.kt @@ -31,6 +31,7 @@ import org.junit.Test import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyString +import org.mockito.Mockito.doReturn import kotlin.test.assertFailsWith class PackageManagerLocalSnapshotTest { @@ -154,7 +155,7 @@ class PackageManagerLocalSnapshotTest { put(packageStateUser0.packageName, packageStateUser0) put(packageStateUser10.packageName, packageStateUser10) } - whenever(this.packageStates) { packageStates } + doReturn(packageStates).whenever(this).packageStates whenever(getPackageStateFiltered(anyString(), anyInt(), anyInt())) { packageStates[arguments[0]]?.takeUnless { shouldFilterApplication(it, arguments[1] as Int, arguments[2] as Int) diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt index 55645d7f80b1..9fbf86e36df4 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt @@ -48,6 +48,7 @@ import org.mockito.Mockito.any import org.mockito.Mockito.anyInt import org.mockito.Mockito.anyLong import org.mockito.Mockito.anyString +import org.mockito.Mockito.doReturn import org.mockito.Mockito.eq import org.mockito.Mockito.mock import org.mockito.Mockito.verifyNoMoreInteractions @@ -351,12 +352,12 @@ class DomainVerificationEnforcerTest { whenever(this.domainSetId) { domainSetId } whenever(getUserStateOrDefault(0)) { PackageUserStateInternal.DEFAULT } whenever(getUserStateOrDefault(1)) { PackageUserStateInternal.DEFAULT } - whenever(userStates) { + doReturn( SparseArray<PackageUserStateInternal>().apply { this[0] = PackageUserStateInternal.DEFAULT this[1] = PackageUserStateInternal.DEFAULT } - } + ).whenever(this).userStates whenever(isSystem) { false } whenever(signingDetails) { SigningDetails.UNKNOWN } } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt index 86c4335ecfe9..47d9196b502b 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationManagerApiTest.kt @@ -44,6 +44,7 @@ import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyLong import org.mockito.ArgumentMatchers.anyString +import org.mockito.Mockito.doReturn import java.util.UUID import java.util.concurrent.atomic.AtomicBoolean import kotlin.test.assertFailsWith @@ -555,12 +556,12 @@ class DomainVerificationManagerApiTest { whenever(this.domainSetId) { domainSetId } whenever(getUserStateOrDefault(0)) { pkgUserState0() } whenever(getUserStateOrDefault(1)) { pkgUserState1() } - whenever(userStates) { + doReturn( SparseArray<PackageUserStateInternal>().apply { this[0] = pkgUserState0() this[1] = pkgUserState1() } - } + ).whenever(this).userStates whenever(isSystem) { false } } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt index e55ff3b7c229..98d780143ff7 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationPackageTest.kt @@ -1084,12 +1084,12 @@ class DomainVerificationPackageTest { whenever(this.domainSetId) { domainSetId } whenever(getUserStateOrDefault(0)) { PackageUserStateInternal.DEFAULT } whenever(getUserStateOrDefault(10)) { PackageUserStateInternal.DEFAULT } - whenever(userStates) { + doReturn( SparseArray<PackageUserStateInternal>().apply { this[0] = PackageUserStateInternal.DEFAULT this[1] = PackageUserStateInternal.DEFAULT } - } + ).whenever(this).userStates whenever(isSystem) { isSystemApp } val mockSigningDetails = SigningDetails(arrayOf(spy(Signature(signature)) { diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt index 427b5b3494b2..4a211dfeb91e 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationSettingsMutationTest.kt @@ -41,6 +41,7 @@ import org.mockito.Mockito.any import org.mockito.Mockito.anyInt import org.mockito.Mockito.anyLong import org.mockito.Mockito.anyString +import org.mockito.Mockito.doReturn import org.mockito.Mockito.eq import org.mockito.Mockito.verify import java.util.UUID @@ -218,12 +219,12 @@ class DomainVerificationSettingsMutationTest { whenever(domainSetId) { TEST_UUID } whenever(getUserStateOrDefault(0)) { PackageUserStateInternal.DEFAULT } whenever(getUserStateOrDefault(10)) { PackageUserStateInternal.DEFAULT } - whenever(userStates) { + doReturn( SparseArray<PackageUserStateInternal>().apply { this[0] = PackageUserStateInternal.DEFAULT this[1] = PackageUserStateInternal.DEFAULT } - } + ).whenever(this).userStates whenever(isSystem) { false } } } diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt index 6bb5f393f0d2..d54d608e48c2 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationUserSelectionOverrideTest.kt @@ -41,6 +41,8 @@ import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyInt import org.mockito.ArgumentMatchers.anyLong import org.mockito.ArgumentMatchers.anyString +import org.mockito.Mockito.doReturn + import java.util.UUID class DomainVerificationUserStateOverrideTest { @@ -155,12 +157,12 @@ class DomainVerificationUserStateOverrideTest { whenever(this.domainSetId) { domainSetId } whenever(getUserStateOrDefault(0)) { PackageUserStateInternal.DEFAULT } whenever(getUserStateOrDefault(1)) { PackageUserStateInternal.DEFAULT } - whenever(userStates) { + doReturn( SparseArray<PackageUserStateInternal>().apply { this[0] = PackageUserStateInternal.DEFAULT this[1] = PackageUserStateInternal.DEFAULT } - } + ).whenever(this).userStates whenever(isSystem) { false } } diff --git a/services/tests/RemoteProvisioningServiceTests/Android.bp b/services/tests/RemoteProvisioningServiceTests/Android.bp index 075680a51af3..fc2c0857146b 100644 --- a/services/tests/RemoteProvisioningServiceTests/Android.bp +++ b/services/tests/RemoteProvisioningServiceTests/Android.bp @@ -31,6 +31,7 @@ android_test { "service-rkp.impl", "services.core", "truth-prebuilt", + "truth-java8-extension-jar", ], test_suites: [ "device-tests", diff --git a/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java index 77c339646400..007c0db1b731 100644 --- a/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java +++ b/services/tests/RemoteProvisioningServiceTests/src/com/android/server/security/rkp/RemoteProvisioningShellCommandTest.java @@ -17,15 +17,18 @@ package com.android.server.security.rkp; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth8.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.Context; import android.hardware.security.keymint.DeviceInfo; import android.hardware.security.keymint.IRemotelyProvisionedComponent; import android.hardware.security.keymint.MacedPublicKey; @@ -33,9 +36,15 @@ import android.hardware.security.keymint.ProtectedData; import android.hardware.security.keymint.RpcHardwareInfo; import android.os.Binder; import android.os.FileUtils; +import android.os.OutcomeReceiver; +import android.os.Process; +import android.security.rkp.service.RegistrationProxy; +import android.security.rkp.service.RemotelyProvisionedKey; +import androidx.test.core.app.ApplicationProvider; import androidx.test.runner.AndroidJUnit4; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,17 +54,17 @@ import java.io.FileOutputStream; import java.util.Arrays; import java.util.Base64; import java.util.Map; +import java.util.concurrent.Executor; @RunWith(AndroidJUnit4.class) public class RemoteProvisioningShellCommandTest { - private static class Injector extends RemoteProvisioningShellCommand.Injector { + private Context mContext; - private final Map<String, IRemotelyProvisionedComponent> mIrpcs; + private static class Injector extends RemoteProvisioningShellCommand.Injector { - Injector(Map irpcs) { - mIrpcs = irpcs; - } + Map<String, IRemotelyProvisionedComponent> mIrpcs; + Map<String, RegistrationProxy> mRegistrationProxies; @Override String[] getIrpcNames() { @@ -70,6 +79,12 @@ public class RemoteProvisioningShellCommandTest { } return irpc; } + + @Override + RegistrationProxy getRegistrationProxy( + Context context, int callerUid, String name, Executor executor) { + return mRegistrationProxies.get(name); + } } private static class CommandResult { @@ -111,36 +126,48 @@ public class RemoteProvisioningShellCommandTest { code, FileUtils.readTextFile(out, 0, null), FileUtils.readTextFile(err, 0, null)); } + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + } + @Test public void list_zeroInstances() throws Exception { + Injector injector = new Injector(); + injector.mIrpcs = Map.of(); RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( - new Injector(Map.of())); + mContext, Process.SHELL_UID, injector); CommandResult res = exec(cmd, new String[] {"list"}); assertThat(res.getErr()).isEmpty(); assertThat(res.getCode()).isEqualTo(0); assertThat(res.getOut()).isEmpty(); + assertThat(res.getOut().lines()).isEmpty(); } @Test public void list_oneInstances() throws Exception { + Injector injector = new Injector(); + injector.mIrpcs = Map.of("default", mock(IRemotelyProvisionedComponent.class)); RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( - new Injector(Map.of("default", mock(IRemotelyProvisionedComponent.class)))); + mContext, Process.SHELL_UID, injector); CommandResult res = exec(cmd, new String[] {"list"}); assertThat(res.getErr()).isEmpty(); assertThat(res.getCode()).isEqualTo(0); - assertThat(Arrays.asList(res.getOut().split("\n"))).containsExactly("default"); + assertThat(res.getOut().lines()).containsExactly("default"); } @Test public void list_twoInstances() throws Exception { + Injector injector = new Injector(); + injector.mIrpcs = Map.of( + "default", mock(IRemotelyProvisionedComponent.class), + "strongbox", mock(IRemotelyProvisionedComponent.class)); RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( - new Injector(Map.of( - "default", mock(IRemotelyProvisionedComponent.class), - "strongbox", mock(IRemotelyProvisionedComponent.class)))); + mContext, Process.SHELL_UID, injector); CommandResult res = exec(cmd, new String[] {"list"}); assertThat(res.getErr()).isEmpty(); assertThat(res.getCode()).isEqualTo(0); - assertThat(Arrays.asList(res.getOut().split("\n"))).containsExactly("default", "strongbox"); + assertThat(res.getOut().lines()).containsExactly("default", "strongbox"); } @Test @@ -157,8 +184,10 @@ public class RemoteProvisioningShellCommandTest { }).when(defaultMock).generateCertificateRequest( anyBoolean(), any(), any(), any(), any(), any()); + Injector injector = new Injector(); + injector.mIrpcs = Map.of("default", defaultMock); RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( - new Injector(Map.of("default", defaultMock))); + mContext, Process.SHELL_UID, injector); CommandResult res = exec(cmd, new String[] { "csr", "--challenge", "dGVzdHRlc3R0ZXN0dGVzdA==", "default"}); verify(defaultMock).generateCertificateRequest( @@ -188,8 +217,10 @@ public class RemoteProvisioningShellCommandTest { }).when(defaultMock).generateCertificateRequest( anyBoolean(), any(), any(), any(), any(), any()); + Injector injector = new Injector(); + injector.mIrpcs = Map.of("default", defaultMock); RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( - new Injector(Map.of("default", defaultMock))); + mContext, Process.SHELL_UID, injector); CommandResult res = exec(cmd, new String[] { "csr", "--challenge", "dGVzdHRlc3R0ZXN0dGVzdA==", "default"}); verify(defaultMock).generateCertificateRequest( @@ -214,8 +245,10 @@ public class RemoteProvisioningShellCommandTest { when(defaultMock.generateCertificateRequestV2(any(), any())) .thenReturn(new byte[] {0x68, 0x65, 0x6c, 0x6c, 0x6f}); + Injector injector = new Injector(); + injector.mIrpcs = Map.of("default", defaultMock); RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( - new Injector(Map.of("default", defaultMock))); + mContext, Process.SHELL_UID, injector); CommandResult res = exec(cmd, new String[] {"csr", "default"}); verify(defaultMock).generateCertificateRequestV2(new MacedPublicKey[0], new byte[0]); assertThat(res.getErr()).isEmpty(); @@ -232,8 +265,10 @@ public class RemoteProvisioningShellCommandTest { when(defaultMock.generateCertificateRequestV2(any(), any())) .thenReturn(new byte[] {0x68, 0x69}); + Injector injector = new Injector(); + injector.mIrpcs = Map.of("default", defaultMock); RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( - new Injector(Map.of("default", defaultMock))); + mContext, Process.SHELL_UID, injector); CommandResult res = exec(cmd, new String[] {"csr", "--challenge", "dHJpYWw=", "default"}); verify(defaultMock).generateCertificateRequestV2( new MacedPublicKey[0], new byte[] {0x74, 0x72, 0x69, 0x61, 0x6c}); @@ -241,4 +276,82 @@ public class RemoteProvisioningShellCommandTest { assertThat(res.getCode()).isEqualTo(0); assertThat(res.getOut()).isEqualTo("aGk=\n"); } + + @Test + public void certify_sameOrderAsReceived() throws Exception { + String cert1 = "MIIBqDCCAU2gAwIBAgIUI3FFU7xZno/2Xf/wZzKKquP0ov0wCgYIKoZIzj0EAwIw\n" + + "KTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQ0wCwYDVQQKDARUZXN0MB4XDTIz\n" + + "MDgyMjE5MzgxMFoXDTMzMDgxOTE5MzgxMFowKTELMAkGA1UEBhMCVVMxCzAJBgNV\n" + + "BAgMAkNBMQ0wCwYDVQQKDARUZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n" + + "czOpG6NKOdDjV/yrKjuy0q0jEJvsVLGgTeY+vyKRBJS59OhyRWG6n3aza21bNg5d\n" + + "WE9ruz+bcT0IP4kDbiS0y6NTMFEwHQYDVR0OBBYEFHYfJxCUipNI7qRqvczcWsOb\n" + + "FIDPMB8GA1UdIwQYMBaAFHYfJxCUipNI7qRqvczcWsObFIDPMA8GA1UdEwEB/wQF\n" + + "MAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKm/kpJwlnWkjoLCAddBiSnxbT4EfJIK\n" + + "H0j58tg5VazHAiEAnS/kRzU9AbstOZyD7el/ws3gLXkbUNey3pLFutBWsSU=\n"; + String cert2 = "MIIBpjCCAU2gAwIBAgIUdSzfZzeGr+h70JPO7Sxwdkw99iMwCgYIKoZIzj0EAwIw\n" + + "KTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQ0wCwYDVQQKDARUZXN0MB4XDTIz\n" + + "MDgyMjIwMTcyMFoXDTMzMDgxOTIwMTcyMFowKTELMAkGA1UEBhMCVVMxCzAJBgNV\n" + + "BAgMAkNBMQ0wCwYDVQQKDARUZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n" + + "voGJi4DxuqH8rzPV6Eq0OVULc0xFzaM0500VBqiQEB7Qt0Ktk2d+3bUrFAb3SZV4\n" + + "6TIdb7SkynvaDtr0x45Ng6NTMFEwHQYDVR0OBBYEFMeGjvGV0ADPBJk5/FPoW9HQ\n" + + "uTc6MB8GA1UdIwQYMBaAFMeGjvGV0ADPBJk5/FPoW9HQuTc6MA8GA1UdEwEB/wQF\n" + + "MAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgd1gu7iiNOQXaQUn5BT3WwWR0Yk78ndWt\n" + + "ew7tRiTOhFcCIFURi6WcNH0oWa6IbwBSMC9aZlo98Fbg+dTwhLAAw+PW\n"; + byte[] cert1Bytes = Base64.getDecoder().decode(cert1.replaceAll("\\s+", "")); + byte[] cert2Bytes = Base64.getDecoder().decode(cert2.replaceAll("\\s+", "")); + byte[] certChain = Arrays.copyOf(cert1Bytes, cert1Bytes.length + cert2Bytes.length); + System.arraycopy(cert2Bytes, 0, certChain, cert1Bytes.length, cert2Bytes.length); + RemotelyProvisionedKey keyMock = mock(RemotelyProvisionedKey.class); + when(keyMock.getEncodedCertChain()).thenReturn(certChain); + RegistrationProxy defaultMock = mock(RegistrationProxy.class); + doAnswer(invocation -> { + ((OutcomeReceiver<RemotelyProvisionedKey, Exception>) invocation.getArgument(3)) + .onResult(keyMock); + return null; + }).when(defaultMock).getKeyAsync(anyInt(), any(), any(), any()); + + Injector injector = new Injector(); + injector.mRegistrationProxies = Map.of("default", defaultMock); + RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( + mContext, Process.SHELL_UID, injector); + CommandResult res = exec(cmd, new String[] {"certify", "default"}); + assertThat(res.getErr()).isEmpty(); + assertThat(res.getCode()).isEqualTo(0); + assertThat(res.getOut()).isEqualTo( + "-----BEGIN CERTIFICATE-----\n" + cert1 + "-----END CERTIFICATE-----\n" + + "-----BEGIN CERTIFICATE-----\n" + cert2 + "-----END CERTIFICATE-----\n"); + } + + @Test + public void certify_noBlankLineBeforeTrailer() throws Exception { + String cert = "MIIB2zCCAYGgAwIBAgIRAOpN7Em1k7gaqLAB2dzXUTYwCgYIKoZIzj0EAwIwKTET\n" + + "MBEGA1UEChMKR29vZ2xlIExMQzESMBAGA1UEAxMJRHJvaWQgQ0EzMB4XDTIzMDgx\n" + + "ODIzMzI1MloXDTIzMDkyMTIzMzI1MlowOTEMMAoGA1UEChMDVEVFMSkwJwYDVQQD\n" + + "EyBlYTRkZWM0OWI1OTNiODFhYThiMDAxZDlkY2Q3NTEzNjBZMBMGByqGSM49AgEG\n" + + "CCqGSM49AwEHA0IABHM/cKZblmlw8bdGbDXnX+ZiLiGjSjaLHXYOoHDrVArAMXUi\n" + + "L6brhcUPaqSGcVLcfFZbaFMOxXW6TsGdQiwJ0iyjejB4MB0GA1UdDgQWBBTYzft+\n" + + "X32TH/Hh+ngwQF6aPhnfXDAfBgNVHSMEGDAWgBQT4JObI9mzNNW2FRsHRcw4zVn2\n" + + "8jAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwICBDAVBgorBgEEAdZ5AgEe\n" + + "BAehARoABAAAMAoGCCqGSM49BAMCA0gAMEUCIDc0OR7CzIYw0myTr0y/Brl1nZyk\n" + + "eGSQp615WpTwYhwxAiEApM10gSIKBIo7Z4/FNzkuiz1zZwW9+Dcqisqxkfe6icQ=\n"; + byte[] certBytes = Base64.getDecoder().decode(cert.replaceAll("\\s+", "")); + RemotelyProvisionedKey keyMock = mock(RemotelyProvisionedKey.class); + when(keyMock.getEncodedCertChain()).thenReturn(certBytes); + RegistrationProxy defaultMock = mock(RegistrationProxy.class); + doAnswer(invocation -> { + ((OutcomeReceiver<RemotelyProvisionedKey, Exception>) invocation.getArgument(3)) + .onResult(keyMock); + return null; + }).when(defaultMock).getKeyAsync(anyInt(), any(), any(), any()); + + Injector injector = new Injector(); + injector.mRegistrationProxies = Map.of("strongbox", defaultMock); + RemoteProvisioningShellCommand cmd = new RemoteProvisioningShellCommand( + mContext, Process.SHELL_UID, injector); + CommandResult res = exec(cmd, new String[] {"certify", "strongbox"}); + assertThat(res.getErr()).isEmpty(); + assertThat(res.getCode()).isEqualTo(0); + assertThat(res.getOut()).isEqualTo( + "-----BEGIN CERTIFICATE-----\n" + cert + "-----END CERTIFICATE-----\n"); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/ExtendedMockitoRule.java b/services/tests/mockingservicestests/src/com/android/server/ExtendedMockitoRule.java deleted file mode 100644 index 881dd504428d..000000000000 --- a/services/tests/mockingservicestests/src/com/android/server/ExtendedMockitoRule.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server; - -import android.annotation.Nullable; -import android.util.Log; - -import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder; -import com.android.internal.util.Preconditions; -import com.android.modules.utils.testing.StaticMockFixture; -import com.android.modules.utils.testing.StaticMockFixtureRule; - -import org.mockito.Mockito; -import org.mockito.quality.Strictness; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * Rule to make it easier to use Extended Mockito. - * - * <p>It's derived from {@link StaticMockFixtureRule}, with the additional features: - * - * <ul> - * <li>Easier to define which classes must be statically mocked or spied - * <li>Automatically starts mocking (so tests don't need a mockito runner or rule) - * <li>Automatically clears the inlined mocks at the end (to avoid OOM) - * <li>Allows other customization like strictness - * </ul> - */ -public final class ExtendedMockitoRule extends StaticMockFixtureRule { - - private static final String TAG = ExtendedMockitoRule.class.getSimpleName(); - - private static final boolean VERBOSE = Log.isLoggable(TAG, Log.VERBOSE); - - private final Object mTestClassInstance; - private final Strictness mStrictness; - - private ExtendedMockitoRule(Builder builder) { - super(() -> new SimpleStatickMockFixture(builder.mMockedStaticClasses, - builder.mSpiedStaticClasses, builder.mDynamicSessionBuilderConfigurator, - builder.mAfterSessionFinishedCallback)); - mTestClassInstance = builder.mTestClassInstance; - mStrictness = builder.mStrictness; - if (VERBOSE) { - Log.v(TAG, "strictness=" + mStrictness + ", testClassInstance" + mTestClassInstance - + ", mockedStaticClasses=" + builder.mMockedStaticClasses - + ", spiedStaticClasses=" + builder.mSpiedStaticClasses - + ", dynamicSessionBuilderConfigurator=" - + builder.mDynamicSessionBuilderConfigurator - + ", afterSessionFinishedCallback=" + builder.mAfterSessionFinishedCallback); - } - } - - @Override - public StaticMockitoSessionBuilder getSessionBuilder() { - StaticMockitoSessionBuilder sessionBuilder = super.getSessionBuilder(); - if (mStrictness != null) { - if (VERBOSE) { - Log.v(TAG, "Setting strictness to " + mStrictness + " on " + sessionBuilder); - } - sessionBuilder.strictness(mStrictness); - } - return sessionBuilder.initMocks(mTestClassInstance); - } - - public static final class Builder { - private final Object mTestClassInstance; - private @Nullable Strictness mStrictness; - private final List<Class<?>> mMockedStaticClasses = new ArrayList<>(); - private final List<Class<?>> mSpiedStaticClasses = new ArrayList<>(); - private @Nullable Visitor<StaticMockitoSessionBuilder> mDynamicSessionBuilderConfigurator; - private @Nullable Runnable mAfterSessionFinishedCallback; - - public Builder(Object testClassInstance) { - mTestClassInstance = Objects.requireNonNull(testClassInstance); - } - - public Builder setStrictness(Strictness strictness) { - mStrictness = Objects.requireNonNull(strictness); - return this; - } - - public Builder mockStatic(Class<?> clazz) { - Objects.requireNonNull(clazz); - Preconditions.checkState(!mMockedStaticClasses.contains(clazz), - "class %s already mocked", clazz); - mMockedStaticClasses.add(clazz); - return this; - } - - public Builder spyStatic(Class<?> clazz) { - Objects.requireNonNull(clazz); - Preconditions.checkState(!mSpiedStaticClasses.contains(clazz), - "class %s already spied", clazz); - mSpiedStaticClasses.add(clazz); - return this; - } - - public Builder dynamiclyConfigureSessionBuilder( - Visitor<StaticMockitoSessionBuilder> dynamicSessionBuilderConfigurator) { - mDynamicSessionBuilderConfigurator = Objects - .requireNonNull(dynamicSessionBuilderConfigurator); - return this; - } - - public Builder afterSessionFinished(Runnable runnable) { - mAfterSessionFinishedCallback = Objects.requireNonNull(runnable); - return this; - } - - public ExtendedMockitoRule build() { - return new ExtendedMockitoRule(this); - } - } - - private static final class SimpleStatickMockFixture implements StaticMockFixture { - - private final List<Class<?>> mMockedStaticClasses; - private final List<Class<?>> mSpiedStaticClasses; - @Nullable - private final Visitor<StaticMockitoSessionBuilder> mDynamicSessionBuilderConfigurator; - @Nullable - private final Runnable mAfterSessionFinishedCallback; - - private SimpleStatickMockFixture(List<Class<?>> mockedStaticClasses, - List<Class<?>> spiedStaticClasses, - @Nullable Visitor<StaticMockitoSessionBuilder> dynamicSessionBuilderConfigurator, - @Nullable Runnable afterSessionFinishedCallback) { - mMockedStaticClasses = mockedStaticClasses; - mSpiedStaticClasses = spiedStaticClasses; - mDynamicSessionBuilderConfigurator = dynamicSessionBuilderConfigurator; - mAfterSessionFinishedCallback = afterSessionFinishedCallback; - } - - @Override - public StaticMockitoSessionBuilder setUpMockedClasses( - StaticMockitoSessionBuilder sessionBuilder) { - mMockedStaticClasses.forEach((c) -> sessionBuilder.mockStatic(c)); - mSpiedStaticClasses.forEach((c) -> sessionBuilder.spyStatic(c)); - if (mDynamicSessionBuilderConfigurator != null) { - mDynamicSessionBuilderConfigurator.visit(sessionBuilder); - } - return sessionBuilder; - } - - @Override - public void setUpMockBehaviors() { - } - - @Override - public void tearDown() { - try { - if (mAfterSessionFinishedCallback != null) { - mAfterSessionFinishedCallback.run(); - } - } finally { - if (VERBOSE) { - Log.v(TAG, "calling Mockito.framework().clearInlineMocks()"); - } - // When using inline mock maker, clean up inline mocks to prevent OutOfMemory - // errors. See https://github.com/mockito/mockito/issues/1614 and b/259280359. - Mockito.framework().clearInlineMocks(); - } - } - } -} diff --git a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java index f1d4de9369f0..c04674066c55 100644 --- a/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/alarm/AlarmManagerServiceTest.java @@ -162,11 +162,11 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; import com.android.internal.util.ArrayUtils; +import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.AlarmManagerInternal; import com.android.server.AppStateTracker; import com.android.server.AppStateTrackerImpl; import com.android.server.DeviceIdleInternal; -import com.android.server.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.SystemClockTime.TimeConfidence; import com.android.server.SystemService; diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceInjectorTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceInjectorTest.java index 9ceb5e7b018d..405272ec79d5 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceInjectorTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceInjectorTest.java @@ -31,7 +31,7 @@ import android.os.UserManager; import android.util.Log; import android.view.Display; -import com.android.server.ExtendedMockitoRule; +import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.am.ActivityManagerService.Injector; import org.junit.Before; diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java index 6bcc14e97955..ff04728912ef 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueModernImplTest.java @@ -92,7 +92,7 @@ import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.util.FrameworkStatsLog; -import com.android.server.ExtendedMockitoRule; +import com.android.modules.utils.testing.ExtendedMockitoRule; import org.junit.After; import org.junit.Before; diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java index eb6efd2e859f..22ad7c46193b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java @@ -39,8 +39,8 @@ import android.text.TextUtils; import androidx.test.platform.app.InstrumentationRegistry; +import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.modules.utils.testing.TestableDeviceConfig; -import com.android.server.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.ServiceThread; import com.android.server.appop.AppOpsService; @@ -85,22 +85,17 @@ public final class CachedAppOptimizerTest { @Mock private PackageManagerInternal mPackageManagerInt; - private final TestableDeviceConfig mDeviceConfig = new TestableDeviceConfig(); - @Rule public final ApplicationExitInfoTest.ServiceThreadRule mServiceThreadRule = new ApplicationExitInfoTest.ServiceThreadRule(); @Rule public final ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this) - .dynamiclyConfigureSessionBuilder( - sessionBuilder -> mDeviceConfig.setUpMockedClasses(sessionBuilder)) - .build(); + .addStaticMockFixtures(TestableDeviceConfig::new).build(); @Before public void setUp() { System.loadLibrary("mockingservicestestjni"); - mDeviceConfig.setUpMockBehaviors(); mHandlerThread = new HandlerThread(""); mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); @@ -131,7 +126,6 @@ public final class CachedAppOptimizerTest { mHandlerThread.quit(); mThread.quit(); mCountDown = null; - mDeviceConfig.tearDown(); } private ProcessRecord makeProcessRecord(int pid, int uid, int packageUid, String processName, diff --git a/services/tests/mockingservicestests/src/com/android/server/cpu/CpuMonitorServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/cpu/CpuMonitorServiceTest.java index 5a5f5256e37d..994313f345db 100644 --- a/services/tests/mockingservicestests/src/com/android/server/cpu/CpuMonitorServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/cpu/CpuMonitorServiceTest.java @@ -48,7 +48,7 @@ import android.os.ServiceManager; import android.util.ArraySet; import android.util.SparseArray; -import com.android.server.ExtendedMockitoRule; +import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.Watchdog; diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java index 170076098b7d..2def023de4f3 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerController2Test.java @@ -60,7 +60,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; -import com.android.server.ExtendedMockitoRule; +import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; diff --git a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java index 5c0810fdca44..6c80f7b5f4ab 100644 --- a/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -60,7 +60,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; -import com.android.server.ExtendedMockitoRule; +import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java index 5b0e2f3800c3..3a73dd9eb101 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/ApexManagerTest.java @@ -19,6 +19,7 @@ package com.android.server.pm; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doAnswer; @@ -368,10 +369,11 @@ public class ApexManagerTest { File finalApex = extractResource("test.rebootles_apex_v2", "test.rebootless_apex_v2.apex"); ApexInfo newApexInfo = createApexInfo("test.apex_rebootless", 2, /* isActive= */ true, /* isFactory= */ false, finalApex); - when(mApexService.installAndActivatePackage(anyString())).thenReturn(newApexInfo); + when(mApexService.installAndActivatePackage(anyString(), anyBoolean())).thenReturn( + newApexInfo); File installedApex = extractResource("installed", "test.rebootless_apex_v2.apex"); - newApexInfo = mApexManager.installPackage(installedApex); + newApexInfo = mApexManager.installPackage(installedApex, /* force= */ false); var newPkg = mockParsePackage(mPackageParser2, newApexInfo); assertThat(newPkg.getBaseApkPath()).isEqualTo(finalApex.getAbsolutePath()); @@ -398,10 +400,11 @@ public class ApexManagerTest { File finalApex = extractResource("test.rebootles_apex_v2", "test.rebootless_apex_v2.apex"); ApexInfo newApexInfo = createApexInfo("test.apex_rebootless", 2, /* isActive= */ true, /* isFactory= */ false, finalApex); - when(mApexService.installAndActivatePackage(anyString())).thenReturn(newApexInfo); + when(mApexService.installAndActivatePackage(anyString(), anyBoolean())).thenReturn( + newApexInfo); File installedApex = extractResource("installed", "test.rebootless_apex_v2.apex"); - newApexInfo = mApexManager.installPackage(installedApex); + newApexInfo = mApexManager.installPackage(installedApex, /* force= */ false); var newPkg = mockParsePackage(mPackageParser2, newApexInfo); assertThat(newPkg.getBaseApkPath()).isEqualTo(finalApex.getAbsolutePath()); @@ -416,13 +419,13 @@ public class ApexManagerTest { @Test public void testInstallPackageBinderCallFails() throws Exception { - when(mApexService.installAndActivatePackage(anyString())).thenThrow( + when(mApexService.installAndActivatePackage(anyString(), anyBoolean())).thenThrow( new RuntimeException("install failed :(")); File installedApex = extractResource("test.apex_rebootless_v1", "test.rebootless_apex_v1.apex"); assertThrows(PackageManagerException.class, - () -> mApexManager.installPackage(installedApex)); + () -> mApexManager.installPackage(installedApex, /* force= */ false)); } @Test diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt index 3c753326fb7d..e578ea35518d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt @@ -567,9 +567,8 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) { @Throws(Exception::class) private fun stageInstantAppResolverScan() { - whenever(mocks.resources.getStringArray(R.array.config_ephemeralResolverPackage)) { - arrayOf("com.android.test.ephemeral.resolver") - } + doReturn(arrayOf("com.android.test.ephemeral.resolver")) + .whenever(mocks.resources).getStringArray(R.array.config_ephemeralResolverPackage) stageScanNewPackage("com.android.test.ephemeral.resolver", 1L, getPartitionFromFlag(PackageManagerService.SCAN_AS_PRODUCT).privAppFolder, withPackage = { pkg: PackageImpl -> diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java index e7b3e6f88dce..7cd88196bf1b 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java @@ -41,7 +41,7 @@ import android.util.SparseArray; import androidx.test.annotation.UiThreadTest; import com.android.internal.widget.LockSettingsInternal; -import com.android.server.ExtendedMockitoRule; +import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.UserState; import com.android.server.pm.UserManagerService.UserData; diff --git a/services/tests/mockingservicestests/src/com/android/server/trust/OWNERS b/services/tests/mockingservicestests/src/com/android/server/trust/OWNERS new file mode 100644 index 000000000000..e2c6ce15b51e --- /dev/null +++ b/services/tests/mockingservicestests/src/com/android/server/trust/OWNERS @@ -0,0 +1 @@ +include /core/java/android/service/trust/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java b/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java index 90df786e5970..45e7f3512975 100644 --- a/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java +++ b/services/tests/servicestests/src/com/android/server/CertBlacklisterTest.java @@ -34,10 +34,10 @@ import libcore.io.IoUtils; */ public class CertBlacklisterTest extends AndroidTestCase { - private static final String BLACKLIST_ROOT = System.getenv("ANDROID_DATA") + "/misc/keychain/"; + private static final String DENYLIST_ROOT = System.getenv("ANDROID_DATA") + "/misc/keychain/"; - public static final String PUBKEY_PATH = BLACKLIST_ROOT + "pubkey_blacklist.txt"; - public static final String SERIAL_PATH = BLACKLIST_ROOT + "serial_blacklist.txt"; + public static final String PUBKEY_PATH = DENYLIST_ROOT + "pubkey_blacklist.txt"; + public static final String SERIAL_PATH = DENYLIST_ROOT + "serial_blacklist.txt"; public static final String PUBKEY_KEY = "pubkey_blacklist"; public static final String SERIAL_KEY = "serial_blacklist"; diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java index d5d06d3b4eb8..3f20f8a0bcd9 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java @@ -150,28 +150,6 @@ public class FaceAuthenticationClientTest { } @Test - public void testLockoutEndsOperation() throws RemoteException { - final FaceAuthenticationClient client = createClient(2); - client.start(mCallback); - client.onLockoutPermanent(); - - verify(mClientMonitorCallbackConverter).onError(anyInt(), anyInt(), - eq(FACE_ERROR_LOCKOUT_PERMANENT), anyInt()); - verify(mCallback).onClientFinished(client, false); - } - - @Test - public void testTemporaryLockoutEndsOperation() throws RemoteException { - final FaceAuthenticationClient client = createClient(2); - client.start(mCallback); - client.onLockoutTimed(1000); - - verify(mClientMonitorCallbackConverter).onError(anyInt(), anyInt(), - eq(FACE_ERROR_LOCKOUT), anyInt()); - verify(mCallback).onClientFinished(client, false); - } - - @Test public void notifyHalWhenContextChanges() throws RemoteException { final FaceAuthenticationClient client = createClient(); client.start(mCallback); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java index 31a58cd67d3e..d1d6e9d41b1f 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceProviderTest.java @@ -36,7 +36,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.platform.test.annotations.Presubmit; -import androidx.annotation.NonNull; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -73,7 +72,7 @@ public class FaceProviderTest { private SensorProps[] mSensorProps; private LockoutResetDispatcher mLockoutResetDispatcher; - private TestableFaceProvider mFaceProvider; + private FaceProvider mFaceProvider; private static void waitForIdle() { InstrumentationRegistry.getInstrumentation().waitForIdleSync(); @@ -98,8 +97,9 @@ public class FaceProviderTest { mLockoutResetDispatcher = new LockoutResetDispatcher(mContext); - mFaceProvider = new TestableFaceProvider(mDaemon, mContext, mBiometricStateCallback, - mSensorProps, TAG, mLockoutResetDispatcher, mBiometricContext); + mFaceProvider = new FaceProvider(mContext, mBiometricStateCallback, + mSensorProps, TAG, mLockoutResetDispatcher, mBiometricContext, + mDaemon); } @Test @@ -130,6 +130,7 @@ public class FaceProviderTest { for (SensorProps prop : mSensorProps) { final BiometricScheduler scheduler = mFaceProvider.mFaceSensors.get(prop.commonProps.sensorId).getScheduler(); + scheduler.reset(); for (int i = 0; i < numFakeOperations; i++) { final HalClientMonitor testMonitor = mock(HalClientMonitor.class); when(testMonitor.getFreshDaemon()).thenReturn(new Object()); @@ -142,7 +143,7 @@ public class FaceProviderTest { for (SensorProps prop : mSensorProps) { final BiometricScheduler scheduler = mFaceProvider.mFaceSensors.get(prop.commonProps.sensorId).getScheduler(); - assertEquals(numFakeOperations, scheduler.getCurrentPendingCount()); + assertEquals(numFakeOperations - 1, scheduler.getCurrentPendingCount()); assertNotNull(scheduler.getCurrentClient()); } @@ -159,25 +160,4 @@ public class FaceProviderTest { assertEquals(0, scheduler.getCurrentPendingCount()); } } - - private static class TestableFaceProvider extends FaceProvider { - private final IFace mDaemon; - - TestableFaceProvider(@NonNull IFace daemon, - @NonNull Context context, - @NonNull BiometricStateCallback biometricStateCallback, - @NonNull SensorProps[] props, - @NonNull String halInstanceName, - @NonNull LockoutResetDispatcher lockoutResetDispatcher, - @NonNull BiometricContext biometricContext) { - super(context, biometricStateCallback, props, halInstanceName, lockoutResetDispatcher, - biometricContext); - mDaemon = daemon; - } - - @Override - synchronized IFace getHalInstance() { - return mDaemon; - } - } } diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java index 9c01de6f0461..8f6efffcbff8 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProviderTest.java @@ -39,7 +39,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.platform.test.annotations.Presubmit; -import androidx.annotation.NonNull; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -81,7 +80,7 @@ public class FingerprintProviderTest { private SensorProps[] mSensorProps; private LockoutResetDispatcher mLockoutResetDispatcher; - private TestableFingerprintProvider mFingerprintProvider; + private FingerprintProvider mFingerprintProvider; private static void waitForIdle() { InstrumentationRegistry.getInstrumentation().waitForIdleSync(); @@ -110,17 +109,13 @@ public class FingerprintProviderTest { mLockoutResetDispatcher = new LockoutResetDispatcher(mContext); - mFingerprintProvider = new TestableFingerprintProvider(mDaemon, mContext, + mFingerprintProvider = new FingerprintProvider(mContext, mBiometricStateCallback, mSensorProps, TAG, mLockoutResetDispatcher, - mGestureAvailabilityDispatcher, mBiometricContext); + mGestureAvailabilityDispatcher, mBiometricContext, mDaemon); } @Test public void testAddingSensors() { - mFingerprintProvider = new TestableFingerprintProvider(mDaemon, mContext, - mBiometricStateCallback, mSensorProps, TAG, mLockoutResetDispatcher, - mGestureAvailabilityDispatcher, mBiometricContext); - waitForIdle(); for (SensorProps prop : mSensorProps) { @@ -147,6 +142,7 @@ public class FingerprintProviderTest { final BiometricScheduler scheduler = mFingerprintProvider.mFingerprintSensors.get(prop.commonProps.sensorId) .getScheduler(); + scheduler.reset(); for (int i = 0; i < numFakeOperations; i++) { final HalClientMonitor testMonitor = mock(HalClientMonitor.class); when(testMonitor.getFreshDaemon()).thenReturn(new Object()); @@ -160,7 +156,7 @@ public class FingerprintProviderTest { final BiometricScheduler scheduler = mFingerprintProvider.mFingerprintSensors.get(prop.commonProps.sensorId) .getScheduler(); - assertEquals(numFakeOperations, scheduler.getCurrentPendingCount()); + assertEquals(numFakeOperations - 1, scheduler.getCurrentPendingCount()); assertNotNull(scheduler.getCurrentClient()); } @@ -178,26 +174,4 @@ public class FingerprintProviderTest { assertEquals(0, scheduler.getCurrentPendingCount()); } } - - private static class TestableFingerprintProvider extends FingerprintProvider { - private final IFingerprint mDaemon; - - TestableFingerprintProvider(@NonNull IFingerprint daemon, - @NonNull Context context, - @NonNull BiometricStateCallback biometricStateCallback, - @NonNull SensorProps[] props, - @NonNull String halInstanceName, - @NonNull LockoutResetDispatcher lockoutResetDispatcher, - @NonNull GestureAvailabilityDispatcher gestureAvailabilityDispatcher, - @NonNull BiometricContext biometricContext) { - super(context, biometricStateCallback, props, halInstanceName, lockoutResetDispatcher, - gestureAvailabilityDispatcher, biometricContext); - mDaemon = daemon; - } - - @Override - synchronized IFingerprint getHalInstance() { - return mDaemon; - } - } } diff --git a/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java index 668415041129..d8e4fdae5a34 100644 --- a/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java @@ -18,6 +18,8 @@ package com.android.server.devicestate; import static android.hardware.devicestate.DeviceStateManager.INVALID_DEVICE_STATE; +import static com.android.compatibility.common.util.PollingCheck.waitFor; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; @@ -41,6 +43,7 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.FlakyTest; import androidx.test.runner.AndroidJUnit4; +import com.android.compatibility.common.util.PollingCheck; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowProcessController; @@ -81,6 +84,8 @@ public final class DeviceStateManagerServiceTest { private static final int FAKE_PROCESS_ID = 100; + private static final int TIMEOUT = 2000; + private TestDeviceStatePolicy mPolicy; private TestDeviceStateProvider mProvider; private DeviceStateManagerService mService; @@ -118,6 +123,10 @@ public final class DeviceStateManagerServiceTest { } } + private void waitAndAssert(PollingCheck.PollingCheckCondition condition) { + waitFor(TIMEOUT, condition); + } + @Test public void baseStateChanged() { assertEquals(mService.getCommittedState(), Optional.of(DEFAULT_DEVICE_STATE)); @@ -298,37 +307,34 @@ public final class DeviceStateManagerServiceTest { mService.getBinderService().registerCallback(callback); mProvider.setState(OTHER_DEVICE_STATE.getIdentifier()); - flushHandler(); - assertEquals(callback.getLastNotifiedInfo().baseState, - OTHER_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - OTHER_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + == OTHER_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + == OTHER_DEVICE_STATE.getIdentifier()); mProvider.setState(DEFAULT_DEVICE_STATE.getIdentifier()); - flushHandler(); - assertEquals(callback.getLastNotifiedInfo().baseState, - DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - DEFAULT_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + == DEFAULT_DEVICE_STATE.getIdentifier()); + + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + == DEFAULT_DEVICE_STATE.getIdentifier()); mPolicy.blockConfigure(); mProvider.setState(OTHER_DEVICE_STATE.getIdentifier()); - flushHandler(); // The callback should not have been notified of the state change as the policy is still // pending callback. - assertEquals(callback.getLastNotifiedInfo().baseState, - DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - DEFAULT_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + == DEFAULT_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + == DEFAULT_DEVICE_STATE.getIdentifier()); mPolicy.resumeConfigure(); - flushHandler(); // Now that the policy is finished processing the callback should be notified of the state // change. - assertEquals(callback.getLastNotifiedInfo().baseState, - OTHER_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().currentState, - OTHER_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + == OTHER_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().currentState + == OTHER_DEVICE_STATE.getIdentifier()); } @Test @@ -370,13 +376,9 @@ public final class DeviceStateManagerServiceTest { mService.getBinderService().requestState(token, OTHER_DEVICE_STATE.getIdentifier(), 0 /* flags */); - // Flush the handler twice. The first flush ensures the request is added and the policy is - // notified, while the second flush ensures the callback is notified once the change is - // committed. - flushHandler(2 /* count */); - assertEquals(callback.getLastNotifiedStatus(token), - TestDeviceStateManagerCallback.STATUS_ACTIVE); + waitAndAssert(() -> callback.getLastNotifiedStatus(token) + == TestDeviceStateManagerCallback.STATUS_ACTIVE); // Committed state changes as there is a requested override. assertEquals(mService.getCommittedState(), Optional.of(OTHER_DEVICE_STATE)); assertEquals(mSysPropSetter.getValue(), @@ -393,12 +395,11 @@ public final class DeviceStateManagerServiceTest { OTHER_DEVICE_STATE.getIdentifier()); mService.getBinderService().cancelStateRequest(); - flushHandler(); - assertEquals(callback.getLastNotifiedStatus(token), - TestDeviceStateManagerCallback.STATUS_CANCELED); + waitAndAssert(() -> callback.getLastNotifiedStatus(token) + == TestDeviceStateManagerCallback.STATUS_CANCELED); // Committed state is set back to the requested state once the override is cleared. - assertEquals(mService.getCommittedState(), Optional.of(DEFAULT_DEVICE_STATE)); + waitAndAssert(() -> mService.getCommittedState().equals(Optional.of(DEFAULT_DEVICE_STATE))); assertEquals(mSysPropSetter.getValue(), DEFAULT_DEVICE_STATE.getIdentifier() + ":" + DEFAULT_DEVICE_STATE.getName()); assertEquals(mService.getBaseState(), Optional.of(DEFAULT_DEVICE_STATE)); @@ -691,13 +692,9 @@ public final class DeviceStateManagerServiceTest { mService.getBinderService().requestBaseStateOverride(token, OTHER_DEVICE_STATE.getIdentifier(), 0 /* flags */); - // Flush the handler twice. The first flush ensures the request is added and the policy is - // notified, while the second flush ensures the callback is notified once the change is - // committed. - flushHandler(2 /* count */); - assertEquals(callback.getLastNotifiedStatus(token), - TestDeviceStateManagerCallback.STATUS_ACTIVE); + waitAndAssert(() -> callback.getLastNotifiedStatus(token) + == TestDeviceStateManagerCallback.STATUS_ACTIVE); // Committed state changes as there is a requested override. assertEquals(mService.getCommittedState(), Optional.of(OTHER_DEVICE_STATE)); assertEquals(mSysPropSetter.getValue(), @@ -715,12 +712,11 @@ public final class DeviceStateManagerServiceTest { OTHER_DEVICE_STATE.getIdentifier()); mService.getBinderService().cancelBaseStateOverride(); - flushHandler(); - assertEquals(callback.getLastNotifiedStatus(token), - TestDeviceStateManagerCallback.STATUS_CANCELED); + waitAndAssert(() -> callback.getLastNotifiedStatus(token) + == TestDeviceStateManagerCallback.STATUS_CANCELED); // Committed state is set back to the requested state once the override is cleared. - assertEquals(mService.getCommittedState(), Optional.of(DEFAULT_DEVICE_STATE)); + waitAndAssert(() -> mService.getCommittedState().equals(Optional.of(DEFAULT_DEVICE_STATE))); assertEquals(mSysPropSetter.getValue(), DEFAULT_DEVICE_STATE.getIdentifier() + ":" + DEFAULT_DEVICE_STATE.getName()); assertEquals(mService.getBaseState(), Optional.of(DEFAULT_DEVICE_STATE)); @@ -729,8 +725,8 @@ public final class DeviceStateManagerServiceTest { assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), DEFAULT_DEVICE_STATE.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().baseState, - DEFAULT_DEVICE_STATE.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + == DEFAULT_DEVICE_STATE.getIdentifier()); assertEquals(callback.getLastNotifiedInfo().currentState, DEFAULT_DEVICE_STATE.getIdentifier()); } @@ -751,13 +747,9 @@ public final class DeviceStateManagerServiceTest { mService.getBinderService().requestBaseStateOverride(token, OTHER_DEVICE_STATE.getIdentifier(), 0 /* flags */); - // Flush the handler twice. The first flush ensures the request is added and the policy is - // notified, while the second flush ensures the callback is notified once the change is - // committed. - flushHandler(2 /* count */); - assertEquals(callback.getLastNotifiedStatus(token), - TestDeviceStateManagerCallback.STATUS_ACTIVE); + waitAndAssert(() -> callback.getLastNotifiedStatus(token) + == TestDeviceStateManagerCallback.STATUS_ACTIVE); // Committed state changes as there is a requested override. assertEquals(mService.getCommittedState(), Optional.of(OTHER_DEVICE_STATE)); assertEquals(mSysPropSetter.getValue(), @@ -775,12 +767,11 @@ public final class DeviceStateManagerServiceTest { OTHER_DEVICE_STATE.getIdentifier()); mProvider.setState(testDeviceState.getIdentifier()); - flushHandler(); - assertEquals(callback.getLastNotifiedStatus(token), - TestDeviceStateManagerCallback.STATUS_CANCELED); + waitAndAssert(() -> callback.getLastNotifiedStatus(token) + == TestDeviceStateManagerCallback.STATUS_CANCELED); // Committed state is set to the new base state once the override is cleared. - assertEquals(mService.getCommittedState(), Optional.of(testDeviceState)); + waitAndAssert(() -> mService.getCommittedState().equals(Optional.of(testDeviceState))); assertEquals(mSysPropSetter.getValue(), testDeviceState.getIdentifier() + ":" + testDeviceState.getName()); assertEquals(mService.getBaseState(), Optional.of(testDeviceState)); @@ -789,8 +780,8 @@ public final class DeviceStateManagerServiceTest { assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), testDeviceState.getIdentifier()); - assertEquals(callback.getLastNotifiedInfo().baseState, - testDeviceState.getIdentifier()); + waitAndAssert(() -> callback.getLastNotifiedInfo().baseState + == testDeviceState.getIdentifier()); assertEquals(callback.getLastNotifiedInfo().currentState, testDeviceState.getIdentifier()); } diff --git a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java index e9a7d85ae755..c616481a9633 100644 --- a/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java +++ b/services/tests/servicestests/src/com/android/server/graphics/fonts/UpdatableFontDirTest.java @@ -140,7 +140,9 @@ public final class UpdatableFontDirTest { private List<File> mPreinstalledFontDirs; private final Supplier<Long> mCurrentTimeSupplier = () -> CURRENT_TIME; private final Function<Map<String, File>, FontConfig> mConfigSupplier = - (map) -> SystemFonts.getSystemFontConfig(map, 0, 0); + // /system/etc/font_fallback.xml is not accessible from application process, so + // use legacy fonts.xml for testing. + (map) -> SystemFonts.getSystemFontConfigForTesting("/system/etc/fonts.xml", map, 0, 0); private FakeFontFileParser mParser; private FakeFsverityUtil mFakeFsverityUtil; diff --git a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java index 9ca84d33998c..ce15c6d30531 100644 --- a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java @@ -218,7 +218,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void updateRuleSet_notSystemApp() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(false); Rule rule = new Rule( @@ -237,7 +237,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void updateRuleSet_authorized() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); Rule rule = new Rule( @@ -251,7 +251,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void updateRuleSet_correctMethodCall() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); IntentSender mockReceiver = mock(IntentSender.class); List<Rule> rules = @@ -271,7 +271,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void updateRuleSet_fail() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); doThrow(new IOException()).when(mIntegrityFileManager).writeRules(any(), any(), any()); IntentSender mockReceiver = mock(IntentSender.class); @@ -292,7 +292,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void broadcastReceiverRegistration() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); ArgumentCaptor<IntentFilter> intentFilterCaptor = ArgumentCaptor.forClass(IntentFilter.class); @@ -308,7 +308,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void handleBroadcast_correctArgs() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); @@ -345,7 +345,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void handleBroadcast_correctArgs_multipleCerts() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); @@ -368,7 +368,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void handleBroadcast_correctArgs_sourceStamp() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); @@ -393,7 +393,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void handleBroadcast_allow() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); @@ -412,7 +412,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void handleBroadcast_reject() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = ArgumentCaptor.forClass(BroadcastReceiver.class); @@ -438,7 +438,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void handleBroadcast_notInitialized() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); when(mIntegrityFileManager.initialized()).thenReturn(false); ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = @@ -459,7 +459,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void verifierAsInstaller_skipIntegrityVerification() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); setIntegrityCheckIncludesRuleProvider(false); ArgumentCaptor<BroadcastReceiver> broadcastReceiverCaptor = @@ -480,7 +480,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void getCurrentRules() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); Rule rule = new Rule(IntegrityFormula.Application.packageNameEquals("package"), Rule.DENY); when(mIntegrityFileManager.readRules(any())).thenReturn(Arrays.asList(rule)); @@ -490,7 +490,7 @@ public class AppIntegrityManagerServiceImplTest { @Test public void getWhitelistedRuleProviders_returnsEmptyForNonSystemApps() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(false); assertThat(mService.getWhitelistedRuleProviders()).isEmpty(); @@ -498,13 +498,13 @@ public class AppIntegrityManagerServiceImplTest { @Test public void getWhitelistedRuleProviders() throws Exception { - whitelistUsAsRuleProvider(); + allowlistUsAsRuleProvider(); makeUsSystemApp(); assertThat(mService.getWhitelistedRuleProviders()).containsExactly(TEST_FRAMEWORK_PACKAGE); } - private void whitelistUsAsRuleProvider() { + private void allowlistUsAsRuleProvider() { Resources mockResources = mock(Resources.class); when(mockResources.getStringArray(R.array.config_integrityRuleProviderPackages)) .thenReturn(new String[] {TEST_FRAMEWORK_PACKAGE}); diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java index cc1100b1fd22..5654c89196f2 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java @@ -469,7 +469,7 @@ public class KeySyncTaskTest { verify(mTestOnlyInsecureCertificateHelper, atLeast(1)) .isTestOnlyCertificateAlias(eq(TEST_ROOT_CERT_ALIAS)); - // no whitelists check + // no allowlists check verify(mTestOnlyInsecureCertificateHelper, never()) .doesCredentialSupportInsecureMode(anyInt(), any()); verify(mTestOnlyInsecureCertificateHelper, never()) diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java index c04df30cb6fd..2a764526a436 100644 --- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java @@ -157,6 +157,7 @@ import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionPlan; +import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.MediumTest; import android.text.TextUtils; @@ -247,6 +248,7 @@ public class NetworkPolicyManagerServiceTest { private static final String TEST_WIFI_NETWORK_KEY = "TestWifiNetworkKey"; private static final String TEST_IMSI = "310210"; private static final int TEST_SUB_ID = 42; + private static final int TEST_SUB_ID2 = 24; private static final Network TEST_NETWORK = mock(Network.class, CALLS_REAL_METHODS); private static NetworkTemplate sTemplateWifi = new NetworkTemplate.Builder(MATCH_WIFI) @@ -288,6 +290,8 @@ public class NetworkPolicyManagerServiceTest { private ArgumentCaptor<ConnectivityManager.NetworkCallback> mNetworkCallbackCaptor = ArgumentCaptor.forClass(ConnectivityManager.NetworkCallback.class); + private TelephonyCallback.ActiveDataSubscriptionIdListener mActiveDataSubIdListener; + private ActivityManagerInternal mActivityManagerInternal; private PackageManagerInternal mPackageManagerInternal; @@ -363,6 +367,8 @@ public class NetworkPolicyManagerServiceTest { private class TestDependencies extends NetworkPolicyManagerService.Dependencies { private final SparseArray<NetworkStats.Bucket> mMockedStats = new SparseArray<>(); + private int mMockDefaultDataSubId; + private int mMockedActiveDataSubId; TestDependencies(Context context) { super(context); @@ -400,6 +406,21 @@ public class NetworkPolicyManagerServiceTest { final NetworkStats.Bucket bucket = mMockedStats.get(uid); setMockedTotalBytes(uid, bucket.getRxBytes() + rxBytes, bucket.getTxBytes() + txBytes); } + + void setDefaultAndActiveDataSubId(int defaultDataSubId, int activeDataSubId) { + mMockDefaultDataSubId = defaultDataSubId; + mMockedActiveDataSubId = activeDataSubId; + } + + @Override + int getDefaultDataSubId() { + return mMockDefaultDataSubId; + } + + @Override + int getActivateDataSubId() { + return mMockedActiveDataSubId; + } } // TODO: Use TestLooperManager instead. @@ -577,6 +598,14 @@ public class NetworkPolicyManagerServiceTest { NetworkPolicy defaultPolicy = mService.buildDefaultCarrierPolicy(0, ""); mDefaultWarningBytes = defaultPolicy.warningBytes; mDefaultLimitBytes = defaultPolicy.limitBytes; + + // Catch TelephonyCallback during systemReady(). + ArgumentCaptor<TelephonyCallback> telephonyCallbackArgumentCaptor = + ArgumentCaptor.forClass(TelephonyCallback.class); + verify(mTelephonyManager).registerTelephonyCallback(any(), + telephonyCallbackArgumentCaptor.capture()); + mActiveDataSubIdListener = (TelephonyCallback.ActiveDataSubscriptionIdListener) + telephonyCallbackArgumentCaptor.getValue(); } @After @@ -1357,6 +1386,7 @@ public class NetworkPolicyManagerServiceTest { reset(mTelephonyManager, mNetworkManager, mNotifManager); TelephonyManager tmSub = expectMobileDefaults(); + clearInvocations(mNotifManager); mService.updateNetworks(); @@ -1372,6 +1402,7 @@ public class NetworkPolicyManagerServiceTest { reset(mTelephonyManager, mNetworkManager, mNotifManager); TelephonyManager tmSub = expectMobileDefaults(); + clearInvocations(mNotifManager); mService.updateNetworks(); @@ -1389,6 +1420,7 @@ public class NetworkPolicyManagerServiceTest { reset(mTelephonyManager, mNetworkManager, mNotifManager); TelephonyManager tmSub = expectMobileDefaults(); expectDefaultCarrierConfig(); + clearInvocations(mNotifManager); mService.updateNetworks(); @@ -1405,6 +1437,7 @@ public class NetworkPolicyManagerServiceTest { reset(mTelephonyManager, mNetworkManager, mNotifManager); TelephonyManager tmSub = expectMobileDefaults(); + clearInvocations(mNotifManager); mService.updateNetworks(); @@ -1418,6 +1451,7 @@ public class NetworkPolicyManagerServiceTest { { reset(mTelephonyManager, mNetworkManager, mNotifManager); TelephonyManager tmSub = expectMobileDefaults(); + clearInvocations(mNotifManager); mService.snoozeLimit(sTemplateCarrierMetered); mService.updateNetworks(); @@ -1428,6 +1462,31 @@ public class NetworkPolicyManagerServiceTest { verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_LIMIT_SNOOZED), isA(Notification.class), eq(UserHandle.ALL)); } + // The sub is no longer used for data(e.g. user uses another sub), hide the notifications. + { + reset(mTelephonyManager, mNetworkManager, mNotifManager); + + notifyDefaultAndActiveDataSubIdChange(TEST_SUB_ID2, TEST_SUB_ID2); + verify(mNotifManager, atLeastOnce()).cancel(any(), eq(TYPE_LIMIT_SNOOZED)); + } + // The sub is not active for data(e.g. due to auto data switch), but still default for data, + // show notification. + { + reset(mTelephonyManager, mNetworkManager, mNotifManager); + + notifyDefaultAndActiveDataSubIdChange(TEST_SUB_ID, TEST_SUB_ID2); + verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_LIMIT_SNOOZED), + isA(Notification.class), eq(UserHandle.ALL)); + } + // The sub is active for data, but not the default(e.g. due to auto data switch), + // show notification. + { + reset(mTelephonyManager, mNetworkManager, mNotifManager); + + notifyDefaultAndActiveDataSubIdChange(TEST_SUB_ID2, TEST_SUB_ID); + verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_LIMIT_SNOOZED), + isA(Notification.class), eq(UserHandle.ALL)); + } } @Test @@ -2508,6 +2567,7 @@ public class NetworkPolicyManagerServiceTest { String subscriberId) { when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn( createSubscriptionInfoList(subscriptionId)); + notifyDefaultAndActiveDataSubIdChange(subscriptionId, subscriptionId); TelephonyManager subTelephonyManager; subTelephonyManager = mock(TelephonyManager.class); @@ -2519,6 +2579,16 @@ public class NetworkPolicyManagerServiceTest { } /** + * Telephony Manager callback notifies data sub Id changes. + * @param defaultDataSubId The mock default data sub Id. + * @param activeDataSubId The mock active data sub Id. + */ + private void notifyDefaultAndActiveDataSubIdChange(int defaultDataSubId, int activeDataSubId) { + mDeps.setDefaultAndActiveDataSubId(defaultDataSubId, activeDataSubId); + mActiveDataSubIdListener.onActiveDataSubscriptionIdChanged(activeDataSubId); + } + + /** * Creates mock {@link SubscriptionInfo} from subscription id. */ private List<SubscriptionInfo> createSubscriptionInfoList(int subId) { diff --git a/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java b/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java index 77bdf198edf3..3a3ab84b1c89 100644 --- a/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/SELinuxMMACTest.java @@ -18,6 +18,8 @@ package com.android.server.pm; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; +import static org.hamcrest.core.StringContains.containsString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; @@ -53,7 +55,7 @@ public class SELinuxMMACTest { @Test public void getSeInfoOptInToLatest() { - var packageState = makePackageState(Build.VERSION_CODES.P); + var packageState = new PackageStateBuilder(Build.VERSION_CODES.P).build(); when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) .thenReturn(true); @@ -64,7 +66,7 @@ public class SELinuxMMACTest { @Test public void getSeInfoOptInToR() { - var packageState = makePackageState(Build.VERSION_CODES.P); + var packageState = new PackageStateBuilder(Build.VERSION_CODES.P).build(); when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_R_CHANGES), argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) .thenReturn(true); @@ -75,7 +77,7 @@ public class SELinuxMMACTest { @Test public void getSeInfoNoOptIn() { - var packageState = makePackageState(Build.VERSION_CODES.P); + var packageState = new PackageStateBuilder(Build.VERSION_CODES.P).build(); when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) .thenReturn(false); @@ -86,7 +88,7 @@ public class SELinuxMMACTest { @Test public void getSeInfoNoOptInButAlreadyLatest() { - var packageState = makePackageState(LATEST_OPT_IN_VERSION); + var packageState = new PackageStateBuilder(LATEST_OPT_IN_VERSION).build(); when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) .thenReturn(false); @@ -97,7 +99,7 @@ public class SELinuxMMACTest { @Test public void getSeInfoTargetingCurDevelopment() { - var packageState = makePackageState(Build.VERSION_CODES.CUR_DEVELOPMENT); + var packageState = new PackageStateBuilder(Build.VERSION_CODES.CUR_DEVELOPMENT).build(); when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) .thenReturn(true); @@ -108,7 +110,7 @@ public class SELinuxMMACTest { @Test public void getSeInfoNoOptInButAlreadyR() { - var packageState = makePackageState(R_OPT_IN_VERSION); + var packageState = new PackageStateBuilder(R_OPT_IN_VERSION).build(); when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_R_CHANGES), argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) .thenReturn(false); @@ -119,7 +121,7 @@ public class SELinuxMMACTest { @Test public void getSeInfoOptInRButLater() { - var packageState = makePackageState(R_OPT_IN_VERSION + 1); + var packageState = new PackageStateBuilder(R_OPT_IN_VERSION + 1).build(); when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_R_CHANGES), argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) .thenReturn(true); @@ -128,15 +130,114 @@ public class SELinuxMMACTest { is("default:targetSdkVersion=" + (R_OPT_IN_VERSION + 1))); } - private PackageState makePackageState(int targetSdkVersion) { - var packageState = Mockito.mock(PackageState.class); - when(packageState.getPackageName()).thenReturn(PACKAGE_NAME); - when(packageState.getAndroidPackage()).thenReturn( - ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) - .setTargetSdkVersion(targetSdkVersion) - .hideAsParsed()) - .hideAsFinal() - ); - return packageState; + @Test + public void getSeInfoPreinstalledToSystem() { + var packageState = new PackageStateBuilder(Build.VERSION_CODES.CUR_DEVELOPMENT) + .setSystem(true).build(); + when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), + argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) + .thenReturn(true); + assertThat(SELinuxMMAC.getSeInfo(packageState, packageState.getAndroidPackage(), null, + mMockCompatibility), + containsString(":partition=system")); + } + + + @Test + public void getSeInfoPreinstalledToSystemExt() { + var packageState = new PackageStateBuilder(Build.VERSION_CODES.CUR_DEVELOPMENT) + .setSystem(true).setSystemExt(true).build(); + when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), + argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) + .thenReturn(true); + assertThat(SELinuxMMAC.getSeInfo(packageState, packageState.getAndroidPackage(), null, + mMockCompatibility), + containsString(":partition=system_ext")); + } + + + @Test + public void getSeInfoPreinstalledToProduct() { + var packageState = new PackageStateBuilder(Build.VERSION_CODES.CUR_DEVELOPMENT) + .setSystem(true).setProduct(true).build(); + when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), + argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) + .thenReturn(true); + assertThat(SELinuxMMAC.getSeInfo(packageState, packageState.getAndroidPackage(), null, + mMockCompatibility), + containsString(":partition=product")); + } + + + @Test + public void getSeInfoPreinstalledToVendor() { + var packageState = new PackageStateBuilder(Build.VERSION_CODES.CUR_DEVELOPMENT) + .setSystem(true).setVendor(true).build(); + when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), + argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) + .thenReturn(true); + assertThat(SELinuxMMAC.getSeInfo(packageState, packageState.getAndroidPackage(), null, + mMockCompatibility), + containsString(":partition=vendor")); + } + + + @Test + public void getSeInfoNotPreinstalled() { + var packageState = new PackageStateBuilder(Build.VERSION_CODES.CUR_DEVELOPMENT).build(); + when(mMockCompatibility.isChangeEnabledInternal(eq(SELinuxMMAC.SELINUX_LATEST_CHANGES), + argThat(argument -> argument.packageName.equals(packageState.getPackageName())))) + .thenReturn(true); + assertThat(SELinuxMMAC.getSeInfo(packageState, packageState.getAndroidPackage(), null, + mMockCompatibility), + not(containsString(":partition="))); + } + + private static class PackageStateBuilder { + private final int mTargetSdkVersion; + private boolean mIsSystem = false; + private boolean mIsSystemExt = false; + private boolean mIsProduct = false; + private boolean mIsVendor = false; + + PackageStateBuilder(int targetSdkVersion) { + mTargetSdkVersion = targetSdkVersion; + } + + PackageStateBuilder setSystem(boolean isSystem) { + mIsSystem = isSystem; + return this; + } + + PackageStateBuilder setSystemExt(boolean isSystemExt) { + mIsSystemExt = isSystemExt; + return this; + } + + PackageStateBuilder setProduct(boolean isProduct) { + mIsProduct = isProduct; + return this; + } + + PackageStateBuilder setVendor(boolean isVendor) { + mIsVendor = isVendor; + return this; + } + + PackageState build() { + var packageState = Mockito.mock(PackageState.class); + when(packageState.getPackageName()).thenReturn(PACKAGE_NAME); + when(packageState.getAndroidPackage()).thenReturn( + ((ParsedPackage) PackageImpl.forTesting(PACKAGE_NAME) + .setTargetSdkVersion(mTargetSdkVersion) + .hideAsParsed()) + .hideAsFinal() + ); + when(packageState.isSystem()).thenReturn(mIsSystem); + when(packageState.isSystemExt()).thenReturn(mIsSystemExt); + when(packageState.isProduct()).thenReturn(mIsProduct); + when(packageState.isVendor()).thenReturn(mIsVendor); + return packageState; + } } } diff --git a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java index cca924e3f496..77986442261d 100644 --- a/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/UserSystemPackageInstallerTest.java @@ -117,7 +117,7 @@ public class UserSystemPackageInstallerTest { for (int userId : mRemoveUsers) { um.removeUser(userId); } - setUserTypePackageWhitelistMode(mOriginalWhitelistMode); + setUserTypePackageAllowlistMode(mOriginalWhitelistMode); } /** @@ -184,7 +184,7 @@ public class UserSystemPackageInstallerTest { } } - final ArrayMap<String, Long> expectedOutput = getNewPackageToWhitelistedBitSetMap(); + final ArrayMap<String, Long> expectedOutput = getNewPackageToAllowlistedBitSetMap(); expectedOutput.put("com.android.package1", expectedUserTypeBitSet1); expectedOutput.put("com.android.package2", expectedUserTypeBitSet2); expectedOutput.put("com.android.package3", expectedUserTypeBitSet3); @@ -227,7 +227,7 @@ public class UserSystemPackageInstallerTest { } }; - final ArrayMap<String, Long> expectedOutput = getNewPackageToWhitelistedBitSetMap(); + final ArrayMap<String, Long> expectedOutput = getNewPackageToAllowlistedBitSetMap(); expectedOutput.put("com.android.package2", 0L); expectedOutput.put("com.android.package3", 0L); expectedOutput.put("com.android.package4", 0L); @@ -340,7 +340,7 @@ public class UserSystemPackageInstallerTest { public void testPackagesForCreateUser_full() { final String userTypeToCreate = USER_TYPE_FULL_SECONDARY; final long userTypeMask = mUserSystemPackageInstaller.getUserTypeMask(userTypeToCreate); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); PackageManager pm = mContext.getPackageManager(); final SystemConfig sysConfig = new SystemConfigTestClass(true); @@ -384,7 +384,7 @@ public class UserSystemPackageInstallerTest { */ @Test public void testInstallOverlayPackagesExplicitMode() { - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); final String[] userTypes = new String[]{"type"}; final long maskOfType = 0b0001L; @@ -453,49 +453,49 @@ public class UserSystemPackageInstallerTest { */ @Test public void testSetWhitelistEnabledMode() { - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_DISABLE); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_DISABLE); assertFalse(mUserSystemPackageInstaller.isLogMode()); assertFalse(mUserSystemPackageInstaller.isEnforceMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistSystemMode()); assertFalse(mUserSystemPackageInstaller.isIgnoreOtaMode()); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_LOG); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_LOG); assertTrue(mUserSystemPackageInstaller.isLogMode()); assertFalse(mUserSystemPackageInstaller.isEnforceMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistSystemMode()); assertFalse(mUserSystemPackageInstaller.isIgnoreOtaMode()); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); assertFalse(mUserSystemPackageInstaller.isLogMode()); assertTrue(mUserSystemPackageInstaller.isEnforceMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistSystemMode()); assertFalse(mUserSystemPackageInstaller.isIgnoreOtaMode()); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST); assertFalse(mUserSystemPackageInstaller.isLogMode()); assertFalse(mUserSystemPackageInstaller.isEnforceMode()); assertTrue(mUserSystemPackageInstaller.isImplicitWhitelistMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistSystemMode()); assertFalse(mUserSystemPackageInstaller.isIgnoreOtaMode()); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST_SYSTEM); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST_SYSTEM); assertFalse(mUserSystemPackageInstaller.isLogMode()); assertFalse(mUserSystemPackageInstaller.isEnforceMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistMode()); assertTrue(mUserSystemPackageInstaller.isImplicitWhitelistSystemMode()); assertFalse(mUserSystemPackageInstaller.isIgnoreOtaMode()); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IGNORE_OTA); + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IGNORE_OTA); assertFalse(mUserSystemPackageInstaller.isLogMode()); assertFalse(mUserSystemPackageInstaller.isEnforceMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistMode()); assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistSystemMode()); assertTrue(mUserSystemPackageInstaller.isIgnoreOtaMode()); - setUserTypePackageWhitelistMode( + setUserTypePackageAllowlistMode( USER_TYPE_PACKAGE_WHITELIST_MODE_LOG | USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); assertTrue(mUserSystemPackageInstaller.isLogMode()); assertTrue(mUserSystemPackageInstaller.isEnforceMode()); @@ -503,7 +503,7 @@ public class UserSystemPackageInstallerTest { assertFalse(mUserSystemPackageInstaller.isImplicitWhitelistSystemMode()); assertFalse(mUserSystemPackageInstaller.isIgnoreOtaMode()); - setUserTypePackageWhitelistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST + setUserTypePackageAllowlistMode(USER_TYPE_PACKAGE_WHITELIST_MODE_IMPLICIT_WHITELIST | USER_TYPE_PACKAGE_WHITELIST_MODE_ENFORCE); assertFalse(mUserSystemPackageInstaller.isLogMode()); assertTrue(mUserSystemPackageInstaller.isEnforceMode()); @@ -513,7 +513,7 @@ public class UserSystemPackageInstallerTest { } /** Sets the allowlist mode to the desired value via adb's setprop. */ - private void setUserTypePackageWhitelistMode(int mode) { + private void setUserTypePackageAllowlistMode(int mode) { UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); try { String result = uiDevice.executeShellCommand(String.format("setprop %s %d", @@ -526,7 +526,7 @@ public class UserSystemPackageInstallerTest { } /** @see UserSystemPackageInstaller#mWhitelistedPackagesForUserTypes */ - private ArrayMap<String, Long> getNewPackageToWhitelistedBitSetMap() { + private ArrayMap<String, Long> getNewPackageToAllowlistedBitSetMap() { final ArrayMap<String, Long> pkgBitSetMap = new ArrayMap<>(); // "android" is always treated as allowlisted for all types, regardless of the xml file. pkgBitSetMap.put("android", ~0L); diff --git a/services/tests/servicestests/src/com/android/server/power/hint/OWNERS b/services/tests/servicestests/src/com/android/server/power/hint/OWNERS new file mode 100644 index 000000000000..c28c07a234b3 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/power/hint/OWNERS @@ -0,0 +1,2 @@ +include /ADPF_OWNERS + diff --git a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java index aca96ad20385..aad373fdaf95 100644 --- a/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/systemconfig/SystemConfigTest.java @@ -445,14 +445,14 @@ public class SystemConfigTest { + " <library \n" + " name=\"foo\"\n" + " file=\"" + mFooJar + "\"\n" - + " on-bootclasspath-before=\"Q\"\n" + + " on-bootclasspath-before=\"A\"\n" + " on-bootclasspath-since=\"W\"\n" + " />\n\n" + " </permissions>"; parseSharedLibraries(contents); assertFooIsOnlySharedLibrary(); SystemConfig.SharedLibraryEntry entry = mSysConfig.getSharedLibraries().get("foo"); - assertThat(entry.onBootclasspathBefore).isEqualTo("Q"); + assertThat(entry.onBootclasspathBefore).isEqualTo("A"); assertThat(entry.onBootclasspathSince).isEqualTo("W"); } diff --git a/services/tests/servicestests/src/com/android/server/webkit/OWNERS b/services/tests/servicestests/src/com/android/server/webkit/OWNERS index 00e540a46ab2..e7fd7a5d1096 100644 --- a/services/tests/servicestests/src/com/android/server/webkit/OWNERS +++ b/services/tests/servicestests/src/com/android/server/webkit/OWNERS @@ -1,3 +1,3 @@ -changwan@google.com -tobiasjs@google.com +# Bug component: 76427 +ntfschr@google.com torne@google.com diff --git a/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java b/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java index 22d383a84177..fc5213cba2e2 100644 --- a/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java +++ b/services/tests/servicestests/utils/com/android/server/testutils/TestHandler.java @@ -82,7 +82,7 @@ public class TestHandler extends Handler { uptimeMillis = uptimeMillis - SystemClock.uptimeMillis() + mClock.getAsLong(); } - // post a dummy queue entry to keep track of message removal + // post a sentinel queue entry to keep track of message removal return super.sendMessageAtTime(msg, Long.MAX_VALUE) && mMessages.add(new MsgInfo(Message.obtain(msg), uptimeMillis, mMessageCount)); } diff --git a/services/tests/uiservicestests/OWNERS b/services/tests/uiservicestests/OWNERS new file mode 100644 index 000000000000..c0cbea98cc57 --- /dev/null +++ b/services/tests/uiservicestests/OWNERS @@ -0,0 +1 @@ +include /services/core/java/com/android/server/notification/OWNERS
\ No newline at end of file diff --git a/services/tests/wmtests/OWNERS b/services/tests/wmtests/OWNERS index 7a128fc60428..cece37f7dcd2 100644 --- a/services/tests/wmtests/OWNERS +++ b/services/tests/wmtests/OWNERS @@ -1,3 +1,4 @@ +# Bug template url: https://b.corp.google.com/issues/new?component=316125&template=1018199 include /services/core/java/com/android/server/wm/OWNERS # Voice Interaction diff --git a/services/usb/OWNERS b/services/usb/OWNERS index 60172a36128e..d35dbb56437b 100644 --- a/services/usb/OWNERS +++ b/services/usb/OWNERS @@ -1,3 +1,7 @@ +aprasath@google.com +kumarashishg@google.com +sarup@google.com +anothermark@google.com badhri@google.com elaurent@google.com albertccwang@google.com diff --git a/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetAidl.java b/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetAidl.java index d47ccc7f05a0..b7f7c43eadbb 100644 --- a/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetAidl.java +++ b/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetAidl.java @@ -67,10 +67,6 @@ public final class UsbGadgetAidl implements UsbGadgetHal { return GADGET_HAL_V2_0; } - @Override - public void systemReady() { - } - public void serviceDied() { logAndPrint(Log.ERROR, mPw, "Usb Gadget AIDL hal service died"); synchronized (mGadgetProxyLock) { diff --git a/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHal.java b/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHal.java index 7b52f46e77cc..eac796d0636b 100644 --- a/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHal.java +++ b/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHal.java @@ -29,69 +29,6 @@ import java.lang.String; */ public interface UsbGadgetHal { /** - * Power role: This USB port can act as a source (provide power). - * @hide - */ - public static final int HAL_POWER_ROLE_SOURCE = 1; - - /** - * Power role: This USB port can act as a sink (receive power). - * @hide - */ - public static final int HAL_POWER_ROLE_SINK = 2; - - @IntDef(prefix = { "HAL_POWER_ROLE_" }, value = { - HAL_POWER_ROLE_SOURCE, - HAL_POWER_ROLE_SINK - }) - @Retention(RetentionPolicy.SOURCE) - @interface HalUsbPowerRole{} - - /** - * Data role: This USB port can act as a host (access data services). - * @hide - */ - public static final int HAL_DATA_ROLE_HOST = 1; - - /** - * Data role: This USB port can act as a device (offer data services). - * @hide - */ - public static final int HAL_DATA_ROLE_DEVICE = 2; - - @IntDef(prefix = { "HAL_DATA_ROLE_" }, value = { - HAL_DATA_ROLE_HOST, - HAL_DATA_ROLE_DEVICE - }) - @Retention(RetentionPolicy.SOURCE) - @interface HalUsbDataRole{} - - /** - * This USB port can act as a downstream facing port (host). - * - * @hide - */ - public static final int HAL_MODE_DFP = 1; - - /** - * This USB port can act as an upstream facing port (device). - * - * @hide - */ - public static final int HAL_MODE_UFP = 2; - @IntDef(prefix = { "HAL_MODE_" }, value = { - HAL_MODE_DFP, - HAL_MODE_UFP, - }) - @Retention(RetentionPolicy.SOURCE) - @interface HalUsbPortMode{} - - /** - * UsbPortManager would call this when the system is done booting. - */ - public void systemReady(); - - /** * This function is used to query the USB functions included in the * current USB configuration. * diff --git a/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHidl.java b/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHidl.java index 68067d27a0a5..80a70dd2311d 100644 --- a/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHidl.java +++ b/services/usb/java/com/android/server/usb/hal/gadget/UsbGadgetHidl.java @@ -123,10 +123,6 @@ public final class UsbGadgetHidl implements UsbGadgetHal { } } - @Override - public void systemReady() { - } - static boolean isServicePresent(IndentingPrintWriter pw) { try { IUsbGadget.getService(true); diff --git a/services/usb/java/com/android/server/usb/hal/port/UsbPortHal.java b/services/usb/java/com/android/server/usb/hal/port/UsbPortHal.java index f98c598d4190..45de058fc1e8 100644 --- a/services/usb/java/com/android/server/usb/hal/port/UsbPortHal.java +++ b/services/usb/java/com/android/server/usb/hal/port/UsbPortHal.java @@ -70,17 +70,17 @@ public interface UsbPortHal { * * @hide */ - public static final int HAL_MODE_DFP = 1; + public static final int HAL_MODE_UFP = 1; /** * This USB port can act as an upstream facing port (device). * * @hide */ - public static final int HAL_MODE_UFP = 2; + public static final int HAL_MODE_DFP = 2; @IntDef(prefix = { "HAL_MODE_" }, value = { - HAL_MODE_DFP, HAL_MODE_UFP, + HAL_MODE_DFP, }) @Retention(RetentionPolicy.SOURCE) @interface HalUsbPortMode{} diff --git a/startop/apps/ColorChanging/app/build.gradle b/startop/apps/ColorChanging/app/build.gradle index ab955aaf90ee..11b14c04f1b9 100644 --- a/startop/apps/ColorChanging/app/build.gradle +++ b/startop/apps/ColorChanging/app/build.gradle @@ -14,7 +14,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') } } } diff --git a/startop/apps/ColorChanging/app/proguard-rules.pro b/startop/apps/ColorChanging/app/proguard-rules.pro deleted file mode 100644 index f1b424510da5..000000000000 --- a/startop/apps/ColorChanging/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/telecomm/OWNERS b/telecomm/OWNERS index dcaf858a0a0b..b57b7c79326e 100644 --- a/telecomm/OWNERS +++ b/telecomm/OWNERS @@ -4,7 +4,6 @@ breadley@google.com tgunn@google.com xiaotonj@google.com rgreenwalt@google.com -chinmayd@google.com grantmenke@google.com pmadapurmath@google.com tjstuart@google.com
\ No newline at end of file diff --git a/telecomm/java/android/telecom/RemoteConnectionManager.java b/telecomm/java/android/telecom/RemoteConnectionManager.java index fbbfefd9d00e..fbf8eeffd947 100644 --- a/telecomm/java/android/telecom/RemoteConnectionManager.java +++ b/telecomm/java/android/telecom/RemoteConnectionManager.java @@ -39,18 +39,21 @@ public class RemoteConnectionManager { void addConnectionService( ComponentName componentName, IConnectionService outgoingConnectionServiceRpc) { - if (!mRemoteConnectionServices.containsKey(componentName)) { - try { - RemoteConnectionService remoteConnectionService = new RemoteConnectionService( - outgoingConnectionServiceRpc, - mOurConnectionServiceImpl); - mRemoteConnectionServices.put(componentName, remoteConnectionService); - } catch (RemoteException e) { - Log.w(RemoteConnectionManager.this, - "error when addConnectionService of %s: %s", componentName, - e.toString()); - } - } + mRemoteConnectionServices.computeIfAbsent( + componentName, + key -> { + try { + return new RemoteConnectionService( + outgoingConnectionServiceRpc, mOurConnectionServiceImpl); + } catch (RemoteException e) { + Log.w( + RemoteConnectionManager.this, + "error when addConnectionService of %s: %s", + componentName, + e.toString()); + return null; + } + }); } public RemoteConnection createRemoteConnection( @@ -63,17 +66,14 @@ public class RemoteConnectionManager { } ComponentName componentName = request.getAccountHandle().getComponentName(); - if (!mRemoteConnectionServices.containsKey(componentName)) { + RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName); + if (remoteService == null) { throw new UnsupportedOperationException("accountHandle not supported: " + componentName); } - RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName); - if (remoteService != null) { - return remoteService.createRemoteConnection( - connectionManagerPhoneAccount, request, isIncoming); - } - return null; + return remoteService.createRemoteConnection( + connectionManagerPhoneAccount, request, isIncoming); } /** @@ -94,17 +94,14 @@ public class RemoteConnectionManager { } ComponentName componentName = request.getAccountHandle().getComponentName(); - if (!mRemoteConnectionServices.containsKey(componentName)) { + RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName); + if (remoteService == null) { throw new UnsupportedOperationException("accountHandle not supported: " + componentName); } - RemoteConnectionService remoteService = mRemoteConnectionServices.get(componentName); - if (remoteService != null) { - return remoteService.createRemoteConference( - connectionManagerPhoneAccount, request, isIncoming); - } - return null; + return remoteService.createRemoteConference( + connectionManagerPhoneAccount, request, isIncoming); } public void conferenceRemoteConnections(RemoteConnection a, RemoteConnection b) { diff --git a/telephony/common/com/android/internal/telephony/SmsApplication.java b/telephony/common/com/android/internal/telephony/SmsApplication.java index a9cdf7e5bc08..94d4d2260d5c 100644 --- a/telephony/common/com/android/internal/telephony/SmsApplication.java +++ b/telephony/common/com/android/internal/telephony/SmsApplication.java @@ -791,7 +791,7 @@ public final class SmsApplication { AppOpsManager.MODE_ALLOWED); } } catch (NameNotFoundException e) { - // No whitelisted system app on this device + // No allowlisted system app on this device Log.e(LOG_TAG, "Package not found: " + packageName); } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 5b1c6b1c88b8..749ed03b727f 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4601,12 +4601,12 @@ public class CarrierConfigManager { * * <p>Example: * - * <pre><code> + * <pre>{@code * <string-array name="carrier_service_name_array" num="2"> * <item value="Police"/> * <item value="Ambulance"/> * </string-array> - * </code></pre> + * }</pre> */ public static final String KEY_CARRIER_SERVICE_NAME_STRING_ARRAY = "carrier_service_name_array"; @@ -4620,18 +4620,18 @@ public class CarrierConfigManager { * * <ul> * <li>The number of items in both the arrays are equal - * <li>The item added in this key follows a specific format. Either it should be all numbers, - * or "+" followed by all numbers. + * <li>The item should contain dialable characters only which includes 0-9, -, *, #, (, ), + * SPACE. * </ul> * * <p>Example: * - * <pre><code> + * <pre>{@code * <string-array name="carrier_service_number_array" num="2"> - * <item value="123"/> - * <item value="+343"/> + * <item value="*123"/> + * <item value="+ (111) 111-111"/> * </string-array> - * </code></pre> + * }</pre> */ public static final String KEY_CARRIER_SERVICE_NUMBER_STRING_ARRAY = "carrier_service_number_array"; @@ -9876,9 +9876,9 @@ public class CarrierConfigManager { sDefaults.putString(KEY_CARRIER_ERI_FILE_NAME_STRING, "eri.xml"); sDefaults.putInt(KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT, 7200); sDefaults.putStringArray(KEY_CARRIER_METERED_APN_TYPES_STRINGS, - new String[]{"default", "mms", "dun", "supl"}); + new String[]{"default", "mms", "dun", "supl", "enterprise"}); sDefaults.putStringArray(KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS, - new String[]{"default", "mms", "dun", "supl"}); + new String[]{"default", "mms", "dun", "supl", "enterprise"}); sDefaults.putIntArray(KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY, new int[] {TelephonyManager.NETWORK_TYPE_CDMA, TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyManager.NETWORK_TYPE_EVDO_0, TelephonyManager.NETWORK_TYPE_EVDO_A, diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 40488b15a37c..145cc2c78ed9 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -441,7 +441,7 @@ public final class SmsManager { } /** - * Get {@link Context#getOpPackageName()} if this manager has a context, otherwise a dummy + * Get {@link Context#getOpPackageName()} if this manager has a context, otherwise a placeholder * value. * * @return The package name to be used for app-ops checks diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 2a6099a18fab..195dbc47a75b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -7840,7 +7840,7 @@ public class TelephonyManager { } /** - * Rollback modem configurations to factory default except some config which are in whitelist. + * Rollback modem configurations to factory default except some config which are in allowlist. * Used for device configuration by some carriers. * * <p>Requires Permission: @@ -15340,7 +15340,7 @@ public class TelephonyManager { * * 1) User data is turned on, or * 2) APN is un-metered for this subscription, or - * 3) APN type is whitelisted. E.g. MMS is whitelisted if + * 3) APN type is allowlisted. E.g. MMS is allowlisted if * {@link #MOBILE_DATA_POLICY_MMS_ALWAYS_ALLOWED} is enabled. * * @param apnType Value indicating the apn type. Apn types are defined in {@link ApnSetting}. diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java index dda021e6172f..67acda05382b 100644 --- a/telephony/java/android/telephony/ims/ImsReasonInfo.java +++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java @@ -460,7 +460,7 @@ public final class ImsReasonInfo implements Parcelable { */ public static final int CODE_LOW_BATTERY = 505; /** - * Device declined a call due to a blacklisted caller ID. + * Device declined a call due to a denylisted caller ID. */ public static final int CODE_BLACKLISTED_CALL_ID = 506; // IMS -> Telephony diff --git a/tests/ApkVerityTest/ApkVerityTestApp/feature_split/src/com/android/apkverity/feature_x/DummyActivity.java b/tests/ApkVerityTest/ApkVerityTestApp/feature_split/src/com/android/apkverity/feature_x/DummyActivity.java index 0f694c293330..fe9126003967 100644 --- a/tests/ApkVerityTest/ApkVerityTestApp/feature_split/src/com/android/apkverity/feature_x/DummyActivity.java +++ b/tests/ApkVerityTest/ApkVerityTestApp/feature_split/src/com/android/apkverity/feature_x/DummyActivity.java @@ -18,5 +18,5 @@ package com.android.apkverity.feature_x; import android.app.Activity; -/** Dummy class just to generate some dex */ +/** Placeholder class just to generate some dex */ public class DummyActivity extends Activity {} diff --git a/tests/ApkVerityTest/ApkVerityTestApp/src/com/android/apkverity/DummyActivity.java b/tests/ApkVerityTest/ApkVerityTestApp/src/com/android/apkverity/DummyActivity.java index 837c7be37504..a7bd771400c0 100644 --- a/tests/ApkVerityTest/ApkVerityTestApp/src/com/android/apkverity/DummyActivity.java +++ b/tests/ApkVerityTest/ApkVerityTestApp/src/com/android/apkverity/DummyActivity.java @@ -18,5 +18,5 @@ package com.android.apkverity; import android.app.Activity; -/** Dummy class just to generate some dex */ +/** Placeholder class just to generate some dex */ public class DummyActivity extends Activity {} diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java index 1a58f17ef6a0..fa452dd78873 100644 --- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java +++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java @@ -674,7 +674,7 @@ public class AppLaunch extends InstrumentationTestCase { return true; } - // iorap compiler filters specified: the compilerFilter must be in the whitelist. + // iorap compiler filters specified: the compilerFilter must be in the allowlist. if (mIorapCompilerFilters.indexOf(compilerFilter) != -1) { return true; } diff --git a/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt b/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt index 32c2230e4880..ad95fbc36867 100644 --- a/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt +++ b/tests/AttestationVerificationTest/src/android/security/attestationverification/PeerDeviceSystemAttestationVerificationTest.kt @@ -39,7 +39,7 @@ class PeerDeviceSystemAttestationVerificationTest { @Before fun setup() { rule.getScenario().onActivity { - avm = it.getSystemService(AttestationVerificationManager::class.java) + avm = it.getSystemService(AttestationVerificationManager::class.java)!! activity = it } invalidAttestationByteArray = TEST_ATTESTATION_CERT_FILENAME.fromPEMFileToByteArray() diff --git a/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt b/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt index 169effaa45ca..8f06b4a2ea0a 100644 --- a/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt +++ b/tests/AttestationVerificationTest/src/android/security/attestationverification/SystemAttestationVerificationTest.kt @@ -43,7 +43,7 @@ class SystemAttestationVerificationTest { @Before fun setup() { rule.getScenario().onActivity { - avm = it.getSystemService(AttestationVerificationManager::class.java) + avm = it.getSystemService(AttestationVerificationManager::class.java)!! activity = it androidKeystore = KeyStore.getInstance(ANDROID_KEYSTORE).apply { load(null) } } diff --git a/tests/BinderLeakTest/Android.bp b/tests/BinderLeakTest/Android.bp new file mode 100644 index 000000000000..78b0ede76d4e --- /dev/null +++ b/tests/BinderLeakTest/Android.bp @@ -0,0 +1,40 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +filegroup { + name: "binder_leak_test_aidl", + srcs: ["**/*.aidl"], + path: "aidl", +} + +java_defaults { + name: "BinderTest.defaults", + srcs: [ + "**/*.java", + ":binder_leak_test_aidl", + ], + static_libs: [ + "androidx.test.ext.junit", + "androidx.test.rules", + "androidx.test.runner", + ], +} + +// Built with target_sdk_version: current +android_test { + name: "BinderLeakTest", + defaults: ["BinderTest.defaults"], +} + +// Built with target_sdk_version: 33 +android_test { + name: "BinderLeakTest_legacy", + defaults: ["BinderTest.defaults"], + manifest: "AndroidManifest_legacy.xml", +} diff --git a/tests/BinderLeakTest/AndroidManifest.xml b/tests/BinderLeakTest/AndroidManifest.xml new file mode 100644 index 000000000000..756def7ac29d --- /dev/null +++ b/tests/BinderLeakTest/AndroidManifest.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.test.binder"> + <application> + <service + android:name=".MyService" + android:enabled="true" + android:exported="true" + android:process=":service"> + </service> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.test.binder" + android:label="Binder leak test"> + </instrumentation> +</manifest> diff --git a/tests/BinderLeakTest/AndroidManifest_legacy.xml b/tests/BinderLeakTest/AndroidManifest_legacy.xml new file mode 100644 index 000000000000..03d1dfd1fd83 --- /dev/null +++ b/tests/BinderLeakTest/AndroidManifest_legacy.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.test.binder"> + <uses-sdk android:minSdkVersion="33" + android:targetSdkVersion="33" + android:maxSdkVersion="33" /> + <application> + <service + android:name=".MyService" + android:enabled="true" + android:exported="true" + android:process=":service"> + </service> + </application> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.test.binder" + android:label="Binder leak test"> + </instrumentation> +</manifest> diff --git a/tests/BinderLeakTest/aidl/com/android/test/binder/IFoo.aidl b/tests/BinderLeakTest/aidl/com/android/test/binder/IFoo.aidl new file mode 100644 index 000000000000..a721959d19b4 --- /dev/null +++ b/tests/BinderLeakTest/aidl/com/android/test/binder/IFoo.aidl @@ -0,0 +1,5 @@ +package com.android.test.binder; + +interface IFoo { + +} diff --git a/tests/BinderLeakTest/aidl/com/android/test/binder/IFooProvider.aidl b/tests/BinderLeakTest/aidl/com/android/test/binder/IFooProvider.aidl new file mode 100644 index 000000000000..b487f51f812c --- /dev/null +++ b/tests/BinderLeakTest/aidl/com/android/test/binder/IFooProvider.aidl @@ -0,0 +1,10 @@ +package com.android.test.binder; +import com.android.test.binder.IFoo; + +interface IFooProvider { + IFoo createFoo(); + + boolean isFooGarbageCollected(); + + oneway void killProcess(); +} diff --git a/tests/BinderLeakTest/java/com/android/test/binder/BinderTest.java b/tests/BinderLeakTest/java/com/android/test/binder/BinderTest.java new file mode 100644 index 000000000000..f07317f7d5f3 --- /dev/null +++ b/tests/BinderLeakTest/java/com/android/test/binder/BinderTest.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.test.binder; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import android.content.Intent; +import android.os.Build; +import android.os.IBinder; +import android.os.RemoteException; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.rule.ServiceTestRule; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.lang.ref.PhantomReference; +import java.lang.ref.ReferenceQueue; +import java.util.concurrent.TimeoutException; + +@RunWith(AndroidJUnit4.class) +public class BinderTest { + @Rule + public final ServiceTestRule serviceRule = new ServiceTestRule(); + + @Test + public void testDeathRecipientLeaksOrNot() + throws RemoteException, TimeoutException, InterruptedException { + Intent intent = new Intent(ApplicationProvider.getApplicationContext(), MyService.class); + IFooProvider provider = IFooProvider.Stub.asInterface(serviceRule.bindService(intent)); + FooHolder holder = new FooHolder(provider.createFoo()); + + // ref will get enqueued right after holder is finalized for gc. + ReferenceQueue<FooHolder> refQueue = new ReferenceQueue<>(); + PhantomReference<FooHolder> ref = new PhantomReference<>(holder, refQueue); + + DeathRecorder deathRecorder = new DeathRecorder(); + holder.registerDeathRecorder(deathRecorder); + + if (getSdkVersion() >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + ///////////////////////////////////////////// + // New behavior + // + // Reference chain at this moment: + // holder --(java strong ref)--> FooHolder + // FooHolder.mProxy --(java strong ref)--> IFoo.Proxy + // IFoo.Proxy.mRemote --(java strong ref)--> BinderProxy + // BinderProxy --(binder ref)--> Foo.Stub + // In other words, the variable "holder" is the root of the reference chain. + + // By setting the variable to null, we make FooHolder, IFoo.Proxy, BinderProxy, and even + // Foo.Stub unreachable. + holder = null; + + // Ensure that the objects are garbage collected + forceGc(); + assertEquals(ref, refQueue.poll()); + assertTrue(provider.isFooGarbageCollected()); + + // The binder has died, but we don't get notified since the death recipient is GC'ed. + provider.killProcess(); + Thread.sleep(1000); // give some time for the service process to die and reaped + assertFalse(deathRecorder.deathRecorded); + } else { + ///////////////////////////////////////////// + // Legacy behavior + // + // Reference chain at this moment: + // JavaDeathRecipient --(JNI strong ref)--> FooHolder + // holder --(java strong ref)--> FooHolder + // FooHolder.mProxy --(java strong ref)--> IFoo.Proxy + // IFoo.Proxy.mRemote --(java strong ref)--> BinderProxy + // BinderProxy --(binder ref)--> Foo.Stub + // So, BOTH JavaDeathRecipient and holder are roots of the reference chain. + + // Even if we set holder to null, it doesn't make other objects unreachable; they are + // still reachable via the JNI strong ref. + holder = null; + + // Check that objects are not garbage collected + forceGc(); + assertNotEquals(ref, refQueue.poll()); + assertFalse(provider.isFooGarbageCollected()); + + // The legacy behavior is getting notified even when there's no reference + provider.killProcess(); + Thread.sleep(1000); // give some time for the service process to die and reaped + assertTrue(deathRecorder.deathRecorded); + } + } + + static class FooHolder implements IBinder.DeathRecipient { + private IFoo mProxy; + private DeathRecorder mDeathRecorder; + + FooHolder(IFoo proxy) throws RemoteException { + proxy.asBinder().linkToDeath(this, 0); + + // A strong reference from DeathRecipient(this) to the binder proxy is created here + mProxy = proxy; + } + + public void registerDeathRecorder(DeathRecorder dr) { + mDeathRecorder = dr; + } + + @Override + public void binderDied() { + if (mDeathRecorder != null) { + mDeathRecorder.deathRecorded = true; + } + } + } + + static class DeathRecorder { + public boolean deathRecorded = false; + } + + // Try calling System.gc() until an orphaned object is confirmed to be finalized + private static void forceGc() { + Object obj = new Object(); + ReferenceQueue<Object> refQueue = new ReferenceQueue<>(); + PhantomReference<Object> ref = new PhantomReference<>(obj, refQueue); + obj = null; // make it an orphan + while (refQueue.poll() != ref) { + System.gc(); + } + } + + private static int getSdkVersion() { + return ApplicationProvider.getApplicationContext().getApplicationInfo().targetSdkVersion; + } +} diff --git a/tests/BinderLeakTest/java/com/android/test/binder/MyService.java b/tests/BinderLeakTest/java/com/android/test/binder/MyService.java new file mode 100644 index 000000000000..c701253446f4 --- /dev/null +++ b/tests/BinderLeakTest/java/com/android/test/binder/MyService.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.test.binder; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.os.RemoteException; + +import java.lang.ref.PhantomReference; +import java.lang.ref.ReferenceQueue; + +public class MyService extends Service { + @Override + public IBinder onBind(Intent intent) { + return new IFooProvider.Stub() { + ReferenceQueue<IFoo> mRefQueue = new ReferenceQueue<>(); + PhantomReference<IFoo> mRef; + + @Override + public IFoo createFoo() throws RemoteException { + IFoo binder = new IFoo.Stub() {}; + mRef = new PhantomReference<>(binder, mRefQueue); + return binder; + } + + @Override + public boolean isFooGarbageCollected() throws RemoteException { + forceGc(); + return mRefQueue.poll() == mRef; + } + + @Override + public void killProcess() throws RemoteException { + android.os.Process.killProcess(android.os.Process.myPid()); + } + }; + } + + private static void forceGc() { + Object obj = new Object(); + ReferenceQueue<Object> refQueue = new ReferenceQueue<>(); + PhantomReference<Object> ref = new PhantomReference<>(obj, refQueue); + obj = null; // make it an orphan + while (refQueue.poll() != ref) { + System.gc(); + } + } +} diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/BackingStore.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/BackingStore.java index 216e743938ca..df140b976768 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/BackingStore.java +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/BackingStore.java @@ -14,17 +14,10 @@ package androidx.media.filterfw; -import android.annotation.TargetApi; import android.graphics.Bitmap; -import android.os.Build; -import android.renderscript.Allocation; -import android.renderscript.Element; -import android.renderscript.RenderScript; -import android.renderscript.Type; import android.util.Log; import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.Arrays; import java.util.Vector; @@ -42,14 +35,11 @@ final class BackingStore { static final int ACCESS_OBJECT = 0x08; /** Access mode Bitmap: Frame data will be accessed as a Bitmap. */ static final int ACCESS_BITMAP = 0x10; - /** Access mode Allocation: Frame data will be accessed as a RenderScript Allocation. */ - static final int ACCESS_ALLOCATION = 0x20; private static final int BACKING_BYTEBUFFER = 1; private static final int BACKING_TEXTURE = 2; private static final int BACKING_OBJECT = 3; private static final int BACKING_BITMAP = 4; - private static final int BACKING_ALLOCATION = 5; private final FrameType mType; private int[] mDimensions; @@ -243,14 +233,6 @@ final class BackingStore { case ACCESS_BITMAP: backing = new BitmapBacking(); break; - case ACCESS_ALLOCATION: - if (!AllocationBacking.isSupported()) { - throw new RuntimeException( - "Attempted to create an AllocationBacking in context that does " + - "not support RenderScript!"); - } - backing = new AllocationBacking(mFrameManager.getContext().getRenderScript()); - break; } if (backing == null) { throw new RuntimeException( @@ -518,9 +500,6 @@ final class BackingStore { RenderTarget renderTarget = (RenderTarget) backing.lock(ACCESS_RENDERTARGET); mBitmap.copyPixelsFromBuffer( renderTarget.getPixelData(mDimensions[0], mDimensions[1])); - } else if ((access & ACCESS_ALLOCATION) != 0 && AllocationBacking.isSupported()) { - createBitmap(); - syncToAllocationBacking(backing); } else { throw new RuntimeException("Cannot sync bytebuffer backing!"); } @@ -528,12 +507,6 @@ final class BackingStore { mIsDirty = false; } - @TargetApi(11) - private void syncToAllocationBacking(Backing backing) { - Allocation allocation = (Allocation) backing.lock(ACCESS_ALLOCATION); - allocation.copyTo(mBitmap); - } - @Override public Object lock(int accessType) { return mBitmap; @@ -612,8 +585,6 @@ final class BackingStore { int w = mDimensions[0]; int h = mDimensions[1]; ImageShader.renderTextureToTarget(texture, getRenderTarget(), w, h); - } else if ((access & ACCESS_ALLOCATION) != 0 && AllocationBacking.isSupported()) { - syncToAllocationBacking(backing); } else { throw new RuntimeException("Cannot sync bytebuffer backing!"); } @@ -621,14 +592,6 @@ final class BackingStore { mIsDirty = false; } - @TargetApi(11) - private void syncToAllocationBacking(Backing backing) { - Allocation allocation = (Allocation) backing.lock(ACCESS_ALLOCATION); - ByteBuffer pixels = ByteBuffer.allocateDirect(getSize()); - allocation.copyTo(pixels.array()); - mTexture.allocateWithPixels(pixels, mDimensions[0], mDimensions[1]); - } - @Override public Object lock(int accessType) { switch (accessType) { @@ -733,8 +696,6 @@ final class BackingStore { ByteBuffer otherBuffer = (ByteBuffer) backing.lock(ACCESS_BYTES); mBuffer.put(otherBuffer); otherBuffer.rewind(); - } else if ((access & ACCESS_ALLOCATION) != 0 && AllocationBacking.isSupported()) { - syncToAllocationBacking(backing); } else { throw new RuntimeException("Cannot sync bytebuffer backing!"); } @@ -743,23 +704,6 @@ final class BackingStore { mIsDirty = false; } - @TargetApi(11) - private void syncToAllocationBacking(Backing backing) { - Allocation allocation = (Allocation) backing.lock(ACCESS_ALLOCATION); - if (getElementId() == FrameType.ELEMENT_RGBA8888) { - byte[] bytes = mBuffer.array(); - allocation.copyTo(bytes); - } else if (getElementId() == FrameType.ELEMENT_FLOAT32) { - float[] floats = new float[getSize() / 4]; - allocation.copyTo(floats); - mBuffer.asFloatBuffer().put(floats); - } else { - throw new RuntimeException( - "Trying to sync to an allocation with an unsupported element id: " - + getElementId()); - } - } - @Override public Object lock(int accessType) { return mBuffer.rewind(); @@ -791,139 +735,4 @@ final class BackingStore { } } - - @TargetApi(11) - static class AllocationBacking extends Backing { - - private final RenderScript mRenderScript; - private Allocation mAllocation = null; - - public AllocationBacking(RenderScript renderScript) { - mRenderScript = renderScript; - } - - @Override - public void allocate(FrameType frameType) { - assertCompatible(frameType); - - Element element = null; - switch (frameType.getElementId()) { - case FrameType.ELEMENT_RGBA8888: - element = Element.RGBA_8888(mRenderScript); - break; - case FrameType.ELEMENT_FLOAT32: - element = Element.F32(mRenderScript); - break; - } - Type.Builder imageTypeBuilder = new Type.Builder(mRenderScript, element); - imageTypeBuilder.setX(mDimensions.length >= 1 ? mDimensions[0] : 1); - imageTypeBuilder.setY(mDimensions.length == 2 ? mDimensions[1] : 1); - Type imageType = imageTypeBuilder.create(); - - mAllocation = Allocation.createTyped(mRenderScript, imageType); - } - - @Override - public int readAccess() { - return ACCESS_ALLOCATION; - } - - @Override - public int writeAccess() { - return ACCESS_ALLOCATION; - } - - @Override - public boolean requiresGpu() { - return false; - } - - @Override - public void syncTo(Backing backing) { - int access = backing.readAccess(); - if ((access & ACCESS_TEXTURE) != 0) { - RenderTarget target = (RenderTarget) backing.lock(ACCESS_RENDERTARGET); - ByteBuffer pixels = ByteBuffer.allocateDirect(getSize()); - GLToolbox.readTarget(target, pixels, mDimensions[0], mDimensions[1]); - mAllocation.copyFrom(pixels.array()); - } else if ((access & ACCESS_BITMAP) != 0) { - Bitmap bitmap = (Bitmap) backing.lock(ACCESS_BITMAP); - mAllocation.copyFrom(bitmap); - } else if ((access & ACCESS_BYTES) != 0) { - ByteBuffer buffer = (ByteBuffer) backing.lock(ACCESS_BYTES); - if (buffer.order() != ByteOrder.nativeOrder()) { - throw new RuntimeException( - "Trying to sync to the ByteBufferBacking with non-native byte order!"); - } - byte[] bytes; - if (buffer.hasArray()) { - bytes = buffer.array(); - } else { - bytes = new byte[getSize()]; - buffer.get(bytes); - buffer.rewind(); - } - mAllocation.copyFromUnchecked(bytes); - } else { - throw new RuntimeException("Cannot sync allocation backing!"); - } - backing.unlock(); - mIsDirty = false; - } - - @Override - public Object lock(int accessType) { - return mAllocation; - } - - @Override - public void unlock() { - } - - @Override - public int getType() { - return BACKING_ALLOCATION; - } - - @Override - public boolean shouldCache() { - return true; - } - - @Override - public void destroy() { - if (mAllocation != null) { - mAllocation.destroy(); - mAllocation = null; - } - } - - @Override - public int getSize() { - int elementCount = 1; - for (int dim : mDimensions) { - elementCount *= dim; - } - return getElementSize() * elementCount; - } - - public static boolean isSupported() { - return Build.VERSION.SDK_INT >= 11; - } - - private void assertCompatible(FrameType type) { - // TODO: consider adding support for other data types. - if (type.getElementId() != FrameType.ELEMENT_RGBA8888 - && type.getElementId() != FrameType.ELEMENT_FLOAT32) { - throw new RuntimeException( - "Cannot allocate allocation with a non-RGBA or non-float data type!"); - } - if (mDimensions == null || mDimensions.length > 2) { - throw new RuntimeException( - "Cannot create an allocation with more than 2 dimensions!"); - } - } - - } - } diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameBuffer1D.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameBuffer1D.java index 0e24f5be954a..20cc1bf3cb80 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameBuffer1D.java +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/FrameBuffer1D.java @@ -16,9 +16,6 @@ package androidx.media.filterfw; -import android.annotation.TargetApi; -import android.renderscript.Allocation; - import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -40,19 +37,6 @@ public class FrameBuffer1D extends Frame { return (ByteBuffer)mBackingStore.lockData(mode, BackingStore.ACCESS_BYTES); } - /** - * Access frame's data using a RenderScript {@link Allocation}. - * This is a convenience method and is equivalent to calling {@code lockData} with an - * {@code accessFormat} of {@code ACCESS_ALLOCATION}. - * - * @return The Allocation instance holding the Frame's data. - */ - @TargetApi(11) - public Allocation lockAllocation(int mode) { - assertAccessible(mode); - return (Allocation) mBackingStore.lockData(mode, BackingStore.ACCESS_ALLOCATION); - } - public int getLength() { return mLength; } diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/GraphExporter.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/GraphExporter.java index 001396527267..4b7ca5306bfb 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/GraphExporter.java +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/GraphExporter.java @@ -113,7 +113,7 @@ public class GraphExporter { getDotName(target.getFilter().getName()) + ":" + getDotName(target.getName()) + "_IN;\n" ); } else { - // Found a unconnected output port, add dummy node + // Found a unconnected output port, add placeholder node String color = filter.getSignature().getOutputPortInfo(portName).isRequired() ? "red" : "blue"; // red for unconnected, required ports dotFile.write(" " + @@ -131,7 +131,7 @@ public class GraphExporter { if(target != null) { // Found a connection -- nothing to do, connections have been written out above } else { - // Found a unconnected input port, add dummy node + // Found a unconnected input port, add placeholder node String color = filter.getSignature().getInputPortInfo(portName).isRequired() ? "red" : "blue"; // red for unconnected, required ports dotFile.write(" " + diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/MffContext.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/MffContext.java index b7212f982bce..8fd44d2df975 100644 --- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/MffContext.java +++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/MffContext.java @@ -16,15 +16,12 @@ package androidx.media.filterfw; -import android.annotation.TargetApi; import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.content.pm.ConfigurationInfo; -import android.os.Build; import android.os.Handler; import android.os.Looper; -import android.renderscript.RenderScript; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; @@ -66,9 +63,9 @@ public class MffContext { /** * On older Android versions the Camera may need a SurfaceView to render into in order to - * function. You may specify a dummy SurfaceView here if you do not want the context to + * function. You may specify a placeholder SurfaceView here if you do not want the context to * create its own view. Note, that your view may or may not be used. You cannot rely on - * your dummy view to be used by the Camera. If you pass null, no dummy view will be used. + * your placeholder view to be used by the Camera. If you pass null, no placeholder view will be used. * In this case your application may not run correctly on older devices if you use the * camera. This flag has no effect if you do not require the camera. */ @@ -104,7 +101,7 @@ public class MffContext { /** The current context state. */ private State mState = new State(); - /** A dummy SurfaceView that is required for Camera operation on older devices. */ + /** A placeholder SurfaceView that is required for Camera operation on older devices. */ private SurfaceView mDummySurfaceView = null; /** Handler to execute code in the context's thread, such as issuing callbacks. */ @@ -116,9 +113,6 @@ public class MffContext { /** Flag whether camera streaming is supported in this context. */ private boolean mCameraStreamingSupport; - /** RenderScript base master class. */ - private RenderScript mRenderScript; - /** * Creates a new MffContext with the default configuration. * @@ -126,7 +120,7 @@ public class MffContext { * multiple MffContexts, however data between them cannot be shared. The context must be * created in a thread with a Looper (such as the main/UI thread). * - * On older versions of Android, the MffContext may create a visible dummy view for the + * On older versions of Android, the MffContext may create a visible placeholder view for the * camera to render into. This is a 1x1 SurfaceView that is placed into the top-left corner. * * @param context The application context to attach the MffContext to. @@ -142,7 +136,7 @@ public class MffContext { * multiple MffContexts, however data between them cannot be shared. The context must be * created in a thread with a Looper (such as the main/UI thread). * - * On older versions of Android, the MffContext may create a visible dummy view for the + * On older versions of Android, the MffContext may create a visible placeholder view for the * camera to render into. This is a 1x1 SurfaceView that is placed into the top-left corner. * You may alternatively specify your own SurfaceView in the configuration. * @@ -200,9 +194,7 @@ public class MffContext { mCameraStreamer.stop(); mCameraStreamer.tearDown(); } - if (Build.VERSION.SDK_INT >= 11) { - maybeDestroyRenderScript(); - } + stopRunners(false); waitUntilStopped(); tearDown(); @@ -301,14 +293,6 @@ public class MffContext { return mCameraStreamingSupport; } - @TargetApi(11) - public final RenderScript getRenderScript() { - if (mRenderScript == null) { - mRenderScript = RenderScript.create(mApplicationContext); - } - return mRenderScript; - } - final void assertOpenGLSupported() { if (!isOpenGLSupported()) { throw new RuntimeException("Attempting to use OpenGL ES 2 in a context that does not " @@ -459,12 +443,4 @@ public class MffContext { return (context instanceof Activity) ? (Activity) context : null; } - @TargetApi(11) - private void maybeDestroyRenderScript() { - if (mRenderScript != null) { - mRenderScript.destroy(); - mRenderScript = null; - } - } - } diff --git a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/dcl/Simple.java b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/dcl/Simple.java index e995a26ea5c9..2ca91fbc1d3d 100644 --- a/tests/DynamicCodeLoggerIntegrationTests/src/com/android/dcl/Simple.java +++ b/tests/DynamicCodeLoggerIntegrationTests/src/com/android/dcl/Simple.java @@ -16,7 +16,7 @@ package com.android.dcl; -/** Dummy class which is built into a jar purely so we can pass it to DexClassLoader. */ +/** Placeholder class which is built into a jar purely so we can pass it to DexClassLoader. */ public final class Simple { public Simple() {} } diff --git a/tests/Input/OWNERS b/tests/Input/OWNERS index d701f23cb9b8..3cffce960b1c 100644 --- a/tests/Input/OWNERS +++ b/tests/Input/OWNERS @@ -1 +1,2 @@ +# Bug component: 136048 include /core/java/android/hardware/input/OWNERS diff --git a/tests/Input/src/com/android/test/input/AnrTest.kt b/tests/Input/src/com/android/test/input/AnrTest.kt index d185ee6ae116..7bc5df52e316 100644 --- a/tests/Input/src/com/android/test/input/AnrTest.kt +++ b/tests/Input/src/com/android/test/input/AnrTest.kt @@ -134,7 +134,7 @@ class AnrTest { private fun getExitReasons(): List<ApplicationExitInfo> { lateinit var infos: List<ApplicationExitInfo> instrumentation.runOnMainSync { - val am = instrumentation.getContext().getSystemService(ActivityManager::class.java) + val am = instrumentation.getContext().getSystemService(ActivityManager::class.java)!! infos = am.getHistoricalProcessExitReasons(PACKAGE_NAME, ALL_PIDS, NO_MAX) } return infos diff --git a/tests/Input/src/com/android/test/input/UnresponsiveGestureMonitorActivity.kt b/tests/Input/src/com/android/test/input/UnresponsiveGestureMonitorActivity.kt index 3a24406e2b73..63782f1bf955 100644 --- a/tests/Input/src/com/android/test/input/UnresponsiveGestureMonitorActivity.kt +++ b/tests/Input/src/com/android/test/input/UnresponsiveGestureMonitorActivity.kt @@ -45,9 +45,9 @@ class UnresponsiveGestureMonitorActivity : Activity() { private lateinit var mInputMonitor: InputMonitor override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val inputManager = getSystemService(InputManager::class.java) + val inputManager = checkNotNull(getSystemService(InputManager::class.java)) mInputMonitor = inputManager.monitorGestureInput(MONITOR_NAME, displayId) mInputEventReceiver = UnresponsiveReceiver( - mInputMonitor.getInputChannel(), Looper.myLooper()) + mInputMonitor.getInputChannel(), Looper.myLooper()!!) } } diff --git a/tests/Internal/src/stub/DummyWallpaperService.java b/tests/Internal/src/stub/DummyWallpaperService.java index 084c036bea26..db1b7805a316 100644 --- a/tests/Internal/src/stub/DummyWallpaperService.java +++ b/tests/Internal/src/stub/DummyWallpaperService.java @@ -19,7 +19,7 @@ package stub; import android.service.wallpaper.WallpaperService; /** - * Dummy wallpaper service only for test purposes, won't draw anything. + * Placeholder wallpaper service only for test purposes, won't draw anything. */ public class DummyWallpaperService extends WallpaperService { @Override diff --git a/tests/NetworkSecurityConfigTest/res/raw/ca_certs_der.der b/tests/NetworkSecurityConfigTest/res/raw/ca_certs_der.der Binary files differindex 235bd4797b78..fd888ec600cd 100644 --- a/tests/NetworkSecurityConfigTest/res/raw/ca_certs_der.der +++ b/tests/NetworkSecurityConfigTest/res/raw/ca_certs_der.der diff --git a/tests/NetworkSecurityConfigTest/res/raw/ca_certs_pem.pem b/tests/NetworkSecurityConfigTest/res/raw/ca_certs_pem.pem index 413e3c07d2ab..66f7bfd21289 100644 --- a/tests/NetworkSecurityConfigTest/res/raw/ca_certs_pem.pem +++ b/tests/NetworkSecurityConfigTest/res/raw/ca_certs_pem.pem @@ -1,35 +1,31 @@ -----BEGIN CERTIFICATE----- -MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT -MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 -aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw -WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE -AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m -OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu -T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c -JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR -Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz -PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm -aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM -TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g -LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO -BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv -dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB -AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL -NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W -b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBX +MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE +CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYx +OTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoT +GUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIx +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63 +ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwS +iV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351k +KSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZ +DrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zk +j5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5 +cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esW +CruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499 +iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35Ei +Eua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbap +sZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b +9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAf +BgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIw +JQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUH +MAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6Al +oCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAy +MAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIF +AwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9 +NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9 +WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw +9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy ++qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvi +d0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8= -----END CERTIFICATE----- diff --git a/tests/NetworkSecurityConfigTest/res/xml/domain_whitespace.xml b/tests/NetworkSecurityConfigTest/res/xml/domain_whitespace.xml index 5d23d36e1dbf..99106ad37783 100644 --- a/tests/NetworkSecurityConfigTest/res/xml/domain_whitespace.xml +++ b/tests/NetworkSecurityConfigTest/res/xml/domain_whitespace.xml @@ -5,7 +5,7 @@ </domain> <domain> developer.android.com </domain> <pin-set> - <pin digest="SHA-256"> 7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y= </pin> + <pin digest="SHA-256"> zCTnfLwLKbS9S2sbp+uFz4KZOocFvXxkV06Ce9O5M2w= </pin> </pin-set> </domain-config> </network-security-config> diff --git a/tests/NetworkSecurityConfigTest/res/xml/nested_domains.xml b/tests/NetworkSecurityConfigTest/res/xml/nested_domains.xml index d45fd77a5f0f..232f88ff6cc9 100644 --- a/tests/NetworkSecurityConfigTest/res/xml/nested_domains.xml +++ b/tests/NetworkSecurityConfigTest/res/xml/nested_domains.xml @@ -9,7 +9,7 @@ <domain-config> <domain>developer.android.com</domain> <pin-set> - <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <pin digest="SHA-256">zCTnfLwLKbS9S2sbp+uFz4KZOocFvXxkV06Ce9O5M2w=</pin> </pin-set> </domain-config> </domain-config> diff --git a/tests/NetworkSecurityConfigTest/res/xml/pins1.xml b/tests/NetworkSecurityConfigTest/res/xml/pins1.xml index 1773d28094a3..7cc81b0101f1 100644 --- a/tests/NetworkSecurityConfigTest/res/xml/pins1.xml +++ b/tests/NetworkSecurityConfigTest/res/xml/pins1.xml @@ -3,7 +3,7 @@ <domain-config> <domain>android.com</domain> <pin-set> - <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin> + <pin digest="SHA-256">zCTnfLwLKbS9S2sbp+uFz4KZOocFvXxkV06Ce9O5M2w=</pin> </pin-set> </domain-config> </network-security-config> diff --git a/tests/NetworkSecurityConfigTest/src/android/security/net/config/NetworkSecurityConfigTests.java b/tests/NetworkSecurityConfigTest/src/android/security/net/config/NetworkSecurityConfigTests.java index 047be162e642..0494f174f191 100644 --- a/tests/NetworkSecurityConfigTest/src/android/security/net/config/NetworkSecurityConfigTests.java +++ b/tests/NetworkSecurityConfigTest/src/android/security/net/config/NetworkSecurityConfigTests.java @@ -22,23 +22,17 @@ import android.os.Build; import android.test.ActivityUnitTestCase; import android.util.ArraySet; import android.util.Pair; + +import com.android.org.conscrypt.TrustedCertificateStore; + import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.net.Socket; -import java.net.URL; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.Set; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLHandshakeException; -import javax.net.ssl.TrustManager; -import com.android.org.conscrypt.TrustedCertificateStore; +import javax.net.ssl.SSLContext; public class NetworkSecurityConfigTests extends ActivityUnitTestCase<Activity> { @@ -46,9 +40,9 @@ public class NetworkSecurityConfigTests extends ActivityUnitTestCase<Activity> { super(Activity.class); } - // SHA-256 of the G2 intermediate CA for android.com (as of 10/2015). - private static final byte[] G2_SPKI_SHA256 - = hexToBytes("ec722969cb64200ab6638f68ac538e40abab5b19a6485661042a1061c4612776"); + // SHA-256 of the GTS intermediate CA (CN = GTS CA 1C3) for android.com (as of 09/2023). + private static final byte[] GTS_INTERMEDIATE_SPKI_SHA256 = + hexToBytes("cc24e77cbc0b29b4bd4b6b1ba7eb85cf82993a8705bd7c64574e827bd3b9336c"); private static final byte[] TEST_CA_BYTES = hexToBytes( @@ -161,7 +155,7 @@ public class NetworkSecurityConfigTests extends ActivityUnitTestCase<Activity> { public void testGoodPin() throws Exception { ArraySet<Pin> pins = new ArraySet<Pin>(); - pins.add(new Pin("SHA-256", G2_SPKI_SHA256)); + pins.add(new Pin("SHA-256", GTS_INTERMEDIATE_SPKI_SHA256)); NetworkSecurityConfig domain = new NetworkSecurityConfig.Builder() .setPinSet(new PinSet(pins, Long.MAX_VALUE)) .addCertificatesEntryRef( @@ -247,7 +241,7 @@ public class NetworkSecurityConfigTests extends ActivityUnitTestCase<Activity> { public void testWithUrlConnection() throws Exception { ArraySet<Pin> pins = new ArraySet<Pin>(); - pins.add(new Pin("SHA-256", G2_SPKI_SHA256)); + pins.add(new Pin("SHA-256", GTS_INTERMEDIATE_SPKI_SHA256)); NetworkSecurityConfig domain = new NetworkSecurityConfig.Builder() .setPinSet(new PinSet(pins, Long.MAX_VALUE)) .addCertificatesEntryRef( @@ -304,7 +298,7 @@ public class NetworkSecurityConfigTests extends ActivityUnitTestCase<Activity> { } finally { // Delete the user added CA. We don't know the alias so just delete them all. for (String alias : store.aliases()) { - if (store.isUser(alias)) { + if (TrustedCertificateStore.isUser(alias)) { try { store.deleteCertificateEntry(alias); } catch (Exception ignored) { diff --git a/tests/NetworkSecurityConfigTest/src/android/security/net/config/TestUtils.java b/tests/NetworkSecurityConfigTest/src/android/security/net/config/TestUtils.java index 9dec21be7f37..39b5cb4c4f0d 100644 --- a/tests/NetworkSecurityConfigTest/src/android/security/net/config/TestUtils.java +++ b/tests/NetworkSecurityConfigTest/src/android/security/net/config/TestUtils.java @@ -16,19 +16,20 @@ package android.security.net.config; +import static org.junit.Assert.fail; + import android.content.pm.ApplicationInfo; import android.os.Build; -import java.net.Socket; + import java.net.URL; + import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLHandshakeException; -import javax.net.ssl.TrustManager; +import javax.net.ssl.SSLSocket; import javax.net.ssl.TrustManagerFactory; -import junit.framework.Assert; - -public final class TestUtils extends Assert { +public final class TestUtils { private TestUtils() { } @@ -36,8 +37,8 @@ public final class TestUtils extends Assert { public static void assertConnectionFails(SSLContext context, String host, int port) throws Exception { try { - Socket s = context.getSocketFactory().createSocket(host, port); - s.getInputStream(); + SSLSocket s = (SSLSocket) context.getSocketFactory().createSocket(host, port); + s.startHandshake(); fail("Expected connection to " + host + ":" + port + " to fail."); } catch (SSLHandshakeException expected) { } @@ -45,7 +46,8 @@ public final class TestUtils extends Assert { public static void assertConnectionSucceeds(SSLContext context, String host, int port) throws Exception { - Socket s = context.getSocketFactory().createSocket(host, port); + SSLSocket s = (SSLSocket) context.getSocketFactory().createSocket(host, port); + s.startHandshake(); s.getInputStream(); } diff --git a/tests/NetworkSecurityConfigTest/src/android/security/net/config/XmlConfigTests.java b/tests/NetworkSecurityConfigTest/src/android/security/net/config/XmlConfigTests.java index 4b7a014f25dc..81e05c1d4e42 100644 --- a/tests/NetworkSecurityConfigTest/src/android/security/net/config/XmlConfigTests.java +++ b/tests/NetworkSecurityConfigTest/src/android/security/net/config/XmlConfigTests.java @@ -16,26 +16,18 @@ package android.security.net.config; -import android.content.Context; import android.content.pm.ApplicationInfo; import android.test.AndroidTestCase; import android.test.MoreAsserts; -import android.util.ArraySet; -import android.util.Pair; + import java.io.IOException; import java.net.InetAddress; -import java.net.Socket; -import java.net.URL; import java.security.KeyStore; import java.security.Provider; -import java.security.Security; import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Collections; import java.util.Set; -import javax.net.ssl.HttpsURLConnection; + import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLHandshakeException; import javax.net.ssl.SSLSocket; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; @@ -52,7 +44,7 @@ public class XmlConfigTests extends AndroidTestCase { NetworkSecurityConfig config = appConfig.getConfigForHostname(""); assertNotNull(config); // Check defaults. - assertTrue(config.isCleartextTrafficPermitted()); + assertFalse(config.isCleartextTrafficPermitted()); assertFalse(config.isHstsEnforced()); assertFalse(config.getTrustAnchors().isEmpty()); PinSet pinSet = config.getPins(); @@ -72,7 +64,7 @@ public class XmlConfigTests extends AndroidTestCase { NetworkSecurityConfig config = appConfig.getConfigForHostname(""); assertNotNull(config); // Check defaults. - assertTrue(config.isCleartextTrafficPermitted()); + assertFalse(config.isCleartextTrafficPermitted()); assertFalse(config.isHstsEnforced()); assertTrue(config.getTrustAnchors().isEmpty()); PinSet pinSet = config.getPins(); @@ -91,14 +83,14 @@ public class XmlConfigTests extends AndroidTestCase { NetworkSecurityConfig config = appConfig.getConfigForHostname(""); assertNotNull(config); // Check defaults. - assertTrue(config.isCleartextTrafficPermitted()); + assertFalse(config.isCleartextTrafficPermitted()); assertFalse(config.isHstsEnforced()); assertTrue(config.getTrustAnchors().isEmpty()); PinSet pinSet = config.getPins(); assertTrue(pinSet.pins.isEmpty()); // Check android.com. config = appConfig.getConfigForHostname("android.com"); - assertTrue(config.isCleartextTrafficPermitted()); + assertFalse(config.isCleartextTrafficPermitted()); assertFalse(config.isHstsEnforced()); assertFalse(config.getTrustAnchors().isEmpty()); pinSet = config.getPins(); @@ -188,7 +180,7 @@ public class XmlConfigTests extends AndroidTestCase { ApplicationConfig appConfig = new ApplicationConfig(source); assertTrue(appConfig.hasPerDomainConfigs()); NetworkSecurityConfig config = appConfig.getConfigForHostname("android.com"); - assertTrue(config.isCleartextTrafficPermitted()); + assertFalse(config.isCleartextTrafficPermitted()); assertFalse(config.isHstsEnforced()); assertFalse(config.getTrustAnchors().isEmpty()); PinSet pinSet = config.getPins(); @@ -250,9 +242,9 @@ public class XmlConfigTests extends AndroidTestCase { ApplicationConfig appConfig = new ApplicationConfig(source); // Check android.com. NetworkSecurityConfig config = appConfig.getConfigForHostname("android.com"); - assertTrue(config.isCleartextTrafficPermitted()); + assertFalse(config.isCleartextTrafficPermitted()); assertFalse(config.isHstsEnforced()); - assertEquals(2, config.getTrustAnchors().size()); + assertEquals(1, config.getTrustAnchors().size()); // Try connections. SSLContext context = TestUtils.getSSLContext(source); TestUtils.assertConnectionSucceeds(context, "android.com", 443); @@ -267,9 +259,9 @@ public class XmlConfigTests extends AndroidTestCase { ApplicationConfig appConfig = new ApplicationConfig(source); // Check android.com. NetworkSecurityConfig config = appConfig.getConfigForHostname("android.com"); - assertTrue(config.isCleartextTrafficPermitted()); + assertFalse(config.isCleartextTrafficPermitted()); assertFalse(config.isHstsEnforced()); - assertEquals(2, config.getTrustAnchors().size()); + assertEquals(1, config.getTrustAnchors().size()); // Try connections. SSLContext context = TestUtils.getSSLContext(source); TestUtils.assertConnectionSucceeds(context, "android.com", 443); diff --git a/tests/PlatformCompatGating/src/com/android/compat/testing/DummyApi.java b/tests/PlatformCompatGating/src/com/android/compat/testing/DummyApi.java index 731be8e3d9f0..a77950fe4a2d 100644 --- a/tests/PlatformCompatGating/src/com/android/compat/testing/DummyApi.java +++ b/tests/PlatformCompatGating/src/com/android/compat/testing/DummyApi.java @@ -24,7 +24,7 @@ import android.os.ServiceManager; import com.android.internal.compat.IPlatformCompat; /** - * This is a dummy API to test gating + * This is a placeholder API to test gating * * @hide */ @@ -36,7 +36,7 @@ public class DummyApi { public static final long CHANGE_SYSTEM_SERVER = 666016; /** - * Dummy method + * Placeholder method * @return "A" if change is enabled, "B" otherwise. */ public static String dummyFunc() { @@ -47,7 +47,7 @@ public class DummyApi { } /** - * Dummy combined method + * Placeholder combined method * @return "0" if {@link CHANGE_ID_1} is disabled and {@link CHANGE_ID_2} is disabled, "1" if {@link CHANGE_ID_1} is disabled and {@link CHANGE_ID_2} is enabled, "2" if {@link CHANGE_ID_1} is enabled and {@link CHANGE_ID_2} is disabled, @@ -68,7 +68,7 @@ public class DummyApi { } /** - * Dummy api using system server API. + * Placeholder api using system server API. */ public static boolean dummySystemServer(Context context) { IPlatformCompat platformCompat = IPlatformCompat.Stub diff --git a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapMetadataEditor.kt b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapMetadataEditor.kt index 8a653045c97b..1a79a11a3718 100644 --- a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapMetadataEditor.kt +++ b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapMetadataEditor.kt @@ -99,23 +99,23 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { (view.getParent() as ViewGroup).removeView(view) parent.addView(view) - view.findViewById<Button>(R.id.gainmap_metadata_done)!!.setOnClickListener { + view.requireViewById<Button>(R.id.gainmap_metadata_done).setOnClickListener { closeEditor() } - view.findViewById<Button>(R.id.gainmap_metadata_reset)!!.setOnClickListener { + view.requireViewById<Button>(R.id.gainmap_metadata_reset).setOnClickListener { resetGainmapMetadata() } updateMetadataUi() - val gainmapMinSeek = view.findViewById<SeekBar>(R.id.gainmap_metadata_gainmapmin) - val gainmapMaxSeek = view.findViewById<SeekBar>(R.id.gainmap_metadata_gainmapmax) - val capacityMinSeek = view.findViewById<SeekBar>(R.id.gainmap_metadata_capacitymin) - val capacityMaxSeek = view.findViewById<SeekBar>(R.id.gainmap_metadata_capacitymax) - val gammaSeek = view.findViewById<SeekBar>(R.id.gainmap_metadata_gamma) - val offsetSdrSeek = view.findViewById<SeekBar>(R.id.gainmap_metadata_offsetsdr) - val offsetHdrSeek = view.findViewById<SeekBar>(R.id.gainmap_metadata_offsethdr) + val gainmapMinSeek = view.requireViewById<SeekBar>(R.id.gainmap_metadata_gainmapmin) + val gainmapMaxSeek = view.requireViewById<SeekBar>(R.id.gainmap_metadata_gainmapmax) + val capacityMinSeek = view.requireViewById<SeekBar>(R.id.gainmap_metadata_capacitymin) + val capacityMaxSeek = view.requireViewById<SeekBar>(R.id.gainmap_metadata_capacitymax) + val gammaSeek = view.requireViewById<SeekBar>(R.id.gainmap_metadata_gamma) + val offsetSdrSeek = view.requireViewById<SeekBar>(R.id.gainmap_metadata_offsetsdr) + val offsetHdrSeek = view.requireViewById<SeekBar>(R.id.gainmap_metadata_offsethdr) arrayOf(gainmapMinSeek, gainmapMaxSeek, capacityMinSeek, capacityMaxSeek, gammaSeek, offsetSdrSeek, offsetHdrSeek).forEach { it.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ @@ -140,13 +140,13 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { } private fun updateMetadataUi() { - val gainmapMinSeek = parent.findViewById<SeekBar>(R.id.gainmap_metadata_gainmapmin) - val gainmapMaxSeek = parent.findViewById<SeekBar>(R.id.gainmap_metadata_gainmapmax) - val capacityMinSeek = parent.findViewById<SeekBar>(R.id.gainmap_metadata_capacitymin) - val capacityMaxSeek = parent.findViewById<SeekBar>(R.id.gainmap_metadata_capacitymax) - val gammaSeek = parent.findViewById<SeekBar>(R.id.gainmap_metadata_gamma) - val offsetSdrSeek = parent.findViewById<SeekBar>(R.id.gainmap_metadata_offsetsdr) - val offsetHdrSeek = parent.findViewById<SeekBar>(R.id.gainmap_metadata_offsethdr) + val gainmapMinSeek = parent.requireViewById<SeekBar>(R.id.gainmap_metadata_gainmapmin) + val gainmapMaxSeek = parent.requireViewById<SeekBar>(R.id.gainmap_metadata_gainmapmax) + val capacityMinSeek = parent.requireViewById<SeekBar>(R.id.gainmap_metadata_capacitymin) + val capacityMaxSeek = parent.requireViewById<SeekBar>(R.id.gainmap_metadata_capacitymax) + val gammaSeek = parent.requireViewById<SeekBar>(R.id.gainmap_metadata_gamma) + val offsetSdrSeek = parent.requireViewById<SeekBar>(R.id.gainmap_metadata_offsetsdr) + val offsetHdrSeek = parent.requireViewById<SeekBar>(R.id.gainmap_metadata_offsethdr) gainmapMinSeek.setProgress( ((currentMetadata.ratioMin - minRatioMin) / maxRatioMin * maxProgress).toInt()) @@ -166,19 +166,19 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { ((1.0 - Math.log(currentMetadata.offsetHdr.toDouble() / Math.log(3.0)) / -11.0) .toFloat() * maxProgress).toInt()) - parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmin_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_gainmapmin_val).setText( "%.3f".format(currentMetadata.ratioMin)) - parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmax_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_gainmapmax_val).setText( "%.3f".format(currentMetadata.ratioMax)) - parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymin_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_capacitymin_val).setText( "%.3f".format(currentMetadata.capacityMin)) - parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymax_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_capacitymax_val).setText( "%.3f".format(currentMetadata.capacityMax)) - parent.findViewById<TextView>(R.id.gainmap_metadata_gamma_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_gamma_val).setText( "%.3f".format(currentMetadata.gamma)) - parent.findViewById<TextView>(R.id.gainmap_metadata_offsetsdr_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_offsetsdr_val).setText( "%.5f".format(currentMetadata.offsetSdr)) - parent.findViewById<TextView>(R.id.gainmap_metadata_offsethdr_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_offsethdr_val).setText( "%.5f".format(currentMetadata.offsetHdr)) } @@ -201,7 +201,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private fun updateGainmapMin(normalized: Float) { val newValue = minRatioMin + normalized * (maxRatioMin - minRatioMin) - parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmin_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_gainmapmin_val).setText( "%.3f".format(newValue)) currentMetadata.ratioMin = newValue if (showingEdits) { @@ -212,7 +212,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private fun updateGainmapMax(normalized: Float) { val newValue = minRatioMax + normalized * (maxRatioMax - minRatioMax) - parent.findViewById<TextView>(R.id.gainmap_metadata_gainmapmax_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_gainmapmax_val).setText( "%.3f".format(newValue)) currentMetadata.ratioMax = newValue if (showingEdits) { @@ -223,7 +223,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private fun updateCapacityMin(normalized: Float) { val newValue = minCapacityMin + normalized * (maxCapacityMin - minCapacityMin) - parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymin_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_capacitymin_val).setText( "%.3f".format(newValue)) currentMetadata.capacityMin = newValue if (showingEdits) { @@ -234,7 +234,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private fun updateCapacityMax(normalized: Float) { val newValue = minCapacityMax + normalized * (maxCapacityMax - minCapacityMax) - parent.findViewById<TextView>(R.id.gainmap_metadata_capacitymax_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_capacitymax_val).setText( "%.3f".format(newValue)) currentMetadata.capacityMax = newValue if (showingEdits) { @@ -245,7 +245,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { private fun updateGamma(normalized: Float) { val newValue = minGamma + normalized * (maxGamma - minGamma) - parent.findViewById<TextView>(R.id.gainmap_metadata_gamma_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_gamma_val).setText( "%.3f".format(newValue)) currentMetadata.gamma = newValue if (showingEdits) { @@ -259,7 +259,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { if (normalized > 0.0f ) { newValue = Math.pow(3.0, (1.0 - normalized.toDouble()) * -11.0).toFloat() } - parent.findViewById<TextView>(R.id.gainmap_metadata_offsetsdr_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_offsetsdr_val).setText( "%.5f".format(newValue)) currentMetadata.offsetSdr = newValue if (showingEdits) { @@ -273,7 +273,7 @@ class GainmapMetadataEditor(val parent: ViewGroup, val renderView: View) { if (normalized > 0.0f ) { newValue = Math.pow(3.0, (1.0 - normalized.toDouble()) * -11.0).toFloat() } - parent.findViewById<TextView>(R.id.gainmap_metadata_offsethdr_val)!!.setText( + parent.requireViewById<TextView>(R.id.gainmap_metadata_offsethdr_val).setText( "%.5f".format(newValue)) currentMetadata.offsetHdr = newValue if (showingEdits) { diff --git a/tests/SilkFX/src/com/android/test/silkfx/materials/BackgroundBlurActivity.kt b/tests/SilkFX/src/com/android/test/silkfx/materials/BackgroundBlurActivity.kt index 9d17d38d4298..4d38660e6029 100644 --- a/tests/SilkFX/src/com/android/test/silkfx/materials/BackgroundBlurActivity.kt +++ b/tests/SilkFX/src/com/android/test/silkfx/materials/BackgroundBlurActivity.kt @@ -132,7 +132,7 @@ class BackgroundBlurActivity : Activity(), SeekBar.OnSeekBarChangeListener { mBlurForceDisabled = disabled Settings.Global.putInt(getContentResolver(), Settings.Global.DISABLE_WINDOW_BLURS, if (mBlurForceDisabled) 1 else 0) - (findViewById(R.id.toggle_blur_enabled) as Button) + (requireViewById(R.id.toggle_blur_enabled) as Button) .setText(if (mBlurForceDisabled) "Enable blurs" else "Disable blurs") } @@ -142,13 +142,13 @@ class BackgroundBlurActivity : Activity(), SeekBar.OnSeekBarChangeListener { fun setBackgroundBlur(radius: Int) { mBackgroundBlurRadius = radius - (findViewById(R.id.background_blur_radius) as TextView).setText(radius.toString()) + (requireViewById(R.id.background_blur_radius) as TextView).setText(radius.toString()) window.setBackgroundBlurRadius(mBackgroundBlurRadius) } fun setBlurBehind(radius: Int) { mBlurBehindRadius = radius - (findViewById(R.id.blur_behind_radius) as TextView).setText(radius.toString()) + (requireViewById(R.id.blur_behind_radius) as TextView).setText(radius.toString()) window.getAttributes().setBlurBehindRadius(mBlurBehindRadius) window.setAttributes(window.getAttributes()) } @@ -159,7 +159,7 @@ class BackgroundBlurActivity : Activity(), SeekBar.OnSeekBarChangeListener { } else { mDimAmountNoBlur = amount } - (findViewById(R.id.dim_amount) as TextView).setText("%.2f".format(amount)) + (requireViewById(R.id.dim_amount) as TextView).setText("%.2f".format(amount)) window.getAttributes().dimAmount = amount window.setAttributes(window.getAttributes()) } @@ -168,7 +168,7 @@ class BackgroundBlurActivity : Activity(), SeekBar.OnSeekBarChangeListener { mBatterySavingModeOn = on Settings.Global.putInt(getContentResolver(), Settings.Global.LOW_POWER_MODE, if (on) 1 else 0) - (findViewById(R.id.toggle_battery_saving_mode) as Button).setText( + (requireViewById(R.id.toggle_battery_saving_mode) as Button).setText( if (on) "Exit low power mode" else "Enter low power mode") } @@ -182,7 +182,7 @@ class BackgroundBlurActivity : Activity(), SeekBar.OnSeekBarChangeListener { } else { mAlphaNoBlur = alpha } - (findViewById(R.id.background_alpha) as TextView).setText("%.2f".format(alpha)) + (requireViewById(R.id.background_alpha) as TextView).setText("%.2f".format(alpha)) mBackgroundDrawable.setAlpha((alpha * 255f).toInt()) getWindowManager().updateViewLayout(window.getDecorView(), window.getAttributes()) } diff --git a/tests/SilkFX/src/com/android/test/silkfx/materials/GlassView.kt b/tests/SilkFX/src/com/android/test/silkfx/materials/GlassView.kt index 2f2578b87f35..41baeadf7a8c 100644 --- a/tests/SilkFX/src/com/android/test/silkfx/materials/GlassView.kt +++ b/tests/SilkFX/src/com/android/test/silkfx/materials/GlassView.kt @@ -190,9 +190,9 @@ class GlassView(context: Context, attributeSet: AttributeSet) : FrameLayout(cont sensorManager?.unregisterListener(sensorListener) } - override fun onDraw(canvas: Canvas?) { + override fun onDraw(canvas: Canvas) { updateGlassRenderNode() - canvas?.drawRenderNode(renderNode) + canvas.drawRenderNode(renderNode) } fun resetGyroOffsets() { @@ -227,4 +227,4 @@ class GlassView(context: Context, attributeSet: AttributeSet) : FrameLayout(cont renderNodeIsDirty = false } } -}
\ No newline at end of file +} diff --git a/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestService.java b/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestService.java index 3567c08d0285..cc6cebf88907 100644 --- a/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestService.java +++ b/tests/SoundTriggerTestApp/src/com/android/test/soundtrigger/SoundTriggerTestService.java @@ -469,7 +469,7 @@ public class SoundTriggerTestService extends Service { } } - // Create a few dummy models if we didn't load anything. + // Create a few placeholder models if we didn't load anything. if (!loadedModel) { Properties dummyModelProperties = new Properties(); for (String name : new String[]{"1", "2", "3"}) { diff --git a/tests/StagedInstallTest/OWNERS b/tests/StagedInstallTest/OWNERS index aac68e994a39..d7301dc9c895 100644 --- a/tests/StagedInstallTest/OWNERS +++ b/tests/StagedInstallTest/OWNERS @@ -1,3 +1,5 @@ +# Bug component: 36137 + include /services/core/java/com/android/server/pm/OWNERS dariofreni@google.com diff --git a/tests/TrustTests/Android.bp b/tests/TrustTests/Android.bp index a1b888aef934..c216bced81f0 100644 --- a/tests/TrustTests/Android.bp +++ b/tests/TrustTests/Android.bp @@ -25,6 +25,7 @@ android_test { "androidx.test.rules", "androidx.test.ext.junit", "androidx.test.uiautomator_uiautomator", + "flag-junit", "mockito-target-minus-junit4", "servicestests-utils", "truth-prebuilt", diff --git a/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt b/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt index f864fedf4e62..1dfd5c06167b 100644 --- a/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt +++ b/tests/TrustTests/src/android/trust/test/GrantAndRevokeTrustTest.kt @@ -16,6 +16,10 @@ package android.trust.test +import android.content.pm.PackageManager +import android.platform.test.annotations.RequiresFlagsDisabled +import android.platform.test.annotations.RequiresFlagsEnabled +import android.platform.test.flag.junit.DeviceFlagsValueProvider import android.service.trust.GrantTrustResult import android.trust.BaseTrustAgentService import android.trust.TrustTestActivity @@ -27,6 +31,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation import androidx.test.uiautomator.UiDevice import com.android.server.testutils.mock +import org.junit.Assume.assumeFalse import org.junit.Before import org.junit.Rule import org.junit.Test @@ -45,6 +50,7 @@ class GrantAndRevokeTrustTest { private val activityScenarioRule = ActivityScenarioRule(TrustTestActivity::class.java) private val lockStateTrackingRule = LockStateTrackingRule() private val trustAgentRule = TrustAgentRule<GrantAndRevokeTrustAgent>() + private val packageManager = getInstrumentation().getTargetContext().getPackageManager() @get:Rule val rule: RuleChain = RuleChain @@ -52,6 +58,7 @@ class GrantAndRevokeTrustTest { .around(ScreenLockRule()) .around(lockStateTrackingRule) .around(trustAgentRule) + .around(DeviceFlagsValueProvider.createCheckFlagsRule()) @Before fun manageTrust() { @@ -72,7 +79,7 @@ class GrantAndRevokeTrustTest { trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 10000, 0) {} uiDevice.sleep() - lockStateTrackingRule.assertUnlocked() + lockStateTrackingRule.assertUnlockedAndTrusted() } @Test @@ -86,6 +93,51 @@ class GrantAndRevokeTrustTest { } @Test + @RequiresFlagsEnabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS) + fun grantCannotActivelyUnlockDevice() { + // On automotive, trust agents can actively unlock the device. + assumeFalse(packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) + + // Lock the device. + uiDevice.sleep() + lockStateTrackingRule.assertLocked() + + // Grant trust. + trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 10000, 0) {} + + // The grant should not have unlocked the device. Wait a bit so that + // TrustManagerService probably will have finished processing the grant. + await() + lockStateTrackingRule.assertLocked() + + // Turn the screen on and off to cause TrustManagerService to refresh + // its deviceLocked state. Then verify the state is still locked. This + // part failed before the fix for b/296464083. + uiDevice.wakeUp() + uiDevice.sleep() + await() + lockStateTrackingRule.assertLocked() + } + + @Test + @RequiresFlagsDisabled(android.security.Flags.FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS) + fun grantCouldCauseWrongDeviceLockedStateDueToBug() { + // On automotive, trust agents can actively unlock the device. + assumeFalse(packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) + + // Verify that b/296464083 exists. That is, when the device is locked + // and a trust agent grants trust, the deviceLocked state incorrectly + // becomes false even though the device correctly remains locked. + uiDevice.sleep() + lockStateTrackingRule.assertLocked() + trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 10000, 0) {} + uiDevice.wakeUp() + uiDevice.sleep() + await() + lockStateTrackingRule.assertUnlockedButNotReally() + } + + @Test fun grantDoesNotCallBack() { val callback = mock<(GrantTrustResult) -> Unit>() trustAgentRule.agent.grantTrust(GRANT_MESSAGE, 0, 0, callback) diff --git a/tests/TrustTests/src/android/trust/test/TemporaryAndRenewableTrustTest.kt b/tests/TrustTests/src/android/trust/test/TemporaryAndRenewableTrustTest.kt index ae722477a2bc..96362b8e71dc 100644 --- a/tests/TrustTests/src/android/trust/test/TemporaryAndRenewableTrustTest.kt +++ b/tests/TrustTests/src/android/trust/test/TemporaryAndRenewableTrustTest.kt @@ -102,7 +102,7 @@ class TemporaryAndRenewableTrustTest { trustAgentRule.agent.grantTrust( GRANT_MESSAGE, 0, FLAG_GRANT_TRUST_TEMPORARY_AND_RENEWABLE) {} - lockStateTrackingRule.assertUnlocked() + lockStateTrackingRule.assertUnlockedAndTrusted() } @Test @@ -125,7 +125,7 @@ class TemporaryAndRenewableTrustTest { Log.i(TAG, "Callback received; status=${it.status}") result = it } - lockStateTrackingRule.assertUnlocked() + lockStateTrackingRule.assertUnlockedAndTrusted() wait("callback triggered") { result?.status == STATUS_UNLOCKED_BY_GRANT } } diff --git a/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt b/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt index 1400dde5781d..5a8f82827253 100644 --- a/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt +++ b/tests/TrustTests/src/android/trust/test/lib/LockStateTrackingRule.kt @@ -16,6 +16,7 @@ package android.trust.test.lib +import android.app.KeyguardManager import android.app.trust.TrustManager import android.content.Context import android.util.Log @@ -26,18 +27,23 @@ import org.junit.runner.Description import org.junit.runners.model.Statement /** - * Rule for tracking the lock state of the device based on events emitted to [TrustListener]. + * Rule for tracking the trusted state of the device based on events emitted to + * [TrustListener]. Provides helper methods for verifying that the trusted + * state has a particular value and is consistent with (a) the keyguard "locked" + * (i.e. showing) value when applicable, and (b) the device locked value that is + * tracked by TrustManagerService and is queryable via KeyguardManager. */ class LockStateTrackingRule : TestRule { private val context: Context = getApplicationContext() - private val windowManager = WindowManagerGlobal.getWindowManagerService() + private val windowManager = checkNotNull(WindowManagerGlobal.getWindowManagerService()) + private val keyguardManager = context.getSystemService(KeyguardManager::class.java) as KeyguardManager - @Volatile lateinit var lockState: LockState + @Volatile lateinit var trustState: TrustState private set override fun apply(base: Statement, description: Description) = object : Statement() { override fun evaluate() { - lockState = LockState(locked = windowManager.isKeyguardLocked) + trustState = TrustState() val trustManager = context.getSystemService(TrustManager::class.java) as TrustManager val listener = Listener() @@ -51,12 +57,25 @@ class LockStateTrackingRule : TestRule { } fun assertLocked() { - wait("un-locked per TrustListener") { lockState.locked == true } - wait("keyguard lock") { windowManager.isKeyguardLocked } + wait("device locked") { keyguardManager.isDeviceLocked } + // isDeviceLocked implies isKeyguardLocked && !trusted. + wait("keyguard locked") { windowManager.isKeyguardLocked } + wait("not trusted") { trustState.trusted == false } } - fun assertUnlocked() { - wait("locked per TrustListener") { lockState.locked == false } + // TODO(b/299298338) remove this when removing FLAG_FIX_UNLOCKED_DEVICE_REQUIRED_KEYS + fun assertUnlockedButNotReally() { + wait("device unlocked") { !keyguardManager.isDeviceLocked } + wait("not trusted") { trustState.trusted == false } + wait("keyguard locked") { windowManager.isKeyguardLocked } + } + + fun assertUnlockedAndTrusted() { + wait("device unlocked") { !keyguardManager.isDeviceLocked } + wait("trusted") { trustState.trusted == true } + // Can't check for !isKeyguardLocked here, since isKeyguardLocked + // returns true in the case where the keyguard is dismissible with + // swipe, which is considered "device unlocked"! } inner class Listener : TestTrustListener() { @@ -68,12 +87,12 @@ class LockStateTrackingRule : TestRule { trustGrantedMessages: MutableList<String> ) { Log.d(TAG, "Device became trusted=$enabled") - lockState = lockState.copy(locked = !enabled) + trustState = trustState.copy(trusted=enabled) } } - data class LockState( - val locked: Boolean? = null + data class TrustState( + val trusted: Boolean? = null ) companion object { diff --git a/tests/TrustTests/src/android/trust/test/lib/ScreenLockRule.kt b/tests/TrustTests/src/android/trust/test/lib/ScreenLockRule.kt index 4189baae10cb..f1edca3ff86e 100644 --- a/tests/TrustTests/src/android/trust/test/lib/ScreenLockRule.kt +++ b/tests/TrustTests/src/android/trust/test/lib/ScreenLockRule.kt @@ -36,7 +36,7 @@ import org.junit.runners.model.Statement class ScreenLockRule : TestRule { private val context: Context = getApplicationContext() private val uiDevice = UiDevice.getInstance(getInstrumentation()) - private val windowManager = WindowManagerGlobal.getWindowManagerService() + private val windowManager = checkNotNull(WindowManagerGlobal.getWindowManagerService()) private val lockPatternUtils = LockPatternUtils(context) private var instantLockSavedValue = false diff --git a/tests/libs-permissions/system_ext/java/com/android/test/libs/system_ext/LibsSystemExtTest.java b/tests/libs-permissions/system_ext/java/com/android/test/libs/system_ext/LibsSystemExtTest.java index 9999aba37d8d..673c73aa2aac 100644 --- a/tests/libs-permissions/system_ext/java/com/android/test/libs/system_ext/LibsSystemExtTest.java +++ b/tests/libs-permissions/system_ext/java/com/android/test/libs/system_ext/LibsSystemExtTest.java @@ -22,7 +22,7 @@ package com.android.test.libs.system_ext; public class LibsSystemExtTest { /** - * Dummy method for testing. + * Placeholder method for testing. */ public static void test() { } diff --git a/tests/utils/testutils/java/android/os/test/FakePermissionEnforcer.java b/tests/utils/testutils/java/android/os/test/FakePermissionEnforcer.java index b94bb41c0988..d10ae307fdf4 100644 --- a/tests/utils/testutils/java/android/os/test/FakePermissionEnforcer.java +++ b/tests/utils/testutils/java/android/os/test/FakePermissionEnforcer.java @@ -47,6 +47,10 @@ public class FakePermissionEnforcer extends PermissionEnforcer { mGranted.remove(permission); } + public void revokeAll() { + mGranted.clear(); + } + private boolean granted(String permission) { return mGranted.contains(permission); } diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java index 89271e1218d8..302af523a4bd 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -42,6 +42,7 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -345,6 +346,33 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection verify(mConnMgr).reportNetworkConnectivity(eq(mNetworkAgent.getNetwork()), eq(false)); } + @Test + public void testMigrationHandleFailure() throws Exception { + triggerChildOpened(); + mTestLooper.dispatchAll(); + assertEquals(mIkeConnectionInfo, mGatewayConnection.getIkeConnectionInfo()); + + mGatewayConnection + .getUnderlyingNetworkControllerCallback() + .onSelectedUnderlyingNetworkChanged(TEST_UNDERLYING_NETWORK_RECORD_2); + + final IkeSessionConnectionInfo newIkeConnectionInfo = + new IkeSessionConnectionInfo( + TEST_ADDR_V4, TEST_ADDR_V4_2, TEST_UNDERLYING_NETWORK_RECORD_2.network); + getIkeSessionCallback().onIkeSessionConnectionInfoChanged(newIkeConnectionInfo); + getChildSessionCallback() + .onIpSecTransformsMigrated(makeDummyIpSecTransform(), makeDummyIpSecTransform()); + + doThrow(new IllegalArgumentException("testMigrationHandleFailure")) + .when(mIpSecSvc) + .setNetworkForTunnelInterface(anyInt(), any(), any()); + + mTestLooper.dispatchAll(); + + assertEquals(mGatewayConnection.mDisconnectingState, mGatewayConnection.getCurrentState()); + verify(mIkeSession).close(); + } + private void triggerChildOpened() { triggerChildOpened(Collections.singletonList(TEST_INTERNAL_ADDR), TEST_DNS_ADDR); } diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp index 899d26818548..82bcfc2c1a8b 100644 --- a/tools/aapt/AaptAssets.cpp +++ b/tools/aapt/AaptAssets.cpp @@ -7,7 +7,9 @@ #include "AaptUtil.h" #include "Main.h" #include "ResourceFilter.h" +#include "Utils.h" +#include <androidfw/PathUtils.h> #include <utils/misc.h> #include <utils/SortedVector.h> @@ -96,8 +98,8 @@ static bool isHidden(const char *root, const char *path) char *matchedPattern = NULL; String8 fullPath(root); - fullPath.appendPath(path); - FileType type = getFileType(fullPath); + appendPath(fullPath, String8(path)); + FileType type = getFileType(fullPath.c_str()); int plen = strlen(path); @@ -219,7 +221,7 @@ bool AaptLocaleValue::initFromFilterString(const String8& str) { if (numTags >= 1) { const String8& lang = parts[0]; if (isAlpha(lang) && (lang.length() == 2 || lang.length() == 3)) { - setLanguage(lang.string()); + setLanguage(lang.c_str()); valid = true; } } @@ -232,11 +234,11 @@ bool AaptLocaleValue::initFromFilterString(const String8& str) { const String8& part2 = parts[1]; if ((part2.length() == 2 && isAlpha(part2)) || (part2.length() == 3 && isNumber(part2))) { - setRegion(part2.string()); + setRegion(part2.c_str()); } else if (part2.length() == 4 && isAlpha(part2)) { - setScript(part2.string()); + setScript(part2.c_str()); } else if (part2.length() >= 4 && part2.length() <= 8) { - setVariant(part2.string()); + setVariant(part2.c_str()); } else { valid = false; } @@ -249,9 +251,9 @@ bool AaptLocaleValue::initFromFilterString(const String8& str) { const String8& part3 = parts[2]; if (((part3.length() == 2 && isAlpha(part3)) || (part3.length() == 3 && isNumber(part3))) && script[0]) { - setRegion(part3.string()); + setRegion(part3.c_str()); } else if (part3.length() >= 4 && part3.length() <= 8) { - setVariant(part3.string()); + setVariant(part3.c_str()); } else { valid = false; } @@ -262,7 +264,7 @@ bool AaptLocaleValue::initFromFilterString(const String8& str) { const String8& part4 = parts[3]; if (part4.length() >= 4 && part4.length() <= 8) { - setVariant(part4.string()); + setVariant(part4.c_str()); } else { valid = false; } @@ -285,19 +287,19 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta Vector<String8> subtags = AaptUtil::splitAndLowerCase(part, '+'); subtags.removeItemsAt(0); if (subtags.size() == 1) { - setLanguage(subtags[0]); + setLanguage(subtags[0].c_str()); } else if (subtags.size() == 2) { - setLanguage(subtags[0]); + setLanguage(subtags[0].c_str()); // The second tag can either be a region, a variant or a script. switch (subtags[1].size()) { case 2: case 3: - setRegion(subtags[1]); + setRegion(subtags[1].c_str()); break; case 4: if (isAlpha(subtags[1])) { - setScript(subtags[1]); + setScript(subtags[1].c_str()); break; } // This is not alphabetical, so we fall through to variant @@ -306,50 +308,50 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta case 6: case 7: case 8: - setVariant(subtags[1]); + setVariant(subtags[1].c_str()); break; default: fprintf(stderr, "ERROR: Invalid BCP 47 tag in directory name %s\n", - part.string()); + part.c_str()); return -1; } } else if (subtags.size() == 3) { // The language is always the first subtag. - setLanguage(subtags[0]); + setLanguage(subtags[0].c_str()); // The second subtag can either be a script or a region code. // If its size is 4, it's a script code, else it's a region code. if (subtags[1].size() == 4) { - setScript(subtags[1]); + setScript(subtags[1].c_str()); } else if (subtags[1].size() == 2 || subtags[1].size() == 3) { - setRegion(subtags[1]); + setRegion(subtags[1].c_str()); } else { - fprintf(stderr, "ERROR: Invalid BCP 47 tag in directory name %s\n", part.string()); + fprintf(stderr, "ERROR: Invalid BCP 47 tag in directory name %s\n", part.c_str()); return -1; } // The third tag can either be a region code (if the second tag was // a script), else a variant code. if (subtags[2].size() >= 4) { - setVariant(subtags[2]); + setVariant(subtags[2].c_str()); } else { - setRegion(subtags[2]); + setRegion(subtags[2].c_str()); } } else if (subtags.size() == 4) { - setLanguage(subtags[0]); - setScript(subtags[1]); - setRegion(subtags[2]); - setVariant(subtags[3]); + setLanguage(subtags[0].c_str()); + setScript(subtags[1].c_str()); + setRegion(subtags[2].c_str()); + setVariant(subtags[3].c_str()); } else { - fprintf(stderr, "ERROR: Invalid BCP 47 tag in directory name: %s\n", part.string()); + fprintf(stderr, "ERROR: Invalid BCP 47 tag in directory name: %s\n", part.c_str()); return -1; } return ++currentIndex; } else { if ((part.length() == 2 || part.length() == 3) - && isAlpha(part) && strcmp("car", part.string())) { - setLanguage(part); + && isAlpha(part) && strcmp("car", part.c_str())) { + setLanguage(part.c_str()); if (++currentIndex == size) { return size; } @@ -358,8 +360,8 @@ int AaptLocaleValue::initFromDirName(const Vector<String8>& parts, const int sta } part = parts[currentIndex]; - if (part.string()[0] == 'r' && part.length() == 3) { - setRegion(part.string() + 1); + if (part.c_str()[0] == 'r' && part.length() == 3) { + setRegion(part.c_str() + 1); if (++currentIndex == size) { return size; } @@ -508,7 +510,7 @@ String8 AaptFile::getPrintableSource() const { if (hasData()) { String8 name(mGroupEntry.toDirName(String8())); - name.appendPath(mPath); + appendPath(name, mPath); name.append(" #generated"); return name; } @@ -524,8 +526,8 @@ status_t AaptGroup::addFile(const sp<AaptFile>& file, const bool overwriteDuplic ssize_t index = mFiles.indexOfKey(file->getGroupEntry()); if (index >= 0 && overwriteDuplicate) { fprintf(stderr, "warning: overwriting '%s' with '%s'\n", - mFiles[index]->getSourceFile().string(), - file->getSourceFile().string()); + mFiles[index]->getSourceFile().c_str(), + file->getSourceFile().c_str()); removeFile(index); index = -1; } @@ -545,7 +547,7 @@ status_t AaptGroup::addFile(const sp<AaptFile>& file, const bool overwriteDuplic const sp<AaptFile>& originalFile = mFiles.valueAt(index); SourcePos(file->getSourceFile(), -1) .error("Duplicate file.\n%s: Original is here. %s", - originalFile->getPrintableSource().string(), + originalFile->getPrintableSource().c_str(), (withoutVersion.version != 0) ? "The version qualifier may be implied." : ""); return UNKNOWN_ERROR; } @@ -557,21 +559,21 @@ void AaptGroup::removeFile(size_t index) void AaptGroup::print(const String8& prefix) const { - printf("%s%s\n", prefix.string(), getPath().string()); + printf("%s%s\n", prefix.c_str(), getPath().c_str()); const size_t N=mFiles.size(); size_t i; for (i=0; i<N; i++) { sp<AaptFile> file = mFiles.valueAt(i); const AaptGroupEntry& e = file->getGroupEntry(); if (file->hasData()) { - printf("%s Gen: (%s) %d bytes\n", prefix.string(), e.toDirName(String8()).string(), + printf("%s Gen: (%s) %d bytes\n", prefix.c_str(), e.toDirName(String8()).c_str(), (int)file->getSize()); } else { - printf("%s Src: (%s) %s\n", prefix.string(), e.toDirName(String8()).string(), - file->getPrintableSource().string()); + printf("%s Src: (%s) %s\n", prefix.c_str(), e.toDirName(String8()).c_str(), + file->getPrintableSource().c_str()); } - //printf("%s File Group Entry: %s\n", prefix.string(), - // file->getGroupEntry().toDirName(String8()).string()); + //printf("%s File Group Entry: %s\n", prefix.c_str(), + // file->getGroupEntry().toDirName(String8()).c_str()); } } @@ -615,7 +617,7 @@ sp<AaptDir> AaptDir::makeDir(const String8& path) String8 remain = path; sp<AaptDir> subdir = this; - while (name = remain.walkPath(&remain), remain != "") { + while (name = walkPath(remain, &remain), remain != "") { subdir = subdir->makeDir(name); } @@ -623,7 +625,7 @@ sp<AaptDir> AaptDir::makeDir(const String8& path) if (i >= 0) { return subdir->mDirs.valueAt(i); } - sp<AaptDir> dir = new AaptDir(name, subdir->mPath.appendPathCopy(name)); + sp<AaptDir> dir = new AaptDir(name, appendPathCopy(subdir->mPath, name)); subdir->mDirs.add(name, dir); return dir; } @@ -645,7 +647,7 @@ status_t AaptDir::addLeafFile(const String8& leafName, const sp<AaptFile>& file, if (mFiles.indexOfKey(leafName) >= 0) { group = mFiles.valueFor(leafName); } else { - group = new AaptGroup(leafName, mPath.appendPathCopy(leafName)); + group = new AaptGroup(leafName, appendPathCopy(mPath, leafName)); mFiles.add(leafName, group); } @@ -660,9 +662,9 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, { DIR* dir = NULL; - dir = opendir(srcDir.string()); + dir = opendir(srcDir.c_str()); if (dir == NULL) { - fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno)); + fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.c_str(), strerror(errno)); return UNKNOWN_ERROR; } @@ -676,7 +678,7 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, if (entry == NULL) break; - if (isHidden(srcDir.string(), entry->d_name)) + if (isHidden(srcDir.c_str(), entry->d_name)) continue; String8 name(entry->d_name); @@ -684,7 +686,7 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, // Add fully qualified path for dependency purposes // if we're collecting them if (fullResPaths != NULL) { - fullResPaths->add(srcDir.appendPathCopy(name)); + fullResPaths->add(appendPathCopy(srcDir, name)); } } closedir(dir); @@ -701,15 +703,15 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, String8 pathName(srcDir); FileType type; - pathName.appendPath(fileNames[i].string()); - type = getFileType(pathName.string()); + appendPath(pathName, fileNames[i]); + type = getFileType(pathName.c_str()); if (type == kFileTypeDirectory) { sp<AaptDir> subdir; bool notAdded = false; if (mDirs.indexOfKey(fileNames[i]) >= 0) { subdir = mDirs.valueFor(fileNames[i]); } else { - subdir = new AaptDir(fileNames[i], mPath.appendPathCopy(fileNames[i])); + subdir = new AaptDir(fileNames[i], appendPathCopy(mPath, fileNames[i])); notAdded = true; } ssize_t res = subdir->slurpFullTree(bundle, pathName, kind, @@ -732,7 +734,7 @@ ssize_t AaptDir::slurpFullTree(Bundle* bundle, const String8& srcDir, } else { if (bundle->getVerbose()) - printf(" (ignoring non-file/dir '%s')\n", pathName.string()); + printf(" (ignoring non-file/dir '%s')\n", pathName.c_str()); } } @@ -745,7 +747,7 @@ status_t AaptDir::validate() const const size_t ND = mDirs.size(); size_t i; for (i = 0; i < NF; i++) { - if (!validateFileName(mFiles.valueAt(i)->getLeaf().string())) { + if (!validateFileName(mFiles.valueAt(i)->getLeaf().c_str())) { SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error( "Invalid filename. Unable to add."); return UNKNOWN_ERROR; @@ -753,11 +755,11 @@ status_t AaptDir::validate() const size_t j; for (j = i+1; j < NF; j++) { - if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(), - mFiles.valueAt(j)->getLeaf().string()) == 0) { + if (strcasecmp(mFiles.valueAt(i)->getLeaf().c_str(), + mFiles.valueAt(j)->getLeaf().c_str()) == 0) { SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error( "File is case-insensitive equivalent to: %s", - mFiles.valueAt(j)->getPrintableSource().string()); + mFiles.valueAt(j)->getPrintableSource().c_str()); return UNKNOWN_ERROR; } @@ -766,18 +768,18 @@ status_t AaptDir::validate() const } for (j = 0; j < ND; j++) { - if (strcasecmp(mFiles.valueAt(i)->getLeaf().string(), - mDirs.valueAt(j)->getLeaf().string()) == 0) { + if (strcasecmp(mFiles.valueAt(i)->getLeaf().c_str(), + mDirs.valueAt(j)->getLeaf().c_str()) == 0) { SourcePos(mFiles.valueAt(i)->getPrintableSource(), -1).error( "File conflicts with dir from: %s", - mDirs.valueAt(j)->getPrintableSource().string()); + mDirs.valueAt(j)->getPrintableSource().c_str()); return UNKNOWN_ERROR; } } } for (i = 0; i < ND; i++) { - if (!validateFileName(mDirs.valueAt(i)->getLeaf().string())) { + if (!validateFileName(mDirs.valueAt(i)->getLeaf().c_str())) { SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error( "Invalid directory name, unable to add."); return UNKNOWN_ERROR; @@ -785,11 +787,11 @@ status_t AaptDir::validate() const size_t j; for (j = i+1; j < ND; j++) { - if (strcasecmp(mDirs.valueAt(i)->getLeaf().string(), - mDirs.valueAt(j)->getLeaf().string()) == 0) { + if (strcasecmp(mDirs.valueAt(i)->getLeaf().c_str(), + mDirs.valueAt(j)->getLeaf().c_str()) == 0) { SourcePos(mDirs.valueAt(i)->getPrintableSource(), -1).error( "Directory is case-insensitive equivalent to: %s", - mDirs.valueAt(j)->getPrintableSource().string()); + mDirs.valueAt(j)->getPrintableSource().c_str()); return UNKNOWN_ERROR; } } @@ -821,11 +823,11 @@ String8 AaptDir::getPrintableSource() const { if (mFiles.size() > 0) { // Arbitrarily pull the first file out of the list as the source dir. - return mFiles.valueAt(0)->getPrintableSource().getPathDir(); + return getPathDir(mFiles.valueAt(0)->getPrintableSource()); } if (mDirs.size() > 0) { // Or arbitrarily pull the first dir out of the list as the source dir. - return mDirs.valueAt(0)->getPrintableSource().getPathDir(); + return getPathDir(mDirs.valueAt(0)->getPrintableSource()); } // Should never hit this case, but to be safe... @@ -846,12 +848,12 @@ status_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols) const AaptSymbolEntry& entry = javaSymbols->mSymbols.valueAt(i); ssize_t pos = mSymbols.indexOfKey(name); if (pos < 0) { - entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.string()); + entry.sourcePos.error("Symbol '%s' declared with <java-symbol> not defined\n", name.c_str()); err = UNKNOWN_ERROR; continue; } //printf("**** setting symbol #%d/%d %s to isJavaSymbol=%d\n", - // i, N, name.string(), entry.isJavaSymbol ? 1 : 0); + // i, N, name.c_str(), entry.isJavaSymbol ? 1 : 0); mSymbols.editValueAt(pos).isJavaSymbol = entry.isJavaSymbol; } @@ -862,11 +864,11 @@ status_t AaptSymbols::applyJavaSymbols(const sp<AaptSymbols>& javaSymbols) ssize_t pos = mNestedSymbols.indexOfKey(name); if (pos < 0) { SourcePos pos; - pos.error("Java symbol dir %s not defined\n", name.string()); + pos.error("Java symbol dir %s not defined\n", name.c_str()); err = UNKNOWN_ERROR; continue; } - //printf("**** applying java symbols in dir %s\n", name.string()); + //printf("**** applying java symbols in dir %s\n", name.c_str()); status_t myerr = mNestedSymbols.valueAt(pos)->applyJavaSymbols(symbols); if (myerr != NO_ERROR) { err = myerr; @@ -908,8 +910,8 @@ sp<AaptFile> AaptAssets::addFile( sp<AaptFile> file; String8 root, remain(filePath), partialPath; while (remain.length() > 0) { - root = remain.walkPath(&remain); - partialPath.appendPath(root); + root = walkPath(remain, &remain); + appendPath(partialPath, root); const String8 rootStr(root); @@ -924,7 +926,7 @@ sp<AaptFile> AaptAssets::addFile( return NULL; } } - file = new AaptFile(srcDir.appendPathCopy(filePath), entry, resType); + file = new AaptFile(appendPathCopy(srcDir, filePath), entry, resType); status_t res = group->addFile(file); if (res != NO_ERROR) { return NULL; @@ -981,7 +983,7 @@ ssize_t AaptAssets::slurpFromArgs(Bundle* bundle) if (bundle->getAndroidManifestFile() != NULL) { // place at root of zip. String8 srcFile(bundle->getAndroidManifestFile()); - addFile(srcFile.getPathLeaf(), AaptGroupEntry(), srcFile.getPathDir(), + addFile(getPathLeaf(srcFile), AaptGroupEntry(), getPathDir(srcFile), NULL, String8()); totalCount++; } @@ -1131,9 +1133,9 @@ ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir) { ssize_t err = 0; - DIR* dir = opendir(srcDir.string()); + DIR* dir = opendir(srcDir.c_str()); if (dir == NULL) { - fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.string(), strerror(errno)); + fprintf(stderr, "ERROR: opendir(%s): %s\n", srcDir.c_str(), strerror(errno)); return UNKNOWN_ERROR; } @@ -1149,18 +1151,18 @@ ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir) break; } - if (isHidden(srcDir.string(), entry->d_name)) { + if (isHidden(srcDir.c_str(), entry->d_name)) { continue; } String8 subdirName(srcDir); - subdirName.appendPath(entry->d_name); + appendPath(subdirName, entry->d_name); AaptGroupEntry group; String8 resType; bool b = group.initFromDirName(entry->d_name, &resType); if (!b) { - fprintf(stderr, "invalid resource directory name: %s %s\n", srcDir.string(), + fprintf(stderr, "invalid resource directory name: %s %s\n", srcDir.c_str(), entry->d_name); err = -1; continue; @@ -1168,7 +1170,7 @@ ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir) if (bundle->getMaxResVersion() != NULL && group.getVersionString().length() != 0) { int maxResInt = atoi(bundle->getMaxResVersion()); - const char *verString = group.getVersionString().string(); + const char *verString = group.getVersionString().c_str(); int dirVersionInt = atoi(verString + 1); // skip 'v' in version name if (dirVersionInt > maxResInt) { fprintf(stderr, "max res %d, skipping %s\n", maxResInt, entry->d_name); @@ -1176,7 +1178,7 @@ ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir) } } - FileType type = getFileType(subdirName.string()); + FileType type = getFileType(subdirName.c_str()); if (type == kFileTypeDirectory) { sp<AaptDir> dir = makeDir(resType); @@ -1200,7 +1202,7 @@ ssize_t AaptAssets::slurpResourceTree(Bundle* bundle, const String8& srcDir) } } else { if (bundle->getVerbose()) { - fprintf(stderr, " (ignoring file '%s')\n", subdirName.string()); + fprintf(stderr, " (ignoring file '%s')\n", subdirName.c_str()); } } } @@ -1239,16 +1241,16 @@ AaptAssets::slurpResourceZip(Bundle* /* bundle */, const char* filename) String8 entryName(entry->getFileName()); - String8 dirName = entryName.getPathDir(); + String8 dirName = getPathDir(entryName); sp<AaptDir> dir = dirName == "" ? this : makeDir(dirName); String8 resType; AaptGroupEntry kind; String8 remain; - if (entryName.walkPath(&remain) == kResourceDir) { + if (walkPath(entryName, &remain) == kResourceDir) { // these are the resources, pull their type out of the directory name - kind.initFromDirName(remain.walkPath().string(), &resType); + kind.initFromDirName(walkPath(remain).c_str(), &resType); } else { // these are untyped and don't have an AaptGroupEntry } @@ -1258,12 +1260,12 @@ AaptAssets::slurpResourceZip(Bundle* /* bundle */, const char* filename) } // use the one from the zip file if they both exist. - dir->removeFile(entryName.getPathLeaf()); + dir->removeFile(getPathLeaf(entryName)); sp<AaptFile> file = new AaptFile(entryName, kind, resType); - status_t err = dir->addLeafFile(entryName.getPathLeaf(), file); + status_t err = dir->addLeafFile(getPathLeaf(entryName), file); if (err != NO_ERROR) { - fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.string()); + fprintf(stderr, "err=%s entryName=%s\n", strerror(err), entryName.c_str()); count = err; goto bail; } @@ -1273,7 +1275,7 @@ AaptAssets::slurpResourceZip(Bundle* /* bundle */, const char* filename) if (entryName == "AndroidManifest.xml") { printf("AndroidManifest.xml\n"); } - printf("\n\nfile: %s\n", entryName.string()); + printf("\n\nfile: %s\n", entryName.c_str()); #endif size_t len = entry->getUncompressedLen(); @@ -1317,9 +1319,9 @@ status_t AaptAssets::filter(Bundle* bundle) uint32_t preferredDensity = 0; if (bundle->getPreferredDensity().size() > 0) { ResTable_config preferredConfig; - if (!AaptConfig::parseDensity(bundle->getPreferredDensity().string(), &preferredConfig)) { + if (!AaptConfig::parseDensity(bundle->getPreferredDensity().c_str(), &preferredConfig)) { fprintf(stderr, "Error parsing preferred density: %s\n", - bundle->getPreferredDensity().string()); + bundle->getPreferredDensity().c_str()); return UNKNOWN_ERROR; } preferredDensity = preferredConfig.density; @@ -1332,11 +1334,11 @@ status_t AaptAssets::filter(Bundle* bundle) if (bundle->getVerbose()) { if (!reqFilter->isEmpty()) { printf("Applying required filter: %s\n", - bundle->getConfigurations().string()); + bundle->getConfigurations().c_str()); } if (preferredDensity > 0) { printf("Applying preferred density filter: %s\n", - bundle->getPreferredDensity().string()); + bundle->getPreferredDensity().c_str()); } } @@ -1374,7 +1376,7 @@ status_t AaptAssets::filter(Bundle* bundle) // containing no entries. continue; } - if (file->getPath().getPathExtension() == ".xml") { + if (getPathExtension(file->getPath()) == ".xml") { // We can't remove .xml files at this point, because when // we parse them they may add identifier resources, so // removing them can cause our resource identifiers to @@ -1385,7 +1387,7 @@ status_t AaptAssets::filter(Bundle* bundle) if (!reqFilter->match(config)) { if (bundle->getVerbose()) { printf("Pruning unneeded resource: %s\n", - file->getPrintableSource().string()); + file->getPrintableSource().c_str()); } grp->removeFile(k); k--; @@ -1411,7 +1413,7 @@ status_t AaptAssets::filter(Bundle* bundle) // containing no entries. continue; } - if (file->getPath().getPathExtension() == ".xml") { + if (getPathExtension(file->getPath()) == ".xml") { // We can't remove .xml files at this point, because when // we parse them they may add identifier resources, so // removing them can cause our resource identifiers to @@ -1453,7 +1455,7 @@ status_t AaptAssets::filter(Bundle* bundle) if (bestDensity != config.density) { if (bundle->getVerbose()) { printf("Pruning unneeded resource: %s\n", - file->getPrintableSource().string()); + file->getPrintableSource().c_str()); } grp->removeFile(k); k--; @@ -1495,10 +1497,10 @@ status_t AaptAssets::applyJavaSymbols() ssize_t pos = mSymbols.indexOfKey(name); if (pos < 0) { SourcePos pos; - pos.error("Java symbol dir %s not defined\n", name.string()); + pos.error("Java symbol dir %s not defined\n", name.c_str()); return UNKNOWN_ERROR; } - //printf("**** applying java symbols in dir %s\n", name.string()); + //printf("**** applying java symbols in dir %s\n", name.c_str()); status_t err = mSymbols.valueAt(pos)->applyJavaSymbols(symbols); if (err != NO_ERROR) { return err; @@ -1510,7 +1512,7 @@ status_t AaptAssets::applyJavaSymbols() bool AaptAssets::isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const { //printf("isJavaSymbol %s: public=%d, includePrivate=%d, isJavaSymbol=%d\n", - // sym.name.string(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0, + // sym.name.c_str(), sym.isPublic ? 1 : 0, includePrivate ? 1 : 0, // sym.isJavaSymbol ? 1 : 0); if (!mHavePrivateSymbols) return true; if (sym.isPublic) return true; @@ -1529,26 +1531,26 @@ status_t AaptAssets::buildIncludedResources(Bundle* bundle) const size_t packageIncludeCount = includes.size(); for (size_t i = 0; i < packageIncludeCount; i++) { if (bundle->getVerbose()) { - printf("Including resources from package: %s\n", includes[i].string()); + printf("Including resources from package: %s\n", includes[i].c_str()); } if (!mIncludedAssets.addAssetPath(includes[i], NULL)) { fprintf(stderr, "ERROR: Asset package include '%s' not found.\n", - includes[i].string()); + includes[i].c_str()); return UNKNOWN_ERROR; } } const String8& featureOfBase = bundle->getFeatureOfPackage(); - if (!featureOfBase.isEmpty()) { + if (!featureOfBase.empty()) { if (bundle->getVerbose()) { printf("Including base feature resources from package: %s\n", - featureOfBase.string()); + featureOfBase.c_str()); } if (!mIncludedAssets.addAssetPath(featureOfBase, NULL)) { fprintf(stderr, "ERROR: base feature package '%s' not found.\n", - featureOfBase.string()); + featureOfBase.c_str()); return UNKNOWN_ERROR; } } @@ -1581,23 +1583,23 @@ void AaptAssets::print(const String8& prefix) const innerPrefix.append(" "); String8 innerInnerPrefix(innerPrefix); innerInnerPrefix.append(" "); - printf("%sConfigurations:\n", prefix.string()); + printf("%sConfigurations:\n", prefix.c_str()); const size_t N=mGroupEntries.size(); for (size_t i=0; i<N; i++) { String8 cname = mGroupEntries.itemAt(i).toDirName(String8()); - printf("%s %s\n", prefix.string(), - cname != "" ? cname.string() : "(default)"); + printf("%s %s\n", prefix.c_str(), + cname != "" ? cname.c_str() : "(default)"); } - printf("\n%sFiles:\n", prefix.string()); + printf("\n%sFiles:\n", prefix.c_str()); AaptDir::print(innerPrefix); - printf("\n%sResource Dirs:\n", prefix.string()); + printf("\n%sResource Dirs:\n", prefix.c_str()); const Vector<sp<AaptDir> >& resdirs = mResDirs; const size_t NR = resdirs.size(); for (size_t i=0; i<NR; i++) { const sp<AaptDir>& d = resdirs.itemAt(i); - printf("%s Type %s\n", prefix.string(), d->getLeaf().string()); + printf("%s Type %s\n", prefix.c_str(), d->getLeaf().c_str()); d->print(innerInnerPrefix); } } @@ -1631,7 +1633,7 @@ valid_symbol_name(const String8& symbol) NULL }; const char*const* k = KEYWORDS; - const char*const s = symbol.string(); + const char*const s = symbol.c_str(); while (*k) { if (0 == strcmp(s, *k)) { return false; diff --git a/tools/aapt/AaptAssets.h b/tools/aapt/AaptAssets.h index eadd48a6c261..498fc4e38c8c 100644 --- a/tools/aapt/AaptAssets.h +++ b/tools/aapt/AaptAssets.h @@ -463,7 +463,7 @@ private: if (valid_symbol_name(symbol)) { return true; } - pos.error("invalid %s: '%s'\n", label, symbol.string()); + pos.error("invalid %s: '%s'\n", label, symbol.c_str()); return false; } AaptSymbolEntry& edit_symbol(const String8& symbol, const SourcePos* pos) { diff --git a/tools/aapt/AaptConfig.cpp b/tools/aapt/AaptConfig.cpp index 0aca45ea8d60..7578f79f792e 100644 --- a/tools/aapt/AaptConfig.cpp +++ b/tools/aapt/AaptConfig.cpp @@ -39,7 +39,7 @@ bool parse(const String8& str, ConfigDescription* out) { ssize_t index = 0; ssize_t localeIndex = 0; const ssize_t N = parts.size(); - const char* part = parts[index].string(); + const char* part = parts[index].c_str(); if (str.length() == 0) { goto success; @@ -50,7 +50,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseMnc(part, &config)) { @@ -58,7 +58,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } // Locale spans a few '-' separators, so we let it @@ -72,7 +72,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index >= N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseLayoutDirection(part, &config)) { @@ -80,7 +80,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseSmallestScreenWidthDp(part, &config)) { @@ -88,7 +88,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseScreenWidthDp(part, &config)) { @@ -96,7 +96,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseScreenHeightDp(part, &config)) { @@ -104,7 +104,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseScreenLayoutSize(part, &config)) { @@ -112,7 +112,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseScreenLayoutLong(part, &config)) { @@ -120,7 +120,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseScreenRound(part, &config)) { @@ -128,7 +128,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseWideColorGamut(part, &config)) { @@ -136,7 +136,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseHdr(part, &config)) { @@ -144,7 +144,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseOrientation(part, &config)) { @@ -152,7 +152,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseUiModeType(part, &config)) { @@ -160,7 +160,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseUiModeNight(part, &config)) { @@ -168,7 +168,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseDensity(part, &config)) { @@ -176,7 +176,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseTouchscreen(part, &config)) { @@ -184,7 +184,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseKeysHidden(part, &config)) { @@ -192,7 +192,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseKeyboard(part, &config)) { @@ -200,7 +200,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseNavHidden(part, &config)) { @@ -208,7 +208,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseNavigation(part, &config)) { @@ -216,7 +216,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseScreenSize(part, &config)) { @@ -224,7 +224,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } if (parseVersion(part, &config)) { @@ -232,7 +232,7 @@ bool parse(const String8& str, ConfigDescription* out) { if (index == N) { goto success; } - part = parts[index].string(); + part = parts[index].c_str(); } // Unrecognized. @@ -773,8 +773,8 @@ bool parseScreenSize(const char* name, ResTable_config* out) { if (y == name || *y != 0) return false; String8 yName(x, y-x); - uint16_t w = (uint16_t)atoi(xName.string()); - uint16_t h = (uint16_t)atoi(yName.string()); + uint16_t w = (uint16_t)atoi(xName.c_str()); + uint16_t h = (uint16_t)atoi(yName.c_str()); if (w < h) { return false; } @@ -805,7 +805,7 @@ bool parseSmallestScreenWidthDp(const char* name, ResTable_config* out) { String8 xName(name, x-name); if (out) { - out->smallestScreenWidthDp = (uint16_t)atoi(xName.string()); + out->smallestScreenWidthDp = (uint16_t)atoi(xName.c_str()); } return true; @@ -827,7 +827,7 @@ bool parseScreenWidthDp(const char* name, ResTable_config* out) { String8 xName(name, x-name); if (out) { - out->screenWidthDp = (uint16_t)atoi(xName.string()); + out->screenWidthDp = (uint16_t)atoi(xName.c_str()); } return true; @@ -849,7 +849,7 @@ bool parseScreenHeightDp(const char* name, ResTable_config* out) { String8 xName(name, x-name); if (out) { - out->screenHeightDp = (uint16_t)atoi(xName.string()); + out->screenHeightDp = (uint16_t)atoi(xName.c_str()); } return true; @@ -875,7 +875,7 @@ bool parseVersion(const char* name, ResTable_config* out) { String8 sdkName(name, s-name); if (out) { - out->sdkVersion = (uint16_t)atoi(sdkName.string()); + out->sdkVersion = (uint16_t)atoi(sdkName.c_str()); out->minorVersion = 0; } diff --git a/tools/aapt/AaptUtil.cpp b/tools/aapt/AaptUtil.cpp index 293e144b71fe..e82860de578a 100644 --- a/tools/aapt/AaptUtil.cpp +++ b/tools/aapt/AaptUtil.cpp @@ -23,7 +23,7 @@ namespace AaptUtil { Vector<String8> split(const String8& str, const char sep) { Vector<String8> parts; - const char* p = str.string(); + const char* p = str.c_str(); const char* q; while (true) { @@ -41,7 +41,7 @@ Vector<String8> split(const String8& str, const char sep) { Vector<String8> splitAndLowerCase(const String8& str, const char sep) { Vector<String8> parts; - const char* p = str.string(); + const char* p = str.c_str(); const char* q; while (true) { diff --git a/tools/aapt/Android.bp b/tools/aapt/Android.bp index cc10db9e1523..68db56d58b16 100644 --- a/tools/aapt/Android.bp +++ b/tools/aapt/Android.bp @@ -51,6 +51,10 @@ cc_defaults { "libz", ], + whole_static_libs: [ + "libandroidfw_pathutils", + ], + cflags: [ "-Wall", "-Werror", @@ -97,6 +101,7 @@ cc_library_host_static { "ResourceTable.cpp", "SourcePos.cpp", "StringPool.cpp", + "Utils.cpp", "WorkQueue.cpp", "XMLNode.cpp", "ZipEntry.cpp", diff --git a/tools/aapt/ApkBuilder.cpp b/tools/aapt/ApkBuilder.cpp index 01e02e270b63..335c43b96599 100644 --- a/tools/aapt/ApkBuilder.cpp +++ b/tools/aapt/ApkBuilder.cpp @@ -36,7 +36,7 @@ status_t ApkBuilder::createSplitForConfigs(const std::set<ConfigDescription>& co if (splitConfigs.count(*iter) > 0) { // Can't have overlapping configurations. fprintf(stderr, "ERROR: Split configuration '%s' is already defined " - "in another split.\n", iter->toString().string()); + "in another split.\n", iter->toString().c_str()); return ALREADY_EXISTS; } } @@ -115,10 +115,10 @@ status_t ApkSplit::addEntry(const String8& path, const sp<AaptFile>& file) { } void ApkSplit::print() const { - fprintf(stderr, "APK Split '%s'\n", mName.string()); + fprintf(stderr, "APK Split '%s'\n", mName.c_str()); std::set<OutputEntry>::const_iterator iter = mFiles.begin(); for (; iter != mFiles.end(); iter++) { - fprintf(stderr, " %s (%s)\n", iter->getPath().string(), iter->getFile()->getSourceFile().string()); + fprintf(stderr, " %s (%s)\n", iter->getPath().c_str(), iter->getFile()->getSourceFile().c_str()); } } diff --git a/tools/aapt/CacheUpdater.h b/tools/aapt/CacheUpdater.h index 6fa96d67e6a3..dc5493f9e500 100644 --- a/tools/aapt/CacheUpdater.h +++ b/tools/aapt/CacheUpdater.h @@ -7,6 +7,7 @@ #ifndef CACHE_UPDATER_H #define CACHE_UPDATER_H +#include <androidfw/PathUtils.h> #include <utils/String8.h> #include <sys/types.h> #include <sys/stat.h> @@ -16,6 +17,8 @@ #include <direct.h> #endif +#include "Utils.h" + using namespace android; /** CacheUpdater @@ -66,25 +69,25 @@ public: // Check optomistically to see if all directories exist. // If something in the path doesn't exist, then walk the path backwards // and find the place to start creating directories forward. - if (stat(path.string(),&s) == -1) { + if (stat(path.c_str(),&s) == -1) { // Walk backwards to find place to start creating directories existsPath = path; do { // As we remove the end of existsPath add it to // the string of paths to create. - toCreate = existsPath.getPathLeaf().appendPath(toCreate); - existsPath = existsPath.getPathDir(); - } while (stat(existsPath.string(),&s) == -1); + toCreate = appendPathCopy(getPathLeaf(existsPath), toCreate); + existsPath = getPathDir(existsPath); + } while (stat(existsPath.c_str(),&s) == -1); // Walk forwards and build directories as we go do { // Advance to the next segment of the path - existsPath.appendPath(toCreate.walkPath(&remains)); + appendPath(existsPath, walkPath(toCreate, &remains)); toCreate = remains; #ifdef _WIN32 - _mkdir(existsPath.string()); + _mkdir(existsPath.c_str()); #else - mkdir(existsPath.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); + mkdir(existsPath.c_str(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); #endif } while (remains.length() > 0); } //if @@ -93,15 +96,15 @@ public: // Delete a file virtual void deleteFile(String8 path) { - if (remove(path.string()) != 0) - fprintf(stderr,"ERROR DELETING %s\n",path.string()); + if (remove(path.c_str()) != 0) + fprintf(stderr,"ERROR DELETING %s\n",path.c_str()); }; // Process an image from source out to dest virtual void processImage(String8 source, String8 dest) { // Make sure we're trying to write to a directory that is extant - ensureDirectoriesExist(dest.getPathDir()); + ensureDirectoriesExist(getPathDir(dest)); preProcessImageToCache(bundle, source, dest); }; diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index d02fd83df6af..43a8b52f2766 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -12,6 +12,7 @@ #include "ResourceTable.h" #include "XMLNode.h" +#include <androidfw/PathUtils.h> #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/List.h> @@ -240,13 +241,13 @@ static void printResolvedResourceAttribute(const ResTable& resTable, const ResXM } if (value.dataType == Res_value::TYPE_STRING) { String8 result = AaptXml::getResolvedAttribute(resTable, tree, attrRes, outError); - printf("%s='%s'", attrLabel.string(), - ResTable::normalizeForOutput(result.string()).string()); + printf("%s='%s'", attrLabel.c_str(), + ResTable::normalizeForOutput(result.c_str()).c_str()); } else if (Res_value::TYPE_FIRST_INT <= value.dataType && value.dataType <= Res_value::TYPE_LAST_INT) { - printf("%s='%d'", attrLabel.string(), value.data); + printf("%s='%d'", attrLabel.c_str(), value.data); } else { - printf("%s='0x%x'", attrLabel.string(), (int)value.data); + printf("%s='0x%x'", attrLabel.c_str(), (int)value.data); } } @@ -353,23 +354,23 @@ static void printCompatibleScreens(ResXMLTree& tree, String8* outError) { } static void printUsesPermission(const String8& name, bool optional=false, int maxSdkVersion=-1, - const String8& requiredFeature = String8::empty(), - const String8& requiredNotFeature = String8::empty()) { - printf("uses-permission: name='%s'", ResTable::normalizeForOutput(name.string()).string()); + const String8& requiredFeature = String8(), + const String8& requiredNotFeature = String8()) { + printf("uses-permission: name='%s'", ResTable::normalizeForOutput(name.c_str()).c_str()); if (maxSdkVersion != -1) { printf(" maxSdkVersion='%d'", maxSdkVersion); } if (requiredFeature.length() > 0) { - printf(" requiredFeature='%s'", requiredFeature.string()); + printf(" requiredFeature='%s'", requiredFeature.c_str()); } if (requiredNotFeature.length() > 0) { - printf(" requiredNotFeature='%s'", requiredNotFeature.string()); + printf(" requiredNotFeature='%s'", requiredNotFeature.c_str()); } printf("\n"); if (optional) { printf("optional-permission: name='%s'", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); if (maxSdkVersion != -1) { printf(" maxSdkVersion='%d'", maxSdkVersion); } @@ -380,7 +381,7 @@ static void printUsesPermission(const String8& name, bool optional=false, int ma static void printUsesPermissionSdk23(const String8& name, int maxSdkVersion=-1) { printf("uses-permission-sdk-23: "); - printf("name='%s'", ResTable::normalizeForOutput(name.string()).string()); + printf("name='%s'", ResTable::normalizeForOutput(name.c_str()).c_str()); if (maxSdkVersion != -1) { printf(" maxSdkVersion='%d'", maxSdkVersion); } @@ -390,17 +391,17 @@ static void printUsesPermissionSdk23(const String8& name, int maxSdkVersion=-1) static void printUsesImpliedPermission(const String8& name, const String8& reason, const int32_t maxSdkVersion = -1) { printf("uses-implied-permission: name='%s'", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); if (maxSdkVersion != -1) { printf(" maxSdkVersion='%d'", maxSdkVersion); } - printf(" reason='%s'\n", ResTable::normalizeForOutput(reason.string()).string()); + printf(" reason='%s'\n", ResTable::normalizeForOutput(reason.c_str()).c_str()); } Vector<String8> getNfcAidCategories(AssetManager& assets, const String8& xmlPath, bool offHost, String8 *outError = NULL) { - Asset* aidAsset = assets.openNonAsset(xmlPath, Asset::ACCESS_BUFFER); + Asset* aidAsset = assets.openNonAsset(xmlPath.c_str(), Asset::ACCESS_BUFFER); if (aidAsset == NULL) { if (outError != NULL) *outError = "xml resource does not exist"; return Vector<String8>(); @@ -556,7 +557,7 @@ static void addImpliedFeature(KeyedVector<String8, ImpliedFeature>* impliedFeatu static void printFeatureGroupImpl(const FeatureGroup& grp, const KeyedVector<String8, ImpliedFeature>* impliedFeatures) { - printf("feature-group: label='%s'\n", grp.label.string()); + printf("feature-group: label='%s'\n", grp.label.c_str()); if (grp.openGLESVersion > 0) { printf(" uses-gl-es: '0x%x'\n", grp.openGLESVersion); @@ -570,7 +571,7 @@ static void printFeatureGroupImpl(const FeatureGroup& grp, const String8& featureName = grp.features.keyAt(i); printf(" uses-feature%s: name='%s'", (required ? "" : "-not-required"), - ResTable::normalizeForOutput(featureName.string()).string()); + ResTable::normalizeForOutput(featureName.c_str()).c_str()); if (version > 0) { printf(" version='%d'", version); @@ -589,15 +590,15 @@ static void printFeatureGroupImpl(const FeatureGroup& grp, } String8 printableFeatureName(ResTable::normalizeForOutput( - impliedFeature.name.string())); + impliedFeature.name.c_str())); const char* sdk23Suffix = impliedFeature.impliedBySdk23 ? "-sdk-23" : ""; - printf(" uses-feature%s: name='%s'\n", sdk23Suffix, printableFeatureName.string()); + printf(" uses-feature%s: name='%s'\n", sdk23Suffix, printableFeatureName.c_str()); printf(" uses-implied-feature%s: name='%s' reason='", sdk23Suffix, - printableFeatureName.string()); + printableFeatureName.c_str()); const size_t numReasons = impliedFeature.reasons.size(); for (size_t j = 0; j < numReasons; j++) { - printf("%s", impliedFeature.reasons[j].string()); + printf("%s", impliedFeature.reasons[j].c_str()); if (j + 2 < numReasons) { printf(", "); } else if (j + 1 < numReasons) { @@ -649,43 +650,43 @@ static void addImpliedFeaturesForPermission(const int targetSdk, const String8& bool impliedBySdk23Permission) { if (name == "android.permission.CAMERA") { addImpliedFeature(impliedFeatures, "android.hardware.camera", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); } else if (name == "android.permission.ACCESS_FINE_LOCATION") { if (targetSdk < SDK_LOLLIPOP) { addImpliedFeature(impliedFeatures, "android.hardware.location.gps", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); addImpliedFeature(impliedFeatures, "android.hardware.location.gps", String8::format("targetSdkVersion < %d", SDK_LOLLIPOP), impliedBySdk23Permission); } addImpliedFeature(impliedFeatures, "android.hardware.location", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); } else if (name == "android.permission.ACCESS_COARSE_LOCATION") { if (targetSdk < SDK_LOLLIPOP) { addImpliedFeature(impliedFeatures, "android.hardware.location.network", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); addImpliedFeature(impliedFeatures, "android.hardware.location.network", String8::format("targetSdkVersion < %d", SDK_LOLLIPOP), impliedBySdk23Permission); } addImpliedFeature(impliedFeatures, "android.hardware.location", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); } else if (name == "android.permission.ACCESS_MOCK_LOCATION" || name == "android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" || name == "android.permission.INSTALL_LOCATION_PROVIDER") { addImpliedFeature(impliedFeatures, "android.hardware.location", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); } else if (name == "android.permission.BLUETOOTH" || name == "android.permission.BLUETOOTH_ADMIN") { if (targetSdk > SDK_DONUT) { addImpliedFeature(impliedFeatures, "android.hardware.bluetooth", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); addImpliedFeature(impliedFeatures, "android.hardware.bluetooth", String8::format("targetSdkVersion > %d", SDK_DONUT), @@ -693,13 +694,13 @@ static void addImpliedFeaturesForPermission(const int targetSdk, const String8& } } else if (name == "android.permission.RECORD_AUDIO") { addImpliedFeature(impliedFeatures, "android.hardware.microphone", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); } else if (name == "android.permission.ACCESS_WIFI_STATE" || name == "android.permission.CHANGE_WIFI_STATE" || name == "android.permission.CHANGE_WIFI_MULTICAST_STATE") { addImpliedFeature(impliedFeatures, "android.hardware.wifi", - String8::format("requested %s permission", name.string()), + String8::format("requested %s permission", name.c_str()), impliedBySdk23Permission); } else if (name == "android.permission.CALL_PHONE" || name == "android.permission.CALL_PRIVILEGED" || @@ -746,7 +747,7 @@ int doDump(Bundle* bundle) for (size_t i = 0; i < bundle->getPackageIncludes().size(); i++) { const String8& assetPath = bundle->getPackageIncludes()[i]; if (!assets.addAssetPath(assetPath, NULL)) { - fprintf(stderr, "ERROR: included asset path %s could not be loaded\n", assetPath.string()); + fprintf(stderr, "ERROR: included asset path %s could not be loaded\n", assetPath.c_str()); return 1; } } @@ -890,7 +891,7 @@ int doDump(Bundle* bundle) goto bail; } String8 tag(ctag16); - //printf("Depth %d tag %s\n", depth, tag.string()); + //printf("Depth %d tag %s\n", depth, tag.c_str()); if (depth == 1) { if (tag != "manifest") { SourcePos(manifestFile, tree.getLineNumber()).error( @@ -898,14 +899,14 @@ int doDump(Bundle* bundle) goto bail; } String8 pkg = AaptXml::getAttribute(tree, NULL, "package", NULL); - printf("package: %s\n", ResTable::normalizeForOutput(pkg.string()).string()); + printf("package: %s\n", ResTable::normalizeForOutput(pkg.c_str()).c_str()); } else if (depth == 2) { if (tag == "permission") { String8 error; String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name': %s", error.string()); + "ERROR getting 'android:name': %s", error.c_str()); goto bail; } @@ -915,13 +916,13 @@ int doDump(Bundle* bundle) goto bail; } printf("permission: %s\n", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); } else if (tag == "uses-permission") { String8 error; String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } @@ -938,7 +939,7 @@ int doDump(Bundle* bundle) String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } @@ -1133,12 +1134,12 @@ int doDump(Bundle* bundle) if (code == ResXMLTree::END_TAG) { depth--; if (depth < 2) { - if (withinSupportsInput && !supportedInput.isEmpty()) { + if (withinSupportsInput && !supportedInput.empty()) { printf("supports-input: '"); const size_t N = supportedInput.size(); for (size_t i=0; i<N; i++) { printf("%s", ResTable::normalizeForOutput( - supportedInput[i].string()).string()); + supportedInput[i].c_str()).c_str()); if (i != N - 1) { printf("' '"); } else { @@ -1157,27 +1158,27 @@ int doDump(Bundle* bundle) printf("launchable-activity:"); if (aName.length() > 0) { printf(" name='%s' ", - ResTable::normalizeForOutput(aName.string()).string()); + ResTable::normalizeForOutput(aName.c_str()).c_str()); } printf(" label='%s' icon='%s'\n", - ResTable::normalizeForOutput(activityLabel.string()) - .string(), - ResTable::normalizeForOutput(activityIcon.string()) - .string()); + ResTable::normalizeForOutput(activityLabel.c_str()) + .c_str(), + ResTable::normalizeForOutput(activityIcon.c_str()) + .c_str()); } if (isLeanbackLauncherActivity) { printf("leanback-launchable-activity:"); if (aName.length() > 0) { printf(" name='%s' ", - ResTable::normalizeForOutput(aName.string()).string()); + ResTable::normalizeForOutput(aName.c_str()).c_str()); } printf(" label='%s' icon='%s' banner='%s'\n", - ResTable::normalizeForOutput(activityLabel.string()) - .string(), - ResTable::normalizeForOutput(activityIcon.string()) - .string(), - ResTable::normalizeForOutput(activityBanner.string()) - .string()); + ResTable::normalizeForOutput(activityLabel.c_str()) + .c_str(), + ResTable::normalizeForOutput(activityIcon.c_str()) + .c_str(), + ResTable::normalizeForOutput(activityBanner.c_str()) + .c_str()); } } if (!hasIntentFilter) { @@ -1265,7 +1266,7 @@ int doDump(Bundle* bundle) goto bail; } String8 tag(ctag16); - //printf("Depth %d, %s\n", depth, tag.string()); + //printf("Depth %d, %s\n", depth, tag.c_str()); if (depth == 1) { if (tag != "manifest") { SourcePos(manifestFile, tree.getLineNumber()).error( @@ -1274,13 +1275,13 @@ int doDump(Bundle* bundle) } pkg = AaptXml::getAttribute(tree, NULL, "package", NULL); printf("package: name='%s' ", - ResTable::normalizeForOutput(pkg.string()).string()); + ResTable::normalizeForOutput(pkg.c_str()).c_str()); int32_t versionCode = AaptXml::getIntegerAttribute(tree, VERSION_CODE_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:versionCode' attribute: %s", - error.string()); + error.c_str()); goto bail; } if (versionCode > 0) { @@ -1293,16 +1294,16 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:versionName' attribute: %s", - error.string()); + error.c_str()); goto bail; } printf("versionName='%s'", - ResTable::normalizeForOutput(versionName.string()).string()); + ResTable::normalizeForOutput(versionName.c_str()).c_str()); String8 splitName = AaptXml::getAttribute(tree, NULL, "split"); - if (!splitName.isEmpty()) { + if (!splitName.empty()) { printf(" split='%s'", ResTable::normalizeForOutput( - splitName.string()).string()); + splitName.c_str()).c_str()); } // For 'platformBuildVersionName', using both string and int type as a fallback @@ -1313,7 +1314,7 @@ int doDump(Bundle* bundle) AaptXml::getIntegerAttribute(tree, NULL, "platformBuildVersionName", 0, NULL); if (platformBuildVersionName != "") { - printf(" platformBuildVersionName='%s'", platformBuildVersionName.string()); + printf(" platformBuildVersionName='%s'", platformBuildVersionName.c_str()); } else if (platformBuildVersionNameInt > 0) { printf(" platformBuildVersionName='%d'", platformBuildVersionNameInt); } @@ -1326,7 +1327,7 @@ int doDump(Bundle* bundle) AaptXml::getIntegerAttribute(tree, NULL, "platformBuildVersionCode", 0, NULL); if (platformBuildVersionCode != "") { - printf(" platformBuildVersionCode='%s'", platformBuildVersionCode.string()); + printf(" platformBuildVersionCode='%s'", platformBuildVersionCode.c_str()); } else if (platformBuildVersionCodeInt > 0) { printf(" platformBuildVersionCode='%d'", platformBuildVersionCodeInt); } @@ -1336,7 +1337,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:compileSdkVersion' attribute: %s", - error.string()); + error.c_str()); goto bail; } if (compileSdkVersion > 0) { @@ -1347,7 +1348,7 @@ int doDump(Bundle* bundle) COMPILE_SDK_VERSION_CODENAME_ATTR, &error); if (compileSdkVersionCodename != "") { printf(" compileSdkVersionCodename='%s'", ResTable::normalizeForOutput( - compileSdkVersionCodename.string()).string()); + compileSdkVersionCodename.c_str()).c_str()); } printf("\n"); @@ -1357,7 +1358,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:installLocation' attribute: %s", - error.string()); + error.c_str()); goto bail; } @@ -1387,7 +1388,7 @@ int doDump(Bundle* bundle) String8 label; const size_t NL = locales.size(); for (size_t i=0; i<NL; i++) { - const char* localeStr = locales[i].string(); + const char* localeStr = locales[i].c_str(); assets.setConfiguration(config, localeStr != NULL ? localeStr : ""); String8 llabel = AaptXml::getResolvedAttribute(res, tree, LABEL_ATTR, &error); @@ -1395,13 +1396,13 @@ int doDump(Bundle* bundle) if (localeStr == NULL || strlen(localeStr) == 0) { label = llabel; printf("application-label:'%s'\n", - ResTable::normalizeForOutput(llabel.string()).string()); + ResTable::normalizeForOutput(llabel.c_str()).c_str()); } else { if (label == "") { label = llabel; } printf("application-label-%s:'%s'\n", localeStr, - ResTable::normalizeForOutput(llabel.string()).string()); + ResTable::normalizeForOutput(llabel.c_str()).c_str()); } } } @@ -1415,7 +1416,7 @@ int doDump(Bundle* bundle) &error); if (icon != "") { printf("application-icon-%d:'%s'\n", densities[i], - ResTable::normalizeForOutput(icon.string()).string()); + ResTable::normalizeForOutput(icon.c_str()).c_str()); } } assets.setConfiguration(config); @@ -1423,7 +1424,7 @@ int doDump(Bundle* bundle) String8 icon = AaptXml::getResolvedAttribute(res, tree, ICON_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:icon' attribute: %s", error.string()); + "ERROR getting 'android:icon' attribute: %s", error.c_str()); goto bail; } int32_t testOnly = AaptXml::getIntegerAttribute(tree, TEST_ONLY_ATTR, 0, @@ -1431,7 +1432,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:testOnly' attribute: %s", - error.string()); + error.c_str()); goto bail; } @@ -1439,15 +1440,15 @@ int doDump(Bundle* bundle) &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:banner' attribute: %s", error.string()); + "ERROR getting 'android:banner' attribute: %s", error.c_str()); goto bail; } printf("application: label='%s' ", - ResTable::normalizeForOutput(label.string()).string()); - printf("icon='%s'", ResTable::normalizeForOutput(icon.string()).string()); + ResTable::normalizeForOutput(label.c_str()).c_str()); + printf("icon='%s'", ResTable::normalizeForOutput(icon.c_str()).c_str()); if (banner != "") { printf(" banner='%s'", - ResTable::normalizeForOutput(banner.string()).string()); + ResTable::normalizeForOutput(banner.c_str()).c_str()); } printf("\n"); if (testOnly != 0) { @@ -1458,7 +1459,7 @@ int doDump(Bundle* bundle) ISGAME_ATTR, 0, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:isGame' attribute: %s", error.string()); + "ERROR getting 'android:isGame' attribute: %s", error.c_str()); goto bail; } if (isGame != 0) { @@ -1470,7 +1471,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:debuggable' attribute: %s", - error.string()); + error.c_str()); goto bail; } if (debuggable != 0) { @@ -1500,12 +1501,12 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:minSdkVersion' attribute: %s", - error.string()); + error.c_str()); goto bail; } if (name == "Donut") targetSdk = SDK_DONUT; printf("sdkVersion:'%s'\n", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); } else if (code != -1) { targetSdk = code; printf("sdkVersion:'%d'\n", code); @@ -1522,7 +1523,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:targetSdkVersion' attribute: %s", - error.string()); + error.c_str()); goto bail; } if (name == "Donut" && targetSdk < SDK_DONUT) { @@ -1532,7 +1533,7 @@ int doDump(Bundle* bundle) targetSdk = SDK_CUR_DEVELOPMENT; } printf("targetSdkVersion:'%s'\n", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); } else if (code != -1) { if (targetSdk < code) { targetSdk = code; @@ -1592,7 +1593,7 @@ int doDump(Bundle* bundle) group.label = AaptXml::getResolvedAttribute(res, tree, LABEL_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:label' attribute: %s", error.string()); + "ERROR getting 'android:label' attribute: %s", error.c_str()); goto bail; } featureGroups.add(group); @@ -1608,7 +1609,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "failed to read attribute 'android:required': %s", - error.string()); + error.c_str()); goto bail; } @@ -1617,7 +1618,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "failed to read attribute 'android:version': %s", - error.string()); + error.c_str()); goto bail; } @@ -1638,7 +1639,7 @@ int doDump(Bundle* bundle) String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } @@ -1682,7 +1683,7 @@ int doDump(Bundle* bundle) String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } @@ -1701,37 +1702,37 @@ int doDump(Bundle* bundle) String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (name != "" && error == "") { printf("uses-package:'%s'\n", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); } else { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } } else if (tag == "original-package") { String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (name != "" && error == "") { printf("original-package:'%s'\n", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); } else { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } } else if (tag == "supports-gl-texture") { String8 name = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (name != "" && error == "") { printf("supports-gl-texture:'%s'\n", - ResTable::normalizeForOutput(name.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str()); } else { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } } else if (tag == "compatible-screens") { printCompatibleScreens(tree, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting compatible screens: %s", error.string()); + "ERROR getting compatible screens: %s", error.c_str()); goto bail; } depth--; @@ -1742,8 +1743,8 @@ int doDump(Bundle* bundle) &error); if (publicKey != "" && error == "") { printf("package-verifier: name='%s' publicKey='%s'\n", - ResTable::normalizeForOutput(name.string()).string(), - ResTable::normalizeForOutput(publicKey.string()).string()); + ResTable::normalizeForOutput(name.c_str()).c_str(), + ResTable::normalizeForOutput(publicKey.c_str()).c_str()); } } } @@ -1769,7 +1770,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:name' attribute: %s", - error.string()); + error.c_str()); goto bail; } @@ -1778,7 +1779,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:label' attribute: %s", - error.string()); + error.c_str()); goto bail; } @@ -1787,7 +1788,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:icon' attribute: %s", - error.string()); + error.c_str()); goto bail; } @@ -1796,7 +1797,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:banner' attribute: %s", - error.string()); + error.c_str()); goto bail; } @@ -1824,14 +1825,14 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:name' attribute for uses-library" - " %s", error.string()); + " %s", error.c_str()); goto bail; } int req = AaptXml::getIntegerAttribute(tree, REQUIRED_ATTR, 1); printf("uses-library%s:'%s'\n", req ? "" : "-not-required", ResTable::normalizeForOutput( - libraryName.string()).string()); + libraryName.c_str()).c_str()); } else if (tag == "receiver") { withinReceiver = true; receiverName = AaptXml::getAttribute(tree, NAME_ATTR, &error); @@ -1839,7 +1840,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:name' attribute for receiver:" - " %s", error.string()); + " %s", error.c_str()); goto bail; } @@ -1853,7 +1854,7 @@ int doDump(Bundle* bundle) SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:permission' attribute for" " receiver '%s': %s", - receiverName.string(), error.string()); + receiverName.c_str(), error.c_str()); } } else if (tag == "service") { withinService = true; @@ -1862,7 +1863,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:name' attribute for " - "service:%s", error.string()); + "service:%s", error.c_str()); goto bail; } @@ -1887,7 +1888,7 @@ int doDump(Bundle* bundle) } else { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:permission' attribute for " - "service '%s': %s", serviceName.string(), error.string()); + "service '%s': %s", serviceName.c_str(), error.c_str()); } } else if (tag == "provider") { withinProvider = true; @@ -1897,7 +1898,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:exported' attribute for provider:" - " %s", error.string()); + " %s", error.c_str()); goto bail; } @@ -1906,7 +1907,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:grantUriPermissions' attribute for " - "provider: %s", error.string()); + "provider: %s", error.c_str()); goto bail; } @@ -1915,7 +1916,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:permission' attribute for " - "provider: %s", error.string()); + "provider: %s", error.c_str()); goto bail; } @@ -1928,11 +1929,11 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:name' attribute for " - "meta-data: %s", error.string()); + "meta-data: %s", error.c_str()); goto bail; } printf("meta-data: name='%s' ", - ResTable::normalizeForOutput(metaDataName.string()).string()); + ResTable::normalizeForOutput(metaDataName.c_str()).c_str()); printResolvedResourceAttribute(res, tree, VALUE_ATTR, String8("value"), &error); if (error != "") { @@ -1944,7 +1945,7 @@ int doDump(Bundle* bundle) SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:value' or " "'android:resource' attribute for " - "meta-data: %s", error.string()); + "meta-data: %s", error.c_str()); goto bail; } } @@ -1956,7 +1957,7 @@ int doDump(Bundle* bundle) } else { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:name' attribute: %s", - error.string()); + error.c_str()); goto bail; } } @@ -1969,13 +1970,13 @@ int doDump(Bundle* bundle) Feature feature(true); int32_t featureVers = AaptXml::getIntegerAttribute( - tree, androidSchema.string(), "version", 0, &error); + tree, androidSchema.c_str(), "version", 0, &error); if (error == "") { feature.version = featureVers; } else { SourcePos(manifestFile, tree.getLineNumber()).error( "failed to read attribute 'android:version': %s", - error.string()); + error.c_str()); goto bail; } @@ -2016,8 +2017,8 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:name' attribute for " - "meta-data tag in service '%s': %s", serviceName.string(), - error.string()); + "meta-data tag in service '%s': %s", serviceName.c_str(), + error.c_str()); goto bail; } @@ -2034,7 +2035,7 @@ int doDump(Bundle* bundle) SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting 'android:resource' attribute for " "meta-data tag in service '%s': %s", - serviceName.string(), error.string()); + serviceName.c_str(), error.c_str()); goto bail; } @@ -2043,7 +2044,7 @@ int doDump(Bundle* bundle) if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( "ERROR getting AID category for service '%s'", - serviceName.string()); + serviceName.c_str()); goto bail; } @@ -2064,7 +2065,7 @@ int doDump(Bundle* bundle) action = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'android:name' attribute: %s", error.string()); + "ERROR getting 'android:name' attribute: %s", error.c_str()); goto bail; } @@ -2120,7 +2121,7 @@ int doDump(Bundle* bundle) String8 category = AaptXml::getAttribute(tree, NAME_ATTR, &error); if (error != "") { SourcePos(manifestFile, tree.getLineNumber()).error( - "ERROR getting 'name' attribute: %s", error.string()); + "ERROR getting 'name' attribute: %s", error.c_str()); goto bail; } if (withinActivity) { @@ -2352,7 +2353,7 @@ int doDump(Bundle* bundle) printf("locales:"); const size_t NL = locales.size(); for (size_t i=0; i<NL; i++) { - const char* localeStr = locales[i].string(); + const char* localeStr = locales[i].c_str(); if (localeStr == NULL || strlen(localeStr) == 0) { localeStr = "--_--"; } @@ -2373,7 +2374,7 @@ int doDump(Bundle* bundle) SortedVector<String8> architectures; for (size_t i=0; i<dir->getFileCount(); i++) { architectures.add(ResTable::normalizeForOutput( - dir->getFileName(i).string())); + dir->getFileName(i).c_str())); } bool outputAltNativeCode = false; @@ -2401,7 +2402,7 @@ int doDump(Bundle* bundle) } if (index >= 0) { - printf("native-code: '%s'\n", architectures[index].string()); + printf("native-code: '%s'\n", architectures[index].c_str()); architectures.removeAt(index); outputAltNativeCode = true; } @@ -2414,7 +2415,7 @@ int doDump(Bundle* bundle) } printf("native-code:"); for (size_t i = 0; i < archCount; i++) { - printf(" '%s'", architectures[i].string()); + printf(" '%s'", architectures[i].c_str()); } printf("\n"); } @@ -2428,7 +2429,7 @@ int doDump(Bundle* bundle) res.getConfigurations(&configs); const size_t N = configs.size(); for (size_t i=0; i<N; i++) { - printf("%s\n", configs[i].toString().string()); + printf("%s\n", configs[i].toString().c_str()); } } else { fprintf(stderr, "ERROR: unknown dump option '%s'\n", option); @@ -2486,15 +2487,15 @@ int doAdd(Bundle* bundle) for (int i = 1; i < bundle->getFileSpecCount(); i++) { const char* fileName = bundle->getFileSpecEntry(i); - if (strcasecmp(String8(fileName).getPathExtension().string(), ".gz") == 0) { + if (strcasecmp(getPathExtension(String8(fileName)).c_str(), ".gz") == 0) { printf(" '%s'... (from gzip)\n", fileName); - result = zip->addGzip(fileName, String8(fileName).getBasePath().string(), NULL); + result = zip->addGzip(fileName, getBasePath(String8(fileName)).c_str(), NULL); } else { if (bundle->getJunkPath()) { - String8 storageName = String8(fileName).getPathLeaf(); + String8 storageName = getPathLeaf(String8(fileName)); printf(" '%s' as '%s'...\n", fileName, - ResTable::normalizeForOutput(storageName.string()).string()); - result = zip->add(fileName, storageName.string(), + ResTable::normalizeForOutput(storageName.c_str()).c_str()); + result = zip->add(fileName, storageName.c_str(), bundle->getCompressionMethod(), NULL); } else { printf(" '%s'...\n", fileName); @@ -2581,7 +2582,7 @@ static status_t addResourcesToBuilder(const sp<AaptDir>& dir, const sp<ApkBuilde for (size_t i = 0; i < numDirs; i++) { bool ignore = ignoreConfig; const sp<AaptDir>& subDir = dir->getDirs().valueAt(i); - const char* dirStr = subDir->getLeaf().string(); + const char* dirStr = subDir->getLeaf().c_str(); if (!ignore && strstr(dirStr, "mipmap") == dirStr) { ignore = true; } @@ -2604,7 +2605,7 @@ static status_t addResourcesToBuilder(const sp<AaptDir>& dir, const sp<ApkBuilde } if (err != NO_ERROR) { fprintf(stderr, "Failed to add %s (%s) to builder.\n", - gp->getPath().string(), gp->getFiles()[j]->getPrintableSource().string()); + gp->getPath().c_str(), gp->getFiles()[j]->getPrintableSource().c_str()); return err; } } @@ -2617,16 +2618,16 @@ static String8 buildApkName(const String8& original, const sp<ApkSplit>& split) return original; } - String8 ext(original.getPathExtension()); + String8 ext(getPathExtension(original)); if (ext == String8(".apk")) { return String8::format("%s_%s%s", - original.getBasePath().string(), - split->getDirectorySafeName().string(), - ext.string()); + getBasePath(original).c_str(), + split->getDirectorySafeName().c_str(), + ext.c_str()); } - return String8::format("%s_%s", original.string(), - split->getDirectorySafeName().string()); + return String8::format("%s_%s", original.c_str(), + split->getDirectorySafeName().c_str()); } /* @@ -2712,7 +2713,7 @@ int doPackage(Bundle* bundle) for (size_t i = 0; i < numSplits; i++) { std::set<ConfigDescription> configs; if (!AaptConfig::parseCommaSeparatedList(splitStrs[i], &configs)) { - fprintf(stderr, "ERROR: failed to parse split configuration '%s'\n", splitStrs[i].string()); + fprintf(stderr, "ERROR: failed to parse split configuration '%s'\n", splitStrs[i].c_str()); goto bail; } @@ -2756,10 +2757,10 @@ int doPackage(Bundle* bundle) // generate the dependency file in the R.java package subdirectory // e.g. gen/com/foo/app/R.java.d dependencyFile = String8(bundle->getRClassDir()); - dependencyFile.appendPath("R.java.d"); + appendPath(dependencyFile, "R.java.d"); } // Make sure we have a clean dependency file to start with - fp = fopen(dependencyFile, "w"); + fp = fopen(dependencyFile.c_str(), "w"); fclose(fp); } @@ -2835,7 +2836,7 @@ int doPackage(Bundle* bundle) String8 outputPath = buildApkName(String8(outputAPKFile), split); err = writeAPK(bundle, outputPath, split); if (err != NO_ERROR) { - fprintf(stderr, "ERROR: packaging of '%s' failed\n", outputPath.string()); + fprintf(stderr, "ERROR: packaging of '%s' failed\n", outputPath.c_str()); goto bail; } } @@ -2848,7 +2849,7 @@ int doPackage(Bundle* bundle) if (bundle->getGenDependencies()) { // Now that writeResourceSymbols or writeAPK has taken care of writing // the targets to our dependency file, we'll write the prereqs - fp = fopen(dependencyFile, "a+"); + fp = fopen(dependencyFile.c_str(), "a+"); fprintf(fp, " : "); bool includeRaw = (outputAPKFile != NULL); err = writeDependencyPreReqs(bundle, assets, fp, includeRaw); diff --git a/tools/aapt/CrunchCache.cpp b/tools/aapt/CrunchCache.cpp index 7b8a576b88d3..e731ce0d5ccf 100644 --- a/tools/aapt/CrunchCache.cpp +++ b/tools/aapt/CrunchCache.cpp @@ -5,6 +5,7 @@ // This file defines functions laid out and documented in // CrunchCache.h +#include <androidfw/PathUtils.h> #include <utils/Compat.h> #include <utils/Vector.h> #include <utils/String8.h> @@ -44,7 +45,7 @@ size_t CrunchCache::crunch(CacheUpdater* cu, bool forceOverwrite) // This efficiently strips the source directory prefix from our path. // Also, String8 doesn't have a substring method so this is what we've // got to work with. - const char* rPathPtr = mSourceFiles.keyAt(0).string()+mSourcePath.length(); + const char* rPathPtr = mSourceFiles.keyAt(0).c_str()+mSourcePath.length(); // Strip leading slash if present int offset = 0; if (rPathPtr[0] == OS_PATH_SEPARATOR) @@ -52,15 +53,15 @@ size_t CrunchCache::crunch(CacheUpdater* cu, bool forceOverwrite) relativePath = String8(rPathPtr + offset); if (forceOverwrite || needsUpdating(relativePath)) { - cu->processImage(mSourcePath.appendPathCopy(relativePath), - mDestPath.appendPathCopy(relativePath)); + cu->processImage(appendPathCopy(mSourcePath, relativePath), + appendPathCopy(mDestPath, relativePath)); numFilesUpdated++; // crunchFile(relativePath); } // Delete this file from the source files and (if it exists) from the // dest files. mSourceFiles.removeItemsAt(0); - mDestFiles.removeItem(mDestPath.appendPathCopy(relativePath)); + mDestFiles.removeItem(appendPathCopy(mDestPath, relativePath)); } // Iterate through what's left of destFiles and delete leftovers @@ -99,7 +100,7 @@ bool CrunchCache::needsUpdating(const String8& relativePath) const // Retrieve modification dates for this file entry under the source and // cache directory trees. The vectors will return a modification date of 0 // if the file doesn't exist. - time_t sourceDate = mSourceFiles.valueFor(mSourcePath.appendPathCopy(relativePath)); - time_t destDate = mDestFiles.valueFor(mDestPath.appendPathCopy(relativePath)); + time_t sourceDate = mSourceFiles.valueFor(appendPathCopy(mSourcePath, relativePath)); + time_t destDate = mDestFiles.valueFor(appendPathCopy(mDestPath, relativePath)); return sourceDate > destDate; } diff --git a/tools/aapt/DirectoryWalker.h b/tools/aapt/DirectoryWalker.h index 88031d04b2df..7f60d4db9626 100644 --- a/tools/aapt/DirectoryWalker.h +++ b/tools/aapt/DirectoryWalker.h @@ -7,6 +7,7 @@ #ifndef DIRECTORYWALKER_H #define DIRECTORYWALKER_H +#include <androidfw/PathUtils.h> #include <dirent.h> #include <sys/types.h> #include <sys/param.h> @@ -57,7 +58,7 @@ public: virtual bool openDir(String8 path) { mBasePath = path; dir = NULL; - dir = opendir(mBasePath.string() ); + dir = opendir(mBasePath.c_str() ); if (dir == NULL) return false; @@ -77,8 +78,8 @@ public: mEntry = *entryPtr; // Get stats - String8 fullPath = mBasePath.appendPathCopy(mEntry.d_name); - stat(fullPath.string(),&mStats); + String8 fullPath = appendPathCopy(mBasePath, mEntry.d_name); + stat(fullPath.c_str(),&mStats); return &mEntry; }; // Get the stats for the current entry diff --git a/tools/aapt/FileFinder.cpp b/tools/aapt/FileFinder.cpp index c9d0744a4463..69a8fa9fc6f2 100644 --- a/tools/aapt/FileFinder.cpp +++ b/tools/aapt/FileFinder.cpp @@ -5,6 +5,7 @@ // File Finder implementation. // Implementation for the functions declared and documented in FileFinder.h +#include <androidfw/PathUtils.h> #include <utils/Vector.h> #include <utils/String8.h> #include <utils/KeyedVector.h> @@ -57,16 +58,16 @@ bool SystemFileFinder::findFiles(String8 basePath, Vector<String8>& extensions, if (entry->d_name[0] == '.') // Skip hidden files and directories continue; - String8 fullPath = basePath.appendPathCopy(entryName); + String8 fullPath = appendPathCopy(basePath, entryName); // If this entry is a directory we'll recurse into it - if (isDirectory(fullPath.string()) ) { + if (isDirectory(fullPath.c_str()) ) { DirectoryWalker* copy = dw->clone(); findFiles(fullPath, extensions, fileStore,copy); delete copy; } // If this entry is a file, we'll pass it over to checkAndAddFile - if (isFile(fullPath.string()) ) { + if (isFile(fullPath.c_str()) ) { checkAndAddFile(fullPath,dw->entryStats(),extensions,fileStore); } } @@ -83,10 +84,10 @@ void SystemFileFinder::checkAndAddFile(const String8& path, const struct stat* s { // Loop over the extensions, checking for a match bool done = false; - String8 ext(path.getPathExtension()); + String8 ext(getPathExtension(path)); ext.toLower(); for (size_t i = 0; i < extensions.size() && !done; ++i) { - String8 ext2 = extensions[i].getPathExtension(); + String8 ext2 = getPathExtension(extensions[i]); ext2.toLower(); // Compare the extensions. If a match is found, add to storage. if (ext == ext2) { diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp index 627a231de5c8..cd4de90f12f6 100644 --- a/tools/aapt/Images.cpp +++ b/tools/aapt/Images.cpp @@ -8,6 +8,7 @@ #include "Images.h" +#include <androidfw/PathUtils.h> #include <androidfw/ResourceTypes.h> #include <utils/ByteOrder.h> @@ -1328,13 +1329,13 @@ static bool read_png_protected(png_structp read_ptr, String8& printableName, png png_init_io(read_ptr, fp); - read_png(printableName.string(), read_ptr, read_info, imageInfo); + read_png(printableName.c_str(), read_ptr, read_info, imageInfo); const size_t nameLen = file->getPath().length(); if (nameLen > 6) { - const char* name = file->getPath().string(); + const char* name = file->getPath().c_str(); if (name[nameLen-5] == '9' && name[nameLen-6] == '.') { - if (do_9patch(printableName.string(), imageInfo) != NO_ERROR) { + if (do_9patch(printableName.c_str(), imageInfo) != NO_ERROR) { return false; } } @@ -1349,7 +1350,7 @@ static bool write_png_protected(png_structp write_ptr, String8& printableName, p return false; } - write_png(printableName.string(), write_ptr, write_info, *imageInfo, bundle); + write_png(printableName.c_str(), write_ptr, write_info, *imageInfo, bundle); return true; } @@ -1357,10 +1358,10 @@ static bool write_png_protected(png_structp write_ptr, String8& printableName, p status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& /* assets */, const sp<AaptFile>& file, String8* /* outNewLeafName */) { - String8 ext(file->getPath().getPathExtension()); + String8 ext(getPathExtension(file->getPath())); // We currently only process PNG images. - if (strcmp(ext.string(), ".png") != 0) { + if (strcmp(ext.c_str(), ".png") != 0) { return NO_ERROR; } @@ -1371,7 +1372,7 @@ status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& /* assets * String8 printableName(file->getPrintableSource()); if (bundle->getVerbose()) { - printf("Processing image: %s\n", printableName.string()); + printf("Processing image: %s\n", printableName.c_str()); } png_structp read_ptr = NULL; @@ -1385,9 +1386,9 @@ status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& /* assets * status_t error = UNKNOWN_ERROR; - fp = fopen(file->getSourceFile().string(), "rb"); + fp = fopen(file->getSourceFile().c_str(), "rb"); if (fp == NULL) { - fprintf(stderr, "%s: ERROR: Unable to open PNG file\n", printableName.string()); + fprintf(stderr, "%s: ERROR: Unable to open PNG file\n", printableName.c_str()); goto bail; } @@ -1434,7 +1435,7 @@ status_t preProcessImage(const Bundle* bundle, const sp<AaptAssets>& /* assets * size_t newSize = file->getSize(); float factor = ((float)newSize)/oldSize; int percent = (int)(factor*100); - printf(" (processed image %s: %d%% size of source)\n", printableName.string(), percent); + printf(" (processed image %s: %d%% size of source)\n", printableName.c_str(), percent); } bail: @@ -1450,7 +1451,7 @@ bail: if (error != NO_ERROR) { fprintf(stderr, "ERROR: Failure processing PNG image %s\n", - file->getPrintableSource().string()); + file->getPrintableSource().c_str()); } return error; } @@ -1470,13 +1471,13 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con status_t error = UNKNOWN_ERROR; if (bundle->getVerbose()) { - printf("Processing image to cache: %s => %s\n", source.string(), dest.string()); + printf("Processing image to cache: %s => %s\n", source.c_str(), dest.c_str()); } // Get a file handler to read from - fp = fopen(source.string(),"rb"); + fp = fopen(source.c_str(),"rb"); if (fp == NULL) { - fprintf(stderr, "%s ERROR: Unable to open PNG file\n", source.string()); + fprintf(stderr, "%s ERROR: Unable to open PNG file\n", source.c_str()); return error; } @@ -1507,7 +1508,7 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con png_init_io(read_ptr,fp); // Actually read data from the file - read_png(source.string(), read_ptr, read_info, &imageInfo); + read_png(source.c_str(), read_ptr, read_info, &imageInfo); // We're done reading so we can clean up // Find old file size before releasing handle @@ -1518,8 +1519,8 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con // Check to see if we're dealing with a 9-patch // If we are, process appropriately - if (source.getBasePath().getPathExtension() == ".9") { - if (do_9patch(source.string(), &imageInfo) != NO_ERROR) { + if (getPathExtension(getBasePath(source)) == ".9") { + if (do_9patch(source.c_str(), &imageInfo) != NO_ERROR) { return error; } } @@ -1541,9 +1542,9 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con } // Open up our destination file for writing - fp = fopen(dest.string(), "wb"); + fp = fopen(dest.c_str(), "wb"); if (!fp) { - fprintf(stderr, "%s ERROR: Unable to open PNG file\n", dest.string()); + fprintf(stderr, "%s ERROR: Unable to open PNG file\n", dest.c_str()); png_destroy_write_struct(&write_ptr, &write_info); return error; } @@ -1559,11 +1560,11 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con } // Actually write out to the new png - write_png(dest.string(), write_ptr, write_info, imageInfo, bundle); + write_png(dest.c_str(), write_ptr, write_info, imageInfo, bundle); if (bundle->getVerbose()) { // Find the size of our new file - FILE* reader = fopen(dest.string(), "rb"); + FILE* reader = fopen(dest.c_str(), "rb"); fseek(reader, 0, SEEK_END); size_t newSize = (size_t)ftell(reader); fclose(reader); @@ -1571,7 +1572,7 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con float factor = ((float)newSize)/oldSize; int percent = (int)(factor*100); printf(" (processed image to cache entry %s: %d%% size of source)\n", - dest.string(), percent); + dest.c_str(), percent); } //Clean up @@ -1584,12 +1585,12 @@ status_t preProcessImageToCache(const Bundle* bundle, const String8& source, con status_t postProcessImage(const Bundle* bundle, const sp<AaptAssets>& assets, ResourceTable* table, const sp<AaptFile>& file) { - String8 ext(file->getPath().getPathExtension()); + String8 ext(getPathExtension(file->getPath())); // At this point, now that we have all the resource data, all we need to // do is compile XML files. - if (strcmp(ext.string(), ".xml") == 0) { - String16 resourceName(parseResourceName(file->getSourceFile().getPathLeaf())); + if (strcmp(ext.c_str(), ".xml") == 0) { + String16 resourceName(parseResourceName(getPathLeaf(file->getSourceFile()))); return compileXmlFile(bundle, assets, resourceName, file, table); } diff --git a/tools/aapt/Package.cpp b/tools/aapt/Package.cpp index f06643dcf784..5e0f87f0dcaf 100644 --- a/tools/aapt/Package.cpp +++ b/tools/aapt/Package.cpp @@ -8,7 +8,9 @@ #include "OutputSet.h" #include "ResourceTable.h" #include "ResourceFilter.h" +#include "Utils.h" +#include <androidfw/PathUtils.h> #include <androidfw/misc.h> #include <utils/Log.h> @@ -69,39 +71,39 @@ status_t writeAPK(Bundle* bundle, const String8& outputFile, const sp<OutputSet> * If "update" is set, update the contents of the existing archive. * Else, if "force" is set, remove the existing archive. */ - FileType fileType = getFileType(outputFile.string()); + FileType fileType = getFileType(outputFile.c_str()); if (fileType == kFileTypeNonexistent) { // okay, create it below } else if (fileType == kFileTypeRegular) { if (bundle->getUpdate()) { // okay, open it below } else if (bundle->getForce()) { - if (unlink(outputFile.string()) != 0) { - fprintf(stderr, "ERROR: unable to remove '%s': %s\n", outputFile.string(), + if (unlink(outputFile.c_str()) != 0) { + fprintf(stderr, "ERROR: unable to remove '%s': %s\n", outputFile.c_str(), strerror(errno)); goto bail; } } else { fprintf(stderr, "ERROR: '%s' exists (use '-f' to force overwrite)\n", - outputFile.string()); + outputFile.c_str()); goto bail; } } else { - fprintf(stderr, "ERROR: '%s' exists and is not a regular file\n", outputFile.string()); + fprintf(stderr, "ERROR: '%s' exists and is not a regular file\n", outputFile.c_str()); goto bail; } if (bundle->getVerbose()) { printf("%s '%s'\n", (fileType == kFileTypeNonexistent) ? "Creating" : "Opening", - outputFile.string()); + outputFile.c_str()); } status_t status; zip = new ZipFile; - status = zip->open(outputFile.string(), ZipFile::kOpenReadWrite | ZipFile::kOpenCreate); + status = zip->open(outputFile.c_str(), ZipFile::kOpenReadWrite | ZipFile::kOpenCreate); if (status != NO_ERROR) { fprintf(stderr, "ERROR: unable to open '%s' as Zip file for writing\n", - outputFile.string()); + outputFile.c_str()); goto bail; } @@ -112,7 +114,7 @@ status_t writeAPK(Bundle* bundle, const String8& outputFile, const sp<OutputSet> count = processAssets(bundle, zip, outputSet); if (count < 0) { fprintf(stderr, "ERROR: unable to process assets while packaging '%s'\n", - outputFile.string()); + outputFile.c_str()); result = count; goto bail; } @@ -124,7 +126,7 @@ status_t writeAPK(Bundle* bundle, const String8& outputFile, const sp<OutputSet> count = processJarFiles(bundle, zip); if (count < 0) { fprintf(stderr, "ERROR: unable to process jar files while packaging '%s'\n", - outputFile.string()); + outputFile.c_str()); result = count; goto bail; } @@ -169,12 +171,12 @@ status_t writeAPK(Bundle* bundle, const String8& outputFile, const sp<OutputSet> /* anything here? */ if (zip->getNumEntries() == 0) { if (bundle->getVerbose()) { - printf("Archive is empty -- removing %s\n", outputFile.getPathLeaf().string()); + printf("Archive is empty -- removing %s\n", getPathLeaf(outputFile).c_str()); } delete zip; // close the file so we can remove it in Win32 zip = NULL; - if (unlink(outputFile.string()) != 0) { - fprintf(stderr, "warning: could not unlink '%s'\n", outputFile.string()); + if (unlink(outputFile.c_str()) != 0) { + fprintf(stderr, "warning: could not unlink '%s'\n", outputFile.c_str()); } } @@ -187,9 +189,9 @@ status_t writeAPK(Bundle* bundle, const String8& outputFile, const sp<OutputSet> String8 dependencyFile = outputFile; dependencyFile.append(".d"); - FILE* fp = fopen(dependencyFile.string(), "a"); + FILE* fp = fopen(dependencyFile.c_str(), "a"); // Add this file to the dependency file - fprintf(fp, "%s \\\n", outputFile.string()); + fprintf(fp, "%s \\\n", outputFile.c_str()); fclose(fp); } @@ -199,10 +201,10 @@ bail: delete zip; // must close before remove in Win32 if (result != NO_ERROR) { if (bundle->getVerbose()) { - printf("Removing %s due to earlier failures\n", outputFile.string()); + printf("Removing %s due to earlier failures\n", outputFile.c_str()); } - if (unlink(outputFile.string()) != 0) { - fprintf(stderr, "warning: could not unlink '%s'\n", outputFile.string()); + if (unlink(outputFile.c_str()) != 0) { + fprintf(stderr, "warning: could not unlink '%s'\n", outputFile.c_str()); } } @@ -226,7 +228,7 @@ ssize_t processAssets(Bundle* bundle, ZipFile* zip, const sp<const OutputSet>& o fprintf(stderr, "warning: null file being processed.\n"); } else { String8 storagePath(entry.getPath()); - storagePath.convertToResPath(); + convertToResPath(storagePath); if (!processFile(bundle, zip, storagePath, entry.getFile())) { return UNKNOWN_ERROR; } @@ -267,31 +269,31 @@ bool processFile(Bundle* bundle, ZipFile* zip, int fileNameLen = storageName.length(); int excludeExtensionLen = strlen(kExcludeExtension); if (fileNameLen > excludeExtensionLen - && (0 == strcmp(storageName.string() + (fileNameLen - excludeExtensionLen), + && (0 == strcmp(storageName.c_str() + (fileNameLen - excludeExtensionLen), kExcludeExtension))) { - fprintf(stderr, "warning: '%s' not added to Zip\n", storageName.string()); + fprintf(stderr, "warning: '%s' not added to Zip\n", storageName.c_str()); return true; } - if (strcasecmp(storageName.getPathExtension().string(), ".gz") == 0) { + if (strcasecmp(getPathExtension(storageName).c_str(), ".gz") == 0) { fromGzip = true; - storageName = storageName.getBasePath(); + storageName = getBasePath(storageName); } if (bundle->getUpdate()) { - entry = zip->getEntryByName(storageName.string()); + entry = zip->getEntryByName(storageName.c_str()); if (entry != NULL) { /* file already exists in archive; there can be only one */ if (entry->getMarked()) { fprintf(stderr, "ERROR: '%s' exists twice (check for with & w/o '.gz'?)\n", - file->getPrintableSource().string()); + file->getPrintableSource().c_str()); return false; } if (!hasData) { const String8& srcName = file->getSourceFile(); time_t fileModWhen; - fileModWhen = getFileModDate(srcName.string()); + fileModWhen = getFileModDate(srcName.c_str()); if (fileModWhen == (time_t) -1) { // file existence tested earlier, return false; // not expecting an error here } @@ -299,14 +301,14 @@ bool processFile(Bundle* bundle, ZipFile* zip, if (fileModWhen > entry->getModWhen()) { // mark as deleted so add() will succeed if (bundle->getVerbose()) { - printf(" (removing old '%s')\n", storageName.string()); + printf(" (removing old '%s')\n", storageName.c_str()); } zip->remove(entry); } else { // version in archive is newer if (bundle->getVerbose()) { - printf(" (not updating '%s')\n", storageName.string()); + printf(" (not updating '%s')\n", storageName.c_str()); } entry->setMarked(true); return true; @@ -321,22 +323,22 @@ bool processFile(Bundle* bundle, ZipFile* zip, //android_setMinPriority(NULL, ANDROID_LOG_VERBOSE); if (fromGzip) { - result = zip->addGzip(file->getSourceFile().string(), storageName.string(), &entry); + result = zip->addGzip(file->getSourceFile().c_str(), storageName.c_str(), &entry); } else if (!hasData) { /* don't compress certain files, e.g. PNGs */ int compressionMethod = bundle->getCompressionMethod(); if (!okayToCompress(bundle, storageName)) { compressionMethod = ZipEntry::kCompressStored; } - result = zip->add(file->getSourceFile().string(), storageName.string(), compressionMethod, + result = zip->add(file->getSourceFile().c_str(), storageName.c_str(), compressionMethod, &entry); } else { - result = zip->add(file->getData(), file->getSize(), storageName.string(), + result = zip->add(file->getData(), file->getSize(), storageName.c_str(), file->getCompressionMethod(), &entry); } if (result == NO_ERROR) { if (bundle->getVerbose()) { - printf(" '%s'%s", storageName.string(), fromGzip ? " (from .gz)" : ""); + printf(" '%s'%s", storageName.c_str(), fromGzip ? " (from .gz)" : ""); if (entry->getCompressionMethod() == ZipEntry::kCompressStored) { printf(" (not compressed)\n"); } else { @@ -348,10 +350,10 @@ bool processFile(Bundle* bundle, ZipFile* zip, } else { if (result == ALREADY_EXISTS) { fprintf(stderr, " Unable to add '%s': file already in archive (try '-u'?)\n", - file->getPrintableSource().string()); + file->getPrintableSource().c_str()); } else { fprintf(stderr, " Unable to add '%s': Zip add failed (%d)\n", - file->getPrintableSource().string(), result); + file->getPrintableSource().c_str(), result); } return false; } @@ -365,14 +367,14 @@ bool processFile(Bundle* bundle, ZipFile* zip, */ bool okayToCompress(Bundle* bundle, const String8& pathName) { - String8 ext = pathName.getPathExtension(); + String8 ext = getPathExtension(pathName); int i; if (ext.length() == 0) return true; for (i = 0; i < NELEM(kNoCompressExt); i++) { - if (strcasecmp(ext.string(), kNoCompressExt[i]) == 0) + if (strcasecmp(ext.c_str(), kNoCompressExt[i]) == 0) return false; } @@ -383,7 +385,7 @@ bool okayToCompress(Bundle* bundle, const String8& pathName) if (pos < 0) { continue; } - const char* path = pathName.string(); + const char* path = pathName.c_str(); if (strcasecmp(path + pos, str) == 0) { return false; } diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index dd3ebdbdea09..7e4e186ec320 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -15,9 +15,12 @@ #include "ResourceTable.h" #include "StringPool.h" #include "Symbol.h" +#include "Utils.h" #include "WorkQueue.h" #include "XMLNode.h" +#include <androidfw/PathUtils.h> + #include <algorithm> // STATUST: mingw does seem to redefine UNKNOWN_ERROR from our enum value, so a cast is necessary. @@ -57,8 +60,8 @@ public: String8 parseResourceName(const String8& leaf) { - const char* firstDot = strchr(leaf.string(), '.'); - const char* str = leaf.string(); + const char* firstDot = strchr(leaf.c_str(), '.'); + const char* str = leaf.c_str(); if (firstDot) { return String8(str, firstDot-str); @@ -132,7 +135,7 @@ public: mParams = file->getGroupEntry().toParams(); if (kIsDebug) { printf("Dir %s: mcc=%d mnc=%d lang=%c%c cnt=%c%c orient=%d ui=%d density=%d touch=%d key=%d inp=%d nav=%d\n", - group->getPath().string(), mParams.mcc, mParams.mnc, + group->getPath().c_str(), mParams.mcc, mParams.mnc, mParams.language[0] ? mParams.language[0] : '-', mParams.language[1] ? mParams.language[1] : '-', mParams.country[0] ? mParams.country[0] : '-', @@ -142,17 +145,17 @@ public: mParams.inputFlags, mParams.navigation); } mPath = "res"; - mPath.appendPath(file->getGroupEntry().toDirName(mResType)); - mPath.appendPath(leaf); + appendPath(mPath, file->getGroupEntry().toDirName(mResType)); + appendPath(mPath, leaf); mBaseName = parseResourceName(leaf); if (mBaseName == "") { fprintf(stderr, "Error: malformed resource filename %s\n", - file->getPrintableSource().string()); + file->getPrintableSource().c_str()); return UNKNOWN_ERROR; } if (kIsDebug) { - printf("file name=%s\n", mBaseName.string()); + printf("file name=%s\n", mBaseName.c_str()); } return NO_ERROR; @@ -222,7 +225,7 @@ static status_t parsePackage(Bundle* bundle, const sp<AaptAssets>& assets, { if (grp->getFiles().size() != 1) { fprintf(stderr, "warning: Multiple AndroidManifest.xml files found, using %s\n", - grp->getFiles().valueAt(0)->getPrintableSource().string()); + grp->getFiles().valueAt(0)->getPrintableSource().c_str()); } sp<AaptFile> file = grp->getFiles().valueAt(0); @@ -243,20 +246,20 @@ static status_t parsePackage(Bundle* bundle, const sp<AaptAssets>& assets, size_t len; if (code != ResXMLTree::START_TAG) { fprintf(stderr, "%s:%d: No start tag found\n", - file->getPrintableSource().string(), block.getLineNumber()); + file->getPrintableSource().c_str(), block.getLineNumber()); return UNKNOWN_ERROR; } - if (strcmp16(block.getElementName(&len), String16("manifest").string()) != 0) { + if (strcmp16(block.getElementName(&len), String16("manifest").c_str()) != 0) { fprintf(stderr, "%s:%d: Invalid start tag %s, expected <manifest>\n", - file->getPrintableSource().string(), block.getLineNumber(), - String8(block.getElementName(&len)).string()); + file->getPrintableSource().c_str(), block.getLineNumber(), + String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } ssize_t nameIndex = block.indexOfAttribute(NULL, "package"); if (nameIndex < 0) { fprintf(stderr, "%s:%d: <manifest> does not have package attribute.\n", - file->getPrintableSource().string(), block.getLineNumber()); + file->getPrintableSource().c_str(), block.getLineNumber()); return UNKNOWN_ERROR; } @@ -264,19 +267,19 @@ static status_t parsePackage(Bundle* bundle, const sp<AaptAssets>& assets, ssize_t revisionCodeIndex = block.indexOfAttribute(RESOURCES_ANDROID_NAMESPACE, "revisionCode"); if (revisionCodeIndex >= 0) { - bundle->setRevisionCode(String8(block.getAttributeStringValue(revisionCodeIndex, &len)).string()); + bundle->setRevisionCode(String8(block.getAttributeStringValue(revisionCodeIndex, &len)).c_str()); } String16 uses_sdk16("uses-sdk"); while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { - if (strcmp16(block.getElementName(&len), uses_sdk16.string()) == 0) { + if (strcmp16(block.getElementName(&len), uses_sdk16.c_str()) == 0) { ssize_t minSdkIndex = block.indexOfAttribute(RESOURCES_ANDROID_NAMESPACE, "minSdkVersion"); if (minSdkIndex >= 0) { const char16_t* minSdk16 = block.getAttributeStringValue(minSdkIndex, &len); - const char* minSdk8 = strdup(String8(minSdk16).string()); + const char* minSdk8 = strdup(String8(minSdk16).c_str()); bundle->setManifestMinSdkVersion(minSdk8); } } @@ -305,23 +308,23 @@ static status_t makeFileResources(Bundle* bundle, const sp<AaptAssets>& assets, while ((res=it.next()) == NO_ERROR) { if (bundle->getVerbose()) { printf(" (new resource id %s from %s)\n", - it.getBaseName().string(), it.getFile()->getPrintableSource().string()); + it.getBaseName().c_str(), it.getFile()->getPrintableSource().c_str()); } String16 baseName(it.getBaseName()); - const char16_t* str = baseName.string(); + const char16_t* str = baseName.c_str(); const char16_t* const end = str + baseName.size(); while (str < end) { if (!((*str >= 'a' && *str <= 'z') || (*str >= '0' && *str <= '9') || *str == '_' || *str == '.')) { fprintf(stderr, "%s: Invalid file name: must contain only [a-z0-9_.]\n", - it.getPath().string()); + it.getPath().c_str()); hasErrors = true; } str++; } String8 resPath = it.getPath(); - resPath.convertToResPath(); + convertToResPath(resPath); status_t result = table->addEntry(SourcePos(it.getPath(), 0), String16(assets->getPackage()), type16, @@ -413,7 +416,7 @@ static void collect_files(const sp<AaptDir>& dir, sp<ResourceTypeSet> set = new ResourceTypeSet(); if (kIsDebug) { printf("Creating new resource type set for leaf %s with group %s (%p)\n", - leafName.string(), group->getPath().string(), group.get()); + leafName.c_str(), group->getPath().c_str(), group.get()); } set->add(leafName, group); resources->add(resType, set); @@ -423,21 +426,21 @@ static void collect_files(const sp<AaptDir>& dir, if (index < 0) { if (kIsDebug) { printf("Adding to resource type set for leaf %s group %s (%p)\n", - leafName.string(), group->getPath().string(), group.get()); + leafName.c_str(), group->getPath().c_str(), group.get()); } set->add(leafName, group); } else { sp<AaptGroup> existingGroup = set->valueAt(index); if (kIsDebug) { printf("Extending to resource type set for leaf %s group %s (%p)\n", - leafName.string(), group->getPath().string(), group.get()); + leafName.c_str(), group->getPath().c_str(), group.get()); } for (size_t j=0; j<files.size(); j++) { if (kIsDebug) { printf("Adding file %s in group %s resType %s\n", - files.valueAt(j)->getSourceFile().string(), - files.keyAt(j).toDirName(String8()).string(), - resType.string()); + files.valueAt(j)->getSourceFile().c_str(), + files.keyAt(j).toDirName(String8()).c_str(), + resType.c_str()); } existingGroup->addFile(files.valueAt(j)); } @@ -455,14 +458,14 @@ static void collect_files(const sp<AaptAssets>& ass, for (int i=0; i<N; i++) { const sp<AaptDir>& d = dirs.itemAt(i); if (kIsDebug) { - printf("Collecting dir #%d %p: %s, leaf %s\n", i, d.get(), d->getPath().string(), - d->getLeaf().string()); + printf("Collecting dir #%d %p: %s, leaf %s\n", i, d.get(), d->getPath().c_str(), + d->getLeaf().c_str()); } collect_files(d, resources); // don't try to include the res dir if (kIsDebug) { - printf("Removing dir leaf %s\n", d->getLeaf().string()); + printf("Removing dir leaf %s\n", d->getLeaf().c_str()); } ass->removeDir(d->getLeaf()); } @@ -490,8 +493,8 @@ static int validateAttr(const String8& path, const ResTable& table, int strIdx; if ((strIdx=table.resolveReference(&value, 0x10000000, NULL, &specFlags)) < 0) { fprintf(stderr, "%s:%d: Tag <%s> attribute %s references unknown resid 0x%08x.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr, + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr, value.data); return ATTR_NOT_FOUND; } @@ -502,12 +505,12 @@ static int validateAttr(const String8& path, const ResTable& table, str = pool->stringAt(value.data, &len); } printf("***** RES ATTR: %s specFlags=0x%x strIdx=%d: %s\n", attr, - specFlags, strIdx, str != NULL ? String8(str).string() : "???"); + specFlags, strIdx, str != NULL ? String8(str).c_str() : "???"); #endif if ((specFlags&~ResTable_typeSpec::SPEC_PUBLIC) != 0 && false) { fprintf(stderr, "%s:%d: Tag <%s> attribute %s varies by configurations 0x%x.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr, + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr, specFlags); return ATTR_NOT_FOUND; } @@ -515,20 +518,20 @@ static int validateAttr(const String8& path, const ResTable& table, if (value.dataType == Res_value::TYPE_STRING) { if (pool == NULL) { fprintf(stderr, "%s:%d: Tag <%s> attribute %s has no string block.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr); + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr); return ATTR_NOT_FOUND; } if ((str = UnpackOptionalString(pool->stringAt(value.data), &len)) == NULL) { fprintf(stderr, "%s:%d: Tag <%s> attribute %s has corrupt string value.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr); + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr); return ATTR_NOT_FOUND; } } else { fprintf(stderr, "%s:%d: Tag <%s> attribute %s has invalid type %d.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr, + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr, value.dataType); return ATTR_NOT_FOUND; } @@ -546,30 +549,30 @@ static int validateAttr(const String8& path, const ResTable& table, } if (!okay) { fprintf(stderr, "%s:%d: Tag <%s> attribute %s has invalid character '%c'.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr, (char)str[i]); + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr, (char)str[i]); return (int)i; } } } if (*str == ' ') { fprintf(stderr, "%s:%d: Tag <%s> attribute %s can not start with a space.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr); + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr); return ATTR_LEADING_SPACES; } if (len != 0 && str[len-1] == ' ') { fprintf(stderr, "%s:%d: Tag <%s> attribute %s can not end with a space.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr); + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr); return ATTR_TRAILING_SPACES; } return ATTR_OKAY; } if (required) { fprintf(stderr, "%s:%d: Tag <%s> missing required attribute %s.\n", - path.string(), parser.getLineNumber(), - String8(parser.getElementName(&len)).string(), attr); + path.c_str(), parser.getLineNumber(), + String8(parser.getElementName(&len)).c_str(), attr); return ATTR_NOT_FOUND; } return ATTR_OKAY; @@ -584,7 +587,7 @@ static void checkForIds(const String8& path, ResXMLParser& parser) ssize_t index = parser.indexOfAttribute(NULL, "id"); if (index >= 0) { fprintf(stderr, "%s:%d: warning: found plain 'id' attribute; did you mean the new 'android:id' name?\n", - path.string(), parser.getLineNumber()); + path.c_str(), parser.getLineNumber()); } } } @@ -618,7 +621,7 @@ static bool applyFileOverlay(Bundle *bundle, size_t overlayCount = overlaySet->size(); for (size_t overlayIndex=0; overlayIndex<overlayCount; overlayIndex++) { if (bundle->getVerbose()) { - printf("trying overlaySet Key=%s\n",overlaySet->keyAt(overlayIndex).string()); + printf("trying overlaySet Key=%s\n",overlaySet->keyAt(overlayIndex).c_str()); } ssize_t baseIndex = -1; if (baseSet->get() != NULL) { @@ -638,11 +641,11 @@ static bool applyFileOverlay(Bundle *bundle, baseGroup->getFiles(); for (size_t i=0; i < baseFiles.size(); i++) { printf("baseFile " ZD " has flavor %s\n", (ZD_TYPE) i, - baseFiles.keyAt(i).toString().string()); + baseFiles.keyAt(i).toString().c_str()); } for (size_t i=0; i < overlayFiles.size(); i++) { printf("overlayFile " ZD " has flavor %s\n", (ZD_TYPE) i, - overlayFiles.keyAt(i).toString().string()); + overlayFiles.keyAt(i).toString().c_str()); } } @@ -657,16 +660,16 @@ static bool applyFileOverlay(Bundle *bundle, if (bundle->getVerbose()) { printf("found a match (" ZD ") for overlay file %s, for flavor %s\n", (ZD_TYPE) baseFileIndex, - overlayGroup->getLeaf().string(), - overlayFiles.keyAt(overlayGroupIndex).toString().string()); + overlayGroup->getLeaf().c_str(), + overlayFiles.keyAt(overlayGroupIndex).toString().c_str()); } baseGroup->removeFile(baseFileIndex); } else { // didn't find a match fall through and add it.. if (true || bundle->getVerbose()) { printf("nothing matches overlay file %s, for flavor %s\n", - overlayGroup->getLeaf().string(), - overlayFiles.keyAt(overlayGroupIndex).toString().string()); + overlayGroup->getLeaf().c_str(), + overlayFiles.keyAt(overlayGroupIndex).toString().c_str()); } } baseGroup->addFile(overlayFiles.valueAt(overlayGroupIndex)); @@ -728,7 +731,7 @@ bool addTagAttribute(const sp<XMLNode>& node, const char* ns8, if (errorOnFailedInsert) { fprintf(stderr, "Error: AndroidManifest.xml already defines %s (in %s);" " cannot insert new value %s.\n", - String8(attr).string(), String8(ns).string(), value); + String8(attr).c_str(), String8(ns).c_str(), value); return false; } @@ -763,7 +766,7 @@ static void fullyQualifyClassName(const String8& package, const sp<XMLNode>& nod // .asdf .a.b --> package.asdf package.a.b // asdf.adsf --> asdf.asdf String8 className; - const char* p = name.string(); + const char* p = name.c_str(); const char* q = strchr(p, '.'); if (p == q) { className += package; @@ -776,9 +779,9 @@ static void fullyQualifyClassName(const String8& package, const sp<XMLNode>& nod className += name; } if (kIsDebug) { - printf("Qualifying class '%s' to '%s'", name.string(), className.string()); + printf("Qualifying class '%s' to '%s'", name.c_str(), className.c_str()); } - attr->string.setTo(String16(className)); + attr->string = String16(className); } } @@ -810,7 +813,7 @@ static void massageRoundIconSupport(const String16& iconRef, const String16& rou const char* err; String16 iconPackage, iconType, iconName; - if (!ResTable::expandResourceRef(iconRef.string(), iconRef.size(), &iconPackage, &iconType, + if (!ResTable::expandResourceRef(iconRef.c_str(), iconRef.size(), &iconPackage, &iconType, &iconName, NULL, &table->getAssetsPackage(), &err, &publicOnly)) { // Errors will be raised in later XML compilation. @@ -824,7 +827,7 @@ static void massageRoundIconSupport(const String16& iconRef, const String16& rou } String16 roundIconPackage, roundIconType, roundIconName; - if (!ResTable::expandResourceRef(roundIconRef.string(), roundIconRef.size(), &roundIconPackage, + if (!ResTable::expandResourceRef(roundIconRef.c_str(), roundIconRef.size(), &roundIconPackage, &roundIconType, &roundIconName, NULL, &table->getAssetsPackage(), &err, &publicOnly)) { // Errors will be raised in later XML compilation. @@ -839,9 +842,9 @@ static void massageRoundIconSupport(const String16& iconRef, const String16& rou return; } - String16 aliasValue = String16(String8::format("@%s:%s/%s", String8(iconPackage).string(), - String8(iconType).string(), - String8(iconName).string())); + String16 aliasValue = String16(String8::format("@%s:%s/%s", String8(iconPackage).c_str(), + String8(iconType).c_str(), + String8(iconName).c_str())); // Add an equivalent v26 entry to the roundIcon for each v26 variant of the regular icon. const DefaultKeyedVector<ConfigDescription, sp<ResourceTable::Entry>>& configList = @@ -872,7 +875,7 @@ status_t massageManifest(Bundle* bundle, ResourceTable* table, sp<XMLNode> root) const XMLNode::attribute_entry* attr = root->getAttribute( String16(RESOURCES_ANDROID_NAMESPACE), String16("versionCode")); if (attr != NULL) { - bundle->setVersionCode(strdup(String8(attr->string).string())); + bundle->setVersionCode(strdup(String8(attr->string).c_str())); } } @@ -883,7 +886,7 @@ status_t massageManifest(Bundle* bundle, ResourceTable* table, sp<XMLNode> root) const XMLNode::attribute_entry* attr = root->getAttribute( String16(RESOURCES_ANDROID_NAMESPACE), String16("versionName")); if (attr != NULL) { - bundle->setVersionName(strdup(String8(attr->string).string())); + bundle->setVersionName(strdup(String8(attr->string).c_str())); } } @@ -914,14 +917,14 @@ status_t massageManifest(Bundle* bundle, ResourceTable* table, sp<XMLNode> root) const XMLNode::attribute_entry* attr = vers->getAttribute( String16(RESOURCES_ANDROID_NAMESPACE), String16("minSdkVersion")); if (attr != NULL) { - bundle->setMinSdkVersion(strdup(String8(attr->string).string())); + bundle->setMinSdkVersion(strdup(String8(attr->string).c_str())); } } if (bundle->getCompileSdkVersion() != 0) { if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "compileSdkVersion", - String8::format("%d", bundle->getCompileSdkVersion()), + String8::format("%d", bundle->getCompileSdkVersion()).c_str(), errorOnFailedInsert, true)) { return UNKNOWN_ERROR; } @@ -929,21 +932,21 @@ status_t massageManifest(Bundle* bundle, ResourceTable* table, sp<XMLNode> root) if (bundle->getCompileSdkVersionCodename() != "") { if (!addTagAttribute(root, RESOURCES_ANDROID_NAMESPACE, "compileSdkVersionCodename", - bundle->getCompileSdkVersionCodename(), errorOnFailedInsert, true)) { + bundle->getCompileSdkVersionCodename().c_str(), errorOnFailedInsert, true)) { return UNKNOWN_ERROR; } } if (bundle->getPlatformBuildVersionCode() != "") { if (!addTagAttribute(root, "", "platformBuildVersionCode", - bundle->getPlatformBuildVersionCode(), errorOnFailedInsert, true)) { + bundle->getPlatformBuildVersionCode().c_str(), errorOnFailedInsert, true)) { return UNKNOWN_ERROR; } } if (bundle->getPlatformBuildVersionName() != "") { if (!addTagAttribute(root, "", "platformBuildVersionName", - bundle->getPlatformBuildVersionName(), errorOnFailedInsert, true)) { + bundle->getPlatformBuildVersionName().c_str(), errorOnFailedInsert, true)) { return UNKNOWN_ERROR; } } @@ -968,9 +971,9 @@ status_t massageManifest(Bundle* bundle, ResourceTable* table, sp<XMLNode> root) return UNKNOWN_ERROR; } String8 origPackage(attr->string); - attr->string.setTo(String16(manifestPackageNameOverride)); + attr->string = String16(manifestPackageNameOverride); if (kIsDebug) { - printf("Overriding package '%s' to be '%s'\n", origPackage.string(), + printf("Overriding package '%s' to be '%s'\n", origPackage.c_str(), manifestPackageNameOverride); } @@ -1006,7 +1009,7 @@ status_t massageManifest(Bundle* bundle, ResourceTable* table, sp<XMLNode> root) XMLNode::attribute_entry* attr = child->editAttribute( String16(RESOURCES_ANDROID_NAMESPACE), String16("targetPackage")); if (attr != NULL) { - attr->string.setTo(String16(instrumentationPackageNameOverride)); + attr->string = String16(instrumentationPackageNameOverride); } } } @@ -1071,7 +1074,7 @@ enum { static ssize_t extractPlatformBuildVersion(const ResTable& table, ResXMLTree& tree, Bundle* bundle) { // First check if we should be recording the compileSdkVersion* attributes. static const String16 compileSdkVersionName("android:attr/compileSdkVersion"); - const bool useCompileSdkVersion = table.identifierForName(compileSdkVersionName.string(), + const bool useCompileSdkVersion = table.identifierForName(compileSdkVersionName.c_str(), compileSdkVersionName.size()) != 0u; size_t len; @@ -1207,7 +1210,7 @@ status_t generateAndroidManifestForSplit(Bundle* bundle, const sp<AaptAssets>& a sp<XMLNode> manifest = XMLNode::newElement(filename, String16(), String16("manifest")); // Add the 'package' attribute which is set to the package name. - const char* packageName = assets->getPackage(); + const char* packageName = assets->getPackage().c_str(); const char* manifestPackageNameOverride = bundle->getManifestPackageNameOverride(); if (manifestPackageNameOverride != NULL) { packageName = manifestPackageNameOverride; @@ -1223,7 +1226,7 @@ status_t generateAndroidManifestForSplit(Bundle* bundle, const sp<AaptAssets>& a // Add the 'revisionCode' attribute, which is set to the original revisionCode. if (bundle->getRevisionCode().size() > 0) { if (!addTagAttribute(manifest, RESOURCES_ANDROID_NAMESPACE, "revisionCode", - bundle->getRevisionCode().string(), true, true)) { + bundle->getRevisionCode().c_str(), true, true)) { return UNKNOWN_ERROR; } } @@ -1270,7 +1273,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil } if (kIsDebug) { - printf("Creating resources for package %s\n", assets->getPackage().string()); + printf("Creating resources for package %s\n", assets->getPackage().c_str()); } // Set the private symbols package if it was declared. @@ -1284,7 +1287,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil packageType = ResourceTable::SharedLibrary; } else if (bundle->getExtending()) { packageType = ResourceTable::System; - } else if (!bundle->getFeatureOfPackage().isEmpty()) { + } else if (!bundle->getFeatureOfPackage().empty()) { packageType = ResourceTable::AppFeature; } @@ -1685,7 +1688,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil ResourceDirIterator it(fonts, String8("font")); while ((err=it.next()) == NO_ERROR) { // fonts can be resources other than xml. - if (it.getFile()->getPath().getPathExtension() == ".xml") { + if (getPathExtension(it.getFile()->getPath()) == ".xml") { String8 src = it.getFile()->getPrintableSource(); err = compileXmlFile(bundle, assets, String16(it.getBaseName()), it.getFile(), &table, xmlFlags); @@ -1715,7 +1718,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil workItem.file, &table, xmlCompilationFlags); if (err == NO_ERROR && workItem.file->hasData()) { - assets->addResource(workItem.resPath.getPathLeaf(), + assets->addResource(getPathLeaf(workItem.resPath), workItem.resPath, workItem.file, workItem.file->getResourceType()); @@ -1804,7 +1807,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil flattenedTable, split->isBase()); if (err != NO_ERROR) { fprintf(stderr, "Failed to generate resource table for split '%s'\n", - split->getPrintableName().string()); + split->getPrintableName().c_str()); return err; } split->addEntry(String8("resources.arsc"), flattenedTable); @@ -1821,7 +1824,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil err = resTable.add(flattenedTable->getData(), flattenedTable->getSize()); if (err != NO_ERROR) { fprintf(stderr, "Generated resource table for split '%s' is corrupt.\n", - split->getPrintableName().string()); + split->getPrintableName().c_str()); return err; } @@ -1849,7 +1852,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil if (block < 0) { hasError = true; SourcePos().error("%s has no definition for density split '%s'", - symbol.toString().string(), config.toString().string()); + symbol.toString().c_str(), config.toString().c_str()); if (bundle->getVerbose()) { const Vector<SymbolDefinition>& defs = densityVaryingResources[k]; @@ -1857,7 +1860,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil for (size_t d = 0; d < defCount; d++) { const SymbolDefinition& def = defs[d]; def.source.error("%s has definition for %s", - symbol.toString().string(), def.config.toString().string()); + symbol.toString().c_str(), def.config.toString().c_str()); } if (defCount < defs.size()) { @@ -1880,7 +1883,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil generatedManifest, &table); if (err != NO_ERROR) { fprintf(stderr, "Failed to generate AndroidManifest.xml for split '%s'\n", - split->getPrintableName().string()); + split->getPrintableName().c_str()); return err; } split->addEntry(String8("AndroidManifest.xml"), generatedManifest); @@ -1960,7 +1963,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil if (block.getElementNamespace(&len) != NULL) { continue; } - if (strcmp16(block.getElementName(&len), manifest16.string()) == 0) { + if (strcmp16(block.getElementName(&len), manifest16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, NULL, "package", packageIdentChars, true) != ATTR_OKAY) { hasErrors = true; @@ -1969,10 +1972,10 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil "sharedUserId", packageIdentChars, false) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), permission16.string()) == 0 - || strcmp16(block.getElementName(&len), permission_group16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), permission16.c_str()) == 0 + || strcmp16(block.getElementName(&len), permission_group16.c_str()) == 0) { const bool isGroup = strcmp16(block.getElementName(&len), - permission_group16.string()) == 0; + permission_group16.c_str()) == 0; if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "name", isGroup ? packageIdentCharsWithTheStupid : packageIdentChars, true) != ATTR_OKAY) { @@ -2002,8 +2005,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil const char16_t* id = block.getAttributeStringValue(index, &len); if (id == NULL) { fprintf(stderr, "%s:%d: missing name attribute in element <%s>.\n", - manifestPath.string(), block.getLineNumber(), - String8(block.getElementName(&len)).string()); + manifestPath.c_str(), block.getLineNumber(), + String8(block.getElementName(&len)).c_str()); hasErrors = true; break; } @@ -2038,23 +2041,23 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil if (begins_with_digit || (e != p && *(e-1) != '.')) { fprintf(stderr, "%s:%d: Permission name <%s> is not a valid Java symbol\n", - manifestPath.string(), block.getLineNumber(), idStr.string()); + manifestPath.c_str(), block.getLineNumber(), idStr.c_str()); hasErrors = true; } syms->addStringSymbol(String8(e), idStr, srcPos); const char16_t* cmt = block.getComment(&len); if (cmt != NULL && *cmt != 0) { - //printf("Comment of %s: %s\n", String8(e).string(), - // String8(cmt).string()); + //printf("Comment of %s: %s\n", String8(e).c_str(), + // String8(cmt).c_str()); syms->appendComment(String8(e), String16(cmt), srcPos); } syms->makeSymbolPublic(String8(e), srcPos); - } else if (strcmp16(block.getElementName(&len), uses_permission16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), uses_permission16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "name", packageIdentChars, true) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), instrumentation16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), instrumentation16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "name", classIdentChars, true) != ATTR_OKAY) { hasErrors = true; @@ -2064,7 +2067,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil packageIdentChars, true) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), application16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), application16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "name", classIdentChars, false) != ATTR_OKAY) { hasErrors = true; @@ -2084,7 +2087,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil processIdentChars, false) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), provider16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), provider16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "name", classIdentChars, true) != ATTR_OKAY) { hasErrors = true; @@ -2104,9 +2107,9 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil processIdentChars, false) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), service16.string()) == 0 - || strcmp16(block.getElementName(&len), receiver16.string()) == 0 - || strcmp16(block.getElementName(&len), activity16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), service16.c_str()) == 0 + || strcmp16(block.getElementName(&len), receiver16.c_str()) == 0 + || strcmp16(block.getElementName(&len), activity16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "name", classIdentChars, true) != ATTR_OKAY) { hasErrors = true; @@ -2126,14 +2129,14 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil processIdentChars, false) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), action16.string()) == 0 - || strcmp16(block.getElementName(&len), category16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), action16.c_str()) == 0 + || strcmp16(block.getElementName(&len), category16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "name", packageIdentChars, true) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), data16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), data16.c_str()) == 0) { if (validateAttr(manifestPath, finalResTable, block, RESOURCES_ANDROID_NAMESPACE, "mimeType", typeIdentChars, true) != ATTR_OKAY) { @@ -2144,13 +2147,13 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil schemeIdentChars, true) != ATTR_OKAY) { hasErrors = true; } - } else if (strcmp16(block.getElementName(&len), feature_group16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), feature_group16.c_str()) == 0) { int depth = 1; while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code > ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { depth++; - if (strcmp16(block.getElementName(&len), uses_feature16.string()) == 0) { + if (strcmp16(block.getElementName(&len), uses_feature16.c_str()) == 0) { ssize_t idx = block.indexOfAttribute( RESOURCES_ANDROID_NAMESPACE, "required"); if (idx < 0) { @@ -2162,7 +2165,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil fprintf(stderr, "%s:%d: Tag <uses-feature> can not have " "android:required=\"false\" when inside a " "<feature-group> tag.\n", - manifestPath.string(), block.getLineNumber()); + manifestPath.c_str(), block.getLineNumber()); hasErrors = true; } } @@ -2222,7 +2225,7 @@ static String8 flattenSymbol(const String8& symbol) { static String8 getSymbolPackage(const String8& symbol, const sp<AaptAssets>& assets, bool pub) { ssize_t colon = symbol.find(":", 0); if (colon >= 0) { - return String8(symbol.string(), colon); + return String8(symbol.c_str(), colon); } return pub ? assets->getPackage() : assets->getSymbolsPrivatePackage(); } @@ -2230,7 +2233,7 @@ static String8 getSymbolPackage(const String8& symbol, const sp<AaptAssets>& ass static String8 getSymbolName(const String8& symbol) { ssize_t colon = symbol.find(":", 0); if (colon >= 0) { - return String8(symbol.string() + colon + 1); + return String8(symbol.c_str() + colon + 1); } return symbol; } @@ -2245,7 +2248,7 @@ static String16 getAttributeComment(const sp<AaptAssets>& assets, asym = asym->getNestedSymbols().valueFor(String8("attr")); if (asym != NULL) { //printf("Got attrs symbols! comment %s=%s\n", - // name.string(), String8(asym->getComment(name)).string()); + // name.c_str(), String8(asym->getComment(name)).c_str()); if (outTypeComment != NULL) { *outTypeComment = asym->getTypeComment(name); } @@ -2276,8 +2279,8 @@ static status_t writeResourceLoadedCallbackForLayoutClasses( "%sfor(int i = 0; i < styleable.%s.length; ++i) {\n" "%sstyleable.%s[i] = (styleable.%s[i] & 0x00ffffff) | (packageId << 24);\n" "%s}\n", - indentStr, nclassName.string(), - getIndentSpace(indent+1), nclassName.string(), nclassName.string(), + indentStr, nclassName.c_str(), + getIndentSpace(indent+1), nclassName.c_str(), nclassName.c_str(), indentStr); } @@ -2303,8 +2306,8 @@ static status_t writeResourceLoadedCallback( String8 flat_name(flattenSymbol(sym.name)); fprintf(fp, "%s%s.%s = (%s.%s & 0x00ffffff) | (packageId << 24);\n", - getIndentSpace(indent), className.string(), flat_name.string(), - className.string(), flat_name.string()); + getIndentSpace(indent), className.c_str(), flat_name.c_str(), + className.c_str(), flat_name.c_str()); } N = symbols->getNestedSymbols().size(); @@ -2365,12 +2368,12 @@ static status_t writeLayoutClasses( String16 name16(sym.name); uint32_t typeSpecFlags; code = assets->getIncludedResources().identifierForName( - name16.string(), name16.size(), - attr16.string(), attr16.size(), - package16.string(), package16.size(), &typeSpecFlags); + name16.c_str(), name16.size(), + attr16.c_str(), attr16.size(), + package16.c_str(), package16.size(), &typeSpecFlags); if (code == 0) { fprintf(stderr, "ERROR: In <declare-styleable> %s, unable to find attribute %s\n", - nclassName.string(), sym.name.string()); + nclassName.c_str(), sym.name.c_str()); hasErrors = true; } isPublic = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0; @@ -2388,9 +2391,9 @@ static status_t writeLayoutClasses( if (comment.size() > 0) { String8 cmt(comment); ann.preprocessComment(cmt); - fprintf(fp, "%s\n", cmt.string()); + fprintf(fp, "%s\n", cmt.c_str()); } else { - fprintf(fp, "Attributes that can be used with a %s.\n", nclassName.string()); + fprintf(fp, "Attributes that can be used with a %s.\n", nclassName.c_str()); } bool hasTable = false; for (a=0; a<NA; a++) { @@ -2423,7 +2426,7 @@ static status_t writeLayoutClasses( continue; } if (comment.size() > 0) { - const char16_t* p = comment.string(); + const char16_t* p = comment.c_str(); while (*p != 0 && *p != '.') { if (*p == '{') { while (*p != 0 && *p != '}') { @@ -2436,14 +2439,14 @@ static status_t writeLayoutClasses( if (*p == '.') { p++; } - comment = String16(comment.string(), p-comment.string()); + comment = String16(comment.c_str(), p-comment.c_str()); } fprintf(fp, "%s <tr><td><code>{@link #%s_%s %s:%s}</code></td><td>%s</td></tr>\n", - indentStr, nclassName.string(), - flattenSymbol(name8).string(), - getSymbolPackage(name8, assets, true).string(), - getSymbolName(name8).string(), - String8(comment).string()); + indentStr, nclassName.c_str(), + flattenSymbol(name8).c_str(), + getSymbolPackage(name8, assets, true).c_str(), + getSymbolName(name8).c_str(), + String8(comment).c_str()); } } if (hasTable) { @@ -2457,8 +2460,8 @@ static status_t writeLayoutClasses( continue; } fprintf(fp, "%s @see #%s_%s\n", - indentStr, nclassName.string(), - flattenSymbol(sym.name).string()); + indentStr, nclassName.c_str(), + flattenSymbol(sym.name).c_str()); } } fprintf(fp, "%s */\n", getIndentSpace(indent)); @@ -2468,7 +2471,7 @@ static status_t writeLayoutClasses( fprintf(fp, "%spublic static final int[] %s = {\n" "%s", - indentStr, nclassName.string(), + indentStr, nclassName.c_str(), getIndentSpace(indent+1)); for (a=0; a<NA; a++) { @@ -2503,11 +2506,11 @@ static status_t writeLayoutClasses( uint32_t typeSpecFlags = 0; String16 name16(sym.name); assets->getIncludedResources().identifierForName( - name16.string(), name16.size(), - attr16.string(), attr16.size(), - package16.string(), package16.size(), &typeSpecFlags); - //printf("%s:%s/%s: 0x%08x\n", String8(package16).string(), - // String8(attr16).string(), String8(name16).string(), typeSpecFlags); + name16.c_str(), name16.size(), + attr16.c_str(), attr16.size(), + package16.c_str(), package16.size(), &typeSpecFlags); + //printf("%s:%s/%s: 0x%08x\n", String8(package16).c_str(), + // String8(attr16).c_str(), String8(name16).c_str(), typeSpecFlags); const bool pub = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0; AnnotationProcessor ann; @@ -2516,20 +2519,20 @@ static status_t writeLayoutClasses( String8 cmt(comment); ann.preprocessComment(cmt); fprintf(fp, "%s <p>\n%s @attr description\n", indentStr, indentStr); - fprintf(fp, "%s %s\n", indentStr, cmt.string()); + fprintf(fp, "%s %s\n", indentStr, cmt.c_str()); } else { fprintf(fp, "%s <p>This symbol is the offset where the {@link %s.R.attr#%s}\n" "%s attribute's value can be found in the {@link #%s} array.\n", indentStr, - getSymbolPackage(name8, assets, pub).string(), - getSymbolName(name8).string(), - indentStr, nclassName.string()); + getSymbolPackage(name8, assets, pub).c_str(), + getSymbolName(name8).c_str(), + indentStr, nclassName.c_str()); } if (typeComment.size() > 0) { String8 cmt(typeComment); ann.preprocessComment(cmt); - fprintf(fp, "\n\n%s %s\n", indentStr, cmt.string()); + fprintf(fp, "\n\n%s %s\n", indentStr, cmt.c_str()); } if (comment.size() > 0) { if (pub) { @@ -2537,16 +2540,16 @@ static status_t writeLayoutClasses( "%s <p>This corresponds to the global attribute\n" "%s resource symbol {@link %s.R.attr#%s}.\n", indentStr, indentStr, - getSymbolPackage(name8, assets, true).string(), - getSymbolName(name8).string()); + getSymbolPackage(name8, assets, true).c_str(), + getSymbolName(name8).c_str()); } else { fprintf(fp, "%s <p>This is a private symbol.\n", indentStr); } } fprintf(fp, "%s @attr name %s:%s\n", indentStr, - getSymbolPackage(name8, assets, pub).string(), - getSymbolName(name8).string()); + getSymbolPackage(name8, assets, pub).c_str(), + getSymbolName(name8).c_str()); fprintf(fp, "%s*/\n", indentStr); ann.printAnnotations(fp, indentStr); @@ -2556,8 +2559,8 @@ static status_t writeLayoutClasses( fprintf(fp, id_format, - indentStr, nclassName.string(), - flattenSymbol(name8).string(), (int)pos); + indentStr, nclassName.c_str(), + flattenSymbol(name8).c_str(), (int)pos); } } } @@ -2598,12 +2601,12 @@ static status_t writeTextLayoutClasses( String16 name16(sym.name); uint32_t typeSpecFlags; code = assets->getIncludedResources().identifierForName( - name16.string(), name16.size(), - attr16.string(), attr16.size(), - package16.string(), package16.size(), &typeSpecFlags); + name16.c_str(), name16.size(), + attr16.c_str(), attr16.size(), + package16.c_str(), package16.size(), &typeSpecFlags); if (code == 0) { fprintf(stderr, "ERROR: In <declare-styleable> %s, unable to find attribute %s\n", - nclassName.string(), sym.name.string()); + nclassName.c_str(), sym.name.c_str()); hasErrors = true; } isPublic = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0; @@ -2615,7 +2618,7 @@ static status_t writeTextLayoutClasses( NA = idents.size(); - fprintf(fp, "int[] styleable %s {", nclassName.string()); + fprintf(fp, "int[] styleable %s {", nclassName.c_str()); for (a=0; a<NA; a++) { if (a != 0) { @@ -2645,17 +2648,17 @@ static status_t writeTextLayoutClasses( uint32_t typeSpecFlags = 0; String16 name16(sym.name); assets->getIncludedResources().identifierForName( - name16.string(), name16.size(), - attr16.string(), attr16.size(), - package16.string(), package16.size(), &typeSpecFlags); - //printf("%s:%s/%s: 0x%08x\n", String8(package16).string(), - // String8(attr16).string(), String8(name16).string(), typeSpecFlags); + name16.c_str(), name16.size(), + attr16.c_str(), attr16.size(), + package16.c_str(), package16.size(), &typeSpecFlags); + //printf("%s:%s/%s: 0x%08x\n", String8(package16).c_str(), + // String8(attr16).c_str(), String8(name16).c_str(), typeSpecFlags); //const bool pub = (typeSpecFlags&ResTable_typeSpec::SPEC_PUBLIC) != 0; fprintf(fp, "int styleable %s_%s %d\n", - nclassName.string(), - flattenSymbol(name8).string(), (int)pos); + nclassName.c_str(), + flattenSymbol(name8).c_str(), (int)pos); } } } @@ -2670,7 +2673,7 @@ static status_t writeSymbolClass( { fprintf(fp, "%spublic %sfinal class %s {\n", getIndentSpace(indent), - indent != 0 ? "static " : "", className.string()); + indent != 0 ? "static " : "", className.c_str()); indent++; size_t i; @@ -2699,7 +2702,7 @@ static status_t writeSymbolClass( ann.preprocessComment(cmt); fprintf(fp, "%s/** %s\n", - getIndentSpace(indent), cmt.string()); + getIndentSpace(indent), cmt.c_str()); } String16 typeComment(sym.typeComment); if (typeComment.size() > 0) { @@ -2708,10 +2711,10 @@ static status_t writeSymbolClass( if (!haveComment) { haveComment = true; fprintf(fp, - "%s/** %s\n", getIndentSpace(indent), cmt.string()); + "%s/** %s\n", getIndentSpace(indent), cmt.c_str()); } else { fprintf(fp, - "%s %s\n", getIndentSpace(indent), cmt.string()); + "%s %s\n", getIndentSpace(indent), cmt.c_str()); } } if (haveComment) { @@ -2720,7 +2723,7 @@ static status_t writeSymbolClass( ann.printAnnotations(fp, getIndentSpace(indent)); fprintf(fp, id_format, getIndentSpace(indent), - flattenSymbol(name8).string(), (int)sym.int32Val); + flattenSymbol(name8).c_str(), (int)sym.int32Val); } for (i=0; i<N; i++) { @@ -2740,13 +2743,13 @@ static status_t writeSymbolClass( fprintf(fp, "%s/** %s\n" "%s */\n", - getIndentSpace(indent), cmt.string(), + getIndentSpace(indent), cmt.c_str(), getIndentSpace(indent)); } ann.printAnnotations(fp, getIndentSpace(indent)); fprintf(fp, "%spublic static final String %s=\"%s\";\n", getIndentSpace(indent), - flattenSymbol(name8).string(), sym.stringVal.string()); + flattenSymbol(name8).c_str(), sym.stringVal.c_str()); } sp<AaptSymbols> styleableSymbols; @@ -2805,8 +2808,8 @@ static status_t writeTextSymbolClass( String8 name8(sym.name); fprintf(fp, "int %s %s 0x%08x\n", - className.string(), - flattenSymbol(name8).string(), (int)sym.int32Val); + className.c_str(), + flattenSymbol(name8).c_str(), (int)sym.int32Val); } N = symbols->getNestedSymbols().size(); @@ -2844,32 +2847,32 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, if (bundle->getMakePackageDirs()) { const String8& pkg(package); - const char* last = pkg.string(); + const char* last = pkg.c_str(); const char* s = last-1; do { s++; if (s > last && (*s == '.' || *s == 0)) { String8 part(last, s-last); - dest.appendPath(part); + appendPath(dest, part); #ifdef _WIN32 - _mkdir(dest.string()); + _mkdir(dest.c_str()); #else - mkdir(dest.string(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); + mkdir(dest.c_str(), S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP); #endif last = s+1; } } while (*s); } - dest.appendPath(className); + appendPath(dest, className); dest.append(".java"); - FILE* fp = fopen(dest.string(), "w+"); + FILE* fp = fopen(dest.c_str(), "w+"); if (fp == NULL) { fprintf(stderr, "ERROR: Unable to open class file %s: %s\n", - dest.string(), strerror(errno)); + dest.c_str(), strerror(errno)); return UNKNOWN_ERROR; } if (bundle->getVerbose()) { - printf(" Writing symbols for class %s.\n", className.string()); + printf(" Writing symbols for class %s.\n", className.c_str()); } fprintf(fp, @@ -2880,7 +2883,7 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, " * should not be modified by hand.\n" " */\n" "\n" - "package %s;\n\n", package.string()); + "package %s;\n\n", package.c_str()); status_t err = writeSymbolClass(fp, assets, includePrivate, symbols, className, 0, bundle->getNonConstantId(), emitCallback); @@ -2891,17 +2894,17 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, if (textSymbolsDest != NULL && R == className) { String8 textDest(textSymbolsDest); - textDest.appendPath(className); + appendPath(textDest, className); textDest.append(".txt"); - FILE* fp = fopen(textDest.string(), "w+"); + FILE* fp = fopen(textDest.c_str(), "w+"); if (fp == NULL) { fprintf(stderr, "ERROR: Unable to open text symbol file %s: %s\n", - textDest.string(), strerror(errno)); + textDest.c_str(), strerror(errno)); return UNKNOWN_ERROR; } if (bundle->getVerbose()) { - printf(" Writing text symbols for class %s.\n", className.string()); + printf(" Writing text symbols for class %s.\n", className.c_str()); } status_t err = writeTextSymbolClass(fp, assets, includePrivate, symbols, @@ -2917,10 +2920,10 @@ status_t writeResourceSymbols(Bundle* bundle, const sp<AaptAssets>& assets, if (bundle->getGenDependencies() && R == className) { // Add this R.java to the dependency file String8 dependencyFile(bundle->getRClassDir()); - dependencyFile.appendPath("R.java.d"); + appendPath(dependencyFile, "R.java.d"); - FILE *fp = fopen(dependencyFile.string(), "a"); - fprintf(fp,"%s \\\n", dest.string()); + FILE *fp = fopen(dependencyFile.c_str(), "a"); + fprintf(fp,"%s \\\n", dest.c_str()); fclose(fp); } } @@ -2956,7 +2959,7 @@ addProguardKeepRule(ProguardKeepSet* keep, const String8& inClassName, // asdf --> package.asdf // .asdf .a.b --> package.asdf package.a.b // asdf.adsf --> asdf.asdf - const char* p = className.string(); + const char* p = className.c_str(); const char* q = strchr(p, '.'); if (p == q) { className = pkg; @@ -3023,7 +3026,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass if (assGroup->getFiles().size() != 1) { fprintf(stderr, "warning: Multiple AndroidManifest.xml files found, using %s\n", - assGroup->getFiles().valueAt(0)->getPrintableSource().string()); + assGroup->getFiles().valueAt(0)->getPrintableSource().c_str()); } assFile = assGroup->getFiles().valueAt(0); @@ -3048,7 +3051,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass } depth++; String8 tag(tree.getElementName(&len)); - // printf("Depth %d tag %s\n", depth, tag.string()); + // printf("Depth %d tag %s\n", depth, tag.c_str()); bool keepTag = false; if (depth == 1) { if (tag != "manifest") { @@ -3065,7 +3068,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass "http://schemas.android.com/apk/res/android", "backupAgent", &error); if (agent.length() > 0) { - addProguardKeepRule(keep, agent, pkg.string(), + addProguardKeepRule(keep, agent, pkg.c_str(), assFile->getPrintableSource(), tree.getLineNumber()); } @@ -3073,7 +3076,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass defaultProcess = AaptXml::getAttribute(tree, "http://schemas.android.com/apk/res/android", "process", &error); if (error != "") { - fprintf(stderr, "ERROR: %s\n", error.string()); + fprintf(stderr, "ERROR: %s\n", error.c_str()); return -1; } } @@ -3089,7 +3092,7 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass String8 componentProcess = AaptXml::getAttribute(tree, "http://schemas.android.com/apk/res/android", "process", &error); if (error != "") { - fprintf(stderr, "ERROR: %s\n", error.string()); + fprintf(stderr, "ERROR: %s\n", error.c_str()); return -1; } @@ -3103,14 +3106,14 @@ writeProguardForAndroidManifest(ProguardKeepSet* keep, const sp<AaptAssets>& ass String8 name = AaptXml::getAttribute(tree, "http://schemas.android.com/apk/res/android", "name", &error); if (error != "") { - fprintf(stderr, "ERROR: %s\n", error.string()); + fprintf(stderr, "ERROR: %s\n", error.c_str()); return -1; } keepTag = name.length() > 0; if (keepTag) { - addProguardKeepRule(keep, name, pkg.string(), + addProguardKeepRule(keep, name, pkg.c_str(), assFile->getPrintableSource(), tree.getLineNumber()); } } @@ -3143,7 +3146,7 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile, tree.restart(); - if (!startTags.isEmpty()) { + if (!startTags.empty()) { bool haveStart = false; while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code != ResXMLTree::START_TAG) { @@ -3170,7 +3173,7 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile, String8 tag(tree.getElementName(&len)); // If there is no '.', we'll assume that it's one of the built in names. - if (strchr(tag.string(), '.')) { + if (strchr(tag.c_str(), '.')) { addProguardKeepRule(keep, tag, NULL, layoutFile->getPrintableSource(), tree.getLineNumber()); } else if (tagAttrPairs != NULL) { @@ -3183,8 +3186,8 @@ writeProguardForXml(ProguardKeepSet* keep, const sp<AaptFile>& layoutFile, ssize_t attrIndex = tree.indexOfAttribute(nsAttr.ns, nsAttr.attr); if (attrIndex < 0) { // fprintf(stderr, "%s:%d: <%s> does not have attribute %s:%s.\n", - // layoutFile->getPrintableSource().string(), tree.getLineNumber(), - // tag.string(), nsAttr.ns, nsAttr.attr); + // layoutFile->getPrintableSource().c_str(), tree.getLineNumber(), + // tag.c_str(), nsAttr.ns, nsAttr.attr); } else { size_t len; addProguardKeepRule(keep, @@ -3242,7 +3245,7 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets) // tag:attribute pairs that should be checked in transition files. KeyedVector<String8, Vector<NamespaceAttributePair> > kTransitionTagAttrPairs; - addTagAttrPair(&kTransitionTagAttrPairs, kTransition.string(), NULL, kClass); + addTagAttrPair(&kTransitionTagAttrPairs, kTransition.c_str(), NULL, kClass); addTagAttrPair(&kTransitionTagAttrPairs, "pathMotion", NULL, kClass); const Vector<sp<AaptDir> >& dirs = assets->resDirs(); @@ -3252,16 +3255,16 @@ writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets) const String8& dirName = d->getLeaf(); Vector<String8> startTags; const KeyedVector<String8, Vector<NamespaceAttributePair> >* tagAttrPairs = NULL; - if ((dirName == String8("layout")) || (strncmp(dirName.string(), "layout-", 7) == 0)) { + if ((dirName == String8("layout")) || (strncmp(dirName.c_str(), "layout-", 7) == 0)) { tagAttrPairs = &kLayoutTagAttrPairs; - } else if ((dirName == String8("xml")) || (strncmp(dirName.string(), "xml-", 4) == 0)) { + } else if ((dirName == String8("xml")) || (strncmp(dirName.c_str(), "xml-", 4) == 0)) { startTags.add(String8("PreferenceScreen")); startTags.add(String8("preference-headers")); tagAttrPairs = &kXmlTagAttrPairs; - } else if ((dirName == String8("menu")) || (strncmp(dirName.string(), "menu-", 5) == 0)) { + } else if ((dirName == String8("menu")) || (strncmp(dirName.c_str(), "menu-", 5) == 0)) { startTags.add(String8("menu")); tagAttrPairs = NULL; - } else if (dirName == kTransition || (strncmp(dirName.string(), kTransitionPrefix.string(), + } else if (dirName == kTransition || (strncmp(dirName.c_str(), kTransitionPrefix.c_str(), kTransitionPrefix.size()) == 0)) { tagAttrPairs = &kTransitionTagAttrPairs; } else { @@ -3307,9 +3310,9 @@ writeProguardSpec(const char* filename, const ProguardKeepSet& keep, status_t er const SortedVector<String8>& locations = rules.valueAt(i); const size_t M = locations.size(); for (size_t j=0; j<M; j++) { - fprintf(fp, "# %s\n", locations.itemAt(j).string()); + fprintf(fp, "# %s\n", locations.itemAt(j).c_str()); } - fprintf(fp, "%s\n\n", rules.keyAt(i).string()); + fprintf(fp, "%s\n\n", rules.keyAt(i).c_str()); } fclose(fp); @@ -3366,7 +3369,7 @@ status_t writePathsToFile(const sp<FilePathStore>& files, FILE* fp) status_t deps = -1; for (size_t file_i = 0; file_i < files->size(); ++file_i) { // Add the full file path to the dependency file - fprintf(fp, "%s \\\n", files->itemAt(file_i).string()); + fprintf(fp, "%s \\\n", files->itemAt(file_i).c_str()); deps++; } return deps; diff --git a/tools/aapt/ResourceFilter.cpp b/tools/aapt/ResourceFilter.cpp index ed06f605eaeb..cc8dce7e9f3e 100644 --- a/tools/aapt/ResourceFilter.cpp +++ b/tools/aapt/ResourceFilter.cpp @@ -32,7 +32,7 @@ WeakResourceFilter::parse(const String8& str) // only specify locale in the standard 'en_US' format. val.writeTo(&entry.first); } else if (!AaptConfig::parse(part, &entry.first)) { - fprintf(stderr, "Invalid configuration: %s\n", part.string()); + fprintf(stderr, "Invalid configuration: %s\n", part.c_str()); return UNKNOWN_ERROR; } @@ -43,7 +43,7 @@ WeakResourceFilter::parse(const String8& str) // Ignore any densities. Those are best handled in --preferred-density if ((entry.second & ResTable_config::CONFIG_DENSITY) != 0) { - fprintf(stderr, "warning: ignoring flag -c %s. Use --preferred-density instead.\n", entry.first.toString().string()); + fprintf(stderr, "warning: ignoring flag -c %s. Use --preferred-density instead.\n", entry.first.toString().c_str()); entry.first.density = 0; entry.second &= ~ResTable_config::CONFIG_DENSITY; } @@ -148,7 +148,7 @@ StrongResourceFilter::parse(const String8& str) { mConfigs.clear(); for (size_t i = 0; i < configStrs.size(); i++) { if (!AaptConfig::parse(configStrs[i], &config)) { - fprintf(stderr, "Invalid configuration: %s\n", configStrs[i].string()); + fprintf(stderr, "Invalid configuration: %s\n", configStrs[i].c_str()); return UNKNOWN_ERROR; } mConfigs.insert(config); diff --git a/tools/aapt/ResourceIdCache.cpp b/tools/aapt/ResourceIdCache.cpp index 8835fb0130a3..1c7788d70053 100644 --- a/tools/aapt/ResourceIdCache.cpp +++ b/tools/aapt/ResourceIdCache.cpp @@ -37,7 +37,7 @@ static inline uint32_t hashround(uint32_t hash, int c) { static uint32_t hash(const android::String16& hashableString) { uint32_t hash = 5381; - const char16_t* str = hashableString.string(); + const char16_t* str = hashableString.c_str(); while (int c = *str++) hash = hashround(hash, c); return hash; } diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index 4e597fb3b30a..9fb731948b32 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -11,8 +11,10 @@ #include "ResourceFilter.h" #include "ResourceIdCache.h" #include "SdkConstants.h" +#include "Utils.h" #include <algorithm> +#include <androidfw/PathUtils.h> #include <androidfw/ResourceTypes.h> #include <utils/ByteOrder.h> #include <utils/TypeHelpers.h> @@ -82,7 +84,7 @@ status_t compileXmlFile(const Bundle* bundle, sp<AaptDir> resDir = assets->getDirs().valueFor(String8("res")); sp<AaptDir> dir = resDir->getDirs().valueFor(target->getGroupEntry().toDirName( target->getResourceType())); - dir->removeFile(target->getPath().getPathLeaf()); + dir->removeFile(getPathLeaf(target->getPath())); return NO_ERROR; } @@ -361,10 +363,10 @@ static status_t compileAttribute(const sp<AaptFile>& in, ssize_t typeIdx = block.indexOfAttribute(NULL, "format"); if (typeIdx >= 0) { String16 typeStr = String16(block.getAttributeStringValue(typeIdx, &len)); - attr.type = parse_flags(typeStr.string(), typeStr.size(), gFormatFlags); + attr.type = parse_flags(typeStr.c_str(), typeStr.size(), gFormatFlags); if (attr.type == 0) { attr.sourcePos.error("Tag <attr> 'format' attribute value \"%s\" not valid\n", - String8(typeStr).string()); + String8(typeStr).c_str()); attr.hasErrors = true; } attr.createIfNeeded(outTable); @@ -374,14 +376,14 @@ static status_t compileAttribute(const sp<AaptFile>& in, attr.createIfNeeded(outTable); } - //printf("Attribute %s: type=0x%08x\n", String8(attr.ident).string(), attr.type); + //printf("Attribute %s: type=0x%08x\n", String8(attr.ident).c_str(), attr.type); ssize_t minIdx = block.indexOfAttribute(NULL, "min"); if (minIdx >= 0) { String16 val = String16(block.getAttributeStringValue(minIdx, &len)); - if (!ResTable::stringToInt(val.string(), val.size(), NULL)) { + if (!ResTable::stringToInt(val.c_str(), val.size(), NULL)) { attr.sourcePos.error("Tag <attr> 'min' attribute must be a number, not \"%s\"\n", - String8(val).string()); + String8(val).c_str()); attr.hasErrors = true; } attr.createIfNeeded(outTable); @@ -397,9 +399,9 @@ static status_t compileAttribute(const sp<AaptFile>& in, ssize_t maxIdx = block.indexOfAttribute(NULL, "max"); if (maxIdx >= 0) { String16 val = String16(block.getAttributeStringValue(maxIdx, &len)); - if (!ResTable::stringToInt(val.string(), val.size(), NULL)) { + if (!ResTable::stringToInt(val.c_str(), val.size(), NULL)) { attr.sourcePos.error("Tag <attr> 'max' attribute must be a number, not \"%s\"\n", - String8(val).string()); + String8(val).c_str()); attr.hasErrors = true; } attr.createIfNeeded(outTable); @@ -422,7 +424,7 @@ static status_t compileAttribute(const sp<AaptFile>& in, uint32_t l10n_required = parse_flags(str, len, l10nRequiredFlags, &error); if (error) { attr.sourcePos.error("Tag <attr> 'localization' attribute value \"%s\" not valid\n", - String8(str).string()); + String8(str).c_str()); attr.hasErrors = true; } attr.createIfNeeded(outTable); @@ -442,14 +444,14 @@ static status_t compileAttribute(const sp<AaptFile>& in, while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { uint32_t localType = 0; - if (strcmp16(block.getElementName(&len), enum16.string()) == 0) { + if (strcmp16(block.getElementName(&len), enum16.c_str()) == 0) { localType = ResTable_map::TYPE_ENUM; - } else if (strcmp16(block.getElementName(&len), flag16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), flag16.c_str()) == 0) { localType = ResTable_map::TYPE_FLAGS; } else { SourcePos(in->getPrintableSource(), block.getLineNumber()) .error("Tag <%s> can not appear inside <attr>, only <enum> or <flag>\n", - String8(block.getElementName(&len)).string()); + String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } @@ -505,11 +507,11 @@ static status_t compileAttribute(const sp<AaptFile>& in, .error("A 'value' attribute is required for <enum> or <flag>\n"); attr.hasErrors = true; } - if (!attr.hasErrors && !ResTable::stringToInt(value.string(), value.size(), NULL)) { + if (!attr.hasErrors && !ResTable::stringToInt(value.c_str(), value.size(), NULL)) { SourcePos(in->getPrintableSource(), block.getLineNumber()) .error("Tag <enum> or <flag> 'value' attribute must be a number," " not \"%s\"\n", - String8(value).string()); + String8(value).c_str()); attr.hasErrors = true; } @@ -546,21 +548,21 @@ static status_t compileAttribute(const sp<AaptFile>& in, } } } else if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), attr16.string()) == 0) { + if (strcmp16(block.getElementName(&len), attr16.c_str()) == 0) { break; } if ((attr.type&ResTable_map::TYPE_ENUM) != 0) { - if (strcmp16(block.getElementName(&len), enum16.string()) != 0) { + if (strcmp16(block.getElementName(&len), enum16.c_str()) != 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()) .error("Found tag </%s> where </enum> is expected\n", - String8(block.getElementName(&len)).string()); + String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } } else { - if (strcmp16(block.getElementName(&len), flag16.string()) != 0) { + if (strcmp16(block.getElementName(&len), flag16.c_str()) != 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()) .error("Found tag </%s> where </flag> is expected\n", - String8(block.getElementName(&len)).string()); + String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } } @@ -606,7 +608,7 @@ status_t parseAndAddBag(Bundle* bundle, String16 str; Vector<StringPool::entry_style_span> spans; - err = parseStyledString(bundle, in->getPrintableSource().string(), + err = parseStyledString(bundle, in->getPrintableSource().c_str(), block, item16, &str, &spans, isFormatted, pseudolocalize); if (err != NO_ERROR) { @@ -619,10 +621,10 @@ status_t parseAndAddBag(Bundle* bundle, config.language[0], config.language[1], config.country[0], config.country[1], config.orientation, config.density, - String8(parentIdent).string(), - String8(ident).string(), - String8(itemIdent).string(), - String8(str).string()); + String8(parentIdent).c_str(), + String8(ident).c_str(), + String8(itemIdent).c_str(), + String8(str).c_str()); } err = outTable->addBag(SourcePos(in->getPrintableSource(), block->getLineNumber()), @@ -636,8 +638,8 @@ status_t parseAndAddBag(Bundle* bundle, * haystack, false otherwise. */ bool isInProductList(const String16& needle, const String16& haystack) { - const char16_t *needle2 = needle.string(); - const char16_t *haystack2 = haystack.string(); + const char16_t *needle2 = needle.c_str(); + const char16_t *haystack2 = haystack.c_str(); size_t needlesize = needle.size(); while (*haystack2 != '\0') { @@ -703,7 +705,7 @@ status_t parseAndAddEntry(Bundle* bundle, String16 str; Vector<StringPool::entry_style_span> spans; - err = parseStyledString(bundle, in->getPrintableSource().string(), block, + err = parseStyledString(bundle, in->getPrintableSource().c_str(), block, curTag, &str, curIsStyled ? &spans : NULL, isFormatted, pseudolocalize); @@ -730,7 +732,7 @@ status_t parseAndAddEntry(Bundle* bundle, */ if (bundleProduct[0] == '\0') { - if (strcmp16(String16("default").string(), product.string()) != 0) { + if (strcmp16(String16("default").c_str(), product.c_str()) != 0) { /* * This string has a product other than 'default'. Do not add it, * but record it so that if we do not see the same string with @@ -750,7 +752,7 @@ status_t parseAndAddEntry(Bundle* bundle, if (isInProductList(product, String16(bundleProduct))) { ; - } else if (strcmp16(String16("default").string(), product.string()) == 0 && + } else if (strcmp16(String16("default").c_str(), product.c_str()) == 0 && !outTable->hasBagOrEntry(myPackage, curType, ident, config)) { ; } else { @@ -764,7 +766,7 @@ status_t parseAndAddEntry(Bundle* bundle, config.language[0], config.language[1], config.country[0], config.country[1], config.orientation, config.density, - String8(ident).string(), String8(str).string()); + String8(ident).c_str(), String8(str).c_str()); } err = outTable->addEntry(SourcePos(in->getPrintableSource(), block->getLineNumber()), @@ -847,7 +849,7 @@ status_t compileResourceFile(Bundle* bundle, bool hasErrors = false; bool fileIsTranslatable = true; - if (strstr(in->getPrintableSource().string(), "donottranslate") != NULL) { + if (strstr(in->getPrintableSource().c_str(), "donottranslate") != NULL) { fileIsTranslatable = false; } @@ -869,9 +871,9 @@ status_t compileResourceFile(Bundle* bundle, "No start tag found\n"); return UNKNOWN_ERROR; } - if (strcmp16(block.getElementName(&len), resources16.string()) != 0) { + if (strcmp16(block.getElementName(&len), resources16.c_str()) != 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( - "Invalid start tag %s\n", String8(block.getElementName(&len)).string()); + "Invalid start tag %s\n", String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } @@ -900,7 +902,7 @@ status_t compileResourceFile(Bundle* bundle, SourcePos(in->getPrintableSource(), 0).warning( "Resource file %s is skipped as pseudolocalization" " was done automatically.", - in->getPrintableSource().string()); + in->getPrintableSource().c_str()); return NO_ERROR; } @@ -917,29 +919,29 @@ status_t compileResourceFile(Bundle* bundle, bool curIsFormatted = fileIsTranslatable; bool localHasErrors = false; - if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { + if (strcmp16(block.getElementName(&len), skip16.c_str()) == 0) { while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { + if (strcmp16(block.getElementName(&len), skip16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), eat_comment16.c_str()) == 0) { while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { + if (strcmp16(block.getElementName(&len), eat_comment16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), public16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), public16.c_str()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); String16 type; @@ -965,7 +967,7 @@ status_t compileResourceFile(Bundle* bundle, Res_value identValue; if (!ResTable::stringToInt(identStr, len, &identValue)) { srcPos.error("Given 'id' attribute is not an integer: %s\n", - String8(block.getAttributeStringValue(identIdx, &len)).string()); + String8(block.getAttributeStringValue(identIdx, &len)).c_str()); hasErrors = localHasErrors = true; } else { ident = identValue.data; @@ -1004,14 +1006,14 @@ status_t compileResourceFile(Bundle* bundle, while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), public16.string()) == 0) { + if (strcmp16(block.getElementName(&len), public16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), public_padding16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), public_padding16.c_str()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); String16 type; @@ -1037,7 +1039,7 @@ status_t compileResourceFile(Bundle* bundle, Res_value startValue; if (!ResTable::stringToInt(startStr, len, &startValue)) { srcPos.error("Given 'start' attribute is not an integer: %s\n", - String8(block.getAttributeStringValue(startIdx, &len)).string()); + String8(block.getAttributeStringValue(startIdx, &len)).c_str()); hasErrors = localHasErrors = true; } else { start = startValue.data; @@ -1057,7 +1059,7 @@ status_t compileResourceFile(Bundle* bundle, Res_value endValue; if (!ResTable::stringToInt(endStr, len, &endValue)) { srcPos.error("Given 'end' attribute is not an integer: %s\n", - String8(block.getAttributeStringValue(endIdx, &len)).string()); + String8(block.getAttributeStringValue(endIdx, &len)).c_str()); hasErrors = localHasErrors = true; } else { end = endValue.data; @@ -1114,14 +1116,14 @@ status_t compileResourceFile(Bundle* bundle, while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), public_padding16.string()) == 0) { + if (strcmp16(block.getElementName(&len), public_padding16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), private_symbols16.c_str()) == 0) { String16 pkg; ssize_t pkgIdx = block.indexOfAttribute(NULL, "package"); if (pkgIdx < 0) { @@ -1144,14 +1146,14 @@ status_t compileResourceFile(Bundle* bundle, while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), private_symbols16.string()) == 0) { + if (strcmp16(block.getElementName(&len), private_symbols16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), java_symbol16.c_str()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); String16 type; @@ -1186,7 +1188,7 @@ status_t compileResourceFile(Bundle* bundle, while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), java_symbol16.string()) == 0) { + if (strcmp16(block.getElementName(&len), java_symbol16.c_str()) == 0) { break; } } @@ -1194,7 +1196,7 @@ status_t compileResourceFile(Bundle* bundle, continue; - } else if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), add_resource16.c_str()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); String16 typeName; @@ -1217,14 +1219,14 @@ status_t compileResourceFile(Bundle* bundle, while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), add_resource16.string()) == 0) { + if (strcmp16(block.getElementName(&len), add_resource16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), declare_styleable16.c_str()) == 0) { SourcePos srcPos(in->getPrintableSource(), block.getLineNumber()); String16 ident; @@ -1258,30 +1260,30 @@ status_t compileResourceFile(Bundle* bundle, while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { - if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { + if (strcmp16(block.getElementName(&len), skip16.c_str()) == 0) { while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { + if (strcmp16(block.getElementName(&len), skip16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), eat_comment16.c_str()) == 0) { while ((code=block.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), eat_comment16.string()) == 0) { + if (strcmp16(block.getElementName(&len), eat_comment16.c_str()) == 0) { break; } } } continue; - } else if (strcmp16(block.getElementName(&len), attr16.string()) != 0) { + } else if (strcmp16(block.getElementName(&len), attr16.c_str()) != 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Tag <%s> can not appear inside <declare-styleable>, only <attr>\n", - String8(block.getElementName(&len)).string()); + String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } @@ -1297,30 +1299,30 @@ status_t compileResourceFile(Bundle* bundle, SourcePos srcPos(String8(in->getPrintableSource()), block.getLineNumber()); symbols->addSymbol(String8(itemIdent), 0, srcPos); symbols->appendComment(String8(itemIdent), comment, srcPos); - //printf("Attribute %s comment: %s\n", String8(itemIdent).string(), - // String8(comment).string()); + //printf("Attribute %s comment: %s\n", String8(itemIdent).c_str(), + // String8(comment).c_str()); } } else if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), declare_styleable16.string()) == 0) { + if (strcmp16(block.getElementName(&len), declare_styleable16.c_str()) == 0) { break; } SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Found tag </%s> where </attr> is expected\n", - String8(block.getElementName(&len)).string()); + String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } } continue; - } else if (strcmp16(block.getElementName(&len), attr16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), attr16.c_str()) == 0) { err = compileAttribute(in, block, myPackage, outTable, NULL); if (err != NO_ERROR) { hasErrors = true; } continue; - } else if (strcmp16(block.getElementName(&len), item16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), item16.c_str()) == 0) { curTag = &item16; ssize_t attri = block.indexOfAttribute(NULL, "type"); if (attri >= 0) { @@ -1333,12 +1335,12 @@ status_t compileResourceFile(Bundle* bundle, if (formatIdx >= 0) { String16 formatStr = String16(block.getAttributeStringValue( formatIdx, &len)); - curFormat = parse_flags(formatStr.string(), formatStr.size(), + curFormat = parse_flags(formatStr.c_str(), formatStr.size(), gFormatFlags); if (curFormat == 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Tag <item> 'format' attribute value \"%s\" not valid\n", - String8(formatStr).string()); + String8(formatStr).c_str()); hasErrors = localHasErrors = true; } } @@ -1348,7 +1350,7 @@ status_t compileResourceFile(Bundle* bundle, hasErrors = localHasErrors = true; } curIsStyled = true; - } else if (strcmp16(block.getElementName(&len), string16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), string16.c_str()) == 0) { // Note the existence and locale of every string we process char rawLocale[RESTABLE_MAX_LOCALE_LEN]; curParams.getBcp47Locale(rawLocale); @@ -1361,12 +1363,12 @@ status_t compileResourceFile(Bundle* bundle, for (size_t i = 0; i < n; i++) { size_t length; const char16_t* attr = block.getAttributeName(i, &length); - if (strcmp16(attr, name16.string()) == 0) { - name.setTo(block.getAttributeStringValue(i, &length)); - } else if (strcmp16(attr, translatable16.string()) == 0) { - translatable.setTo(block.getAttributeStringValue(i, &length)); - } else if (strcmp16(attr, formatted16.string()) == 0) { - formatted.setTo(block.getAttributeStringValue(i, &length)); + if (strcmp16(attr, name16.c_str()) == 0) { + name = String16(block.getAttributeStringValue(i, &length)); + } else if (strcmp16(attr, translatable16.c_str()) == 0) { + translatable = String16(block.getAttributeStringValue(i, &length)); + } else if (strcmp16(attr, formatted16.c_str()) == 0) { + formatted = String16(block.getAttributeStringValue(i, &length)); } } @@ -1380,8 +1382,8 @@ status_t compileResourceFile(Bundle* bundle, if (locale.size() > 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).warning( "string '%s' marked untranslatable but exists in locale '%s'\n", - String8(name).string(), - locale.string()); + String8(name).c_str(), + locale.c_str()); // hasErrors = localHasErrors = true; } else { // Intentionally empty block: @@ -1407,31 +1409,31 @@ status_t compileResourceFile(Bundle* bundle, curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_STRING; curIsStyled = true; curIsPseudolocalizable = fileIsTranslatable && (translatable != false16); - } else if (strcmp16(block.getElementName(&len), drawable16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), drawable16.c_str()) == 0) { curTag = &drawable16; curType = drawable16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_COLOR; - } else if (strcmp16(block.getElementName(&len), color16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), color16.c_str()) == 0) { curTag = &color16; curType = color16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_COLOR; - } else if (strcmp16(block.getElementName(&len), bool16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), bool16.c_str()) == 0) { curTag = &bool16; curType = bool16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_BOOLEAN; - } else if (strcmp16(block.getElementName(&len), integer16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), integer16.c_str()) == 0) { curTag = &integer16; curType = integer16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_INTEGER; - } else if (strcmp16(block.getElementName(&len), dimen16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), dimen16.c_str()) == 0) { curTag = &dimen16; curType = dimen16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_DIMENSION; - } else if (strcmp16(block.getElementName(&len), fraction16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), fraction16.c_str()) == 0) { curTag = &fraction16; curType = fraction16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_FRACTION; - } else if (strcmp16(block.getElementName(&len), bag16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), bag16.c_str()) == 0) { curTag = &bag16; curIsBag = true; ssize_t attri = block.indexOfAttribute(NULL, "type"); @@ -1442,16 +1444,16 @@ status_t compileResourceFile(Bundle* bundle, "A 'type' attribute is required for <bag>\n"); hasErrors = localHasErrors = true; } - } else if (strcmp16(block.getElementName(&len), style16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), style16.c_str()) == 0) { curTag = &style16; curType = style16; curIsBag = true; - } else if (strcmp16(block.getElementName(&len), plurals16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), plurals16.c_str()) == 0) { curTag = &plurals16; curType = plurals16; curIsBag = true; curIsPseudolocalizable = fileIsTranslatable; - } else if (strcmp16(block.getElementName(&len), array16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), array16.c_str()) == 0) { curTag = &array16; curType = array16; curIsBag = true; @@ -1460,16 +1462,16 @@ status_t compileResourceFile(Bundle* bundle, if (formatIdx >= 0) { String16 formatStr = String16(block.getAttributeStringValue( formatIdx, &len)); - curFormat = parse_flags(formatStr.string(), formatStr.size(), + curFormat = parse_flags(formatStr.c_str(), formatStr.size(), gFormatFlags); if (curFormat == 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Tag <array> 'format' attribute value \"%s\" not valid\n", - String8(formatStr).string()); + String8(formatStr).c_str()); hasErrors = localHasErrors = true; } } - } else if (strcmp16(block.getElementName(&len), string_array16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), string_array16.c_str()) == 0) { // Check whether these strings need valid formats. // (simplified form of what string16 does above) bool isTranslatable = false; @@ -1480,14 +1482,14 @@ status_t compileResourceFile(Bundle* bundle, for (size_t i = 0; i < n; i++) { size_t length; const char16_t* attr = block.getAttributeName(i, &length); - if (strcmp16(attr, formatted16.string()) == 0) { + if (strcmp16(attr, formatted16.c_str()) == 0) { const char16_t* value = block.getAttributeStringValue(i, &length); - if (strcmp16(value, false16.string()) == 0) { + if (strcmp16(value, false16.c_str()) == 0) { curIsFormatted = false; } - } else if (strcmp16(attr, translatable16.string()) == 0) { + } else if (strcmp16(attr, translatable16.c_str()) == 0) { const char16_t* value = block.getAttributeStringValue(i, &length); - if (strcmp16(value, false16.string()) == 0) { + if (strcmp16(value, false16.c_str()) == 0) { isTranslatable = false; } } @@ -1499,7 +1501,7 @@ status_t compileResourceFile(Bundle* bundle, curIsBag = true; curIsBagReplaceOnOverwrite = true; curIsPseudolocalizable = isTranslatable && fileIsTranslatable; - } else if (strcmp16(block.getElementName(&len), integer_array16.string()) == 0) { + } else if (strcmp16(block.getElementName(&len), integer_array16.c_str()) == 0) { curTag = &integer_array16; curType = array16; curFormat = ResTable_map::TYPE_REFERENCE|ResTable_map::TYPE_INTEGER; @@ -1508,7 +1510,7 @@ status_t compileResourceFile(Bundle* bundle, } else { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Found tag %s where item is expected\n", - String8(block.getElementName(&len)).string()); + String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } @@ -1519,7 +1521,7 @@ status_t compileResourceFile(Bundle* bundle, } else { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "A 'name' attribute is required for <%s>\n", - String8(*curTag).string()); + String8(*curTag).c_str()); hasErrors = localHasErrors = true; } @@ -1540,7 +1542,7 @@ status_t compileResourceFile(Bundle* bundle, } else { ssize_t sep = ident.findLast('.'); if (sep >= 0) { - parentIdent.setTo(ident, sep); + parentIdent = String16(ident, sep); } } @@ -1560,11 +1562,11 @@ status_t compileResourceFile(Bundle* bundle, && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::START_TAG) { - if (strcmp16(block.getElementName(&len), item16.string()) != 0) { + if (strcmp16(block.getElementName(&len), item16.c_str()) != 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Tag <%s> can not appear inside <%s>, only <item>\n", - String8(block.getElementName(&len)).string(), - String8(*curTag).string()); + String8(block.getElementName(&len)).c_str(), + String8(*curTag).c_str()); return UNKNOWN_ERROR; } @@ -1647,11 +1649,11 @@ status_t compileResourceFile(Bundle* bundle, hasErrors = localHasErrors = true; } } else if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), curTag->string()) != 0) { + if (strcmp16(block.getElementName(&len), curTag->c_str()) != 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Found tag </%s> where </%s> is expected\n", - String8(block.getElementName(&len)).string(), - String8(*curTag).string()); + String8(block.getElementName(&len)).c_str(), + String8(*curTag).c_str()); return UNKNOWN_ERROR; } break; @@ -1700,9 +1702,9 @@ status_t compileResourceFile(Bundle* bundle, #if 0 if (comment.size() > 0) { - printf("Comment for @%s:%s/%s: %s\n", String8(myPackage).string(), - String8(curType).string(), String8(ident).string(), - String8(comment).string()); + printf("Comment for @%s:%s/%s: %s\n", String8(myPackage).c_str(), + String8(curType).c_str(), String8(ident).c_str(), + String8(comment).c_str()); } #endif if (!localHasErrors) { @@ -1710,9 +1712,9 @@ status_t compileResourceFile(Bundle* bundle, } } else if (code == ResXMLTree::END_TAG) { - if (strcmp16(block.getElementName(&len), resources16.string()) != 0) { + if (strcmp16(block.getElementName(&len), resources16.c_str()) != 0) { SourcePos(in->getPrintableSource(), block.getLineNumber()).error( - "Unexpected end tag %s\n", String8(block.getElementName(&len)).string()); + "Unexpected end tag %s\n", String8(block.getElementName(&len)).c_str()); return UNKNOWN_ERROR; } } @@ -1724,7 +1726,7 @@ status_t compileResourceFile(Bundle* bundle, } SourcePos(in->getPrintableSource(), block.getLineNumber()).error( "Found text \"%s\" where item tag is expected\n", - String8(block.getText(&len)).string()); + String8(block.getText(&len)).c_str()); return UNKNOWN_ERROR; } } @@ -1740,13 +1742,13 @@ status_t compileResourceFile(Bundle* bundle, const char* bundleProduct = (bundle->getProduct() == NULL) ? "" : bundle->getProduct(); fprintf(stderr, "In resource file %s: %s\n", - in->getPrintableSource().string(), - curParams.toString().string()); + in->getPrintableSource().c_str(), + curParams.toString().c_str()); fprintf(stderr, "\t%s '%s' does not match product %s.\n" "\tYou may have forgotten to include a 'default' product variant" " of the resource.\n", - String8(p.type).string(), String8(p.ident).string(), + String8(p.type).c_str(), String8(p.ident).c_str(), bundleProduct[0] == 0 ? "default" : bundleProduct); return UNKNOWN_ERROR; } @@ -1812,17 +1814,17 @@ status_t ResourceTable::addIncludedResources(Bundle* bundle, const sp<AaptAssets mTypeIdOffset = findLargestTypeIdForPackage(assets->getIncludedResources(), mAssetsPackage); const String8& featureAfter = bundle->getFeatureAfterPackage(); - if (!featureAfter.isEmpty()) { + if (!featureAfter.empty()) { AssetManager featureAssetManager; if (!featureAssetManager.addAssetPath(featureAfter, NULL)) { fprintf(stderr, "ERROR: Feature package '%s' not found.\n", - featureAfter.string()); + featureAfter.c_str()); return UNKNOWN_ERROR; } const ResTable& featureTable = featureAssetManager.getResources(false); mTypeIdOffset = std::max(mTypeIdOffset, - findLargestTypeIdForPackage(featureTable, mAssetsPackage)); + findLargestTypeIdForPackage(featureTable, mAssetsPackage)); } return NO_ERROR; @@ -1835,13 +1837,13 @@ status_t ResourceTable::addPublic(const SourcePos& sourcePos, const uint32_t ident) { uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size()); + .identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size()); if (rid != 0) { sourcePos.error("Error declaring public resource %s/%s for included package %s\n", - String8(type).string(), String8(name).string(), - String8(package).string()); + String8(type).c_str(), String8(name).c_str(), + String8(package).c_str()); return UNKNOWN_ERROR; } @@ -1864,12 +1866,12 @@ status_t ResourceTable::addEntry(const SourcePos& sourcePos, const bool overwrite) { uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size()); + .identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size()); if (rid != 0) { sourcePos.error("Resource entry %s/%s is already defined in package %s.", - String8(type).string(), String8(name).string(), String8(package).string()); + String8(type).c_str(), String8(name).c_str(), String8(package).c_str()); return UNKNOWN_ERROR; } @@ -1899,12 +1901,12 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos, // Check for adding entries in other packages... for now we do // nothing. We need to do the right thing here to support skinning. uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size()); + .identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size()); if (rid != 0) { sourcePos.error("Resource entry %s/%s is already defined in package %s.", - String8(type).string(), String8(name).string(), String8(package).string()); + String8(type).c_str(), String8(name).c_str(), String8(package).c_str()); return UNKNOWN_ERROR; } @@ -1921,7 +1923,7 @@ status_t ResourceTable::startBag(const SourcePos& sourcePos, } if (!canAdd) { sourcePos.error("Resource does not already exist in overlay at '%s'; use <add-resource> to add.\n", - String8(name).string()); + String8(name).c_str()); return UNKNOWN_ERROR; } } @@ -1959,9 +1961,9 @@ status_t ResourceTable::addBag(const SourcePos& sourcePos, // Check for adding entries in other packages... for now we do // nothing. We need to do the right thing here to support skinning. uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size()); + .identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size()); if (rid != 0) { return NO_ERROR; } @@ -1969,7 +1971,7 @@ status_t ResourceTable::addBag(const SourcePos& sourcePos, #if 0 if (name == String16("left")) { printf("Adding bag left: file=%s, line=%d, type=%s\n", - sourcePos.file.striing(), sourcePos.line, String8(type).string()); + sourcePos.file.striing(), sourcePos.line, String8(type).c_str()); } #endif sp<Entry> e = getEntry(package, type, name, sourcePos, replace, params); @@ -1996,9 +1998,9 @@ bool ResourceTable::hasBagOrEntry(const String16& package, { // First look for this in the included resources... uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size()); + .identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size()); if (rid != 0) { return true; } @@ -2022,9 +2024,9 @@ bool ResourceTable::hasBagOrEntry(const String16& package, { // First look for this in the included resources... uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size()); + .identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size()); if (rid != 0) { return true; } @@ -2051,7 +2053,7 @@ bool ResourceTable::hasBagOrEntry(const String16& ref, const String16* defPackage) { String16 package, type, name; - if (!ResTable::expandResourceRef(ref.string(), ref.size(), &package, &type, &name, + if (!ResTable::expandResourceRef(ref.c_str(), ref.size(), &package, &type, &name, defType, defPackage ? defPackage:&mAssetsPackage, NULL)) { return false; } @@ -2115,17 +2117,17 @@ bool ResourceTable::makeAttribute(const String16& package, // First look for this in the included resources... uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - attr16.string(), attr16.size(), - package.string(), package.size()); + .identifierForName(name.c_str(), name.size(), + attr16.c_str(), attr16.size(), + package.c_str(), package.size()); if (rid != 0) { - source.error("Attribute \"%s\" has already been defined", String8(name).string()); + source.error("Attribute \"%s\" has already been defined", String8(name).c_str()); return false; } sp<ResourceTable::Entry> entry = getEntry(package, attr16, name, source, false); if (entry == NULL) { - source.error("Failed to create entry attr/%s", String8(name).string()); + source.error("Failed to create entry attr/%s", String8(name).c_str()); return false; } @@ -2146,7 +2148,7 @@ bool ResourceTable::makeAttribute(const String16& package, formatItem.value != formatValue16) { source.error("Attribute \"%s\" already defined with incompatible format.\n" "%s:%d: Original attribute defined here.", - String8(name).string(), formatItem.sourcePos.file.string(), + String8(name).c_str(), formatItem.sourcePos.file.c_str(), formatItem.sourcePos.line); return false; } @@ -2207,9 +2209,9 @@ uint32_t ResourceTable::getResId(const String16& package, // First look for this in the included resources... uint32_t specFlags = 0; uint32_t rid = mAssets->getIncludedResources() - .identifierForName(name.string(), name.size(), - type.string(), type.size(), - package.string(), package.size(), + .identifierForName(name.c_str(), name.size(), + type.c_str(), type.size(), + package.c_str(), package.size(), &specFlags); if (rid != 0) { if (onlyPublic && (specFlags & ResTable_typeSpec::SPEC_PUBLIC) == 0) { @@ -2253,27 +2255,27 @@ uint32_t ResourceTable::getResId(const String16& ref, String16 package, type, name; bool refOnlyPublic = true; if (!ResTable::expandResourceRef( - ref.string(), ref.size(), &package, &type, &name, + ref.c_str(), ref.size(), &package, &type, &name, defType, defPackage ? defPackage:&mAssetsPackage, outErrorMsg, &refOnlyPublic)) { if (kIsDebug) { - printf("Expanding resource: ref=%s\n", String8(ref).string()); + printf("Expanding resource: ref=%s\n", String8(ref).c_str()); printf("Expanding resource: defType=%s\n", - defType ? String8(*defType).string() : "NULL"); + defType ? String8(*defType).c_str() : "NULL"); printf("Expanding resource: defPackage=%s\n", - defPackage ? String8(*defPackage).string() : "NULL"); - printf("Expanding resource: ref=%s\n", String8(ref).string()); + defPackage ? String8(*defPackage).c_str() : "NULL"); + printf("Expanding resource: ref=%s\n", String8(ref).c_str()); printf("Expanded resource: p=%s, t=%s, n=%s, res=0\n", - String8(package).string(), String8(type).string(), - String8(name).string()); + String8(package).c_str(), String8(type).c_str(), + String8(name).c_str()); } return 0; } uint32_t res = getResId(package, type, name, onlyPublic && refOnlyPublic); if (kIsDebug) { printf("Expanded resource: p=%s, t=%s, n=%s, res=%d\n", - String8(package).string(), String8(type).string(), - String8(name).string(), res); + String8(package).c_str(), String8(type).c_str(), + String8(name).c_str(), res); } if (res == 0) { if (outErrorMsg) @@ -2284,7 +2286,7 @@ uint32_t ResourceTable::getResId(const String16& ref, bool ResourceTable::isValidResourceName(const String16& s) { - const char16_t* p = s.string(); + const char16_t* p = s.c_str(); bool first = true; while (*p) { if ((*p >= 'a' && *p <= 'z') @@ -2315,7 +2317,7 @@ bool ResourceTable::stringToValue(Res_value* outValue, StringPool* pool, if (style == NULL || style->size() == 0) { // Text is not styled so it can be any type... let's figure it out. res = mAssets->getIncludedResources() - .stringToValue(outValue, &finalStr, str.string(), str.size(), preserveSpaces, + .stringToValue(outValue, &finalStr, str.c_str(), str.size(), preserveSpaces, coerceType, attrID, NULL, &mAssetsPackage, this, accessorCookie, attrType); } else { @@ -2344,7 +2346,7 @@ bool ResourceTable::stringToValue(Res_value* outValue, StringPool* pool, if (kIsDebug) { printf("Adding to pool string style #%zu config %s: %s\n", style != NULL ? style->size() : 0U, - configStr.string(), String8(finalStr).string()); + configStr.c_str(), String8(finalStr).c_str()); } if (style != NULL && style->size() > 0) { outValue->data = pool->add(finalStr, *style, configTypeName, config); @@ -2368,8 +2370,8 @@ bool ResourceTable::stringToValue(Res_value* outValue, StringPool* pool, uint32_t ResourceTable::getCustomResource( const String16& package, const String16& type, const String16& name) const { - //printf("getCustomResource: %s %s %s\n", String8(package).string(), - // String8(type).string(), String8(name).string()); + //printf("getCustomResource: %s %s %s\n", String8(package).c_str(), + // String8(type).c_str(), String8(name).c_str()); sp<Package> p = mPackages.valueFor(package); if (p == NULL) return 0; sp<Type> t = p->getTypes().valueFor(type); @@ -2400,7 +2402,7 @@ uint32_t ResourceTable::getCustomResourceWithCreation( if (mAssetsPackage != package) { mCurrentXmlPos.error("creating resource for external package %s: %s/%s.", - String8(package).string(), String8(type).string(), String8(name).string()); + String8(package).c_str(), String8(type).c_str(), String8(name).c_str()); if (package == String16("android")) { mCurrentXmlPos.printf("did you mean to use @+id instead of @+android:id?"); } @@ -2427,7 +2429,7 @@ bool ResourceTable::getAttributeType(uint32_t attrID, uint32_t* outType) Res_value value; if (getItemValue(attrID, ResTable_map::ATTR_TYPE, &value)) { //printf("getAttributeType #%08x (%s): #%08x\n", attrID, - // String8(getEntry(attrID)->getName()).string(), value.data); + // String8(getEntry(attrID)->getName()).c_str(), value.data); *outType = value.data; return true; } @@ -2481,7 +2483,7 @@ void ResourceTable::reportError(void* accessorCookie, const char* fmt, ...) vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); ac->sourcePos.error("Error: %s (at '%s' with value '%s').\n", - buf, ac->attr.string(), ac->value.string()); + buf, ac->attr.c_str(), ac->value.c_str()); } } @@ -2493,7 +2495,7 @@ bool ResourceTable::getAttributeKeys( const size_t N = e->getBag().size(); for (size_t i=0; i<N; i++) { const String16& key = e->getBag().keyAt(i); - if (key.size() > 0 && key.string()[0] != '^') { + if (key.size() > 0 && key.c_str()[0] != '^') { outKeys->add(key); } } @@ -2506,14 +2508,14 @@ bool ResourceTable::getAttributeEnum( uint32_t attrID, const char16_t* name, size_t nameLen, Res_value* outValue) { - //printf("getAttributeEnum #%08x %s\n", attrID, String8(name, nameLen).string()); + //printf("getAttributeEnum #%08x %s\n", attrID, String8(name, nameLen).c_str()); String16 nameStr(name, nameLen); sp<const Entry> e = getEntry(attrID); if (e != NULL) { const size_t N = e->getBag().size(); for (size_t i=0; i<N; i++) { - //printf("Comparing %s to %s\n", String8(name, nameLen).string(), - // String8(e->getBag().keyAt(i)).string()); + //printf("Comparing %s to %s\n", String8(name, nameLen).c_str(), + // String8(e->getBag().keyAt(i)).c_str()); if (e->getBag().keyAt(i) == nameStr) { return getItemValue(attrID, e->getBag().valueAt(i).bagKeyId, outValue); } @@ -2529,7 +2531,7 @@ bool ResourceTable::getAttributeFlags( outValue->dataType = Res_value::TYPE_INT_HEX; outValue->data = 0; - //printf("getAttributeFlags #%08x %s\n", attrID, String8(name, nameLen).string()); + //printf("getAttributeFlags #%08x %s\n", attrID, String8(name, nameLen).c_str()); String16 nameStr(name, nameLen); sp<const Entry> e = getEntry(attrID); if (e != NULL) { @@ -2546,8 +2548,8 @@ bool ResourceTable::getAttributeFlags( String16 nameStr(start, pos-start); size_t i; for (i=0; i<N; i++) { - //printf("Comparing \"%s\" to \"%s\"\n", String8(nameStr).string(), - // String8(e->getBag().keyAt(i)).string()); + //printf("Comparing \"%s\" to \"%s\"\n", String8(nameStr).c_str(), + // String8(e->getBag().keyAt(i)).c_str()); if (e->getBag().keyAt(i) == nameStr) { Res_value val; bool got = getItemValue(attrID, e->getBag().valueAt(i).bagKeyId, &val); @@ -2753,7 +2755,7 @@ status_t ResourceTable::addSymbols(const sp<AaptSymbols>& outSymbols, if (mHasDefaultLocalization.find(c->getName()) == mHasDefaultLocalization.end()) { // printf("Skip symbol [%08x] %s\n", rid, - // String8(c->getName()).string()); + // String8(c->getName()).c_str()); continue; } } @@ -2763,7 +2765,7 @@ status_t ResourceTable::addSymbols(const sp<AaptSymbols>& outSymbols, String16 comment(c->getComment()); typeSymbols->appendComment(String8(c->getName()), comment, c->getPos()); //printf("Type symbol [%08x] %s comment: %s\n", rid, - // String8(c->getName()).string(), String8(comment).string()); + // String8(c->getName()).c_str(), String8(comment).c_str()); comment = c->getTypeComment(); typeSymbols->appendTypeComment(String8(c->getName()), comment); } @@ -2809,10 +2811,10 @@ ResourceTable::validateLocalizations(void) // Look for strings with no default localization if (configSrcMap.count(defaultLocale) == 0) { SourcePos().warning("string '%s' has no default translation.", - String8(nameIter.first).string()); + String8(nameIter.first).c_str()); if (mBundle->getVerbose()) { for (const auto& locale : configSrcMap) { - locale.second.printf("locale %s found", locale.first.string()); + locale.second.printf("locale %s found", locale.first.c_str()); } } // !!! TODO: throw an error here in some circumstances @@ -2820,7 +2822,7 @@ ResourceTable::validateLocalizations(void) // Check that all requested localizations are present for this string if (mBundle->getConfigurations().size() > 0 && mBundle->getRequireLocalization()) { - const char* allConfigs = mBundle->getConfigurations().string(); + const char* allConfigs = mBundle->getConfigurations().c_str(); const char* start = allConfigs; const char* comma; @@ -2830,10 +2832,10 @@ ResourceTable::validateLocalizations(void) String8 config; comma = strchr(start, ','); if (comma != NULL) { - config.setTo(start, comma - start); + config = String8(start, comma - start); start = comma + 1; } else { - config.setTo(start); + config = start; } if (!locale.initFromFilterString(config)) { @@ -2847,7 +2849,7 @@ ResourceTable::validateLocalizations(void) // requiring a specific regional localization [e.g. de_DE] but there is an // available string in the generic language localization [e.g. de]; // consider that string to have fulfilled the localization requirement. - String8 region(config.string(), 2); + String8 region(config.c_str(), 2); if (configSrcMap.find(region) == configSrcMap.end() && configSrcMap.count(defaultLocale) == 0) { missingConfigs.insert(config); @@ -2859,12 +2861,12 @@ ResourceTable::validateLocalizations(void) if (!missingConfigs.empty()) { String8 configStr; for (const auto& iter : missingConfigs) { - configStr.appendFormat(" %s", iter.string()); + configStr.appendFormat(" %s", iter.c_str()); } SourcePos().warning("string '%s' is missing %u required localizations:%s", - String8(nameIter.first).string(), + String8(nameIter.first).c_str(), (unsigned int)missingConfigs.size(), - configStr.string()); + configStr.c_str()); } } } @@ -3021,7 +3023,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<const ResourceFilter>& header->header.type = htods(RES_TABLE_PACKAGE_TYPE); header->header.headerSize = htods(sizeof(*header)); header->id = htodl(static_cast<uint32_t>(p->getAssignedId())); - strcpy16_htod(header->name, p->getName().string()); + strcpy16_htod(header->name, p->getName().c_str()); // Write the string blocks. const size_t typeStringsStart = data->getSize(); @@ -3061,7 +3063,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<const ResourceFilter>& sp<Type> t = p->getTypes().valueFor(typeName); LOG_ALWAYS_FATAL_IF(t == NULL && typeName != String16("<empty>"), "Type name %s not found", - String8(typeName).string()); + String8(typeName).c_str()); if (t == NULL) { continue; } @@ -3251,7 +3253,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<const ResourceFilter>& // If we're building splits, then each invocation of the flattening // step will have 'missing' entries. Don't warn/error for this case. - if (bundle->getSplitConfigurations().isEmpty()) { + if (bundle->getSplitConfigurations().empty()) { bool missing_entry = false; const char* log_prefix = bundle->getErrorOnMissingConfigEntry() ? "error" : "warning"; @@ -3260,7 +3262,7 @@ status_t ResourceTable::flatten(Bundle* bundle, const sp<const ResourceFilter>& sp<ConfigList> c = t->getOrderedConfigs().itemAt(i); if (c != NULL) { fprintf(stderr, "%s: no entries written for %s/%s (0x%08zx)\n", log_prefix, - String8(typeName).string(), String8(c->getName()).string(), + String8(typeName).c_str(), String8(c->getName()).c_str(), Res_MAKEID(p->getAssignedId() - 1, ti, i)); } missing_entry = true; @@ -3359,7 +3361,7 @@ status_t ResourceTable::flattenLibraryTable(const sp<AaptFile>& dest, const Vect sp<Package> libPackage = libs[i]; if (kIsDebug) { fprintf(stderr, " Entry %s -> 0x%02x\n", - String8(libPackage->getName()).string(), + String8(libPackage->getName()).c_str(), (uint8_t)libPackage->getAssignedId()); } @@ -3367,7 +3369,7 @@ status_t ResourceTable::flattenLibraryTable(const sp<AaptFile>& dest, const Vect entryStart, sizeof(ResTable_lib_entry)); memset(entry, 0, sizeof(*entry)); entry->packageId = htodl(libPackage->getAssignedId()); - strcpy16_htod(entry->packageName, libPackage->getName().string()); + strcpy16_htod(entry->packageName, libPackage->getName().c_str()); } } return NO_ERROR; @@ -3435,13 +3437,13 @@ void ResourceTable::writePublicDefinitions(const String16& package, FILE* fp, bo const SourcePos& pos = c->getEntries().valueAt(k)->getPos(); if (pos.file != "") { fprintf(fp," <!-- Declared at %s:%d -->\n", - pos.file.string(), pos.line); + pos.file.c_str(), pos.line); } } } fprintf(fp, " <public type=\"%s\" name=\"%s\" id=\"0x%08x\" />\n", - String8(t->getName()).string(), - String8(c->getName()).string(), + String8(t->getName()).c_str(), + String8(c->getName()).c_str(), getResId(pkg, t, c->getEntryIndex())); } } @@ -3501,8 +3503,8 @@ status_t ResourceTable::Entry::makeItABag(const SourcePos& sourcePos) } sourcePos.error("Resource entry %s is already defined as a single item.\n" "%s:%d: Originally defined here.\n", - String8(mName).string(), - mItem.sourcePos.file.string(), mItem.sourcePos.line); + String8(mName).c_str(), + mItem.sourcePos.file.c_str(), mItem.sourcePos.line); return UNKNOWN_ERROR; } @@ -3517,21 +3519,21 @@ status_t ResourceTable::Entry::setItem(const SourcePos& sourcePos, if (mType == TYPE_BAG) { if (mBag.size() == 0) { sourcePos.error("Resource entry %s is already defined as a bag.", - String8(mName).string()); + String8(mName).c_str()); } else { const Item& item(mBag.valueAt(0)); sourcePos.error("Resource entry %s is already defined as a bag.\n" "%s:%d: Originally defined here.\n", - String8(mName).string(), - item.sourcePos.file.string(), item.sourcePos.line); + String8(mName).c_str(), + item.sourcePos.file.c_str(), item.sourcePos.line); } return UNKNOWN_ERROR; } if ( (mType != TYPE_UNKNOWN) && (overwrite == false) ) { sourcePos.error("Resource entry %s is already defined.\n" "%s:%d: Originally defined here.\n", - String8(mName).string(), - mItem.sourcePos.file.string(), mItem.sourcePos.line); + String8(mName).c_str(), + mItem.sourcePos.file.c_str(), mItem.sourcePos.line); return UNKNOWN_ERROR; } @@ -3562,12 +3564,12 @@ status_t ResourceTable::Entry::addToBag(const SourcePos& sourcePos, const Item& item(mBag.valueAt(origKey)); sourcePos.error("Resource entry %s already has bag item %s.\n" "%s:%d: Originally defined here.\n", - String8(mName).string(), String8(key).string(), - item.sourcePos.file.string(), item.sourcePos.line); + String8(mName).c_str(), String8(key).c_str(), + item.sourcePos.file.c_str(), item.sourcePos.line); return UNKNOWN_ERROR; } //printf("Replacing %s with %s\n", - // String8(mBag.valueFor(key).value).string(), String8(value).string()); + // String8(mBag.valueFor(key).value).c_str(), String8(value).c_str()); mBag.replaceValueFor(key, item); } @@ -3611,8 +3613,8 @@ status_t ResourceTable::Entry::generateAttributes(ResourceTable* table, String16 value("false"); if (kIsDebug) { fprintf(stderr, "Generating %s:id/%s\n", - String8(package).string(), - String8(key).string()); + String8(package).c_str(), + String8(key).c_str()); } status_t err = table->addEntry(SourcePos(String8("<generated>"), 0), package, id16, key, value); @@ -3624,10 +3626,10 @@ status_t ResourceTable::Entry::generateAttributes(ResourceTable* table, #if 1 // fprintf(stderr, "ERROR: Bag attribute '%s' has not been defined.\n", -// String8(key).string()); +// String8(key).c_str()); // const Item& item(mBag.valueAt(i)); // fprintf(stderr, "Referenced from file %s line %d\n", -// item.sourcePos.file.string(), item.sourcePos.line); +// item.sourcePos.file.c_str(), item.sourcePos.line); // return UNKNOWN_ERROR; #else char numberStr[16]; @@ -3660,7 +3662,7 @@ status_t ResourceTable::Entry::assignResourceIds(ResourceTable* table, mParentId = table->getResId(mParent, &style16, NULL, &errorMsg); if (mParentId == 0) { mPos.error("Error retrieving parent for item: %s '%s'.\n", - errorMsg, String8(mParent).string()); + errorMsg, String8(mParent).c_str()); hasErrors = true; } } @@ -3670,11 +3672,11 @@ status_t ResourceTable::Entry::assignResourceIds(ResourceTable* table, Item& it = mBag.editValueAt(i); it.bagKeyId = table->getResId(key, it.isId ? &id16 : &attr16, NULL, &errorMsg); - //printf("Bag key of %s: #%08x\n", String8(key).string(), it.bagKeyId); + //printf("Bag key of %s: #%08x\n", String8(key).c_str(), it.bagKeyId); if (it.bagKeyId == 0) { it.sourcePos.error("Error: %s: %s '%s'.\n", errorMsg, - String8(it.isId ? id16 : attr16).string(), - String8(key).string()); + String8(it.isId ? id16 : attr16).c_str(), + String8(key).c_str()); hasErrors = true; } } @@ -3709,7 +3711,7 @@ status_t ResourceTable::Entry::prepareFlatten(StringPool* strings, ResourceTable } } else { mPos.error("Error: entry %s is not a single item or a bag.\n", - String8(mName).string()); + String8(mName).c_str()); return UNKNOWN_ERROR; } return NO_ERROR; @@ -3732,7 +3734,7 @@ status_t ResourceTable::Entry::remapStringValue(StringPool* strings) } } else { mPos.error("Error: entry %s is not a single item or a bag.\n", - String8(mName).string()); + String8(mName).c_str()); return UNKNOWN_ERROR; } return NO_ERROR; @@ -3768,7 +3770,7 @@ ssize_t ResourceTable::Entry::flatten(Bundle* /* bundle */, const sp<AaptFile>& par.data = htodl(it.parsedValue.data); #if 0 printf("Writing item (%s): type=%d, data=0x%x, res0=0x%x\n", - String8(mName).string(), it.parsedValue.dataType, + String8(mName).c_str(), it.parsedValue.dataType, it.parsedValue.data, par.res0); #endif err = data->writeData(&par, it.parsedValue.size); @@ -3852,7 +3854,7 @@ status_t ResourceTable::Type::addPublic(const SourcePos& sourcePos, int32_t entryIdx = Res_GETENTRY(ident); if (entryIdx < 0) { sourcePos.error("Public resource %s/%s has an invalid 0 identifier (0x%08x).\n", - String8(mName).string(), String8(name).string(), ident); + String8(mName).c_str(), String8(name).c_str(), ident); return UNKNOWN_ERROR; } #endif @@ -3863,7 +3865,7 @@ status_t ResourceTable::Type::addPublic(const SourcePos& sourcePos, if (mPublicIndex > 0 && mPublicIndex != typeIdx) { sourcePos.error("Public resource %s/%s has conflicting type codes for its" " public identifiers (0x%x vs 0x%x).\n", - String8(mName).string(), String8(name).string(), + String8(mName).c_str(), String8(name).c_str(), mPublicIndex, typeIdx); return UNKNOWN_ERROR; } @@ -3882,8 +3884,8 @@ status_t ResourceTable::Type::addPublic(const SourcePos& sourcePos, sourcePos.error("Public resource %s/%s has conflicting public identifiers" " (0x%08x vs 0x%08x).\n" "%s:%d: Originally defined here.\n", - String8(mName).string(), String8(name).string(), p.ident, ident, - p.sourcePos.file.string(), p.sourcePos.line); + String8(mName).c_str(), String8(name).c_str(), p.ident, ident, + p.sourcePos.file.c_str(), p.sourcePos.line); return UNKNOWN_ERROR; } } @@ -3909,7 +3911,7 @@ sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, if (overlay && !autoAddOverlay && mCanAddEntries.indexOf(entry) < 0) { sourcePos.error("Resource at %s appears in overlay but not" " in the base package; use <add-resource> to add.\n", - String8(entry).string()); + String8(entry).c_str()); return NULL; } c = new ConfigList(entry, sourcePos); @@ -3931,7 +3933,7 @@ sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, printf("New entry at %s:%d: imsi:%d/%d lang:%c%c cnt:%c%c " "orien:%d touch:%d density:%d key:%d inp:%d nav:%d sz:%dx%d " "sw%ddp w%ddp h%ddp layout:%d\n", - sourcePos.file.string(), sourcePos.line, + sourcePos.file.c_str(), sourcePos.line, config->mcc, config->mnc, config->language[0] ? config->language[0] : '-', config->language[1] ? config->language[1] : '-', @@ -3951,7 +3953,7 @@ sp<ResourceTable::Entry> ResourceTable::Type::getEntry(const String16& entry, config->screenLayout); } else { printf("New entry at %s:%d: NULL config\n", - sourcePos.file.string(), sourcePos.line); + sourcePos.file.c_str(), sourcePos.line); } } e = new Entry(entry, sourcePos); @@ -4032,11 +4034,11 @@ status_t ResourceTable::Type::applyPublicEntryOrder() const Public& p = mPublic.valueAt(j); int32_t idx = Res_GETENTRY(p.ident); //printf("Looking for entry \"%s\"/\"%s\" (0x%08x) in %d...\n", - // String8(mName).string(), String8(name).string(), p.ident, N); + // String8(mName).c_str(), String8(name).c_str(), p.ident, N); bool found = false; for (i=0; i<N; i++) { sp<ConfigList> e = origOrder.itemAt(i); - //printf("#%d: \"%s\"\n", i, String8(e->getName()).string()); + //printf("#%d: \"%s\"\n", i, String8(e->getName()).c_str()); if (e->getName() == name) { if (idx >= (int32_t)mOrderedConfigs.size()) { mOrderedConfigs.resize(idx + 1); @@ -4056,10 +4058,10 @@ status_t ResourceTable::Type::applyPublicEntryOrder() p.sourcePos.error("Multiple entry names declared for public entry" " identifier 0x%x in type %s (%s vs %s).\n" "%s:%d: Originally defined here.", - idx+1, String8(mName).string(), - String8(oe->getName()).string(), - String8(name).string(), - oe->getPublicSourcePos().file.string(), + idx+1, String8(mName).c_str(), + String8(oe->getName()).c_str(), + String8(name).c_str(), + oe->getPublicSourcePos().file.c_str(), oe->getPublicSourcePos().line); hasError = true; } @@ -4068,7 +4070,7 @@ status_t ResourceTable::Type::applyPublicEntryOrder() if (!found) { p.sourcePos.error("Public symbol %s/%s declared here is not defined.", - String8(mName).string(), String8(name).string()); + String8(mName).c_str(), String8(name).c_str()); hasError = true; } } @@ -4189,9 +4191,9 @@ status_t ResourceTable::Package::applyPublicTypeOrder() t->getFirstPublicSourcePos().error("Multiple type names declared for public type" " identifier 0x%x (%s vs %s).\n" "%s:%d: Originally defined here.", - idx, String8(ot->getName()).string(), - String8(t->getName()).string(), - ot->getFirstPublicSourcePos().file.string(), + idx, String8(ot->getName()).c_str(), + String8(t->getName()).c_str(), + ot->getFirstPublicSourcePos().file.c_str(), ot->getFirstPublicSourcePos().line); return UNKNOWN_ERROR; } @@ -4399,8 +4401,8 @@ const ResourceTable::Item* ResourceTable::getItem(uint32_t resID, uint32_t attrI const Item& it = e->getBag().valueAt(i); if (it.bagKeyId == 0) { fprintf(stderr, "warning: ID not yet assigned to '%s' in bag '%s'\n", - String8(e->getName()).string(), - String8(e->getBag().keyAt(i)).string()); + String8(e->getName()).c_str(), + String8(e->getBag().keyAt(i)).c_str()); } if (it.bagKeyId == attrID) { return ⁢ @@ -4427,8 +4429,8 @@ bool ResourceTable::getItemValue( } } fprintf(stderr, "warning: Circular reference detected in key '%s' of bag '%s'\n", - String8(e->getName()).string(), - String8(e->getBag().keyAt(i)).string()); + String8(e->getName()).c_str(), + String8(e->getBag().keyAt(i)).c_str()); return false; } item->evaluating = true; @@ -4436,7 +4438,7 @@ bool ResourceTable::getItemValue( if (kIsDebug) { if (res) { printf("getItemValue of #%08x[#%08x] (%s): type=#%08x, data=#%08x\n", - resID, attrID, String8(getEntry(resID)->getName()).string(), + resID, attrID, String8(getEntry(resID)->getName()).c_str(), outValue->dataType, outValue->data); } else { printf("getItemValue of #%08x[#%08x]: failed\n", @@ -4713,10 +4715,10 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle) { entriesToAdd[i].value->getPos() .printf("using v%d attributes; synthesizing resource %s:%s/%s for configuration %s.", entriesToAdd[i].key.sdkVersion, - String8(p->getName()).string(), - String8(t->getName()).string(), - String8(entriesToAdd[i].value->getName()).string(), - entriesToAdd[i].key.toString().string()); + String8(p->getName()).c_str(), + String8(t->getName()).c_str(), + String8(entriesToAdd[i].value->getName()).c_str(), + entriesToAdd[i].key.toString().c_str()); } sp<Entry> newEntry = t->getEntry(c->getName(), @@ -4801,9 +4803,9 @@ bool ResourceTable::versionForCompat(const Bundle* bundle, const String16& resou sp<AaptFile> newFile = new AaptFile(target->getSourceFile(), AaptGroupEntry(newConfig), target->getResourceType()); String8 resPath = String8::format("res/%s/%s.xml", - newFile->getGroupEntry().toDirName(target->getResourceType()).string(), - String8(resourceName).string()); - resPath.convertToResPath(); + newFile->getGroupEntry().toDirName(target->getResourceType()).c_str(), + String8(resourceName).c_str()); + convertToResPath(resPath); // Add a resource table entry. addEntry(SourcePos(), @@ -4857,7 +4859,7 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle, Vector<sp<XMLNode> > nodesToVisit; nodesToVisit.push(root); - while (!nodesToVisit.isEmpty()) { + while (!nodesToVisit.empty()) { sp<XMLNode> node = nodesToVisit.top(); nodesToVisit.pop(); @@ -4893,10 +4895,10 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle, if (bundle->getVerbose()) { SourcePos(node->getFilename(), node->getStartLineNumber()).printf( "removing attribute %s%s%s from <%s>", - String8(attr.ns).string(), + String8(attr.ns).c_str(), (attr.ns.size() == 0 ? "" : ":"), - String8(attr.name).string(), - String8(node->getElementName()).string()); + String8(attr.name).c_str(), + String8(node->getElementName()).c_str()); } node->removeAttribute(i); i--; @@ -4925,19 +4927,19 @@ status_t ResourceTable::modifyForCompat(const Bundle* bundle, sp<AaptFile> newFile = new AaptFile(target->getSourceFile(), AaptGroupEntry(newConfig), target->getResourceType()); String8 resPath = String8::format("res/%s/%s.xml", - newFile->getGroupEntry().toDirName(target->getResourceType()).string(), - String8(resourceName).string()); - resPath.convertToResPath(); + newFile->getGroupEntry().toDirName(target->getResourceType()).c_str(), + String8(resourceName).c_str()); + convertToResPath(resPath); // Add a resource table entry. if (bundle->getVerbose()) { SourcePos(target->getSourceFile(), -1).printf( "using v%d attributes; synthesizing resource %s:%s/%s for configuration %s.", newConfig.sdkVersion, - mAssets->getPackage().string(), - newFile->getResourceType().string(), - String8(resourceName).string(), - newConfig.toString().string()); + mAssets->getPackage().c_str(), + newFile->getResourceType().c_str(), + String8(resourceName).c_str(), + newConfig.toString().c_str()); } addEntry(SourcePos(), @@ -5114,8 +5116,8 @@ status_t ResourceTable::processBundleFormatImpl(const Bundle* bundle, sp<XMLNode> nestedRoot = findOnlyChildElement(child); if (nestedRoot == NULL) { source.error("<%s:%s> must have exactly one child element", - String8(child->getElementNamespace()).string(), - String8(child->getElementName()).string()); + String8(child->getElementNamespace()).c_str(), + String8(child->getElementName()).c_str()); return UNKNOWN_ERROR; } @@ -5130,7 +5132,7 @@ status_t ResourceTable::processBundleFormatImpl(const Bundle* bundle, // Parse the attribute name. const char* errorMsg = NULL; String16 attrPackage, attrType, attrName; - bool result = ResTable::expandResourceRef(attr->string.string(), + bool result = ResTable::expandResourceRef(attr->string.c_str(), attr->string.size(), &attrPackage, &attrType, &attrName, &kAttr16, &kAssetPackage16, @@ -5156,11 +5158,11 @@ status_t ResourceTable::processBundleFormatImpl(const Bundle* bundle, // This child element will be extracted into its own resource file. // Generate a name and path for it from its parent. nestedResourceName = String8::format("%s_%d", - String8(resourceName).string(), suffix++); + String8(resourceName).c_str(), suffix++); nestedResourcePath = String8::format("res/%s/%s.xml", target->getGroupEntry().toDirName(target->getResourceType()) - .string(), - nestedResourceName.string()); + .c_str(), + nestedResourceName.c_str()); // Lookup or create the entry for this name. sp<Entry> entry = getEntry(kAssetPackage16, @@ -5187,20 +5189,20 @@ status_t ResourceTable::processBundleFormatImpl(const Bundle* bundle, if (bundle->getVerbose()) { source.printf("generating nested resource %s:%s/%s", - mAssets->getPackage().string(), target->getResourceType().string(), - nestedResourceName.string()); + mAssets->getPackage().c_str(), target->getResourceType().c_str(), + nestedResourceName.c_str()); } // Build the attribute reference and assign it to the parent. String16 nestedResourceRef = String16(String8::format("@%s:%s/%s", - mAssets->getPackage().string(), target->getResourceType().string(), - nestedResourceName.string())); + mAssets->getPackage().c_str(), target->getResourceType().c_str(), + nestedResourceName.c_str())); String16 attrNs = buildNamespace(attrPackage); if (parent->getAttribute(attrNs, attrName) != NULL) { SourcePos(parent->getFilename(), parent->getStartLineNumber()) .error("parent of nested resource already defines attribute '%s:%s'", - String8(attrPackage).string(), String8(attrName).string()); + String8(attrPackage).c_str(), String8(attrName).c_str()); return UNKNOWN_ERROR; } diff --git a/tools/aapt/SourcePos.cpp b/tools/aapt/SourcePos.cpp index 38643201c22d..354a65c14772 100644 --- a/tools/aapt/SourcePos.cpp +++ b/tools/aapt/SourcePos.cpp @@ -78,14 +78,14 @@ ErrorPos::print(FILE* to) const break; } - if (!this->file.isEmpty()) { + if (!this->file.empty()) { if (this->line >= 0) { - fprintf(to, "%s:%d: %s%s\n", this->file.string(), this->line, type, this->error.string()); + fprintf(to, "%s:%d: %s%s\n", this->file.c_str(), this->line, type, this->error.c_str()); } else { - fprintf(to, "%s: %s%s\n", this->file.string(), type, this->error.string()); + fprintf(to, "%s: %s%s\n", this->file.c_str(), type, this->error.c_str()); } } else { - fprintf(to, "%s%s\n", type, this->error.string()); + fprintf(to, "%s%s\n", type, this->error.c_str()); } } diff --git a/tools/aapt/StringPool.cpp b/tools/aapt/StringPool.cpp index 6cacd32eb91d..1af8d6f67bd3 100644 --- a/tools/aapt/StringPool.cpp +++ b/tools/aapt/StringPool.cpp @@ -67,7 +67,7 @@ void printStringPool(const ResStringPool* pool) const size_t NS = pool->size(); for (size_t s=0; s<NS; s++) { auto str = pool->string8ObjectAt(s); - printf("String #" ZD ": %s\n", (ZD_TYPE) s, (str.has_value() ? str->string() : "")); + printf("String #" ZD ": %s\n", (ZD_TYPE) s, (str.has_value() ? str->c_str() : "")); } } @@ -139,7 +139,7 @@ ssize_t StringPool::add(const String16& value, if (eidx < 0) { eidx = mEntries.add(entry(value)); if (eidx < 0) { - fprintf(stderr, "Failure adding string %s\n", String8(value).string()); + fprintf(stderr, "Failure adding string %s\n", String8(value).c_str()); return eidx; } } @@ -148,7 +148,7 @@ ssize_t StringPool::add(const String16& value, entry& ent = mEntries.editItemAt(eidx); if (kIsDebug) { printf("*** adding config type name %s, was %s\n", - configTypeName->string(), ent.configTypeName.string()); + configTypeName->c_str(), ent.configTypeName.c_str()); } if (ent.configTypeName.size() <= 0) { ent.configTypeName = *configTypeName; @@ -166,7 +166,7 @@ ssize_t StringPool::add(const String16& value, if (cmp >= 0) { if (cmp > 0) { if (kIsDebug) { - printf("*** inserting config: %s\n", config->toString().string()); + printf("*** inserting config: %s\n", config->toString().c_str()); } ent.configs.insertAt(*config, addPos); } @@ -175,7 +175,7 @@ ssize_t StringPool::add(const String16& value, } if (addPos >= ent.configs.size()) { if (kIsDebug) { - printf("*** adding config: %s\n", config->toString().string()); + printf("*** adding config: %s\n", config->toString().c_str()); } ent.configs.add(*config); } @@ -195,7 +195,7 @@ ssize_t StringPool::add(const String16& value, if (kIsDebug) { printf("Adding string %s to pool: pos=%zd eidx=%zd vidx=%zd\n", - String8(value).string(), pos, eidx, vidx); + String8(value).c_str(), pos, eidx, vidx); } return pos; @@ -286,13 +286,13 @@ void StringPool::sortByConfig() for (size_t i=0; i<N; i++) { printf("#%d was %d: %s\n", i, newPosToOriginalPos[i], - mEntries[mEntryArray[newPosToOriginalPos[i]]].makeConfigsString().string()); + mEntries[mEntryArray[newPosToOriginalPos[i]]].makeConfigsString().c_str()); entries.add(mEntries[mEntryArray[i]]); } for (size_t i=0; i<entries.size(); i++) { printf("Sorted config #%d: %s\n", i, - entries[i].makeConfigsString().string()); + entries[i].makeConfigsString().c_str()); } #endif @@ -363,8 +363,8 @@ void StringPool::sortByConfig() printf("FINAL SORTED STRING CONFIGS:\n"); for (size_t i=0; i<mEntries.size(); i++) { const entry& ent = mEntries[i]; - printf("#" ZD " %s: %s\n", (ZD_TYPE)i, ent.makeConfigsString().string(), - String8(ent.value).string()); + printf("#" ZD " %s: %s\n", (ZD_TYPE)i, ent.makeConfigsString().c_str(), + String8(ent.value).c_str()); } #endif } @@ -415,7 +415,7 @@ status_t StringPool::writeStringBlock(const sp<AaptFile>& pool) ssize_t idx = add(span.name, true); if (idx < 0) { fprintf(stderr, "Error adding span for style tag '%s'\n", - String8(span.name).string()); + String8(span.name).c_str()); return idx; } span.span.name.index = (uint32_t)idx; @@ -472,13 +472,13 @@ status_t StringPool::writeStringBlock(const sp<AaptFile>& pool) ENCODE_LENGTH(strings, sizeof(uint8_t), encSize) - strncpy((char*)strings, encStr, encSize+1); + strncpy((char*)strings, encStr.c_str(), encSize + 1); } else { char16_t* strings = (char16_t*)dat; ENCODE_LENGTH(strings, sizeof(char16_t), strSize) - strcpy16_htod(strings, ent.value); + strcpy16_htod(strings, ent.value.c_str()); } strPos += totalSize; @@ -571,7 +571,7 @@ status_t StringPool::writeStringBlock(const sp<AaptFile>& pool) if (kIsDebug) { printf("Writing entry #%zu: \"%s\" ent=%zu off=%zu\n", i, - String8(ent.value).string(), + String8(ent.value).c_str(), mEntryArray[i], ent.offset); } @@ -591,8 +591,8 @@ ssize_t StringPool::offsetForString(const String16& val) const const Vector<size_t>* indices = offsetsForString(val); ssize_t res = indices != NULL && indices->size() > 0 ? indices->itemAt(0) : -1; if (kIsDebug) { - printf("Offset for string %s: %zd (%s)\n", String8(val).string(), res, - res >= 0 ? String8(mEntries[mEntryArray[res]].value).string() : String8()); + printf("Offset for string %s: %zd (%s)\n", String8(val).c_str(), res, + res >= 0 ? String8(mEntries[mEntryArray[res]].value).c_str() : ""); } return res; } diff --git a/tools/aapt/Symbol.h b/tools/aapt/Symbol.h index e1575410e38b..de1d60cbae42 100644 --- a/tools/aapt/Symbol.h +++ b/tools/aapt/Symbol.h @@ -68,9 +68,9 @@ Symbol::Symbol(const android::String16& p, const android::String16& t, const and android::String8 Symbol::toString() const { return android::String8::format("%s:%s/%s (0x%08x)", - android::String8(package).string(), - android::String8(type).string(), - android::String8(name).string(), + android::String8(package).c_str(), + android::String8(type).c_str(), + android::String8(name).c_str(), (int) id); } diff --git a/tools/aapt/Utils.cpp b/tools/aapt/Utils.cpp new file mode 100644 index 000000000000..946916a0598a --- /dev/null +++ b/tools/aapt/Utils.cpp @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2005 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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 "Utils.h" + +#include <utils/Compat.h> + +// Separator used by resource paths. This is not platform dependent contrary +// to OS_PATH_SEPARATOR. +#define RES_PATH_SEPARATOR '/' + +using android::String8; + +void convertToResPath([[maybe_unused]] String8& s) { +#if OS_PATH_SEPARATOR != RES_PATH_SEPARATOR + size_t len = s.length(); + if (len > 0) { + char* buf = s.lockBuffer(len); + for (char* end = buf + len; buf < end; ++buf) { + if (*buf == OS_PATH_SEPARATOR) *buf = RES_PATH_SEPARATOR; + } + s.unlockBuffer(len); + } +#endif +} + +String8 walkPath(const String8& path, String8* outRemains) { + const char* cp; + const char* const str = path.c_str(); + const char* buf = str; + + cp = strchr(buf, OS_PATH_SEPARATOR); + if (cp == buf) { + // don't include a leading '/'. + buf = buf + 1; + cp = strchr(buf, OS_PATH_SEPARATOR); + } + + if (cp == nullptr) { + String8 res = buf != str ? String8(buf) : path; + if (outRemains) *outRemains = String8(); + return res; + } + + String8 res(buf, cp - buf); + if (outRemains) *outRemains = String8(cp + 1); + return res; +} diff --git a/tools/aapt/Utils.h b/tools/aapt/Utils.h new file mode 100644 index 000000000000..f0d69799f7e2 --- /dev/null +++ b/tools/aapt/Utils.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2005 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +// This file contains cruft that used to be in libutils' String8, that's only +// used for aapt. + +#include <utils/String8.h> + +// Converts all separators in this string to /, the default path +// separator. +// If the default OS separator is backslash, this converts all +// backslashes to slashes, in-place. Otherwise it does nothing. +void convertToResPath(android::String8&); + +/** + * Retrieve the front (root dir) component. Optionally also return the + * remaining components. + * + * "/tmp/foo/bar.c" --> "tmp" (remain = "foo/bar.c") + * "/tmp" --> "tmp" (remain = "") + * "bar.c" --> "bar.c" (remain = "") + */ +android::String8 walkPath(const android::String8& path, android::String8* outRemains = nullptr); diff --git a/tools/aapt/XMLNode.cpp b/tools/aapt/XMLNode.cpp index 69392d66e21f..1a648c01f631 100644 --- a/tools/aapt/XMLNode.cpp +++ b/tools/aapt/XMLNode.cpp @@ -66,14 +66,14 @@ static const String16 RESOURCES_TOOLS_NAMESPACE("http://schemas.android.com/tool String16 getNamespaceResourcePackage(const String16& appPackage, const String16& namespaceUri, bool* outIsPublic) { - //printf("%s starts with %s?\n", String8(namespaceUri).string(), - // String8(RESOURCES_PREFIX).string()); + //printf("%s starts with %s?\n", String8(namespaceUri).c_str(), + // String8(RESOURCES_PREFIX).c_str()); size_t prefixSize; bool isPublic = true; if(namespaceUri.startsWith(RESOURCES_PREFIX_AUTO_PACKAGE)) { if (kIsDebug) { - printf("Using default application package: %s -> %s\n", String8(namespaceUri).string(), - String8(appPackage).string()); + printf("Using default application package: %s -> %s\n", String8(namespaceUri).c_str(), + String8(appPackage).c_str()); } isPublic = true; return appPackage; @@ -88,7 +88,7 @@ String16 getNamespaceResourcePackage(const String16& appPackage, const String16& } //printf("YES!\n"); - //printf("namespace: %s\n", String8(String16(namespaceUri, namespaceUri.size()-prefixSize, prefixSize)).string()); + //printf("namespace: %s\n", String8(String16(namespaceUri, namespaceUri.size()-prefixSize, prefixSize)).c_str()); if (outIsPublic) *outIsPublic = isPublic; return String16(namespaceUri, namespaceUri.size()-prefixSize, prefixSize); } @@ -97,7 +97,7 @@ status_t hasSubstitutionErrors(const char* fileName, ResXMLTree* inXml, const String16& str16) { - const char16_t* str = str16.string(); + const char16_t* str = str16.c_str(); const char16_t* p = str; const char16_t* end = str + str16.size(); @@ -223,7 +223,7 @@ status_t parseStyledString(Bundle* /* bundle */, String16 text(inXml->getText(&len)); if (firstTime && text.size() > 0) { firstTime = false; - if (text.string()[0] == '@') { + if (text.c_str()[0] == '@') { // If this is a resource reference, don't do the pseudoloc. pseudolocalize = NO_PSEUDOLOCALIZATION; pseudo.setMethod(pseudolocalize); @@ -263,7 +263,7 @@ status_t parseStyledString(Bundle* /* bundle */, { SourcePos(String8(fileName), inXml->getLineNumber()).error( "Found unsupported XLIFF tag <%s>\n", - element8.string()); + element8.c_str()); return UNKNOWN_ERROR; } moveon: @@ -272,14 +272,14 @@ moveon: if (outSpans == NULL) { SourcePos(String8(fileName), inXml->getLineNumber()).error( - "Found style tag <%s> where styles are not allowed\n", element8.string()); + "Found style tag <%s> where styles are not allowed\n", element8.c_str()); return UNKNOWN_ERROR; } - if (!ResTable::collectString(outString, curString.string(), + if (!ResTable::collectString(outString, curString.c_str(), curString.size(), false, &errorMsg, true)) { SourcePos(String8(fileName), inXml->getLineNumber()).error("%s (in %s)\n", - errorMsg, String8(curString).string()); + errorMsg, String8(curString).c_str()); return UNKNOWN_ERROR; } rawString.append(curString); @@ -295,7 +295,7 @@ moveon: str = inXml->getAttributeStringValue(ai, &len); span.name.append(str, len); } - //printf("Span: %s\n", String8(span.name).string()); + //printf("Span: %s\n", String8(span.name).c_str()); span.span.firstChar = span.span.lastChar = outString->size(); spanStack.push(span); @@ -311,21 +311,21 @@ moveon: xliffDepth--; continue; } - if (!ResTable::collectString(outString, curString.string(), + if (!ResTable::collectString(outString, curString.c_str(), curString.size(), false, &errorMsg, true)) { SourcePos(String8(fileName), inXml->getLineNumber()).error("%s (in %s)\n", - errorMsg, String8(curString).string()); + errorMsg, String8(curString).c_str()); return UNKNOWN_ERROR; } rawString.append(curString); curString = String16(); if (spanStack.size() == 0) { - if (strcmp16(inXml->getElementName(&len), endTag.string()) != 0) { + if (strcmp16(inXml->getElementName(&len), endTag.c_str()) != 0) { SourcePos(String8(fileName), inXml->getLineNumber()).error( "Found tag %s where <%s> close is expected\n", - String8(inXml->getElementName(&len)).string(), - String8(endTag).string()); + String8(inXml->getElementName(&len)).c_str(), + String8(endTag).c_str()); return UNKNOWN_ERROR; } break; @@ -334,15 +334,15 @@ moveon: String16 spanTag; ssize_t semi = span.name.findFirst(';'); if (semi >= 0) { - spanTag.setTo(span.name.string(), semi); + spanTag = String16(span.name.c_str(), semi); } else { - spanTag.setTo(span.name); + spanTag = span.name; } - if (strcmp16(inXml->getElementName(&len), spanTag.string()) != 0) { + if (strcmp16(inXml->getElementName(&len), spanTag.c_str()) != 0) { SourcePos(String8(fileName), inXml->getLineNumber()).error( "Found close tag %s where close tag %s is expected\n", - String8(inXml->getElementName(&len)).string(), - String8(spanTag).string()); + String8(inXml->getElementName(&len)).c_str(), + String8(spanTag).c_str()); return UNKNOWN_ERROR; } bool empty = true; @@ -363,7 +363,7 @@ moveon: if (0 && empty) { fprintf(stderr, "%s:%d: warning: empty '%s' span found in text '%s'\n", fileName, inXml->getLineNumber(), - String8(spanTag).string(), String8(*outString).string()); + String8(spanTag).c_str(), String8(*outString).c_str()); } } else if (code == ResXMLTree::START_NAMESPACE) { @@ -380,11 +380,11 @@ moveon: if (outSpans != NULL && outSpans->size() > 0) { if (curString.size() > 0) { - if (!ResTable::collectString(outString, curString.string(), + if (!ResTable::collectString(outString, curString.c_str(), curString.size(), false, &errorMsg, true)) { SourcePos(String8(fileName), inXml->getLineNumber()).error( "%s (in %s)\n", - errorMsg, String8(curString).string()); + errorMsg, String8(curString).c_str()); return UNKNOWN_ERROR; } } @@ -393,7 +393,7 @@ moveon: // later as part of the overall type conversion. Return to the // client the raw unprocessed text. rawString.append(curString); - outString->setTo(rawString); + *outString = rawString; } return NO_ERROR; @@ -450,10 +450,10 @@ void printXMLBlock(ResXMLTree* block) String8 elemNs = build_namespace(namespaces, ns16); const char16_t* com16 = block->getComment(&len); if (com16) { - printf("%s <!-- %s -->\n", prefix.string(), String8(com16).string()); + printf("%s <!-- %s -->\n", prefix.c_str(), String8(com16).c_str()); } - printf("%sE: %s%s (line=%d)\n", prefix.string(), elemNs.string(), - String8(block->getElementName(&len)).string(), + printf("%sE: %s%s (line=%d)\n", prefix.c_str(), elemNs.c_str(), + String8(block->getElementName(&len)).c_str(), block->getLineNumber()); int N = block->getAttributeCount(); depth++; @@ -463,11 +463,11 @@ void printXMLBlock(ResXMLTree* block) ns16 = block->getAttributeNamespace(i, &len); String8 ns = build_namespace(namespaces, ns16); String8 name(block->getAttributeName(i, &len)); - printf("%sA: ", prefix.string()); + printf("%sA: ", prefix.c_str()); if (res) { - printf("%s%s(0x%08x)", ns.string(), name.string(), res); + printf("%s%s(0x%08x)", ns.c_str(), name.c_str(), res); } else { - printf("%s%s", ns.string(), name.string()); + printf("%s%s", ns.c_str(), name.c_str()); } Res_value value; block->getAttributeValue(i, &value); @@ -480,14 +480,14 @@ void printXMLBlock(ResXMLTree* block) } else if (value.dataType == Res_value::TYPE_STRING) { printf("=\"%s\"", ResTable::normalizeForOutput(String8(block->getAttributeStringValue(i, - &len)).string()).string()); + &len)).c_str()).c_str()); } else { printf("=(type 0x%x)0x%x", (int)value.dataType, (int)value.data); } const char16_t* val = block->getAttributeStringValue(i, &len); if (val != NULL) { - printf(" (Raw: \"%s\")", ResTable::normalizeForOutput(String8(val).string()). - string()); + printf(" (Raw: \"%s\")", ResTable::normalizeForOutput(String8(val).c_str()). + c_str()); } printf("\n"); } @@ -509,8 +509,8 @@ void printXMLBlock(ResXMLTree* block) } ns.uri = String8(block->getNamespaceUri(&len)); namespaces.push(ns); - printf("%sN: %s=%s\n", prefix.string(), ns.prefix.string(), - ns.uri.string()); + printf("%sN: %s=%s\n", prefix.c_str(), ns.prefix.c_str(), + ns.uri.c_str()); depth++; } else if (code == ResXMLTree::END_NAMESPACE) { if (--depth < 0) { @@ -529,19 +529,19 @@ void printXMLBlock(ResXMLTree* block) if (ns.prefix != pr) { prefix = make_prefix(depth); printf("%s*** BAD END NS PREFIX: found=%s, expected=%s\n", - prefix.string(), pr.string(), ns.prefix.string()); + prefix.c_str(), pr.c_str(), ns.prefix.c_str()); } String8 uri = String8(block->getNamespaceUri(&len)); if (ns.uri != uri) { prefix = make_prefix(depth); printf("%s *** BAD END NS URI: found=%s, expected=%s\n", - prefix.string(), uri.string(), ns.uri.string()); + prefix.c_str(), uri.c_str(), ns.uri.c_str()); } namespaces.pop(); } else if (code == ResXMLTree::TEXT) { size_t len; - printf("%sC: \"%s\"\n", prefix.string(), - ResTable::normalizeForOutput(String8(block->getText(&len)).string()).string()); + printf("%sC: \"%s\"\n", prefix.c_str(), + ResTable::normalizeForOutput(String8(block->getText(&len)).c_str()).c_str()); } } @@ -559,7 +559,7 @@ status_t parseXMLResource(const sp<AaptFile>& file, ResXMLTree* outTree, root->removeWhitespace(stripAll, cDataTags); if (kIsDebug) { - printf("Input XML from %s:\n", (const char*)file->getPrintableSource()); + printf("Input XML from %s:\n", file->getPrintableSource().c_str()); root->print(); } sp<AaptFile> rsc = new AaptFile(String8(), AaptGroupEntry(), String8()); @@ -583,7 +583,7 @@ status_t parseXMLResource(const sp<AaptFile>& file, ResXMLTree* outTree, sp<XMLNode> XMLNode::parse(const sp<AaptFile>& file) { char buf[16384]; - int fd = open(file->getSourceFile().string(), O_RDONLY | O_BINARY); + int fd = open(file->getSourceFile().c_str(), O_RDONLY | O_BINARY); if (fd < 0) { SourcePos(file->getSourceFile(), -1).error("Unable to open file for read: %s", strerror(errno)); @@ -875,9 +875,9 @@ void XMLNode::setAttributeResID(size_t attrIdx, uint32_t resId) } if (kIsDebug) { printf("Elem %s %s=\"%s\": set res id = 0x%08x\n", - String8(getElementName()).string(), - String8(mAttributes.itemAt(attrIdx).name).string(), - String8(mAttributes.itemAt(attrIdx).string).string(), + String8(getElementName()).c_str(), + String8(mAttributes.itemAt(attrIdx).name).c_str(), + String8(mAttributes.itemAt(attrIdx).string).c_str(), resId); } mAttributes.editItemAt(attrIdx).nameResId = resId; @@ -915,7 +915,7 @@ void XMLNode::setEndLineNumber(int32_t line) void XMLNode::removeWhitespace(bool stripAll, const char** cDataTags) { - //printf("Removing whitespace in %s\n", String8(mElementName).string()); + //printf("Removing whitespace in %s\n", String8(mElementName).c_str()); size_t N = mChildren.size(); if (cDataTags) { String8 tag(mElementName); @@ -931,13 +931,13 @@ void XMLNode::removeWhitespace(bool stripAll, const char** cDataTags) sp<XMLNode> node = mChildren.itemAt(i); if (node->getType() == TYPE_CDATA) { // This is a CDATA node... - const char16_t* p = node->mChars.string(); + const char16_t* p = node->mChars.c_str(); while (*p != 0 && *p < 128 && isspace(*p)) { p++; } //printf("Space ends at %d in \"%s\"\n", - // (int)(p-node->mChars.string()), - // String8(node->mChars).string()); + // (int)(p-node->mChars.c_str()), + // String8(node->mChars).c_str()); if (*p == 0) { if (stripAll) { // Remove this node! @@ -949,18 +949,18 @@ void XMLNode::removeWhitespace(bool stripAll, const char** cDataTags) } } else { // Compact leading/trailing whitespace. - const char16_t* e = node->mChars.string()+node->mChars.size()-1; + const char16_t* e = node->mChars.c_str()+node->mChars.size()-1; while (e > p && *e < 128 && isspace(*e)) { e--; } - if (p > node->mChars.string()) { + if (p > node->mChars.c_str()) { p--; } - if (e < (node->mChars.string()+node->mChars.size()-1)) { + if (e < (node->mChars.c_str()+node->mChars.size()-1)) { e++; } - if (p > node->mChars.string() || - e < (node->mChars.string()+node->mChars.size()-1)) { + if (p > node->mChars.c_str() || + e < (node->mChars.c_str()+node->mChars.size()-1)) { String16 tmp(p, e-p+1); node->mChars = tmp; } @@ -986,14 +986,14 @@ status_t XMLNode::parseValues(const sp<AaptAssets>& assets, table->setCurrentXmlPos(SourcePos(mFilename, getStartLineNumber())); if (!assets->getIncludedResources() .stringToValue(&e.value, &e.string, - e.string.string(), e.string.size(), true, true, + e.string.c_str(), e.string.size(), true, true, e.nameResId, NULL, &defPackage, table, &ac)) { hasErrors = true; } if (kIsDebug) { printf("Attr %s: type=0x%x, str=%s\n", - String8(e.name).string(), e.value.dataType, - String8(e.string).string()); + String8(e.name).c_str(), e.value.dataType, + String8(e.string).c_str()); } } } @@ -1023,30 +1023,30 @@ status_t XMLNode::assignResourceIds(const sp<AaptAssets>& assets, String16 pkg(getNamespaceResourcePackage(String16(assets->getPackage()), e.ns, &nsIsPublic)); if (kIsDebug) { printf("Elem %s %s=\"%s\": namespace(%s) %s ===> %s\n", - String8(getElementName()).string(), - String8(e.name).string(), - String8(e.string).string(), - String8(e.ns).string(), + String8(getElementName()).c_str(), + String8(e.name).c_str(), + String8(e.string).c_str(), + String8(e.ns).c_str(), (nsIsPublic) ? "public" : "private", - String8(pkg).string()); + String8(pkg).c_str()); } if (pkg.size() <= 0) continue; uint32_t res = table != NULL ? table->getResId(e.name, &attr, &pkg, &errorMsg, nsIsPublic) : assets->getIncludedResources(). - identifierForName(e.name.string(), e.name.size(), - attr.string(), attr.size(), - pkg.string(), pkg.size()); + identifierForName(e.name.c_str(), e.name.size(), + attr.c_str(), attr.size(), + pkg.c_str(), pkg.size()); if (res != 0) { if (kIsDebug) { printf("XML attribute name %s: resid=0x%08x\n", - String8(e.name).string(), res); + String8(e.name).c_str(), res); } setAttributeResID(i, res); } else { SourcePos(mFilename, getStartLineNumber()).error( "No resource identifier found for attribute '%s' in package '%s'\n", - String8(e.name).string(), String8(pkg).string()); + String8(e.name).c_str(), String8(pkg).c_str()); hasErrors = true; } } @@ -1137,7 +1137,7 @@ status_t XMLNode::flatten(const sp<AaptFile>& dest, if (kPrintStringMetrics) { fprintf(stderr, "**** total xml size: %zu / %zu%% strings (in %s)\n", dest->getSize(), (stringPool->getSize()*100)/dest->getSize(), - dest->getPath().string()); + dest->getPath().c_str()); } return NO_ERROR; @@ -1155,8 +1155,8 @@ void XMLNode::print(int indent) if (elemNs.size() > 0) { elemNs.append(":"); } - printf("%s E: %s%s", prefix.string(), - elemNs.string(), String8(getElementName()).string()); + printf("%s E: %s%s", prefix.c_str(), + elemNs.c_str(), String8(getElementName()).c_str()); int N = mAttributes.size(); for (i=0; i<N; i++) { ssize_t idx = mAttributeOrder.valueAt(i); @@ -1171,21 +1171,21 @@ void XMLNode::print(int indent) attrNs.append(":"); } if (attr.nameResId) { - printf("%s%s(0x%08x)", attrNs.string(), - String8(attr.name).string(), attr.nameResId); + printf("%s%s(0x%08x)", attrNs.c_str(), + String8(attr.name).c_str(), attr.nameResId); } else { - printf("%s%s", attrNs.string(), String8(attr.name).string()); + printf("%s%s", attrNs.c_str(), String8(attr.name).c_str()); } - printf("=%s", String8(attr.string).string()); + printf("=%s", String8(attr.string).c_str()); } printf("\n"); } else if (getType() == TYPE_NAMESPACE) { - printf("%s N: %s=%s\n", prefix.string(), + printf("%s N: %s=%s\n", prefix.c_str(), getNamespacePrefix().size() > 0 - ? String8(getNamespacePrefix()).string() : "<DEF>", - String8(getNamespaceUri()).string()); + ? String8(getNamespacePrefix()).c_str() : "<DEF>", + String8(getNamespaceUri()).c_str()); } else { - printf("%s C: \"%s\"\n", prefix.string(), String8(getCData()).string()); + printf("%s C: \"%s\"\n", prefix.c_str(), String8(getCData()).c_str()); } int N = mChildren.size(); for (i=0; i<N; i++) { @@ -1258,7 +1258,7 @@ void XMLCALL XMLNode::characterData(void *userData, const XML_Char *s, int len) { if (kIsDebugParse) { - printf("CDATA: \"%s\"\n", String8(s, len).string()); + printf("CDATA: \"%s\"\n", String8(s, len).c_str()); } ParseState* st = (ParseState*)userData; sp<XMLNode> node = NULL; @@ -1423,7 +1423,7 @@ status_t XMLNode::collect_attr_strings(StringPool* outPool, idx = outPool->add(attr.name); if (kIsDebug) { printf("Adding attr %s (resid 0x%08x) to pool: idx=%zd\n", - String8(attr.name).string(), id, idx); + String8(attr.name).c_str(), id, idx); } if (id != 0) { while ((ssize_t)outResIds->size() <= idx) { @@ -1434,7 +1434,7 @@ status_t XMLNode::collect_attr_strings(StringPool* outPool, } attr.namePoolIdx = idx; if (kIsDebug) { - printf("String %s offset=0x%08zd\n", String8(attr.name).string(), idx); + printf("String %s offset=0x%08zd\n", String8(attr.name).c_str(), idx); } } } @@ -1488,7 +1488,7 @@ status_t XMLNode::flatten_node(const StringPool& strings, const sp<AaptFile>& de node.comment.index = htodl( mComment.size() > 0 ? strings.offsetForString(mComment) : -1); //if (mComment.size() > 0) { - // printf("Flattening comment: %s\n", String8(mComment).string()); + // printf("Flattening comment: %s\n", String8(mComment).c_str()); //} } else { node.comment.index = htodl((uint32_t)-1); diff --git a/tools/aapt/ZipEntry.cpp b/tools/aapt/ZipEntry.cpp index 5339285f5667..6886993fbfa1 100644 --- a/tools/aapt/ZipEntry.cpp +++ b/tools/aapt/ZipEntry.cpp @@ -18,6 +18,8 @@ // Access to entries in a Zip archive. // +#define _POSIX_THREAD_SAFE_FUNCTIONS // For mingw localtime_r(). + #define LOG_TAG "zip" #include "ZipEntry.h" @@ -337,39 +339,26 @@ time_t ZipEntry::getModWhen(void) const /* * Set the CDE/LFH timestamp from UNIX time. */ -void ZipEntry::setModWhen(time_t when) -{ -#if !defined(_WIN32) - struct tm tmResult; -#endif - time_t even; - unsigned short zdate, ztime; - - struct tm* ptm; - +void ZipEntry::setModWhen(time_t when) { /* round up to an even number of seconds */ - even = (time_t)(((unsigned long)(when) + 1) & (~1)); + time_t even = (time_t)(((unsigned long)(when) + 1) & (~1)); /* expand */ -#if !defined(_WIN32) - ptm = localtime_r(&even, &tmResult); -#else - ptm = localtime(&even); -#endif + struct tm tmResult; + struct tm* ptm = localtime_r(&even, &tmResult); int year; year = ptm->tm_year; if (year < 80) year = 80; - zdate = (year - 80) << 9 | (ptm->tm_mon+1) << 5 | ptm->tm_mday; - ztime = ptm->tm_hour << 11 | ptm->tm_min << 5 | ptm->tm_sec >> 1; + unsigned short zdate = (year - 80) << 9 | (ptm->tm_mon + 1) << 5 | ptm->tm_mday; + unsigned short ztime = ptm->tm_hour << 11 | ptm->tm_min << 5 | ptm->tm_sec >> 1; mCDE.mLastModFileTime = mLFH.mLastModFileTime = ztime; mCDE.mLastModFileDate = mLFH.mLastModFileDate = zdate; } - /* * =========================================================================== * ZipEntry::LocalFileHeader diff --git a/tools/aapt/pseudolocalize.cpp b/tools/aapt/pseudolocalize.cpp index 4e8dcb1bc6ee..fc2ed98949dd 100644 --- a/tools/aapt/pseudolocalize.cpp +++ b/tools/aapt/pseudolocalize.cpp @@ -42,7 +42,7 @@ String16 Pseudolocalizer::text(const String16& text) { size_t depth = mLastDepth; size_t lastpos, pos; const size_t length= text.size(); - const char16_t* str = text.string(); + const char16_t* str = text.c_str(); bool escaped = false; for (lastpos = pos = 0; pos < length; pos++) { char16_t c = str[pos]; @@ -181,7 +181,7 @@ static bool is_possible_normal_placeholder_end(const char16_t c) { static String16 pseudo_generate_expansion(const unsigned int length) { String16 result = k_expansion_string; - const char16_t* s = result.string(); + const char16_t* s = result.c_str(); if (result.size() < length) { result += String16(" "); result += pseudo_generate_expansion(length - result.size()); @@ -237,7 +237,7 @@ String16 PseudoMethodAccent::end() { */ String16 PseudoMethodAccent::text(const String16& source) { - const char16_t* s = source.string(); + const char16_t* s = source.c_str(); String16 result; const size_t I = source.size(); bool lastspace = true; @@ -357,7 +357,7 @@ String16 PseudoMethodAccent::placeholder(const String16& source) { String16 PseudoMethodBidi::text(const String16& source) { - const char16_t* s = source.string(); + const char16_t* s = source.c_str(); String16 result; bool lastspace = true; bool space = true; diff --git a/tools/aapt/tests/AaptGroupEntry_test.cpp b/tools/aapt/tests/AaptGroupEntry_test.cpp index bf5ca59a81c8..8621e9be7010 100644 --- a/tools/aapt/tests/AaptGroupEntry_test.cpp +++ b/tools/aapt/tests/AaptGroupEntry_test.cpp @@ -24,7 +24,7 @@ using android::String8; static ::testing::AssertionResult TestParse(AaptGroupEntry& entry, const String8& dirName, String8* outType) { - if (entry.initFromDirName(dirName, outType)) { + if (entry.initFromDirName(dirName.c_str(), outType)) { return ::testing::AssertionSuccess() << dirName << " was successfully parsed"; } return ::testing::AssertionFailure() << dirName << " could not be parsed"; diff --git a/tools/aapt2/Debug.cpp b/tools/aapt2/Debug.cpp index df878899fa28..9cfb85d7cd73 100644 --- a/tools/aapt2/Debug.cpp +++ b/tools/aapt2/Debug.cpp @@ -447,7 +447,7 @@ void Debug::DumpResStringPool(const android::ResStringPool* pool, text::Printer* const size_t NS = pool->size(); for (size_t s=0; s<NS; s++) { auto str = pool->string8ObjectAt(s); - printer->Print(StringPrintf("String #%zd : %s\n", s, str.has_value() ? str->string() : "")); + printer->Print(StringPrintf("String #%zd : %s\n", s, str.has_value() ? str->c_str() : "")); } } diff --git a/tools/aapt2/DominatorTree_test.cpp b/tools/aapt2/DominatorTree_test.cpp index 52949da1b64f..087f456ec084 100644 --- a/tools/aapt2/DominatorTree_test.cpp +++ b/tools/aapt2/DominatorTree_test.cpp @@ -51,8 +51,7 @@ class PrettyPrinter : public DominatorTree::Visitor { void VisitConfig(const DominatorTree::Node* node, const int indent) { auto config_string = node->value()->config.toString(); buffer_ << std::string(indent, ' ') - << (config_string.isEmpty() ? "<default>" : config_string) - << std::endl; + << (config_string.empty() ? "<default>" : config_string.c_str()) << std::endl; } void VisitNode(const DominatorTree::Node* node, const int indent) { diff --git a/tools/aapt2/OWNERS b/tools/aapt2/OWNERS index 4f655e54a7c2..55bab7d8d74f 100644 --- a/tools/aapt2/OWNERS +++ b/tools/aapt2/OWNERS @@ -1,4 +1,4 @@ set noparent -toddke@google.com zyy@google.com -patb@google.com
\ No newline at end of file +patb@google.com +markpun@google.com diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp index a7c5479b56fd..a766bd437120 100644 --- a/tools/aapt2/SdkConstants.cpp +++ b/tools/aapt2/SdkConstants.cpp @@ -26,8 +26,8 @@ using android::StringPiece; namespace aapt { static ApiVersion sDevelopmentSdkLevel = 10000; -static const auto sDevelopmentSdkCodeNames = - std::unordered_set<StringPiece>({"Q", "R", "S", "Sv2", "Tiramisu", "UpsideDownCake"}); +static const auto sDevelopmentSdkCodeNames = std::unordered_set<StringPiece>( + {"Q", "R", "S", "Sv2", "Tiramisu", "UpsideDownCake", "VanillaIceCream"}); static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = { {0x021c, 1}, diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp index 1671e1e1a6a1..a92f24b82547 100644 --- a/tools/aapt2/cmd/Util.cpp +++ b/tools/aapt2/cmd/Util.cpp @@ -215,7 +215,7 @@ std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info, } std::vector<std::string> sanitized_config_names; for (const auto &config : constraints.configs) { - sanitized_config_names.push_back(MakePackageSafeName(config.toString().string())); + sanitized_config_names.push_back(MakePackageSafeName(config.toString().c_str())); } split_name << "config." << util::Joiner(sanitized_config_names, "_"); diff --git a/tools/aapt2/compile/InlineXmlFormatParser.h b/tools/aapt2/compile/InlineXmlFormatParser.h index 4300023e7726..3a5161b828da 100644 --- a/tools/aapt2/compile/InlineXmlFormatParser.h +++ b/tools/aapt2/compile/InlineXmlFormatParser.h @@ -21,8 +21,8 @@ #include <vector> #include "android-base/macros.h" - #include "process/IResourceTableConsumer.h" +#include "xml/XmlDom.h" namespace aapt { diff --git a/tools/aapt2/dump/DumpManifest.cpp b/tools/aapt2/dump/DumpManifest.cpp index a43bf1b60f42..adb682730f5a 100644 --- a/tools/aapt2/dump/DumpManifest.cpp +++ b/tools/aapt2/dump/DumpManifest.cpp @@ -216,9 +216,7 @@ class SupportsScreen; class ManifestExtractor { public: - - explicit ManifestExtractor(LoadedApk* apk, DumpManifestOptions& options) - : apk_(apk), options_(options) { } + explicit ManifestExtractor(LoadedApk* apk, DumpManifestOptions& options); class Element { public: @@ -509,7 +507,7 @@ class ManifestExtractor { private: std::unique_ptr<xml::XmlResource> doc_; - std::unique_ptr<CommonFeatureGroup> commonFeatureGroup_ = util::make_unique<CommonFeatureGroup>(); + std::unique_ptr<CommonFeatureGroup> commonFeatureGroup_; std::map<std::string, ConfigDescription> locales_; std::map<uint16_t, ConfigDescription> densities_; std::vector<Element*> parent_stack_; @@ -2471,6 +2469,12 @@ static void ToProto(ManifestExtractor::Element* el, pb::Badging* out_badging) { } } +// Define this constructor after the CommonFeatureGroup class definition to avoid errors with using +// std::unique_ptr on an incomplete type. +ManifestExtractor::ManifestExtractor(LoadedApk* apk, DumpManifestOptions& options) + : apk_(apk), options_(options), commonFeatureGroup_(util::make_unique<CommonFeatureGroup>()) { +} + bool ManifestExtractor::Extract(android::IDiagnostics* diag) { // Load the manifest doc_ = apk_->LoadXml("AndroidManifest.xml", diag); diff --git a/tools/aapt2/format/binary/BinaryResourceParser.cpp b/tools/aapt2/format/binary/BinaryResourceParser.cpp index 75dcba581c90..2e20e8175213 100644 --- a/tools/aapt2/format/binary/BinaryResourceParser.cpp +++ b/tools/aapt2/format/binary/BinaryResourceParser.cpp @@ -453,7 +453,7 @@ bool BinaryResourceParser::ParseLibrary(const ResChunk_header* chunk) { const size_t count = entries.size(); for (size_t i = 0; i < count; i++) { table_->included_packages_[entries.valueAt(i)] = - android::util::Utf16ToUtf8(StringPiece16(entries.keyAt(i).string())); + android::util::Utf16ToUtf8(StringPiece16(entries.keyAt(i).c_str())); } return true; } diff --git a/tools/hiddenapi/OWNERS b/tools/hiddenapi/OWNERS index afbeef5a0b41..dc82aac9d41c 100644 --- a/tools/hiddenapi/OWNERS +++ b/tools/hiddenapi/OWNERS @@ -1,5 +1,4 @@ # compat-team@ for changes to hiddenapi files -andreionea@google.com mathewi@google.com satayev@google.com diff --git a/tools/incident_section_gen/main.cpp b/tools/incident_section_gen/main.cpp index dd266ffe0f16..a2c1d6b4f784 100644 --- a/tools/incident_section_gen/main.cpp +++ b/tools/incident_section_gen/main.cpp @@ -383,13 +383,11 @@ static bool generatePrivacyFlags(const Descriptor* descriptor, const Destination if (allDefaults) return false; emptyline(); - int policyCount = 0; printf("Privacy* %s[] = {\n", messageName.c_str()); for (size_t i=0; i<fieldsInOrder.size(); i++) { const FieldDescriptor* field = fieldsInOrder[i]; if (hasDefaultFlags[i]) continue; // NOLINT(clang-analyzer-core.uninitialized.Branch) printf(" &%s,\n", getFieldName(field).c_str()); - policyCount++; } printf(" NULL };\n"); emptyline(); diff --git a/tools/lint/common/Android.bp b/tools/lint/common/Android.bp index 898f88b8759c..8bfbfe5f60b3 100644 --- a/tools/lint/common/Android.bp +++ b/tools/lint/common/Android.bp @@ -27,3 +27,30 @@ java_library_host { libs: ["lint_api"], kotlincflags: ["-Xjvm-default=all"], } + +java_defaults { + name: "AndroidLintCheckerTestDefaults", + srcs: ["checks/src/test/java/**/*.kt"], + static_libs: [ + "junit", + "lint", + "lint_tests", + ], + test_options: { + unit_test: true, + tradefed_options: [ + { + // lint bundles in some classes that were built with older versions + // of libraries, and no longer load. Since tradefed tries to load + // all classes in the jar to look for tests, it crashes loading them. + // Exclude these classes from tradefed's search. + name: "exclude-paths", + value: "org/apache", + }, + { + name: "exclude-paths", + value: "META-INF", + }, + ], + }, +} diff --git a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/AidlImplementationDetector.kt b/tools/lint/common/src/main/java/com/google/android/lint/aidl/AidlImplementationDetector.kt index ab6d871d6ea6..ab6d871d6ea6 100644 --- a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/AidlImplementationDetector.kt +++ b/tools/lint/common/src/main/java/com/google/android/lint/aidl/AidlImplementationDetector.kt diff --git a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/Constants.kt b/tools/lint/common/src/main/java/com/google/android/lint/aidl/Constants.kt index dcfbe953f955..e03d92ab44a0 100644 --- a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/Constants.kt +++ b/tools/lint/common/src/main/java/com/google/android/lint/aidl/Constants.kt @@ -72,5 +72,78 @@ val EXCLUDED_CPP_INTERFACES = listOf( "Status", "IThermalService", "IPowerManager", - "ITunerResourceManager" + "ITunerResourceManager", + // b/278147400 + "IActivityManager", + "IUidObserver", + "IDrm", + "IVsyncCallback", + "IVsyncService", + "ICallback", + "IIPCTest", + "ISafeInterfaceTest", + "IGpuService", + "IConsumerListener", + "IGraphicBufferConsumer", + "ITransactionComposerListener", + "SensorEventConnection", + "SensorServer", + "ICamera", + "ICameraClient", + "ICameraRecordingProxy", + "ICameraRecordingProxyListener", + "ICrypto", + "IOMXObserver", + "IStreamListener", + "IStreamSource", + "IAudioService", + "IDataSource", + "IDrmClient", + "IMediaCodecList", + "IMediaDrmService", + "IMediaExtractor", + "IMediaExtractorService", + "IMediaHTTPConnection", + "IMediaHTTPService", + "IMediaLogService", + "IMediaMetadataRetriever", + "IMediaMetricsService", + "IMediaPlayer", + "IMediaPlayerClient", + "IMediaPlayerService", + "IMediaRecorder", + "IMediaRecorderClient", + "IMediaResourceMonitor", + "IMediaSource", + "IRemoteDisplay", + "IRemoteDisplayClient", + "IResourceManagerClient", + "IResourceManagerService", + "IComplexTypeInterface", + "IPermissionController", + "IPingResponder", + "IProcessInfoService", + "ISchedulingPolicyService", + "IStringConstants", + "IObbActionListener", + "IStorageEventListener", + "IStorageManager", + "IStorageShutdownObserver", + "IPersistentVrStateCallbacks", + "IVrManager", + "IVrStateCallbacks", + "ISurfaceComposer", + "IMemory", + "IMemoryHeap", + "IProcfsInspector", + "IAppOpsCallback", + "IAppOpsService", + "IBatteryStats", + "IResultReceiver", + "IShellCallback", + "IDrmManagerService", + "IDrmServiceListener", + "IAAudioClient", + "IAAudioService", + "VtsFuzzer", ) diff --git a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionUtils.kt b/tools/lint/common/src/main/java/com/google/android/lint/aidl/EnforcePermissionUtils.kt index d41fee3fc0dc..d41fee3fc0dc 100644 --- a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/EnforcePermissionUtils.kt +++ b/tools/lint/common/src/main/java/com/google/android/lint/aidl/EnforcePermissionUtils.kt diff --git a/tools/lint/fix/Android.bp b/tools/lint/fix/Android.bp index 43f21221ae5a..ddacf57c3a3e 100644 --- a/tools/lint/fix/Android.bp +++ b/tools/lint/fix/Android.bp @@ -25,6 +25,11 @@ python_binary_host { name: "lint_fix", main: "soong_lint_fix.py", srcs: ["soong_lint_fix.py"], + version: { + py3: { + embedded_launcher: true, + }, + }, } python_library_host { diff --git a/tools/lint/fix/soong_lint_fix.py b/tools/lint/fix/soong_lint_fix.py index cd4d778d1dec..2e82beb24b56 100644 --- a/tools/lint/fix/soong_lint_fix.py +++ b/tools/lint/fix/soong_lint_fix.py @@ -14,6 +14,7 @@ import argparse import json +import functools import os import shutil import subprocess @@ -28,56 +29,75 @@ SOONG_UI = "build/soong/soong_ui.bash" PATH_PREFIX = "out/soong/.intermediates" PATH_SUFFIX = "android_common/lint" FIX_ZIP = "suggested-fixes.zip" +MODULE_JAVA_DEPS = "out/soong/module_bp_java_deps.json" -class SoongLintFix: - """ - This class creates a command line tool that will - apply lint fixes to the platform via the necessary - combination of soong and shell commands. - It breaks up these operations into a few "private" methods - that are intentionally exposed so experimental code can tweak behavior. +class SoongModule: + """A Soong module to lint. - The entry point, `run`, will apply lint fixes using the - intermediate `suggested-fixes` directory that soong creates during its - invocation of lint. + The constructor takes the name of the module (for example, + "framework-minus-apex"). find() must be called to extract the intermediate + module path from Soong's module-info.json + """ + def __init__(self, name): + self._name = name - Basic usage: - ``` - from soong_lint_fix import SoongLintFix + def find(self, module_info): + """Finds the module in the loaded module_info.json.""" + if self._name not in module_info: + raise Exception(f"Module {self._name} not found!") - SoongLintFix().run() - ``` - """ - def __init__(self): - self._parser = _setup_parser() - self._args = None - self._kwargs = None - self._path = None - self._target = None + partial_path = module_info[self._name]["path"][0] + print(f"Found module {partial_path}/{self._name}.") + self._path = f"{PATH_PREFIX}/{partial_path}/{self._name}/{PATH_SUFFIX}" + def find_java_deps(self, module_java_deps): + """Finds the dependencies of a Java module in the loaded module_bp_java_deps.json. - def run(self, additional_setup=None, custom_fix=None): + Returns: + A list of module names. """ - Run the script - """ - self._setup() - self._find_module() - self._lint() + if self._name not in module_java_deps: + raise Exception(f"Module {self._name} not found!") + + return module_java_deps[self._name]["dependencies"] - if not self._args.no_fix: - self._fix() + @property + def name(self): + return self._name - if self._args.print: - self._print() + @property + def path(self): + return self._path + + @property + def lint_report(self): + return f"{self._path}/lint-report.txt" + + @property + def suggested_fixes(self): + return f"{self._path}/{FIX_ZIP}" + + +class SoongLintWrapper: + """ + This class wraps the necessary calls to Soong and/or shell commands to lint + platform modules and apply suggested fixes if desired. + + It breaks up these operations into a few methods that are available to + sub-classes (see SoongLintFix for an example). + """ + def __init__(self, check=None, lint_module=None): + self._check = check + self._lint_module = lint_module + self._kwargs = None def _setup(self): - self._args = self._parser.parse_args() env = os.environ.copy() - if self._args.check: - env["ANDROID_LINT_CHECK"] = self._args.check - if self._args.lint_module: - env["ANDROID_LINT_CHECK_EXTRA_MODULES"] = self._args.lint_module + if self._check: + env["ANDROID_LINT_CHECK"] = self._check + if self._lint_module: + env["ANDROID_LINT_CHECK_EXTRA_MODULES"] = self._lint_module self._kwargs = { "env": env, @@ -87,9 +107,10 @@ class SoongLintFix: os.chdir(ANDROID_BUILD_TOP) - - def _find_module(self): - print("Refreshing soong modules...") + @functools.cached_property + def _module_info(self): + """Returns the JSON content of module-info.json.""" + print("Refreshing Soong modules...") try: os.mkdir(ANDROID_PRODUCT_OUT) except OSError: @@ -98,47 +119,122 @@ class SoongLintFix: print("done.") with open(f"{ANDROID_PRODUCT_OUT}/module-info.json") as f: - module_info = json.load(f) + return json.load(f) - if self._args.module not in module_info: - sys.exit(f"Module {self._args.module} not found!") + def _find_module(self, module_name): + """Returns a SoongModule from a module name. - module_path = module_info[self._args.module]["path"][0] - print(f"Found module {module_path}/{self._args.module}.") + Ensures that the module is known to Soong. + """ + module = SoongModule(module_name) + module.find(self._module_info) + return module + + def _find_modules(self, module_names): + modules = [] + for module_name in module_names: + modules.append(self._find_module(module_name)) + return modules + + @functools.cached_property + def _module_java_deps(self): + """Returns the JSON content of module_bp_java_deps.json.""" + print("Refreshing Soong Java deps...") + subprocess.call(f"{SOONG_UI} --make-mode {MODULE_JAVA_DEPS}", **self._kwargs) + print("done.") - self._path = f"{PATH_PREFIX}/{module_path}/{self._args.module}/{PATH_SUFFIX}" - self._target = f"{self._path}/lint-report.txt" + with open(f"{MODULE_JAVA_DEPS}") as f: + return json.load(f) + def _find_module_java_deps(self, module): + """Returns a list a dependencies for a module. - def _lint(self): + Args: + module: A SoongModule. + + Returns: + A list of SoongModule. + """ + deps = [] + dep_names = module.find_java_deps(self._module_java_deps) + for dep_name in dep_names: + dep = SoongModule(dep_name) + dep.find(self._module_info) + deps.append(dep) + return deps + + def _lint(self, modules): print("Cleaning up any old lint results...") - try: - os.remove(f"{self._target}") - os.remove(f"{self._path}/{FIX_ZIP}") - except FileNotFoundError: - pass + for module in modules: + try: + os.remove(f"{module.lint_report}") + os.remove(f"{module.suggested_fixes}") + except FileNotFoundError: + pass print("done.") - print(f"Generating {self._target}") - subprocess.call(f"{SOONG_UI} --make-mode {self._target}", **self._kwargs) + target = " ".join([ module.lint_report for module in modules ]) + print(f"Generating {target}") + subprocess.call(f"{SOONG_UI} --make-mode {target}", **self._kwargs) print("done.") - - def _fix(self): - print("Copying suggested fixes to the tree...") - with zipfile.ZipFile(f"{self._path}/{FIX_ZIP}") as zip: - for name in zip.namelist(): - if name.startswith("out") or not name.endswith(".java"): - continue - with zip.open(name) as src, open(f"{ANDROID_BUILD_TOP}/{name}", "wb") as dst: - shutil.copyfileobj(src, dst) + def _fix(self, modules): + for module in modules: + print(f"Copying suggested fixes for {module.name} to the tree...") + with zipfile.ZipFile(f"{module.suggested_fixes}") as zip: + for name in zip.namelist(): + if name.startswith("out") or not name.endswith(".java"): + continue + with zip.open(name) as src, open(f"{ANDROID_BUILD_TOP}/{name}", "wb") as dst: + shutil.copyfileobj(src, dst) print("done.") + def _print(self, modules): + for module in modules: + print(f"### lint-report.txt {module.name} ###", end="\n\n") + with open(module.lint_report, "r") as f: + print(f.read()) + + +class SoongLintFix(SoongLintWrapper): + """ + Basic usage: + ``` + from soong_lint_fix import SoongLintFix + + opts = SoongLintFixOptions() + opts.parse_args() + SoongLintFix(opts).run() + ``` + """ + def __init__(self, opts): + super().__init__(check=opts.check, lint_module=opts.lint_module) + self._opts = opts + + def run(self): + self._setup() + modules = self._find_modules(self._opts.modules) + self._lint(modules) + + if not self._opts.no_fix: + self._fix(modules) + + if self._opts.print: + self._print(modules) + + +class SoongLintFixOptions: + """Options for SoongLintFix""" + + def __init__(self): + self.modules = [] + self.check = None + self.lint_module = None + self.no_fix = False + self.print = False - def _print(self): - print("### lint-report.txt ###", end="\n\n") - with open(self._target, "r") as f: - print(f.read()) + def parse_args(self, args=None): + _setup_parser().parse_args(args, self) def _setup_parser(): @@ -151,7 +247,8 @@ def _setup_parser(): **Gotcha**: You must have run `source build/envsetup.sh` and `lunch` first. """, formatter_class=argparse.RawTextHelpFormatter) - parser.add_argument('module', + parser.add_argument('modules', + nargs='+', help='The soong build module to run ' '(e.g. framework-minus-apex or services.core.unboosted)') @@ -170,4 +267,6 @@ def _setup_parser(): return parser if __name__ == "__main__": - SoongLintFix().run()
\ No newline at end of file + opts = SoongLintFixOptions() + opts.parse_args() + SoongLintFix(opts).run() diff --git a/tools/lint/framework/Android.bp b/tools/lint/framework/Android.bp index 30a6daaef2a4..5acdf436ae08 100644 --- a/tools/lint/framework/Android.bp +++ b/tools/lint/framework/Android.bp @@ -37,28 +37,9 @@ java_library_host { java_test_host { name: "AndroidFrameworkLintCheckerTest", + defaults: ["AndroidLintCheckerTestDefaults"], srcs: ["checks/src/test/java/**/*.kt"], static_libs: [ "AndroidFrameworkLintChecker", - "junit", - "lint", - "lint_tests", ], - test_options: { - unit_test: true, - tradefed_options: [ - { - // lint bundles in some classes that were built with older versions - // of libraries, and no longer load. Since tradefed tries to load - // all classes in the jar to look for tests, it crashes loading them. - // Exclude these classes from tradefed's search. - name: "exclude-paths", - value: "org/apache", - }, - { - name: "exclude-paths", - value: "META-INF", - }, - ], - }, } diff --git a/tools/lint/global/Android.bp b/tools/lint/global/Android.bp index bedb7bd78a29..3e74171814ab 100644 --- a/tools/lint/global/Android.bp +++ b/tools/lint/global/Android.bp @@ -38,28 +38,9 @@ java_library_host { java_test_host { name: "AndroidGlobalLintCheckerTest", + defaults: ["AndroidLintCheckerTestDefaults"], srcs: ["checks/src/test/java/**/*.kt"], static_libs: [ "AndroidGlobalLintChecker", - "junit", - "lint", - "lint_tests", ], - test_options: { - unit_test: true, - tradefed_options: [ - { - // lint bundles in some classes that were built with older versions - // of libraries, and no longer load. Since tradefed tries to load - // all classes in the jar to look for tests, it crashes loading them. - // Exclude these classes from tradefed's search. - name: "exclude-paths", - value: "org/apache", - }, - { - name: "exclude-paths", - value: "META-INF", - }, - ], - }, } diff --git a/tools/lint/utils/Android.bp b/tools/lint/utils/Android.bp new file mode 100644 index 000000000000..439c86d564c7 --- /dev/null +++ b/tools/lint/utils/Android.bp @@ -0,0 +1,51 @@ +// Copyright (C) 2023 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +java_library_host { + name: "AndroidUtilsLintChecker", + srcs: ["checks/src/main/java/**/*.kt"], + plugins: ["auto_service_plugin"], + libs: [ + "auto_service_annotations", + "lint_api", + ], + static_libs: [ + "AndroidCommonLint", + ], + kotlincflags: ["-Xjvm-default=all"], +} + +java_test_host { + name: "AndroidUtilsLintCheckerTest", + defaults: ["AndroidLintCheckerTestDefaults"], + srcs: ["checks/src/test/java/**/*.kt"], + static_libs: [ + "AndroidUtilsLintChecker", + ], +} + +python_binary_host { + name: "enforce_permission_counter", + srcs: ["enforce_permission_counter.py"], + libs: ["soong_lint_fix"], +} diff --git a/tools/lint/utils/checks/src/main/java/com/google/android/lint/AndroidUtilsIssueRegistry.kt b/tools/lint/utils/checks/src/main/java/com/google/android/lint/AndroidUtilsIssueRegistry.kt new file mode 100644 index 000000000000..fa61c42ef8e6 --- /dev/null +++ b/tools/lint/utils/checks/src/main/java/com/google/android/lint/AndroidUtilsIssueRegistry.kt @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.google.android.lint + +import com.android.tools.lint.client.api.IssueRegistry +import com.android.tools.lint.client.api.Vendor +import com.android.tools.lint.detector.api.CURRENT_API +import com.google.android.lint.aidl.AnnotatedAidlCounter +import com.google.auto.service.AutoService + +@AutoService(IssueRegistry::class) +@Suppress("UnstableApiUsage") +class AndroidUtilsIssueRegistry : IssueRegistry() { + override val issues = listOf( + AnnotatedAidlCounter.ISSUE_ANNOTATED_AIDL_COUNTER, + ) + + override val api: Int + get() = CURRENT_API + + override val minApi: Int + get() = 8 + + override val vendor: Vendor = Vendor( + vendorName = "Android", + feedbackUrl = "http://b/issues/new?component=315013", + contact = "tweek@google.com" + ) +} diff --git a/tools/lint/utils/checks/src/main/java/com/google/android/lint/aidl/AnnotatedAidlCounter.kt b/tools/lint/utils/checks/src/main/java/com/google/android/lint/aidl/AnnotatedAidlCounter.kt new file mode 100644 index 000000000000..f0ec3f44f6c4 --- /dev/null +++ b/tools/lint/utils/checks/src/main/java/com/google/android/lint/aidl/AnnotatedAidlCounter.kt @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.google.android.lint.aidl + +import com.android.tools.lint.detector.api.Category +import com.android.tools.lint.detector.api.Context +import com.android.tools.lint.detector.api.Implementation +import com.android.tools.lint.detector.api.Issue +import com.android.tools.lint.detector.api.JavaContext +import com.android.tools.lint.detector.api.Location +import com.android.tools.lint.detector.api.Scope +import com.android.tools.lint.detector.api.Severity +import org.jetbrains.uast.UBlockExpression +import org.jetbrains.uast.UMethod + +import java.util.TreeMap + +/** + * Count the number of AIDL interfaces. Reports the number of annotated and + * non-annotated methods. + */ +@Suppress("UnstableApiUsage") +class AnnotatedAidlCounter : AidlImplementationDetector() { + + private data class Stat( + var unannotated: Int = 0, + var enforced: Int = 0, + var notRequired: Int = 0, + ) + + private var packagesStats: TreeMap<String, Stat> = TreeMap<String, Stat>() + + override fun visitAidlMethod( + context: JavaContext, + node: UMethod, + interfaceName: String, + body: UBlockExpression + ) { + val packageName = context.uastFile?.packageName ?: "<unknown>" + var packageStat = packagesStats.getOrDefault(packageName, Stat()) + when { + node.hasAnnotation(ANNOTATION_ENFORCE_PERMISSION) -> packageStat.enforced += 1 + node.hasAnnotation(ANNOTATION_REQUIRES_NO_PERMISSION) -> packageStat.notRequired += 1 + else -> packageStat.unannotated += 1 + } + packagesStats.put(packageName, packageStat) + // context.driver.client.log(null, "%s.%s#%s".format(packageName, interfaceName, node.name)) + } + + override fun afterCheckRootProject(context: Context) { + var total = Stat() + for ((packageName, stat) in packagesStats) { + context.client.log(null, "package $packageName => $stat") + total.unannotated += stat.unannotated + total.enforced += stat.enforced + total.notRequired += stat.notRequired + } + val location = Location.create(context.project.dir) + context.report( + ISSUE_ANNOTATED_AIDL_COUNTER, + location, + "module ${context.project.name} => $total" + ) + } + + companion object { + + @JvmField + val ISSUE_ANNOTATED_AIDL_COUNTER = Issue.create( + id = "AnnotatedAidlCounter", + briefDescription = "Statistics on the number of annotated AIDL methods.", + explanation = "", + category = Category.SECURITY, + priority = 5, + severity = Severity.INFORMATIONAL, + implementation = Implementation( + AnnotatedAidlCounter::class.java, + Scope.JAVA_FILE_SCOPE + ), + ) + } +} diff --git a/tools/lint/utils/checks/src/test/java/com/google/android/lint/aidl/AnnotatedAidlCounterTest.kt b/tools/lint/utils/checks/src/test/java/com/google/android/lint/aidl/AnnotatedAidlCounterTest.kt new file mode 100644 index 000000000000..692b7da243c9 --- /dev/null +++ b/tools/lint/utils/checks/src/test/java/com/google/android/lint/aidl/AnnotatedAidlCounterTest.kt @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT 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.google.android.lint.aidl + +import com.android.tools.lint.checks.infrastructure.LintDetectorTest +import com.android.tools.lint.checks.infrastructure.TestFile +import com.android.tools.lint.checks.infrastructure.TestLintTask +import com.android.tools.lint.detector.api.Detector +import com.android.tools.lint.detector.api.Issue + +@Suppress("UnstableApiUsage") +class AnnotatedAidlCounterTest : LintDetectorTest() { + override fun getDetector(): Detector = AnnotatedAidlCounter() + + override fun getIssues(): List<Issue> = listOf( + AnnotatedAidlCounter.ISSUE_ANNOTATED_AIDL_COUNTER, + ) + + override fun lint(): TestLintTask = super.lint().allowMissingSdk(true) + + /** No issue scenario */ + + fun testDoesNotDetectIssuesCorrectAnnotationOnMethod() { + lint().files(java( + """ + package test.pkg; + import android.annotation.EnforcePermission; + public class TestClass2 extends IFooMethod.Stub { + @Override + @EnforcePermission(android.Manifest.permission.READ_PHONE_STATE) + public void testMethod() {} + } + """).indented(), + *stubs + ) + .run() + .expect(""" + app: Information: module app => Stat(unannotated=0, enforced=1, notRequired=0) [AnnotatedAidlCounter] + 0 errors, 0 warnings + """) + } + + // A service with permission annotation on the method. + private val interfaceIFooMethodStub: TestFile = java( + """ + public interface IFooMethod extends android.os.IInterface { + public static abstract class Stub extends android.os.Binder implements IFooMethod {} + @android.annotation.EnforcePermission(android.Manifest.permission.READ_PHONE_STATE) + public void testMethod(); + } + """ + ).indented() + + // A service without any permission annotation. + private val interfaceIBarStub: TestFile = java( + """ + public interface IBar extends android.os.IInterface { + public static abstract class Stub extends android.os.Binder implements IBar { + @Override + public void testMethod() {} + } + public void testMethod(); + } + """ + ).indented() + + private val manifestPermissionStub: TestFile = java( + """ + package android.Manifest; + class permission { + public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE"; + } + """ + ).indented() + + private val enforcePermissionAnnotationStub: TestFile = java( + """ + package android.annotation; + public @interface EnforcePermission {} + """ + ).indented() + + private val stubs = arrayOf(interfaceIFooMethodStub, interfaceIBarStub, + manifestPermissionStub, enforcePermissionAnnotationStub) +} diff --git a/tools/lint/utils/enforce_permission_counter.py b/tools/lint/utils/enforce_permission_counter.py new file mode 100644 index 000000000000..a4c00f79b63f --- /dev/null +++ b/tools/lint/utils/enforce_permission_counter.py @@ -0,0 +1,63 @@ +# Copyright (C) 2023 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import re + +import soong_lint_fix + +CHECK = "AnnotatedAidlCounter" +LINT_MODULE = "AndroidUtilsLintChecker" + +class EnforcePermissionMigratedCounter(soong_lint_fix.SoongLintWrapper): + """Wrapper around lint_fix to count the number of AIDL methods annotated.""" + + def __init__(self): + super().__init__(check=CHECK, lint_module=LINT_MODULE) + + def run(self): + self._setup() + + # Analyze the dependencies of the "services" module and the module + # "services.core.unboosted". + service_module = self._find_module("services") + dep_modules = self._find_module_java_deps(service_module) + \ + [self._find_module("services.core.unboosted")] + + # Skip dependencies that are not services. Skip the "services.core" + # module which is analyzed via "services.core.unboosted". + modules = [] + for module in dep_modules: + if "frameworks/base/services" not in module.path: + continue + if module.name == "services.core": + continue + modules.append(module) + + self._lint(modules) + + counts = { "unannotated": 0, "enforced": 0, "notRequired": 0 } + for module in modules: + with open(module.lint_report, "r") as f: + content = f.read() + keys = dict(re.findall(r'(\w+)=(\d+)', content)) + for key in keys: + counts[key] += int(keys[key]) + print(counts) + total = sum(counts.values()) + annotated_percent = (1 - (counts["unannotated"] / total)) * 100 + print("Annotated methods = %.2f%%" % (annotated_percent)) + + +if __name__ == "__main__": + EnforcePermissionMigratedCounter().run() diff --git a/tools/obbtool/Main.cpp b/tools/obbtool/Main.cpp index 64808c0a755f..70140685e37e 100644 --- a/tools/obbtool/Main.cpp +++ b/tools/obbtool/Main.cpp @@ -135,7 +135,7 @@ void doInfo(const char* filename) { } printf("OBB info for '%s':\n", filename); - printf("Package name: %s\n", obb->getPackageName().string()); + printf("Package name: %s\n", obb->getPackageName().c_str()); printf(" Version: %d\n", obb->getVersion()); printf(" Flags: 0x%08x\n", obb->getFlags()); printf(" Overlay: %s\n", obb->isOverlay() ? "true" : "false"); diff --git a/tools/split-select/Android.bp b/tools/split-select/Android.bp index 540265793de6..ec9d42a2dc64 100644 --- a/tools/split-select/Android.bp +++ b/tools/split-select/Android.bp @@ -57,9 +57,6 @@ cc_defaults { // This tool is prebuilt if we're doing an app-only build. product_variables: { - pdk: { - enabled: false, - }, unbundled_build: { enabled: false, }, diff --git a/tools/split-select/Grouper_test.cpp b/tools/split-select/Grouper_test.cpp index 7294a86fa862..a8b78cd3cf7c 100644 --- a/tools/split-select/Grouper_test.cpp +++ b/tools/split-select/Grouper_test.cpp @@ -179,7 +179,7 @@ void GrouperTest::expectHasGroupWithSplits(const Vector<const char*>& expectedSt errorMessage.append("\n"); } } - ADD_FAILURE() << errorMessage.string(); + ADD_FAILURE() << errorMessage.c_str(); } void GrouperTest::addSplit(Vector<SplitDescription>& splits, const char* str) { diff --git a/tools/split-select/Main.cpp b/tools/split-select/Main.cpp index e6966db0aa00..73bfa19a051a 100644 --- a/tools/split-select/Main.cpp +++ b/tools/split-select/Main.cpp @@ -99,8 +99,7 @@ void generate(const KeyedVector<String8, Vector<SplitDescription> >& splits, con } masterRule = Rule::simplify(masterRule); fprintf(stdout, " {\n \"path\": \"%s\",\n \"rules\": %s\n }", - splits.keyAt(i).string(), - masterRule->toJson(2).string()); + splits.keyAt(i).c_str(), masterRule->toJson(2).c_str()); } fprintf(stdout, "\n]\n"); } @@ -158,25 +157,23 @@ static bool getAppInfo(const String8& path, AppInfo& outInfo) { const char16_t* name = xml.getElementName(&len); String16 name16(name, len); if (name16 == kManifestTag) { - ssize_t idx = xml.indexOfAttribute( - kAndroidNamespace.string(), kAndroidNamespace.size(), - kVersionCodeAttr.string(), kVersionCodeAttr.size()); + ssize_t idx = xml.indexOfAttribute(kAndroidNamespace.c_str(), kAndroidNamespace.size(), + kVersionCodeAttr.c_str(), kVersionCodeAttr.size()); if (idx >= 0) { outInfo.versionCode = xml.getAttributeData(idx); } } else if (name16 == kApplicationTag) { - ssize_t idx = xml.indexOfAttribute( - kAndroidNamespace.string(), kAndroidNamespace.size(), - kMultiArchAttr.string(), kMultiArchAttr.size()); + ssize_t idx = xml.indexOfAttribute(kAndroidNamespace.c_str(), kAndroidNamespace.size(), + kMultiArchAttr.c_str(), kMultiArchAttr.size()); if (idx >= 0) { outInfo.multiArch = xml.getAttributeData(idx) != 0; } } else if (name16 == kUsesSdkTag) { - ssize_t idx = xml.indexOfAttribute( - kAndroidNamespace.string(), kAndroidNamespace.size(), - kMinSdkVersionAttr.string(), kMinSdkVersionAttr.size()); + ssize_t idx = + xml.indexOfAttribute(kAndroidNamespace.c_str(), kAndroidNamespace.size(), + kMinSdkVersionAttr.c_str(), kMinSdkVersionAttr.size()); if (idx >= 0) { uint16_t type = xml.getAttributeDataType(idx); if (type >= Res_value::TYPE_FIRST_INT && type <= Res_value::TYPE_LAST_INT) { @@ -187,10 +184,10 @@ static bool getAppInfo(const String8& path, AppInfo& outInfo) { fprintf(stderr, "warning: failed to retrieve android:minSdkVersion.\n"); } else { char *endPtr; - int minSdk = strtol(minSdk8->string(), &endPtr, 10); - if (endPtr != minSdk8->string() + minSdk8->size()) { + int minSdk = strtol(minSdk8->c_str(), &endPtr, 10); + if (endPtr != minSdk8->c_str() + minSdk8->size()) { fprintf(stderr, "warning: failed to parse android:minSdkVersion '%s'\n", - minSdk8->string()); + minSdk8->c_str()); } else { outInfo.minSdkVersion = minSdk; } @@ -232,7 +229,7 @@ static Vector<SplitDescription> extractSplitDescriptionsFromApk(const String8& p splits.add(); Vector<String8> parts = AaptUtil::splitAndLowerCase(dir->getFileName(i), '-'); if (parseAbi(parts, 0, &splits.editTop()) < 0) { - fprintf(stderr, "Malformed library %s\n", dir->getFileName(i).string()); + fprintf(stderr, "Malformed library %s\n", dir->getFileName(i).c_str()); splits.pop(); } } @@ -260,7 +257,7 @@ static int main(int argc, char** argv) { usage(); return 1; } - targetConfigStr.setTo(*argv); + targetConfigStr = *argv; } else if (arg == "--split") { argc--; argv++; @@ -284,14 +281,14 @@ static int main(int argc, char** argv) { usage(); return 1; } - baseApkPath.setTo(*argv); + baseApkPath = *argv; } else if (arg == "--generate") { generateFlag = true; } else if (arg == "--help") { help(); return 0; } else { - fprintf(stderr, "error: unknown argument '%s'.\n", arg.string()); + fprintf(stderr, "error: unknown argument '%s'.\n", arg.c_str()); usage(); return 1; } @@ -313,15 +310,14 @@ static int main(int argc, char** argv) { // Find out some details about the base APK. AppInfo baseAppInfo; if (!getAppInfo(baseApkPath, baseAppInfo)) { - fprintf(stderr, "error: unable to read base APK: '%s'.\n", baseApkPath.string()); + fprintf(stderr, "error: unable to read base APK: '%s'.\n", baseApkPath.c_str()); return 1; } SplitDescription targetSplit; if (!generateFlag) { if (!SplitDescription::parse(targetConfigStr, &targetSplit)) { - fprintf(stderr, "error: invalid --target config: '%s'.\n", - targetConfigStr.string()); + fprintf(stderr, "error: invalid --target config: '%s'.\n", targetConfigStr.c_str()); usage(); return 1; } @@ -341,7 +337,7 @@ static int main(int argc, char** argv) { Vector<SplitDescription> splits = extractSplitDescriptionsFromApk(splitApkPaths[i]); if (splits.isEmpty()) { fprintf(stderr, "error: invalid --split path: '%s'. No splits found.\n", - splitApkPaths[i].string()); + splitApkPaths[i].c_str()); usage(); return 1; } @@ -364,7 +360,7 @@ static int main(int argc, char** argv) { const size_t matchingSplitApkPathCount = matchingSplitPaths.size(); for (size_t i = 0; i < matchingSplitApkPathCount; i++) { if (matchingSplitPaths[i] != baseApkPath) { - fprintf(stdout, "%s\n", matchingSplitPaths[i].string()); + fprintf(stdout, "%s\n", matchingSplitPaths[i].c_str()); } } } else { diff --git a/tools/split-select/Rule_test.cpp b/tools/split-select/Rule_test.cpp index c6cff0d0220e..c78533fd1907 100644 --- a/tools/split-select/Rule_test.cpp +++ b/tools/split-select/Rule_test.cpp @@ -68,7 +68,7 @@ TEST(RuleTest, generatesValidJson) { expected.erase(std::remove_if(expected.begin(), expected.end(), ::isspace), expected.end()); // Result - std::string result(rule.toJson().string()); + std::string result(rule.toJson().c_str()); result.erase(std::remove_if(result.begin(), result.end(), ::isspace), result.end()); ASSERT_EQ(expected, result); diff --git a/tools/split-select/SplitDescription.cpp b/tools/split-select/SplitDescription.cpp index 99bc23d819fb..c02e2d797608 100644 --- a/tools/split-select/SplitDescription.cpp +++ b/tools/split-select/SplitDescription.cpp @@ -70,7 +70,7 @@ bool SplitDescription::match(const SplitDescription& o) const { String8 SplitDescription::toString() const { String8 extension; if (abi != abi::Variant_none) { - if (extension.isEmpty()) { + if (extension.empty()) { extension.append(":"); } else { extension.append("-"); @@ -134,10 +134,10 @@ bool SplitDescription::parse(const String8& str, SplitDescription* outSplit) { String8 configStr; String8 extensionStr; if (index >= 0) { - configStr.setTo(str.string(), index); - extensionStr.setTo(str.string() + index + 1); + configStr = String8(str.c_str(), index); + extensionStr = (str.c_str() + index + 1); } else { - configStr.setTo(str); + configStr = str; } SplitDescription split; diff --git a/tools/split-select/TestRules.cpp b/tools/split-select/TestRules.cpp index 86ccd6a25c18..ca3c56fe861c 100644 --- a/tools/split-select/TestRules.cpp +++ b/tools/split-select/TestRules.cpp @@ -78,9 +78,8 @@ const Rule AlwaysTrue() { const String8 actualStr(actual != NULL ? actual->toJson() : String8()); if (expectedStr != actualStr) { - return ::testing::AssertionFailure() - << "Expected: " << expectedStr.string() << "\n" - << " Actual: " << actualStr.string(); + return ::testing::AssertionFailure() << "Expected: " << expectedStr.c_str() << "\n" + << " Actual: " << actualStr.c_str(); } return ::testing::AssertionSuccess(); } diff --git a/tools/validatekeymaps/Main.cpp b/tools/validatekeymaps/Main.cpp index 0fa13b81c4ea..70d875e394ff 100644 --- a/tools/validatekeymaps/Main.cpp +++ b/tools/validatekeymaps/Main.cpp @@ -165,7 +165,7 @@ static bool validateFile(const char* filename) { case FileType::INPUT_DEVICE_CONFIGURATION: { android::base::Result<std::unique_ptr<PropertyMap>> propertyMap = - PropertyMap::load(String8(filename)); + PropertyMap::load(String8(filename).c_str()); if (!propertyMap.ok()) { error("Error parsing input device configuration file: %s.\n\n", propertyMap.error().message().c_str()); |